Merge branch 'dev-life' into dev

Conflicts:
	app/init.go
	app/service/UserService.go
	conf/app.conf
	conf/routes
	mongodb_backup/leanote_install_data/albums.metadata.json
	mongodb_backup/leanote_install_data/attachs.metadata.json
	mongodb_backup/leanote_install_data/blog_comments.metadata.json
	mongodb_backup/leanote_install_data/blog_likes.metadata.json
	mongodb_backup/leanote_install_data/blog_singles.metadata.json
	mongodb_backup/leanote_install_data/configs.bson
	mongodb_backup/leanote_install_data/configs.metadata.json
	mongodb_backup/leanote_install_data/email_logs.metadata.json
	mongodb_backup/leanote_install_data/files.metadata.json
	mongodb_backup/leanote_install_data/find_pwds.metadata.json
	mongodb_backup/leanote_install_data/group_users.metadata.json
	mongodb_backup/leanote_install_data/groups.metadata.json
	mongodb_backup/leanote_install_data/has_share_notes.metadata.json
	mongodb_backup/leanote_install_data/leanote.ShareNotes.metadata.json

mongodb_backup/leanote_install_data/leanote.has_share_notes.metadata.jso
n

mongodb_backup/leanote_install_data/note_content_histories.metadata.json
	mongodb_backup/leanote_install_data/note_contents.metadata.json
	mongodb_backup/leanote_install_data/note_images.metadata.json
	mongodb_backup/leanote_install_data/notebooks.bson
	mongodb_backup/leanote_install_data/notebooks.metadata.json
	mongodb_backup/leanote_install_data/notes.bson
	mongodb_backup/leanote_install_data/notes.metadata.json
	mongodb_backup/leanote_install_data/reports.metadata.json
	mongodb_backup/leanote_install_data/sessions.metadata.json
	mongodb_backup/leanote_install_data/share_notebooks.metadata.json
	mongodb_backup/leanote_install_data/share_notes.metadata.json
	mongodb_backup/leanote_install_data/suggestions.metadata.json
	mongodb_backup/leanote_install_data/system.indexes.bson
	mongodb_backup/leanote_install_data/tag_count.metadata.json
	mongodb_backup/leanote_install_data/tags.metadata.json
	mongodb_backup/leanote_install_data/themes.metadata.json
	mongodb_backup/leanote_install_data/tokens.metadata.json
	mongodb_backup/leanote_install_data/user_blogs.metadata.json
	mongodb_backup/leanote_install_data/users.bson
	mongodb_backup/leanote_install_data/users.metadata.json
	public/blog/themes/default/theme.json
	public/blog/themes/elegant/theme.json
	public/blog/themes/nav_fixed/theme.json
	public/images/logo/leanote_icon_blue.jpg
	public/js/app/note-min.js
	public/js/app/note.js
	public/js/app/notebook-min.js
	public/js/app/notebook.js
	public/js/app/tag-min.js
	public/js/app/tag.js
	public/tinymce/plugins/paste/plugin.dev.js
	public/tinymce/plugins/spellchecker/plugin.min.js
	public/tinymce/tinymce.dev.js
	public/tinymce/tinymce.jquery.dev.js
