diff --git a/app/views/note/note-dev.html b/app/views/note/note-dev.html index 5466d8e..584a8e5 100644 --- a/app/views/note/note-dev.html +++ b/app/views/note/note-dev.html @@ -17,16 +17,16 @@ - + - + @@ -427,6 +427,7 @@ function log(o) {
+

diff --git a/public/js/app/note.js b/public/js/app/note.js index bb7b105..7200ea1 100644 --- a/public/js/app/note.js +++ b/public/js/app/note.js @@ -7,7 +7,7 @@ // 3. 什么时候设置curNoteId? 是ajax得到内容之后设置 // note -Note.curNoteId = ""; +Note.curNoteId = ''; Note.interval = ""; // 定时器 @@ -33,22 +33,23 @@ Note.notebookIds = {}; // notebookId => true Note.isReadOnly = false; // 定时保存信息 -Note.intervalTime = 600000; // 600s, 10mins +Note.intervalTime = 600 * 000; // 600s, 10mins +Note.intervalTime = 10 * 1000; // 10s Note.startInterval = function() { + clearInterval(Note.interval); Note.interval = setInterval(function() { - log("自动保存开始...") - changedNote = Note.curChangedSaveIt(false); + log("自动保存开始..."); + Note.curChangedSaveIt(); }, 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) { @@ -80,7 +81,7 @@ Note.setCurNoteId = function (noteId) { }; Note.clearCurNoteId = function () { this.curNoteId = null; -} +}; // 得到当前的笔记 Note.getCurNote = function() { @@ -93,7 +94,7 @@ Note.getCurNote = function() { Note.getNote = function(noteId) { var self = this; return self.cache[noteId]; -} +}; // 每当有notebookId相应的note改变时都要重新清空之 // 并设置该notebookId有值 @@ -103,14 +104,14 @@ Note.clearCacheByNotebookId = function(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) { @@ -176,15 +177,6 @@ Note.getNotesByNotebookId = function(notebookId, sortBy, isAsc) { return notes; }; -// 该笔记点击后已污染 -Note.curNoteIsDirtied = function() { - var me = this; - var note = me.getCurNote(); - if(note) { - note.isDirty = true; - } -}; - // called by Notebook // render 所有notes, 和第一个note的content Note.renderNotesAndFirstOneContent = function(ret) { @@ -204,25 +196,69 @@ Note.renderNotesAndFirstOneContent = function(ret) { // 当前的note是否改变过了? // 返回已改变的信息 -// force bool true表示content比较是比较HTML, 否则比较text, 默认为true -// 定时保存用false +// +// isDirty()不好判断, 因为富文本编辑器下用快捷键, 插入图片的问题 +// 所以不用isDirty() +// 只用Note.readOnly, 如果Note.readOnly, 那么不判断内容 +// Note.curHasChanged = function(force) { - if(force == undefined) { - force = true; + var cacheNote = Note.getCurNote(); + if (!cacheNote) { + return false; } - var cacheNote = Note.cache[Note.curNoteId] || {}; + // 收集当前信息, 与cache比对 - var title = $("#noteTitle").val(); - var tags = Tag.getTags(); // TODO + var title = $('#noteTitle').val(); + var tags = Tag.getTags(); + + var hasChanged = { + hasChanged: false, // 总的是否有改变 + IsNew: cacheNote.IsNew, // 是否是新添加的 + IsMarkdown: cacheNote.IsMarkdown, // 是否是markdown笔记 + FromUserId: cacheNote.FromUserId, // 是否是共享新建的 + NoteId: cacheNote.NoteId, + NotebookId: cacheNote.NotebookId + }; + + if (cacheNote.IsNew) { + hasChanged.hasChanged = true; + } + + if(cacheNote.Title != title) { + hasChanged.hasChanged = true; // 本页使用用小写 + hasChanged.Title = title; // 要传到后台的用大写 + } + if(!arrayEqual(cacheNote.Tags, tags)) { + hasChanged.hasChanged = true; + hasChanged.Tags = tags.join(","); // 为什么? 因为空数组不会传到后台 + } + + // 是否需要检查内容呢? + + var needCheckContent = false; + if (cacheNote.IsNew || force || !Note.readOnly) { + needCheckContent = true; + } + + // 标题, 标签, 内容都没改变 + if (!hasChanged.hasChanged && !needCheckContent) { + return false; + } + + if (!needCheckContent) { + return hasChanged; + } + + //=========== + // 内容的比较 + // 如果是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); @@ -233,47 +269,19 @@ Note.curHasChanged = function(force) { 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, - Version: cacheNote.Version || 0, // 版本控制 - }; - - if(hasChanged.IsNew) { - $.extend(hasChanged, cacheNote); - } else { - if(!force && !cacheNote.isDirty) { - log("no dirty"); - hasChanged.hasChanged = false; - return hasChanged; - } - } - - 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.join(","); // 为什么? 因为空数组不会传到后台 } // 比较text, 因为note Nav会添加dom会导致content改变 - if((force && cacheNote.Content != content) || (!force && (/**/(!cacheNote.IsMarkdown && $(cacheNote.Content).text() != contentText) || (cacheNote.IsMarkdown && cacheNote.Content != contentText)) /**/) ) { + /* + if((force && cacheNote.Content != content) + || (!force && ( + (!cacheNote.IsMarkdown && $(cacheNote.Content).text() != contentText) + || (cacheNote.IsMarkdown && cacheNote.Content != contentText) + ) + ) + ) { + */ + if (cacheNote.Content != content) { hasChanged.hasChanged = true; hasChanged.Content = content; @@ -288,13 +296,13 @@ Note.curHasChanged = function(force) { } } else { log("text相同"); - log(cacheNote.Content == content); } - - hasChanged["UserId"] = cacheNote["UserId"] || ""; - - return hasChanged; -} + + if (hasChanged.hasChanged) { + return hasChanged; + } + return false; +}; // 由content生成desc // 换行不要替换 @@ -406,13 +414,22 @@ Note.savePool = {}; // 保存池, 以后的保存先放在pool中, id => note Note.curChangedSaveIt = function(force, callback) { var me = this; // 如果当前没有笔记, 不保存 + // 或者是共享的只读笔记 if(!Note.curNoteId || Note.isReadOnly) { + log(!Note.curNoteId ? '无当前笔记' : '共享只读'); + return; + } + var hasChanged; + try { + hasChanged = Note.curHasChanged(force); + } catch(e) { + console.error('获取当前改变的笔记错误!'); + callback && callback(false); return; } - var hasChanged = Note.curHasChanged(force); - - if(hasChanged.hasChanged || hasChanged.IsNew) { + if(hasChanged && hasChanged.hasChanged) { + log('需要保存...'); // 把已改变的渲染到左边 item-list Note.renderChangedNote(hasChanged); delete hasChanged.hasChanged; @@ -456,6 +473,10 @@ Note.curChangedSaveIt = function(force, callback) { return hasChanged; } + else { + log('无需保存'); + } + return false; }; @@ -613,7 +634,7 @@ Note.changeNote = function(selectNoteId, isShare, needSaveChanged, callback) { } // 2. 设空, 防止在内容得到之前又发生保存 - Note.curNoteId = ""; + Note.clearCurNoteId(); // 2 得到现在的 // ajax之 @@ -648,9 +669,10 @@ Note.changeNote = function(selectNoteId, isShare, needSaveChanged, callback) { Note.contentAjaxSeq++; var seq = Note.contentAjaxSeq; - function setContent(ret) { + + function setContent(ret, seq2) { Note.contentAjax = null; - if(seq != Note.contentAjaxSeq) { + if(seq2 != Note.contentAjaxSeq) { return; } Note.setNoteCache(ret, false); @@ -658,20 +680,14 @@ Note.changeNote = function(selectNoteId, isShare, needSaveChanged, callback) { // 把其它信息也带上 ret = Note.cache[selectNoteId] Note.renderNoteContent(ret); - /* 都用editable的render - if(hasPerm) { - Note.renderNoteContent(ret); - } else { - Note.renderNoteContentReadOnly(ret); - } - */ + self.hideContentLoading(); callback && callback(ret); } if(cacheNote.Content) { - setContent(cacheNote); + setContent(cacheNote, seq); return; } @@ -686,12 +702,14 @@ Note.changeNote = function(selectNoteId, isShare, needSaveChanged, callback) { if(Note.contentAjax != null) { Note.contentAjax.abort(); } - Note.contentAjax = ajaxGet(url, param, function (ret) { - // 因为之前Content内的IsBlog和Note的IsBlog不同步, 所以去掉Content中的IsBlog - delete ret['IsBlog']; - setContent(ret); - }); -} + Note.contentAjax = ajaxGet(url, param, (function (seq2) { + return function (ret) { + // 因为之前Content内的IsBlog和Note的IsBlog不同步, 所以去掉Content中的IsBlog + delete ret['IsBlog']; + setContent(ret, seq2); + } + })(seq)); +}; // 渲染 @@ -725,12 +743,12 @@ Note.renderChangedNote = function(changedNote) { $leftNoteNav.find(".item-thumb").remove(); // 以前有, 现在没有了 $leftNoteNav.removeClass("item-image"); } -} +}; // 清空右侧note信息, 可能是共享的, // 此时需要清空只读的, 且切换到note edit模式下 Note.clearNoteInfo = function() { - Note.curNoteId = ""; + Note.clearCurNoteId(); Tag.clearTags(); $("#noteTitle").val(""); setEditorContent(""); @@ -743,20 +761,21 @@ Note.clearNoteInfo = function() { // 只隐藏即可 $("#noteRead").hide(); -} +}; + // 清除noteList导航 Note.clearNoteList = function() { Note.noteItemListO.html(""); // 清空 -} +}; // 清空所有, 在转换notebook时使用 Note.clearAll = function() { // 当前的笔记清空掉 - Note.curNoteId = ""; + Note.clearCurNoteId(); Note.clearNoteInfo(); Note.clearNoteList(); -} +}; Note.renderNote = function(note) { if(!note) { @@ -769,20 +788,19 @@ Note.renderNote = function(note) { // 当前正在编辑的 // tags Tag.renderTags(note.Tags); - - // 笔记是新render的, 没有污染过 - note.isDirty = false; -} +}; // render content Note.renderNoteContent = function(content) { + setEditorContent(content.Content, content.IsMarkdown, content.Preview, function() { - Note.curNoteId = content.NoteId; + Note.setCurNoteId(content.NoteId); Note.toggleReadOnly(); }); + // 只有在renderNoteContent时才设置curNoteId - Note.curNoteId = content.NoteId; -} + // Note.curNoteId = content.NoteId; +}; // 初始化时渲染最初的notes /** @@ -813,10 +831,10 @@ Note.showEditorMask = function() { $("#editorMaskBtns").show(); $("#editorMaskBtnsEmpty").hide(); } -} +}; Note.hideEditorMask = function() { $("#editorMask").css("z-index", -10).hide(); -} +}; // 这里如果notes过多>100个将会很慢!!, 使用setTimeout来分解 Note.renderNotesC = 0; @@ -878,7 +896,7 @@ Note.renderNotes = function(notes, forNewNote, isShared) { } })(i), i*2000); } -} +}; Note._renderNotes = function(notes, forNewNote, isShared, tang) { // 第几趟 var len = notes.length; for(var i = (tang-1)*20; i < len && i < tang*20; ++i) { @@ -949,6 +967,8 @@ Note.newNote = function(notebookId, isShare, fromUserId, isMarkdown) { Note.stopInterval(); // 保存当前的笔记 Note.curChangedSaveIt(); + + Note.batch.reset(); var note = {NoteId: getObjectId(), Title: "", Tags:[], Content:"", NotebookId: notebookId, IsNew: true, FromUserId: fromUserId, IsMarkdown: isMarkdown}; // 是新的 // 添加到缓存中 @@ -1006,25 +1026,13 @@ Note.newNote = function(notebookId, isShare, fromUserId, isMarkdown) { Note.renderNote(note); Note.renderNoteContent(note); - Note.curNoteId = note.NoteId; + Note.setCurNoteId(note.NoteId); // 更新数量 Notebook.incrNotebookNumberNotes(notebookId) // 切换到写模式 Note.toggleWriteable(); -} - -// 保存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 { - } }; // 删除或移动笔记后, 渲染下一个或上一个 @@ -1162,7 +1170,7 @@ Note.deleteNote = function(target, contextmenuItem, isShared) { Note.listNoteShareUserInfo = function(target) { var noteId = $(target).attr("noteId"); showDialogRemote("/share/listNoteShareUserInfo", {noteId: noteId}); -} +}; // 共享笔记 Note.shareNote = function(target) { @@ -1200,12 +1208,12 @@ Note.showReadOnly = function() { // $("#noteRead").show(); $('#note').addClass('read-only'); -} +}; Note.hideReadOnly = function() { Note.isReadOnly = false; $('#note').removeClass('read-only'); $("#noteRead").hide(); -} +}; // read only Note.renderNoteReadOnly = function(note) { Note.showReadOnly(); @@ -1215,9 +1223,7 @@ Note.renderNoteReadOnly = function(note) { $("#noteReadCreatedTime").html(goNowToDatetime(note.CreatedTime)); $("#noteReadUpdatedTime").html(goNowToDatetime(note.UpdatedTime)); -} -Note.renderNoteContentReadOnly = function(note) { -} +}; //--------------------------- // 搜索 @@ -1245,7 +1251,7 @@ Note.isSameSearch = function(key) { Note.lastSearchTime = now; Note.lastKey = key; return false; -} +}; Note.searchNote = function() { var val = $("#searchNoteInput").val(); @@ -1287,7 +1293,7 @@ Note.searchNote = function() { // 不是这个原因, 下面的Note.changeNote会导致保存 // 设空, 防止发生上述情况 - // Note.curNoteId = ""; + // Note.clearCurNoteId(); Note.renderNotes(notes); if(!isEmpty(notes)) { @@ -1298,7 +1304,7 @@ Note.searchNote = function() { } }); // Note.lastSearch.abort(); -} +}; Note.$itemList = $('#noteItemList'); Note.getTargetById = function(noteId) { @@ -1654,7 +1660,7 @@ Note.getContextNotebooks = function(notebooks) { copys2.push(copy2); } return [moves, copys, copys2]; -} +}; // Notebook调用 Note.contextmenu = null; Note.notebooksCopy = []; // share会用到 @@ -1762,7 +1768,7 @@ Note.initContextmenu = function() { } Note.contextmenu = $("#noteItemList .item-my").contextmenu(noteListMenu); -} +}; // 附件 // 笔记的附件需要ajax获取 @@ -1816,7 +1822,7 @@ var Attach = { e.stopPropagation(); var attachId = $(this).closest('li').data("id"); var attach = self.attachsMap[attachId]; - var src = UrlPrefix + "/attach/download?attachId=" + attachId; + var src = UrlPrefix + "/api/file/getAttach?fileId=" + attachId; Note.toggleWriteable(); if(LEA.isMarkdownEditor() && MD) { MD.insertLink(src, attach.Title); @@ -1986,9 +1992,11 @@ Note.batch = { cancelInBatch: function () { Note.inBatch = false; + this.$body.removeClass('batch'); }, setInBatch: function () { Note.inBatch = true; + this.$body.addClass('batch'); }, // 是否是多选, 至少选了2个 @@ -2001,8 +2009,6 @@ Note.batch = { return false; }, - - // 得到开始的笔记 _startNoteO: null, // 开始选择的笔记 getStartNoteO: function () { @@ -2145,7 +2151,6 @@ Note.batch = { //---------- // 多选操作 //---------- - if (isMulti || isConti) { Note.curChangedSaveIt(); } @@ -2267,15 +2272,11 @@ Note.batch = { if (me.isInBatch()) { // 清空当前笔记, 不让自动保存 Note.clearCurNoteId(); - - me.$body.addClass('batch'); me.renderBatchNotes(); - me.setInBatch(); // 单个处理 } else { - me.$body.removeClass('batch'); me.clearRender(); me.cancelInBatch(); @@ -2397,16 +2398,6 @@ $(function() { Note.batch.init(); - // 当前笔记可以已修改 - $('#editorContent, #wmd-input, #noteTitle').on('keyup input', function() { - Note.curNoteIsDirtied(); - }); - /* - $('#addTagInput').click(function() { - Note.curNoteIsDirtied(); - }); - */ - //------------------ // 新建笔记 // 1. 直接点击新建 OR @@ -2459,6 +2450,7 @@ $(function() { // Note.initContextmenu(); $("#saveBtn").click(function() { + // 只有在这里, 才会force Note.curChangedSaveIt(true); }); @@ -2496,7 +2488,22 @@ $(function() { $('.toolbar-update').click(function() { Note.toggleWriteable(); }); + + // + // 笔记内容里的链接跳转 + $('#editorContent').on('click', 'a', function (e) { + e.preventDefault(); + if (Note.readOnly) { + var href = $(this).attr('href'); + window.open(href); + } + }); + $('#preview-contents').on('click', 'a', function (e) { + e.preventDefault(); + var href = $(this).attr('href'); + window.open(href); + }); }); // 定时器启动 -Note.startInterval(); +Note.startInterval(); \ No newline at end of file diff --git a/public/js/app/page.js b/public/js/app/page.js index fbf48a9..e24b202 100644 --- a/public/js/app/page.js +++ b/public/js/app/page.js @@ -558,7 +558,7 @@ function initEditor() { // 刷新时保存 参考autosave插件 window.onbeforeunload = function(e) { - Note.curChangedSaveIt(); + Note.curChangedSaveIt(true); } // 全局快捷键 diff --git a/public/js/app/tag.js b/public/js/app/tag.js index 501e22c..944a959 100644 --- a/public/js/app/tag.js +++ b/public/js/app/tag.js @@ -172,8 +172,6 @@ Tag.appendTag = function(tag, save) { // 笔记已污染 if(save) { - Note.curNoteIsDirtied(); - // 如果之前不存, 则添加之 if(!isExists) { Note.curChangedSaveIt(true, function() { @@ -373,4 +371,4 @@ $(function() { // $("#minTagNav").on("click", "li", searchTag); $("#myTag .folderBody").on("click", "li .tag-delete", deleteTag); -}); \ No newline at end of file +}); diff --git a/public/js/common.js b/public/js/common.js index 394cd2a..5e4fbf9 100644 --- a/public/js/common.js +++ b/public/js/common.js @@ -204,7 +204,6 @@ function formSerializeDataToJson(formSerializeData) { return $.extend(datas, arrObj); } - // ajax请求返回结果后的操作 // 用于ajaxGet(), ajaxPost() function _ajaxCallback(ret, successFunc, failureFunc) { @@ -229,9 +228,9 @@ function _ajaxCallback(ret, successFunc, failureFunc) { } } function _ajax(type, url, param, successFunc, failureFunc, async) { - log("-------------------ajax:"); - log(url); - log(param); + // log("-------------------ajax:"); + // log(url); + // log(param); if(typeof async == "undefined") { async = true; } else { @@ -279,9 +278,9 @@ function ajaxPost(url, param, successFunc, failureFunc, async) { _ajax("POST", url, param, successFunc, failureFunc, async); } function ajaxPostJson(url, param, successFunc, failureFunc, async) { - log("-------------------ajaxPostJson:"); - log(url); - log(param); + // log("-------------------ajaxPostJson:"); + // log(url); + // log(param); // 默认是异步的 if(typeof async == "undefined") { @@ -696,6 +695,13 @@ function goNowToDatetime(goNow) { if(!goNow) { return ""; } + if (typeof goNow == 'object') { + try { + return goNow.format("yyyy-M-d hh:mm:ss"); + } catch(e) { + return getCurDate(); + } + } return goNow.substr(0, 10) + " " + goNow.substr(11, 8); } function getCurDate() {