diff --git a/node_modules/notebook.js b/node_modules/notebook.js index c237faf2..8e0b612c 100644 --- a/node_modules/notebook.js +++ b/node_modules/notebook.js @@ -434,6 +434,7 @@ var Notebook = { var me = this; // 服务器没有, 但是是发送更新的, 所以需要作为添加 + // 情况很少见 if(notebookSyncInfo.changeNeedAdds) { var needAddNotebooks = notebookSyncInfo.changeNeedAdds; for(var i in needAddNotebooks) { @@ -442,6 +443,7 @@ var Notebook = { } } + // pull // 处理添加的, 更新的, 这里前端统一重新渲染!! var adds = notebookSyncInfo.adds; if (!isEmpty(adds) || !isEmpty(notebookSyncInfo.updates)) { @@ -452,11 +454,15 @@ var Notebook = { Web.reloadNotebook(); } + // push if (!isEmpty(notebookSyncInfo.changeAdds)) { - console.log(' has changeAdds notebook') - console.log(notebookSyncInfo.changeAdds) + console.log(' has changeAdds notebook', notebookSyncInfo.changeAdds); Web.addChangeNotebook(notebookSyncInfo.changeAdds); } + if (!isEmpty(notebookSyncInfo.changeUpdates)) { + console.log(' has changeUpdates notebook', notebookSyncInfo.changeUpdates); + Web.updateChangeNotebook(notebookSyncInfo.changeUpdates); + } if (!isEmpty(notebookSyncInfo.deletes)) { // 处理删除的 diff --git a/node_modules/sync.js b/node_modules/sync.js index 86db55b7..03597727 100644 --- a/node_modules/sync.js +++ b/node_modules/sync.js @@ -32,7 +32,7 @@ syncProgress 设置 var Sync = { // 同步的信息, 返回给调用者 _syncInfo: { - notebook: {changeAdds: [], changeConflicts: [], adds: [], deletes: [], updates: []}, + notebook: {changeAdds: [], changeConflicts: [], adds: [], deletes: [], updates: [], changeUpdates: []}, note: {changeAdds: [], changeConflicts: [], adds: [], deletes: [], updates: [], conflicts: [], errors: []}, tag: {} }, @@ -84,7 +84,7 @@ var Sync = { // 同步信息 me._syncInfo = { - notebook: {ok: false, changeAdds: [], changeConflicts: [], changeNeedAdds: [], adds: [], deletes: [], updates: []}, + notebook: {ok: false, changeAdds: [], changeConflicts: [], changeNeedAdds: [], adds: [], deletes: [], updates: [], changeUpdates: []}, note: {ok: false, adds: [], changeAdds: [], changeConflicts: [], changeUpdates:[], changeNeedAdds: [], deletes: [], updates: [], conflicts: [], errors: []}, tag: {ok: false, adds: [], changeAdds: [], changeConflicts: [], changeNeedAdds: [], deletes: [], updates: [], conflicts: []}, }; @@ -884,8 +884,8 @@ var Sync = { } else if(newNotebook.Msg == 'notExists') { // 服务器端没有, 那么要作为添加 // 可能服务器上已删除, 此时应该要作为添加而不是更新 - me._syncInfo.notebook.changeNeedAdds.push(notebook); - // me.fixSynced('notebook', 'changeNeedAdds', notebook); + // me._syncInfo.notebook.changeNeedAdds.push(notebook); + me.fixSynced('notebook', 'changeNeedAdds', notebook); } // me.checkNeedIncSyncAgain(newNotebook.Usn); @@ -894,17 +894,15 @@ var Sync = { else { // 更新 // TODO 后端updateNotebook只要传Usn回来即可 - console.log(" 返回来的notebook" + newNotebook.Title) + console.log(" 返回来的notebook " + newNotebook.Title) Notebook.updateNotebookForceForSendChange(notebook.NotebookId, newNotebook, function() { if(notebook.LocalIsNew) { - // 没用 - me._syncInfo.notebook.changeAdds.push(newNotebook); - // me.fixSynced('notebook', 'changeAdds', newNotebook); + // me._syncInfo.notebook.changeAdds.push(newNotebook); + me.fixSynced('notebook', 'changeAdds', newNotebook); } else { - // 没用 - // me._syncInfo.notebook.updates.push(newNotebook); - me.fixSynced('notebook', 'updates', newNotebook); + // me._syncInfo.notebook.changeUpdates.push(newNotebook); + me.fixSynced('notebook', 'changeUpdates', newNotebook); } // 这里才cb(), 因为先添加父, 再添加子 diff --git a/node_modules/web.js b/node_modules/web.js index d1519cf4..d4ecced3 100644 --- a/node_modules/web.js +++ b/node_modules/web.js @@ -57,7 +57,10 @@ var Web = { }, addChangeNotebook: function(notebooks) { var me = this; - me.Notebook.addChange(notebooks); + me.Notebook.addChanges(notebooks); + }, + updateChangeNotebook: function (notebooks) { + this.Notebook.updateChanges(notebooks); }, /* fixNotebookConflicts: function(notebookInfo) { diff --git a/public/js/app/note.js b/public/js/app/note.js index 0d61c9ad..51dbdf66 100644 --- a/public/js/app/note.js +++ b/public/js/app/note.js @@ -2336,7 +2336,7 @@ Note.initContextmenu = function() { } }); - var ms = Note.getContextNotebooksSys(notebooks); + // var ms = Note.getContextNotebooksSys(notebooks); // this.move.submenu = ms[0]; // this.copy.submenu = ms[1]; diff --git a/public/js/app/notebook.js b/public/js/app/notebook.js index 06938238..90ca2765 100644 --- a/public/js/app/notebook.js +++ b/public/js/app/notebook.js @@ -3,7 +3,6 @@ Notebook.cache = {}; // notebookId => {}; Notebook.notebooks = []; // 按次序 //
  • CSS
  • Notebook.notebookNavForListNote = ""; // html 为了note list上面和新建时的ul -Notebook.notebookNavForNewNote = ""; // html 为了note list上面和新建时的ul // 设置缓存 Notebook.setCache = function(notebook) { @@ -148,6 +147,7 @@ Notebook.getSubNotebooks = function(parentNotebookId) { } return nodes; }; + /** * Simple Tree Setting(基本版) * 笔记移动、复制时使用 @@ -202,16 +202,13 @@ Notebook.getTreeSetting = function(isSearch, isShare) { icoObj = $("#" + treeId + " #" + treeNode.tId + "_ico"); switchObj.remove(); icoObj.before(switchObj); - if(!isShare) { - if(!Notebook.isAllNotebookId(treeNode.NotebookId) && !Notebook.isTrashNotebookId(treeNode.NotebookId)) { - icoObj.after($('' + (treeNode.NumberNotes || 0) + '')); - icoObj.after($('')); - } - } else { - if(!Share.isDefaultNotebookId(treeNode.NotebookId)) { - icoObj.after($('')); - } + + if(!Notebook.isAllNotebookId(treeNode.NotebookId) && !Notebook.isTrashNotebookId(treeNode.NotebookId)) { + icoObj.after($('' + (treeNode.NumberNotes || 0) + '')); + // icoObj.after($('')); + icoObj.after($('')); } + if (treeNode.level > 1) { var spaceStr = ""; switchObj.before(spaceStr); @@ -270,34 +267,22 @@ Notebook.getTreeSetting = function(isSearch, isShare) { // {siblings: [id1, id2], parentNotebookId: 'xx', curNotebookId: 'yy'} NotebookService.dragNotebooks(ajaxData.curNotebookId, ajaxData.parentNotebookId, ajaxData.siblings); - // ajaxPost("/notebook/dragNotebooks", {data: JSON.stringify(ajaxData)}); - - // 这里慢! setTimeout(function() { Notebook.changeNav(); }, 100); } - if(!isShare) { - var onClick = function(e, treeId, treeNode) { - var notebookId = treeNode.NotebookId; - Notebook.changeNotebook(notebookId); - }; - var onDblClick = function(e) { - var notebookId = $(e.target).attr("notebookId"); - if(!Notebook.isAllNotebookId(notebookId) && !Notebook.isTrashNotebookId(notebookId)) { - self.updateNotebookTitle(e.target); - } + var onClick = function(e, treeId, treeNode) { + var notebookId = treeNode.NotebookId; + Notebook.changeNotebook(notebookId); + }; + var onDblClick = function(e) { + var notebookId = $(e.target).attr("notebookId"); + if(!Notebook.isAllNotebookId(notebookId) && !Notebook.isTrashNotebookId(notebookId)) { + self.updateNotebookTitle(e.target); } - } else { - var onClick = function(e, treeId, treeNode) { - var notebookId = treeNode.NotebookId; - var fromUserId = $(e.target).closest('.friend-notebooks').attr("fromUserId"); - Share.changeNotebook(fromUserId, notebookId); - }; - var onDblClick = null; - } - + }; + var setting = { view: { showLine: false, @@ -341,6 +326,8 @@ Notebook.getTreeSetting = function(isSearch, isShare) { $('#numberNotes_' + notebookId).html(Notebook._subNotebookNumberNotes[notebookId]); Notebook._subNotebookNumberNotes[notebookId] = undefined; } + // 子的dirty, new状态 + Notebook.setDirtyOrNewForSub(notebookId); }); } } @@ -373,7 +360,8 @@ Notebook.getTreeSetting = function(isSearch, isShare) { }; return setting; -} +}; + Notebook.allNotebookId = "0"; Notebook.trashNotebookId = "-1"; Notebook.curNotebookIsTrashOrAll = function() { @@ -499,13 +487,6 @@ Notebook.searchNotebookForAddNote = function(key) { notebooks2.push(notebooks[i]); } } - if(isEmpty(notebooks2)) { - $("#notebookNavForNewNote").html(""); - } else { - $("#notebookNavForNewNote").html(self.getChangedNotebooks(notebooks2)); - } - } else { - $("#notebookNavForNewNote").html(self.everNavForNewNote); } } @@ -531,42 +512,9 @@ Notebook.searchNotebookForList = function(key) { self.tree2 = null; $search.hide(); $notebookList.show(); - $("#notebookNavForNewNote").html(self.everNavForNewNote); } -} - - -// 修改,添加,删除notebook后调用 -// 改变nav -// 直接从html中取! -Notebook.getChangedNotebooks = function(notebooks) { - var self = this; - var navForNewNote = ""; - - var len = notebooks.length; - for(var i = 0; i < len; ++i) { - var notebook = notebooks[i]; - - var classes = ""; - if(!isEmpty(notebook.Subs)) { - classes = "dropdown-submenu"; - } - var eachForNew = tt(''; - - navForNewNote += eachForNew; - } - return navForNewNote; }; -Notebook.everNavForNewNote = ""; Notebook.everNotebooks = []; Notebook.changeNav = function() { var self = Notebook; @@ -579,21 +527,10 @@ Notebook.changeNav = function() { pureNotebooks.push(notebooks[i]); } } - var html = self.getChangedNotebooks(pureNotebooks); - - self.everNavForNewNote = html; self.everNotebooks = pureNotebooks; - - $("#notebookNavForNewNote").html(html); - // 移动, 复制重新来, 因为nav变了, 移动至-----的notebook导航也变了 - // 这里速度很慢 - // var t1 = (new Date()).getTime(); Note.initContextmenu(); - // Share.initContextmenu(Note.notebooksCopy); - // var t2 = (new Date()).getTime(); - // log(t2-t1); -} +}; /** * 我的共享notebooks @@ -949,6 +886,37 @@ Notebook.updateNotebookTitle = function(target) { self.tree.editName(self.tree.getNodeByTId(notebookId)); } }; +Notebook.subNotebookDirtyOrNew = {}; // notebookId => {dirty: new: } +Notebook.setDirtyOrNew = function (notebookId, isDirty, isNew) { + if (this._setDirtyOrNew(notebookId, isDirty, isNew)) { + if (this.subNotebookDirtyOrNew[notebookId]) { + delete this.subNotebookDirtyOrNew[notebookId]; + } + } + // 没找到, 可能是子笔记本, 还没展开 + else { + this.subNotebookDirtyOrNew[notebookId] = {isDirty: isDirty, isNew: isNew}; + } +}; + +Notebook.setDirtyOrNewForSub = function (notebookId, isDirty, isNew) { + var d = this.subNotebookDirtyOrNew[notebookId]; + if (!d) { + return; + } + this._setDirtyOrNew(notebookId, d.isDirty, d.isNew); +}; + +Notebook._setDirtyOrNew = function (notebookId, isDirty, isNew) { + var $o = $('#' + notebookId + '_a'); + if ($o.length) { + isDirty ? $o.addClass('nb-dirty') : $o.removeClass('nb-dirty'); + isNew ? $o.addClass('nb-new') : $o.removeClass('nb-new'); + return true; + } + return false; +}; + Notebook.doUpdateNotebookTitle = function(notebookId, newTitle) { var self = Notebook; newTitle = trimTitle(newTitle); @@ -957,13 +925,15 @@ Notebook.doUpdateNotebookTitle = function(notebookId, newTitle) { Notebook.cache[notebookId].Title = newTitle; // 改变nav Notebook.changeNav(); - + // 同步 if(self.tree2) { var notebook = self.tree.getNodeByTId(notebookId); notebook.Title = newTitle; self.tree.updateNode(notebook); // 同步到对方 } + + self.setDirtyOrNew(notebookId, true); }); }; @@ -1117,10 +1087,21 @@ Notebook.fixSyncConflict = function(note, newNote) { */ }; +// push // 本地 -> 添加到服务器上的 -// 不用做任何操作 -Notebook.addChange = function(notebooks) { - return; +// 前端取消dirty +Notebook.addChanges = function(notebooks) { + var me = this; + if(isEmpty(notebooks)) { + return; + } + for(var i = 0; i < notebooks.length; ++i) { + var notebook = notebooks[i]; + me.setDirtyOrNew(notebook.NotebookId, false, false); + } +}; +Notebook.updateChanges = function(notebooks) { + this.addChanges(notebooks); }; // 服务器adds/updates后, 一起渲染 @@ -1132,10 +1113,13 @@ Notebook.reload = function() { // 定位到某个笔记本下 Notebook.expandNotebookTo(curNotebookId); + + // 为了移动/复制笔记 + me.changeNav(); }); }; -// 弃用, 一起渲染 +// 弃用, 一起渲染 reload // notebooks // <- server 服务器端添加过来的 // ? 如果是子先添加了, 再父添加呢? @@ -1153,7 +1137,7 @@ Notebook.addSync = function(notebooks) { true, true, false); } }; -// 弃用, 一起渲染 +// 弃用, 一起渲染 reload // 更新 // 不对移动做修改, 只修改标题 Notebook.updateSync = function(notebooks) { diff --git a/public/js/jquery.ztree.all-3.5.js b/public/js/jquery.ztree.all-3.5.js index 616fa032..99ac753e 100644 --- a/public/js/jquery.ztree.all-3.5.js +++ b/public/js/jquery.ztree.all-3.5.js @@ -1193,7 +1193,14 @@ } // life // 加入notebookId - html.push(" 0) ? "href='" + url + "'" : ""), " target='",view.makeNodeTarget(node),"' style='", fontStyle.join(''), "'", ' notebookId="' + node.NotebookId + '" '); if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) {html.push("title='", title.replace(/'/g,"'").replace(//g,'>'),"'");} diff --git a/public/themes/basic.less b/public/themes/basic.less index b530794a..5eea50c6 100644 --- a/public/themes/basic.less +++ b/public/themes/basic.less @@ -524,32 +524,6 @@ h3 { } } -.item-dirty { - .dirty-bg { - position: absolute; - right: 0; - bottom: 0; - z-index: 1; - width: 0; - height: 0; - border-top: 29px solid transparent; - border-right: 23px solid #040421; - } - - &::after { - content: "\f093"; - position: absolute; - right: 1px; - bottom: 1px; - z-index: 2; - color: #FFF; - /* font-size: 5px; */ - font: normal normal normal 14px/1 FontAwesome; - /* font-size: inherit; */ - text-rendering: auto; - -webkit-font-smoothing: antialiased; - } -} #noteItemList { user-select: none; @@ -672,6 +646,7 @@ h3 { padding: 0 3px; } + // 设置 .notebook-setting { display: none; @@ -2326,5 +2301,54 @@ img::selection { list-style: none; } +// dirty + +.nb-dirty:after, +.nb-new:after { + content: ""; + width: 7px; + height: 7px; + background: #FF6363; + position: absolute; + right: 4px; + top: 11px; + border-radius: 50%; +} + +.item-dirty { + &::after { + content: ""; + width: 7px; + height: 7px; + background: #FF6363; + position: absolute; + right: 7px; + bottom: 6px; + border-radius: 50%; + } + // .dirty-bg { + // position: absolute; + // right: 0; + // bottom: 0; + // z-index: 1; + // width: 0; + // height: 0; + // border-top: 29px solid transparent; + // border-right: 23px solid #040421; + // } + + // &::after { + // content: "\f093"; + // position: absolute; + // right: 1px; + // bottom: 1px; + // z-index: 2; + // color: #FFF; + // font: normal normal normal 14px/1 FontAwesome; + // text-rendering: auto; + // -webkit-font-smoothing: antialiased; + // } +} + @import '../css/includes/traffic.less'; @import '../css/includes/ani.less';