This commit is contained in:
life
2015-03-31 16:18:22 +08:00
510 changed files with 7769 additions and 2623 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -21,6 +21,10 @@ Notebook.getCurNotebookId = function() {
return Notebook.curNotebookId;
};
Notebook.getCurNotebook = function() {
return Notebook.cache[Notebook.curNotebookId];
};
// 笔记本的笔记数量更新
Notebook._updateNotebookNumberNotes = function(notebookId, n) {
var self = this;
@ -248,7 +252,17 @@ Notebook.renderNotebooks = function(notebooks) {
if(!notebooks || typeof notebooks != "object" || notebooks.length < 0) {
notebooks = [];
}
<<<<<<< HEAD
=======
// title可能有<script>
for(var i = 0, len = notebooks.length; i < len; ++i) {
var notebook = notebooks[i];
notebook.Title = trimTitle(notebook.Title);
}
>>>>>>> dev-life
notebooks = [{NotebookId: Notebook.allNotebookId, Title: getMsg("all"), drop:false, drag: false}].concat(notebooks);
notebooks.push({NotebookId: Notebook.trashNotebookId, Title: getMsg("trash"), drop:false, drag: false});
Notebook.notebooks = notebooks; // 缓存之
@ -579,6 +593,7 @@ Notebook.curActiveNotebookIsAll = function() {
// 2. ajax得到该notebook下的所有note
// 3. 使用Note.RederNotes()
// callback Pjax, 当popstate时调用
Notebook.changeNotebookSeq = 1;
Notebook.changeNotebook = function(notebookId, callback) {
var me = this;
Notebook.changeNotebookNav(notebookId);
@ -602,29 +617,38 @@ Notebook.changeNotebook = function(notebookId, callback) {
param = {};
// 得到全部的...
cacheNotes = Note.getNotesByNotebookId();
if(!isEmpty(cacheNotes)) { // 万一真的是没有呢?
// 数量一致
if(!isEmpty(cacheNotes)) {
if(callback) {
callback(cacheNotes);
} else {
Note.renderNotesAndFirstOneContent(cacheNotes);
}
return;
}
}
} else {
cacheNotes = Note.getNotesByNotebookId(notebookId);
if(!isEmpty(cacheNotes)) { // 万一真的是没有呢? 执行后面的ajax
var notebook = Notebook.cache[notebookId];
var len = cacheNotes ? cacheNotes.length : 0;
// alert( notebook.NumberNotes + " " + len);
if(len == notebook.NumberNotes) {
if(callback) {
callback(cacheNotes);
} else {
Note.renderNotesAndFirstOneContent(cacheNotes);
}
return;
} else {
Note.clearCacheByNotebookId(notebookId);
log('数量不一致');
}
}
// 2 得到笔记本
// 这里可以缓存起来, note按notebookId缓存
// 这里可能点击过快导致前面点击的后来才返回
me.showNoteAndEditorLoading();
<<<<<<< HEAD
ajaxGet(url, param, function(cacheNotes) {
if(callback) {
callback(cacheNotes);
@ -633,6 +657,25 @@ Notebook.changeNotebook = function(notebookId, callback) {
}
me.hideNoteAndEditorLoading();
});
=======
me.changeNotebookSeq++;
(function(seq) {
ajaxGet(url, param, function(cacheNotes) {
// 后面点击过快, 之前的结果不要了
if(seq != me.changeNotebookSeq) {
log("notebook changed too fast!");
log(cacheNotes);
return;
}
if(callback) {
callback(cacheNotes);
} else {
Note.renderNotesAndFirstOneContent(cacheNotes);
}
me.hideNoteAndEditorLoading();
});
})(me.changeNotebookSeq);
>>>>>>> dev-life
}
// 笔记列表与编辑器的mask loading

File diff suppressed because one or more lines are too long

View File

@ -996,7 +996,7 @@ LeaAce = {
aceEditor.setOption("wrap", "free");
aceEditor.setShowInvisibles(false);
aceEditor.setAutoScrollEditorIntoView(true);
aceEditor.setOption("maxLines", 100);
aceEditor.setOption("maxLines", 10000);
aceEditor.commands.addCommand({
name: "undo",
bindKey: {win: "Ctrl-z", mac: "Command-z"},

File diff suppressed because one or more lines are too long

View File

@ -33,8 +33,8 @@ Tag.t = $("#tags");
Tag.getTags = function() {
var tags = [];
Tag.t.children().each(function(){
var text = $(this).text();
text = text.substring(0, text.length - 1); // 把X去掉
var text = $(this).data('tag');
// text = text.substring(0, text.length - 1); // 把X去掉
text = Tag.mapCn2En[text] || text;
tags.push(text);
});
@ -121,7 +121,7 @@ Tag.renderReadOnlyTags = function(tags) {
// 添加tag
// tag = {classes:"label label-red", text:"红色"}
// tag = life
Tag.appendTag = function(tag) {
Tag.appendTag = function(tag, save) {
var isColor = false;
var classes, text;
@ -144,22 +144,34 @@ Tag.appendTag = function(tag) {
classes = "label label-default";
}
}
<<<<<<< HEAD
=======
var rawText = text;
>>>>>>> dev-life
if(LEA.locale == "zh") {
text = Tag.mapEn2Cn[text] || text;
rawText = Tag.mapCn2En[rawText] || rawText;
}
<<<<<<< HEAD
text = text.replace(/[\r\n]/g, '');
tag = tt('<span class="?">?<i title="' + getMsg("delete") + '">X</i></span>', classes, Note._toHtmlEntity(text));
=======
tag = tt('<span class="?" data-tag="?">?<i title="' + getMsg("delete") + '">X</i></span>', classes, text, text);
>>>>>>> dev-life
// 避免重复
var isExists = false;
$("#tags").children().each(function() {
if (isColor) {
var tagHtml = $("<div></div>").append($(this).clone()).html();
if (tagHtml == tag) {
$(this).remove();
isExists = true;
}
} else if (text + "X" == $(this).text()) {
$(this).remove();
isExists = true;
}
});
@ -170,6 +182,22 @@ Tag.appendTag = function(tag) {
if (!isColor) {
reRenderTags();
}
// 笔记已污染
if(save) {
Note.curNoteIsDirtied();
// 如果之前不存, 则添加之
if(!isExists) {
Note.curChangedSaveIt(true, function() {
ajaxPost("/tag/updateTag", {tag: rawText}, function(ret) {
if(reIsOk(ret)) {
Tag.addTagNav(ret.Item);
}
});
});
}
}
}
// 为了颜色间隔, add, delete时调用
@ -186,24 +214,66 @@ function reRenderTags() {
i++;
}
});
}
};
// 删除tag
Tag.removeTag = function($target) {
var tag = $target.data('tag');
$target.remove();
reRenderTags();
if(LEA.locale == "zh") {
tag = Tag.mapCn2En[tag] || tag;
}
Note.curChangedSaveIt(true, function() {
ajaxPost("/tag/updateTag", {tag: tag}, function(ret) {
if(reIsOk(ret)) {
Tag.addTagNav(ret.Item);
}
});
});
};
//-----------
// 左侧nav en -> cn
Tag.tags = [];
Tag.renderTagNav = function(tags) {
var me = this;
tags = tags || [];
Tag.tags = tags;
$("#tagNav").html('');
for(var i in tags) {
var tag = tags[i];
if(tag == "red" || tag == "blue" || tag == "yellow" || tag == "green") {
continue;
var noteTag = tags[i];
var tag = noteTag.Tag;
var text = tag;
if(LEA.locale == "zh") {
var text = Tag.mapEn2Cn[tag] || text;
}
<<<<<<< HEAD
var text = Note._toHtmlEntity(Tag.mapEn2Cn[tag] || tag);
text = text.replace(/[\r\n]/g, '');
var classes = Tag.classes[tag] || "label label-default";
$("#tagNav").append(tt('<li data-tag="?"><a> <span class="?">?</span></li>', text, classes, text));
=======
var classes = Tag.classes[tag] || "label label-default";
$("#tagNav").append(tt('<li data-tag="?"><a> <span class="?">?</span> <span class="tag-delete">X</span></li>', tag, classes, text));
>>>>>>> dev-life
}
}
};
// 添加的标签重新render到左边, 放在第一个位置
// 重新render
Tag.addTagNav = function(newTag) {
var me = this;
for(var i in me.tags) {
var noteTag = me.tags[i];
if(noteTag.Tag == newTag.Tag) {
me.tags.splice(i, 1);
break;
}
}
me.tags.unshift(newTag);
me.renderTagNav(me.tags);
};
// 事件
$(function() {
@ -251,7 +321,7 @@ $(function() {
Tag.appendTag({
classes : a.attr("class"),
text : a.text()
});
}, true);
});
// 这是个问题, 为什么? 捕获不了事件?, input的blur造成
/*
@ -266,14 +336,33 @@ $(function() {
*/
$("#tags").on("click", "i", function() {
$(this).parent().remove();
reRenderTags();
Tag.removeTag($(this).parent());
});
<<<<<<< HEAD
=======
//----------
//
function deleteTag() {
$li = $(this).closest('li');
var tag = $.trim($li.data("tag"));
if(confirm("Are you sure ?")) {
ajaxPost("/tag/deleteTag", {tag: tag}, function(re) {
if(reIsOk(re)) {
var item = re.Item; // 被删除的
Note.deleteNoteTag(item, tag);
$li.remove();
}
});
};
}
>>>>>>> dev-life
//-------------
// nav 标签搜索
function searchTag() {
var tag = $.trim($(this).data("tag"));
var $li = $(this).closest('li');
var tag = $.trim($li.data("tag"));
// tag = Tag.mapCn2En[tag] || tag;
// 学习changeNotebook
@ -284,8 +373,15 @@ $(function() {
// 2 先清空所有
// 也会把curNoteId清空
Note.clearAll();
<<<<<<< HEAD
$("#tagSearch").html($(this).html()).show();
=======
$("#tagSearch").html($li.html()).show();
$("#tagSearch .tag-delete").remove();
>>>>>>> dev-life
showLoading();
ajaxGet("/note/searchNoteByTags", {tags: [tag]}, function(notes) {
hideLoading();
@ -301,6 +397,8 @@ $(function() {
}
});
}
$("#myTag .folderBody").on("click", "li", searchTag);
$("#minTagNav").on("click", "li", searchTag);
$("#myTag .folderBody").on("click", "li .label", searchTag);
// $("#minTagNav").on("click", "li", searchTag);
$("#myTag .folderBody").on("click", "li .tag-delete", deleteTag);
});

File diff suppressed because one or more lines are too long

View File

@ -759,7 +759,7 @@ function post(url, param, func, btnId) {
// 是否是正确的email
function isEmail(email) {
var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[0-9a-zA-Z]{2,3}$/;
var myreg = /^([a-zA-Z0-9]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+@([a-zA-Z0-9\-]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+\.[0-9a-zA-Z]{2,3}$/;
return myreg.test(email);
}
@ -967,8 +967,9 @@ var vd = {
return result;
},
isEmail: function(emailValue){
var emailPattern=/^[^@.]+@([^@.]+\.)+[^@.]+$/; //邮箱的正则表达式
var emailPattern=/^([a-zA-Z0-9]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+@([a-zA-Z0-9\-]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+\.[0-9a-zA-Z]{2,3}$/; //邮箱的正则表达式
result=emailPattern.test(emailValue);
return result;
},
isBlank: function(o) {
@ -1024,7 +1025,7 @@ var vd = {
if(val === "" && !is_required(target)) {
return true;
}
return isEmail(val);
return vd.isEmail(val);
},
noSpecialChars: function(target) {
var val = get_val(target);
@ -1275,4 +1276,8 @@ function setHash(key, value) {
}
}
location.href = "#" + str;
}
}
var trimTitle = function(title) {
return title.replace(/<.*?script.*?>/g, '');
};

View File

@ -11,7 +11,7 @@ pre.prettyprint {
}
code.prettyprint,pre.prettyprint {
padding: 8px;
padding: 18px;
background-color: #f7f7f9;
border: 1px solid #e1e1e8;
-moz-border-radius: 3px;