test
This commit is contained in:
212
public/js/app/attachment_upload.js
Normal file
212
public/js/app/attachment_upload.js
Normal file
@ -0,0 +1,212 @@
|
||||
// upload attachment
|
||||
// 依赖note
|
||||
var urlPrefix = UrlPrefix;
|
||||
define('attachment_upload', ['jquery.ui.widget', 'fileupload'], function(){
|
||||
// Helper function that formats the file sizes
|
||||
function formatFileSize(bytes) {
|
||||
if (typeof bytes !== 'number') {
|
||||
return '';
|
||||
}
|
||||
if (bytes >= 1000000000) {
|
||||
return (bytes / 1000000000).toFixed(2) + ' GB';
|
||||
}
|
||||
if (bytes >= 1000000) {
|
||||
return (bytes / 1000000).toFixed(2) + ' MB';
|
||||
}
|
||||
return (bytes / 1000).toFixed(2) + ' KB';
|
||||
}
|
||||
|
||||
function setDropStyle(dropzoneId, formId) {
|
||||
// drag css
|
||||
var dropZone = $(dropzoneId);
|
||||
$(formId).bind('dragover', function (e) {
|
||||
e.preventDefault();
|
||||
var timeout = window.dropZoneTimeoutAttach;
|
||||
if(timeout) {
|
||||
clearTimeout(timeout);
|
||||
}
|
||||
|
||||
var found = false,
|
||||
node = e.target;
|
||||
do {
|
||||
if (node === dropZone[0]) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
node = node.parentNode;
|
||||
} while (node != null);
|
||||
if (found) {
|
||||
dropZone.addClass('hover');
|
||||
} else {
|
||||
dropZone.removeClass('hover');
|
||||
}
|
||||
window.dropZoneTimeoutAttach = setTimeout(function () {
|
||||
window.dropZoneTimeoutAttach = null;
|
||||
dropZone.removeClass('in hover');
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
|
||||
setDropStyle("#dropAttach", "#uploadAttach");
|
||||
setDropStyle("#dropAvatar", "#uploadAvatar");
|
||||
|
||||
var initUploader = function() {
|
||||
$('.dropzone .btn-choose-file').click(function() {
|
||||
$(this).parent().find('input').click();
|
||||
});
|
||||
|
||||
var $msg = $('#attachUploadMsg');
|
||||
// Initialize the jQuery File Upload plugin
|
||||
$('#uploadAttach').fileupload({
|
||||
dataType: 'json',
|
||||
// This element will accept file drag/drop uploading
|
||||
dropZone: $('#dropAttach'),
|
||||
formData: function(form) {
|
||||
return [{name: 'noteId', value: Note.curNoteId}] // 传递笔记本过去
|
||||
},
|
||||
// This function is called when a file is added to the queue;
|
||||
// either via the browse button, or via drag/drop:
|
||||
add: function(e, data) {
|
||||
var note = Note.getCurNote();
|
||||
if(!note || note.IsNew) {
|
||||
alert("This note hasn't saved, please save it firstly!")
|
||||
return;
|
||||
}
|
||||
var tpl = $('<div class="alert alert-info"><img class="loader" src="/tinymce/plugins/leaui_image/public/images/ajax-loader.gif"> <a class="close" data-dismiss="alert">×</a></div>');
|
||||
|
||||
// Append the file name and file size
|
||||
tpl.append(data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small>');
|
||||
|
||||
// Add the HTML to the UL element
|
||||
$msg.html(tpl);
|
||||
data.context = $msg;
|
||||
|
||||
// 检查文件大小
|
||||
var size = data.files[0].size;
|
||||
var maxFileSize = +GlobalConfigs["uploadAttachSize"] || 100;
|
||||
if(typeof size == 'number' && size > 1024 * 1024 * maxFileSize) {
|
||||
tpl.find("img").remove();
|
||||
tpl.removeClass("alert-info").addClass("alert-danger");
|
||||
tpl.append(" Warning: File size is bigger than " + maxFileSize + "M");
|
||||
setTimeout((function(tpl) {
|
||||
return function() {
|
||||
tpl.remove();
|
||||
}
|
||||
})(tpl), 3000);
|
||||
return;
|
||||
}
|
||||
|
||||
// Automatically upload the file once it is added to the queue
|
||||
var jqXHR;
|
||||
setTimeout(function() {
|
||||
jqXHR = data.submit();
|
||||
}, 10);
|
||||
},
|
||||
/*
|
||||
progress: function (e, data) {
|
||||
},
|
||||
*/
|
||||
done: function(e, data) {
|
||||
if (data.result.Ok == true) {
|
||||
data.context.html("");
|
||||
Attach.addAttach(data.result.Item);
|
||||
} else {
|
||||
var re = data.result;
|
||||
data.context.html("");
|
||||
var tpl = $('<div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div>');
|
||||
tpl.append('<b>Error:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.result.Msg);
|
||||
data.context.html(tpl);
|
||||
setTimeout((function(tpl) {
|
||||
return function() {
|
||||
tpl.remove();
|
||||
}
|
||||
})(tpl), 3000);
|
||||
}
|
||||
$("#uploadAttachMsg").scrollTop(1000);
|
||||
},
|
||||
fail: function(e, data) {
|
||||
data.context.html("");
|
||||
var tpl = $('<div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div>');
|
||||
tpl.append('<b>Error:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.errorThrown);
|
||||
data.context.html(tpl);
|
||||
setTimeout((function(tpl) {
|
||||
return function() {
|
||||
tpl.remove();
|
||||
}
|
||||
})(tpl), 3000);
|
||||
|
||||
$("#uploadAttachMsg").scrollTop(1000);
|
||||
}
|
||||
});
|
||||
|
||||
//-------------------
|
||||
|
||||
var $msg2 = $('#avatarUploadMsg');
|
||||
$('#uploadAvatar').fileupload({
|
||||
dataType: 'json',
|
||||
dropZone: $('#dropAvatar'),
|
||||
add: function(e, data) {
|
||||
var tpl = $('<div class="alert alert-info"><img class="loader" src="/tinymce/plugins/leaui_image/public/images/ajax-loader.gif"> <a class="close" data-dismiss="alert">×</a></div>');
|
||||
|
||||
// Append the file name and file size
|
||||
tpl.append(data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small>');
|
||||
|
||||
// Add the HTML to the UL element
|
||||
$msg2.html(tpl);
|
||||
data.context = $msg2;
|
||||
|
||||
// 检查文件大小
|
||||
var size = data.files[0].size;
|
||||
var maxFileSize = +GlobalConfigs["uploadAvatarSize"] || 100;
|
||||
if(typeof size == 'number' && size > 1024 * 1024 * maxFileSize) {
|
||||
tpl.find("img").remove();
|
||||
tpl.removeClass("alert-info").addClass("alert-danger");
|
||||
tpl.append(" Warning: File size is bigger than " + maxFileSize + "M");
|
||||
setTimeout((function(tpl) {
|
||||
return function() {
|
||||
tpl.remove();
|
||||
}
|
||||
})(tpl), 3000);
|
||||
return;
|
||||
}
|
||||
|
||||
// Automatically upload the file once it is added to the queue
|
||||
var jqXHR;
|
||||
setTimeout(function() {
|
||||
jqXHR = data.submit();
|
||||
}, 10);
|
||||
},
|
||||
done: function(e, data) {
|
||||
if (data.result.Ok == true) {
|
||||
data.context.html("");
|
||||
var re = data.result;
|
||||
$("#avatar").attr("src", UrlPrefix + "/" + re.Id);
|
||||
} else {
|
||||
var re = data.result;
|
||||
data.context.html("");
|
||||
var tpl = $('<div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div>');
|
||||
tpl.append('<b>Error:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.result.Msg);
|
||||
data.context.html(tpl);
|
||||
setTimeout((function(tpl) {
|
||||
return function() {
|
||||
tpl.remove();
|
||||
}
|
||||
})(tpl), 3000);
|
||||
}
|
||||
},
|
||||
fail: function(e, data) {
|
||||
data.context.html("");
|
||||
var tpl = $('<div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div>');
|
||||
tpl.append('<b>Error:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.errorThrown);
|
||||
data.context.html(tpl);
|
||||
setTimeout((function(tpl) {
|
||||
return function() {
|
||||
tpl.remove();
|
||||
}
|
||||
})(tpl), 3000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
initUploader();
|
||||
});
|
207
public/js/app/blog/common.js
Normal file
207
public/js/app/blog/common.js
Normal file
@ -0,0 +1,207 @@
|
||||
// 返回是否是re.Ok == true
|
||||
function reIsOk(re) {
|
||||
return re && typeof re == "object" && re.Ok;
|
||||
}
|
||||
function showAlert(id, msg, type, id2Focus) {
|
||||
$(id).html(msg).removeClass("alert-danger").removeClass("alert-success").removeClass("alert-warning").addClass("alert-" + type).show();
|
||||
if(id2Focus) {
|
||||
$(id2Focus).focus();
|
||||
}
|
||||
}
|
||||
function hideAlert(id, timeout) {
|
||||
if(timeout) {
|
||||
setTimeout(function() {
|
||||
$(id).hide();
|
||||
}, timeout);
|
||||
} else {
|
||||
$(id).hide();
|
||||
}
|
||||
}
|
||||
function ajaxGet(url, param, func) {
|
||||
$.get(url, param, func);
|
||||
}
|
||||
function ajaxPost(url, param, func) {
|
||||
$.post(url, param, func);
|
||||
}
|
||||
function goLogin(){
|
||||
var loginUrl = urlPrefix + '/login?from=' + encodeURI(location.href);
|
||||
location.href = loginUrl;
|
||||
}
|
||||
function goRegister() {
|
||||
var registerUrl = urlPrefix + '/register?from=' + encodeURI(location.href);
|
||||
location.href = registerUrl;
|
||||
}
|
||||
function needLogin() {
|
||||
if(typeof visitUserInfo == "undefined" || !visitUserInfo || !visitUserInfo.UserId) {
|
||||
// 弹框之
|
||||
var loginUrl = urlPrefix + '/login?from=' + encodeURI(location.href);
|
||||
var registerUrl = urlPrefix + '/register?from=' + encodeURI(location.href);
|
||||
var modal = BootstrapDialog.show({
|
||||
title: "你还未登录",
|
||||
message: '<div class="needLogin" style="border:none"><a href="' + loginUrl + '">立即登录</a>, 发表评论.<br />没有帐号? <a href="' + registerUrl +'">立即注册</a>',
|
||||
nl2br: false
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function scrollToTarget(t, fixed) {
|
||||
if(!fixed) {
|
||||
fixed = 0;
|
||||
}
|
||||
var $t = $(t)
|
||||
var targetOffset = $t.offset().top + fixed;
|
||||
$('html,body').animate({scrollTop: targetOffset}, 300);
|
||||
}
|
||||
|
||||
var windowParam = 'width=700, height=580, top=180, left=320, toolbar=no, menubar=no, scrollbars=no, location=yes, resizable=no, status=no';
|
||||
function getShareUrl(noteId) {
|
||||
return viewUrl + "/" + noteId;
|
||||
}
|
||||
function getShareTitle(title) {
|
||||
return encodeURI(title + " (来自leanote.com)");
|
||||
}
|
||||
function shareSinaWeibo(noteId, title, pic) {
|
||||
var url = "http://service.weibo.com/share/share.php?title=" + getShareTitle(title) + "&url=" + getShareUrl(noteId);
|
||||
window.open(url, 'Share', windowParam);
|
||||
}
|
||||
function shareTencentWeibo(noteId, title, pic) {
|
||||
var _appkey = '801542571';
|
||||
var url = "http://share.v.t.qq.com/index.php?c=share&a=index&appkey=" + _appkey +"&title=" + getShareTitle(title) + "&url=" + getShareUrl(noteId) +"&pic=" + pic;
|
||||
window.open(url, 'Share', windowParam);
|
||||
}
|
||||
function shareQQ(noteId, title, pic) {
|
||||
var url = 'http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + getShareUrl(noteId) + '&title=' + title + '&pics=' + pic;
|
||||
window.open(url, 'Share', windowParam);
|
||||
}
|
||||
function shareRenRen(noteId, title, pic) {
|
||||
var url = 'http://widget.renren.com/dialog/share?resourceUrl=' + getShareUrl(noteId) + '&srcUrl=' + getShareUrl(noteId) + '&title=' + getShareTitle(title) + '&pic=' + pic;
|
||||
window.open(url, 'Share', windowParam);
|
||||
}
|
||||
|
||||
// https://twitter.com/intent/tweet?text=&pic=
|
||||
function shareTwitter(noteId, title, pic) {
|
||||
var url = 'https://twitter.com/intent/tweet?text=' + getShareTitle(title) + '&pic=' + pic;
|
||||
window.open(url, 'Share', windowParam);
|
||||
}
|
||||
// http://www.facebook.com/sharer.php?u=<?php the_permalink();?>&t=<?php the_title(); ?>”
|
||||
function shareFacebook(noteId, title, pic) {
|
||||
var url = ' http://www.facebook.com/sharer.php?t=' + getShareTitle(title) + '&pic=' + pic;
|
||||
window.open(url, 'Share', windowParam);
|
||||
}
|
||||
|
||||
//JavaScript函数:
|
||||
var minute = 1000 * 60;
|
||||
var hour = minute * 60;
|
||||
var day = hour * 24;
|
||||
var halfamonth = day * 15;
|
||||
var month = day * 30;
|
||||
// 2014-01-06T18:29:48.802+08:00
|
||||
|
||||
function goNowToDatetime(goNow) {
|
||||
if(!goNow) {
|
||||
return "";
|
||||
}
|
||||
return goNow.substr(0, 10) + " " + goNow.substr(11, 8);
|
||||
}
|
||||
function getDateDiff(dateTimeStamp){
|
||||
var now = new Date().getTime();
|
||||
var diffValue = now - dateTimeStamp;
|
||||
if(diffValue < 0){
|
||||
return "";
|
||||
}
|
||||
var monthC =diffValue/month;
|
||||
var weekC =diffValue/(7*day);
|
||||
var dayC =diffValue/day;
|
||||
var hourC =diffValue/hour;
|
||||
var minC =diffValue/minute;
|
||||
if(monthC>=1){
|
||||
result=parseInt(monthC) + getMsg("monthsAgo");
|
||||
}
|
||||
else if(weekC>=1){
|
||||
result=parseInt(weekC) + getMsg("weeksAgo");
|
||||
}
|
||||
else if(dayC>=1){
|
||||
result=parseInt(dayC) + getMsg("daysAgo");
|
||||
}
|
||||
else if(hourC>=1){
|
||||
result=parseInt(hourC) + getMsg("hoursAgo");
|
||||
}
|
||||
else if(minC>=1){
|
||||
result=parseInt(minC) + getMsg("minutesAgo");
|
||||
}else {
|
||||
result=getMsg("justNow");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function weixin() {
|
||||
var local=window.location.href;
|
||||
var title = $.trim($(".title").text());
|
||||
var desc = $.trim($("#desc").text());
|
||||
var imgUrl = $("#content img").eq(0).attr('src');
|
||||
window.shareData = {
|
||||
"imgUrl": imgUrl,
|
||||
"timeLineLink":local,
|
||||
"sendFriendLink": local,
|
||||
"weiboLink":local,
|
||||
"tTitle": title,
|
||||
"tContent": desc,
|
||||
"fTitle": title,
|
||||
"fContent": desc,
|
||||
"wContent": desc
|
||||
};
|
||||
document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
|
||||
// 发送给好友
|
||||
WeixinJSBridge.on('menu:share:appmessage', function (argv) {
|
||||
WeixinJSBridge.invoke('sendAppMessage', {
|
||||
"img_url": window.shareData.imgUrl,
|
||||
"img_width": "200",
|
||||
"link": window.shareData.sendFriendLink,
|
||||
"desc": window.shareData.fContent,
|
||||
"title": window.shareData.fTitle
|
||||
}, function (res) {
|
||||
hs_guide('none');
|
||||
_report('send_msg', res.err_msg);
|
||||
})
|
||||
});
|
||||
|
||||
// 分享到朋友圈
|
||||
WeixinJSBridge.on('menu:share:timeline', function (argv) {
|
||||
WeixinJSBridge.invoke('shareTimeline', {
|
||||
"img_url": window.shareData.imgUrl,
|
||||
"img_width": "200",
|
||||
"link": window.shareData.timeLineLink,
|
||||
"desc": window.shareData.tContent,
|
||||
"title": window.shareData.tTitle
|
||||
}, function (res) {
|
||||
hs_guide('none');
|
||||
_report('timeline', res.err_msg);
|
||||
});
|
||||
});
|
||||
|
||||
// 分享到微博
|
||||
WeixinJSBridge.on('menu:share:weibo', function (argv) {
|
||||
WeixinJSBridge.invoke('shareWeibo', {
|
||||
"content": window.shareData.wContent,
|
||||
"url": window.shareData.weiboLink,
|
||||
}, function (res) {
|
||||
hs_guide('none');
|
||||
_report('weibo', res.err_msg);
|
||||
});
|
||||
});
|
||||
}, false);
|
||||
}
|
||||
|
||||
var LEA = {isMobile: false};
|
||||
function isMobile() {
|
||||
var u = navigator.userAgent;
|
||||
LEA.isMobile = false;
|
||||
LEA.isMobile = /Mobile|Android|iPhone/i.test(u);
|
||||
if(!LEA.isMobile && $(document).width() <= 600){
|
||||
LEA.isMobile = true
|
||||
}
|
||||
}
|
||||
$(function() {
|
||||
isMobile();
|
||||
});
|
509
public/js/app/blog/view.js
Normal file
509
public/js/app/blog/view.js
Normal file
@ -0,0 +1,509 @@
|
||||
function scrollTo(self, tagName, text) {
|
||||
var iframe = $("#content");
|
||||
var target = iframe.find(tagName + ":contains(" + text + ")");
|
||||
|
||||
// 找到是第几个
|
||||
// 在nav是第几个
|
||||
var navs = $('#blogNavContent [data-a="' + tagName + '-' + encodeURI(text) + '"]');
|
||||
var len = navs.size();
|
||||
for(var i = 0; i < len; ++i) {
|
||||
if(navs[i] == self) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (target.size() >= i+1) {
|
||||
target = target.eq(i);
|
||||
// 之前插入, 防止多行定位不准
|
||||
var top = target.offset().top;
|
||||
if(LEA.isMobile) {
|
||||
top -= 50;
|
||||
}
|
||||
var nowTop = $(document).scrollTop();
|
||||
// 用$("body").scrllTop(10)没反应 firefox下
|
||||
$('html,body').animate({scrollTop: top}, 200);
|
||||
return;
|
||||
}
|
||||
}
|
||||
function genNav() {
|
||||
var $con = $("#content");
|
||||
var html = $con.html();
|
||||
// 构造一棵树
|
||||
// {"h1-title":{h2-title:{}}}
|
||||
var tree = [];//[{title: "xx", children:[{}]}, {title:"xx2"}];
|
||||
var hs = $con.find("h1,h2,h3,h4,h5,h6").toArray();
|
||||
var titles = '<ul>';
|
||||
for(var i = 0; i < hs.length; ++i) {
|
||||
var text = $(hs[i]).text();
|
||||
var tagName = hs[i].tagName.toLowerCase();
|
||||
// scrollTo在page.js中定义
|
||||
titles += '<li class="nav-' + tagName + '"><a data-a="' + tagName + '-' + encodeURI(text)+'" onclick="scrollTo(this, \'' + tagName + '\', \'' + text + '\')">' + text + '</a></li>';
|
||||
}
|
||||
titles += "</ul>";
|
||||
$("#blogNavContent").html(titles);
|
||||
if(!hs.length) {
|
||||
$("#blogNavContent").html(getMsg("none"));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function initNav() {
|
||||
var hasNav = genNav();
|
||||
if(!hasNav) {
|
||||
return;
|
||||
}
|
||||
|
||||
var $title = $(".title");
|
||||
var titlePos = $title.offset();
|
||||
var top = titlePos.top + 10;// - $title.height();
|
||||
// 手机下不要与标题在同一高度
|
||||
if(LEA.isMobile){
|
||||
top += 30;
|
||||
}
|
||||
if(top < 0) {
|
||||
top = 10;
|
||||
}
|
||||
|
||||
var left = $title.width() + titlePos.left - 100;
|
||||
$("#blogNav").css("top", top).css("left", left);
|
||||
$("#blogNav").show();
|
||||
|
||||
$("#blogNavNav").click(function() {
|
||||
var $o = $("#blogNavContent");
|
||||
if($o.is(":hidden")) {
|
||||
$o.show();
|
||||
} else {
|
||||
$o.hide();
|
||||
}
|
||||
});
|
||||
|
||||
var $d = $(document);
|
||||
function reNav() {
|
||||
var vtop = $d.scrollTop();
|
||||
if(vtop <= top) {
|
||||
$("#blogNav").css("top", top-vtop);
|
||||
} else {
|
||||
// 差距很磊了
|
||||
if(LEA.isMobile) {
|
||||
$("#blogNav").css("top", 50);
|
||||
} else {
|
||||
$("#blogNav").css("top", 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
reNav();
|
||||
$(window).scroll(reNav);
|
||||
}
|
||||
|
||||
var C = {
|
||||
info: null,
|
||||
noteId: noteId,
|
||||
preLikeNum: preLikeNum,
|
||||
commentNum: commentNum,
|
||||
likeBtnO: $("#likeBtn"),
|
||||
likeNumO: $("#likeNum"),
|
||||
tLikersO: $("#tLikers"),
|
||||
likersO: $("#likers"),
|
||||
tCommentsO: $("#tComments"),
|
||||
commentsO: $("#comments"),
|
||||
|
||||
commentBtnO: $("#commentBtn"),
|
||||
|
||||
commentsLoadingO: $(".comments-loading"),
|
||||
commentsMoreO: $(".comments-more"),
|
||||
|
||||
commentBoxO: $(".comment-box"),
|
||||
init: function() {
|
||||
var self = this;
|
||||
if(UserBlogInfo.CanComment && UserBlogInfo.CommentType != "disqus") {
|
||||
self.initLikeAndComments();
|
||||
} else {
|
||||
self.initLike();
|
||||
}
|
||||
self.initEvent();
|
||||
self.incReadNum();
|
||||
},
|
||||
incReadNum: function() {
|
||||
var self = this;
|
||||
if(!$.cookie(self.noteId)) {
|
||||
$.cookie(self.noteId, 1);
|
||||
ajaxGet(staticUrl + "/blog/incReadNum", {noteId: self.noteId});
|
||||
}
|
||||
},
|
||||
initLike: function() {
|
||||
var self = this;
|
||||
ajaxGet(staticUrl + "/blog/getLike", {noteId: self.noteId}, function(ret) {
|
||||
self.info = ret;
|
||||
self.toggleLikeBtnActive();
|
||||
self.renderLikers();
|
||||
});
|
||||
},
|
||||
initLikeAndComments: function() {
|
||||
var self = this;
|
||||
ajaxGet(staticUrl + "/blog/getLikeAndComments", {noteId: self.noteId}, function(ret) {
|
||||
self.info = ret;
|
||||
self.toggleLikeBtnActive();
|
||||
self.renderLikers();
|
||||
// 是否需要renderComments?
|
||||
self.info.commentUserInfo = self.info.commentUserInfo || {};
|
||||
// 为了防止第一条评论找不到用户信息情况
|
||||
if(visitUserInfo.UserId) {
|
||||
self.info.commentUserInfo[visitUserInfo.UserId] = visitUserInfo;
|
||||
}
|
||||
self.renderComments();
|
||||
|
||||
self.commentBoxO.removeClass("hide");
|
||||
self.commentsLoadingO.addClass("hide");
|
||||
if(self.info.pageInfo.TotalPage > self.info.pageInfo.CurPage) {
|
||||
self.commentsMoreO.removeClass("hide");
|
||||
self.initMoreComments();
|
||||
}
|
||||
});
|
||||
},
|
||||
initMoreComments: function() {
|
||||
var self = this;
|
||||
self.commentsMoreO.find("a").click(function(){
|
||||
if(self.info.pageInfo.TotalPage > self.info.pageInfo.CurPage) {
|
||||
self.commentsMoreO.addClass("hide");
|
||||
self.commentsLoadingO.removeClass("hide");
|
||||
ajaxGet(staticUrl + "/blog/listComments", {noteId: self.noteId, page: self.info.pageInfo.CurPage+1}, function(ret) {
|
||||
var pageInfo = ret.pageInfo;
|
||||
var comments = ret.comments;
|
||||
var commentUserInfo = ret.commentUserInfo;
|
||||
|
||||
$.extend(self.info.commentUserInfo, commentUserInfo);
|
||||
|
||||
// 渲染之
|
||||
for(var i in comments) {
|
||||
var comment = comments[i];
|
||||
comment = self.parseComment(comment);
|
||||
}
|
||||
var html = self.tCommentsO.render({comments: comments, visitUserInfo: visitUserInfo});
|
||||
self.commentsO.append(html);
|
||||
|
||||
self.info.pageInfo = pageInfo;
|
||||
|
||||
if(self.info.pageInfo.TotalPage > self.info.pageInfo.CurPage) {
|
||||
self.commentsMoreO.removeClass("hide");
|
||||
} else {
|
||||
self.commentsMoreO.addClass("hide");
|
||||
}
|
||||
|
||||
self.commentsLoadingO.addClass("hide");
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
addCommentRender: function(comment){
|
||||
var self = this;
|
||||
comment = self.parseComment(comment);
|
||||
var html = self.tCommentsO.render({blogUrl: blogUrl, comments: [comment], visitUserInfo: visitUserInfo});
|
||||
self.commentsO.prepend(html);
|
||||
var li = self.commentsO.find("li").eq(0);
|
||||
li.hide();
|
||||
li.show(500);
|
||||
li.addClass("item-highlight");
|
||||
setTimeout(function() {
|
||||
li.removeClass("item-highlight");
|
||||
}, 2000);
|
||||
},
|
||||
parseComment: function(comment) {
|
||||
var self = this;
|
||||
var authorUserId = UserInfo.UserId;
|
||||
commentUserInfo = self.info.commentUserInfo;
|
||||
comment.UserInfo = commentUserInfo[comment.UserId];
|
||||
// 是作者自己
|
||||
if(visitUserInfo.UserId == UserInfo.UserId) {
|
||||
comment.IsMyNote = true;
|
||||
}
|
||||
if(comment.UserId == authorUserId) {
|
||||
comment.IsAuthorComment = true;
|
||||
}
|
||||
if(comment.UserId == visitUserInfo.UserId) {
|
||||
comment.IsMyComment = true;
|
||||
}
|
||||
// 不是回复自己
|
||||
if(comment.ToUserId && comment.ToUserId != comment.UserId) {
|
||||
comment.ToUserInfo = commentUserInfo[comment.ToUserId];
|
||||
if(comment.ToUserInfo.UserId == UserInfo.UserId) {
|
||||
comment.ToUserIsAuthor = true;
|
||||
}
|
||||
}
|
||||
comment.PublishDate = getDateDiff(Date.parse(goNowToDatetime(comment.CreatedTime)));
|
||||
return comment;
|
||||
},
|
||||
// 渲染评论
|
||||
renderComments: function() {
|
||||
var self = this;
|
||||
var comments = self.info.comments || [];
|
||||
if(comments.length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 整理数据
|
||||
// 回复谁, 是否是作者?
|
||||
// 回复日期, 几天前, 刚刚
|
||||
for(var i in comments) {
|
||||
var comment = comments[i];
|
||||
comment = self.parseComment(comment);
|
||||
}
|
||||
var html = self.tCommentsO.render({blogUrl: blogUrl, comments: comments, visitUserInfo: visitUserInfo});
|
||||
self.commentsO.html(html);
|
||||
},
|
||||
|
||||
// 重新渲染likers
|
||||
reRenderLikers: function(addMe) {
|
||||
var self = this;
|
||||
var likedUsers = self.info.likedUsers || [];
|
||||
for(var i = 0; i < likedUsers.length; ++i) {
|
||||
var user = likedUsers[i];
|
||||
if(user.UserId == visitUserInfo.UserId) {
|
||||
likedUsers.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(addMe) {
|
||||
likedUsers = [visitUserInfo].concat(likedUsers);
|
||||
self.info.likedUsers = likedUsers;
|
||||
}
|
||||
self.renderLikers();
|
||||
},
|
||||
renderLikers: function() {
|
||||
var self = this;
|
||||
var users = self.info.likedUsers || [];
|
||||
var html = self.tLikersO.render({blogUrl: blogUrl, users: users});
|
||||
self.likersO.html(html);
|
||||
},
|
||||
toggleLikeBtnActive: function() {
|
||||
var self = this;
|
||||
if(self.info.isILikeIt) {
|
||||
self.likeBtnO.addClass("active");
|
||||
} else {
|
||||
self.likeBtnO.removeClass("active");
|
||||
}
|
||||
},
|
||||
commentNumO: $("#commentNum"),
|
||||
bindCommentNum: function(fix) {
|
||||
var self = this;
|
||||
self.commentNum += fix;
|
||||
self.commentNumO.text(self.commentNum);
|
||||
},
|
||||
initEvent: function() {
|
||||
var self = this;
|
||||
|
||||
// like or not
|
||||
self.likeBtnO.click(function() {
|
||||
if(!visitUserInfo.UserId) {
|
||||
needLogin();
|
||||
return;
|
||||
}
|
||||
ajaxPost(staticUrl + "/blog/likeBlog", {noteId: self.noteId}, function(ret) {
|
||||
if(ret.Ok) {
|
||||
// like
|
||||
if(ret.Item) {
|
||||
var num = self.preLikeNum+1;
|
||||
} else {
|
||||
var num = self.preLikeNum-1;
|
||||
}
|
||||
self.preLikeNum = num >= 0 ? num : 0;
|
||||
self.likeNumO.text(self.preLikeNum);
|
||||
self.info.isILikeIt = ret.Item;
|
||||
self.toggleLikeBtnActive();
|
||||
|
||||
// 重新render likers
|
||||
// 我是否在列表中
|
||||
self.reRenderLikers(ret.Item);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 显示回复回复
|
||||
$("#comments").on("click", ".comment-reply", function() {
|
||||
var form = $(this).closest("li").find("form");
|
||||
if(form.is(":hidden")) {
|
||||
form.show();
|
||||
form.find("textarea").focus();
|
||||
} else {
|
||||
form.hide();
|
||||
}
|
||||
});
|
||||
$("#comments").on("click", ".reply-cancel", function() {
|
||||
$(this).closest("form").hide();
|
||||
});
|
||||
|
||||
// 回复
|
||||
$(".comment-box").on("click", ".reply-comment-btn", function(e) {
|
||||
e.preventDefault();
|
||||
var commentId = $(this).data("comment-id");
|
||||
var $form = $(this).closest("form");
|
||||
var $content = $form.find("textarea");
|
||||
var content = $.trim($content.val());
|
||||
if(!content) {
|
||||
$content.focus();
|
||||
return;
|
||||
}
|
||||
var t = $(this);
|
||||
t.button("loading");
|
||||
var data = {noteId: self.noteId, toCommentId: commentId, content: content};
|
||||
ajaxPost(staticUrl + "/blog/comment", data, function(ret) {
|
||||
t.button("reset");
|
||||
$content.val("");
|
||||
self.bindCommentNum(1);
|
||||
if(commentId) {
|
||||
$form.hide();
|
||||
}
|
||||
|
||||
if(commentId) {
|
||||
scrollToTarget("#comments", -200);
|
||||
}
|
||||
|
||||
// 添加一个
|
||||
self.addCommentRender(ret.Item);
|
||||
});
|
||||
});
|
||||
|
||||
// 删除
|
||||
$(".comment-box").on("click", ".comment-trash", function(e) {
|
||||
var commentId = $(this).parent().data("comment-id");
|
||||
var t = this;
|
||||
BootstrapDialog.confirm(getMsg("confirmDeleteComment"), function(yes) {
|
||||
if(yes) {
|
||||
ajaxPost(staticUrl + "/blog/deleteComment", {noteId: self.noteId, commentId: commentId}, function(ret) {
|
||||
if(ret.Ok) {
|
||||
var li = $(t).closest("li");
|
||||
li.hide(500); // remove();
|
||||
setTimeout(function() {
|
||||
li.remove();
|
||||
}, 300);
|
||||
|
||||
self.bindCommentNum(-1);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 点zan
|
||||
$(".comment-box").on("click", ".comment-like", function(e) {
|
||||
var commentId = $(this).parent().data("comment-id");
|
||||
var t = this;
|
||||
|
||||
ajaxPost(staticUrl + "/blog/likeComment", {commentId: commentId}, function(re) {
|
||||
if(re.Ok) {
|
||||
var ret = re.Item;
|
||||
if(ret.Num <= 0) {
|
||||
$(t).parent().find(".like-num").addClass("hide");
|
||||
} else {
|
||||
$(t).parent().find(".like-num").removeClass("hide");
|
||||
$(t).parent().find(".like-num-i").text(ret.Num)
|
||||
}
|
||||
if(ret.IsILikeIt) {
|
||||
$(t).find(".like-text").text(getMsg("unlike"));
|
||||
} else {
|
||||
$(t).find(".like-text").text(getMsg('like'));
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 举报
|
||||
function report(commentId, noteId, title) {
|
||||
var form = $("#reportMsg").html();
|
||||
var body;
|
||||
var input;
|
||||
var isOver = false;
|
||||
var modal = BootstrapDialog.show({
|
||||
title: title,
|
||||
message: form,
|
||||
nl2br: false,
|
||||
buttons: [{
|
||||
label: getMsg("cancel"),
|
||||
action: function(dialog) {
|
||||
dialog.close();
|
||||
}
|
||||
}, {
|
||||
label: getMsg("confirm"),
|
||||
cssClass: 'btn-primary',
|
||||
action: function(dialog) {
|
||||
if(isOver) {
|
||||
dialog.close();
|
||||
}
|
||||
var val = body.find("input[type='radio']:checked").val();
|
||||
if(!val) {
|
||||
var val = body.find(".input-container input").val();
|
||||
}
|
||||
if(!val) {
|
||||
body.find(".footnote").html(getMsg("chooseReason"));
|
||||
return;
|
||||
}
|
||||
ajaxPost(staticUrl + "/blog/report", {commentId: commentId, noteId: noteId, reason: val}, function(re) {
|
||||
isOver = true;
|
||||
if(reIsOk(re)) {
|
||||
body.html(getMsg("reportSuccess"));
|
||||
} else {
|
||||
body.html(getMsg("error"));
|
||||
}
|
||||
setTimeout(function() {
|
||||
dialog.close();
|
||||
}, 3000);
|
||||
});
|
||||
}
|
||||
}]
|
||||
});
|
||||
body = modal.getModalBody();
|
||||
input = body.find(".input-container");
|
||||
body.find("input[type='radio']").click(function(){
|
||||
if(!$(this).val()) {
|
||||
input.show();
|
||||
input.find("input").focus();
|
||||
} else {
|
||||
input.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
$(".comment-box").on("click", ".comment-report", function() {
|
||||
if(needLogin()) {
|
||||
return;
|
||||
}
|
||||
var commentId = $(this).parent().data("comment-id");
|
||||
report(commentId, self.noteId, getMsg("reportComment?"));
|
||||
});
|
||||
$("#reportBtn").click(function() {
|
||||
if(needLogin()) {
|
||||
return;
|
||||
}
|
||||
report("", self.noteId, getMsg("reportBlog?"));
|
||||
});
|
||||
|
||||
self.initShare();
|
||||
},
|
||||
weixinQRCodeO: $("#weixinQRCode"),
|
||||
initShare: function() {
|
||||
var self = this;
|
||||
$(".btn-weixin").click(function() {
|
||||
if(!self.weixinQRCodeO.html()) {
|
||||
self.weixinQRCodeO.qrcode(viewUrl + "/" + self.noteId);
|
||||
}
|
||||
BootstrapDialog.show({
|
||||
title: getMsg('scanQRCode'),
|
||||
message: self.weixinQRCodeO
|
||||
});
|
||||
});
|
||||
|
||||
$(".btn-share").click(function() {
|
||||
var $this = $(this);
|
||||
var map = {"btn-weibo": shareSinaWeibo, "tencent-weibo": shareTencentWeibo, "qq": shareQQ, "renren": shareRenRen};
|
||||
for(var i in map) {
|
||||
if($this.hasClass(i)) {
|
||||
map[i](self.noteId, document.title);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$(function() {
|
||||
C.init();
|
||||
});
|
114
public/js/app/import_theme.js
Normal file
114
public/js/app/import_theme.js
Normal file
@ -0,0 +1,114 @@
|
||||
define('import_theme', ['jquery.ui.widget', 'fileupload'], function(){
|
||||
// Helper function that formats the file sizes
|
||||
function formatFileSize(bytes) {
|
||||
if (typeof bytes !== 'number') {
|
||||
return '';
|
||||
}
|
||||
if (bytes >= 1000000000) {
|
||||
return (bytes / 1000000000).toFixed(2) + ' GB';
|
||||
}
|
||||
if (bytes >= 1000000) {
|
||||
return (bytes / 1000000).toFixed(2) + ' MB';
|
||||
}
|
||||
return (bytes / 1000).toFixed(2) + ' KB';
|
||||
}
|
||||
|
||||
function setDropStyle(dropzoneId, formId) {
|
||||
// drag css
|
||||
var dropZone = $(dropzoneId);
|
||||
$(formId).bind('dragover', function (e) {
|
||||
e.preventDefault();
|
||||
var timeout = window.dropZoneTimeoutAttach;
|
||||
if(timeout) {
|
||||
clearTimeout(timeout);
|
||||
}
|
||||
|
||||
var found = false,
|
||||
node = e.target;
|
||||
do {
|
||||
if (node === dropZone[0]) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
node = node.parentNode;
|
||||
} while (node != null);
|
||||
if (found) {
|
||||
dropZone.addClass('hover');
|
||||
} else {
|
||||
dropZone.removeClass('hover');
|
||||
}
|
||||
window.dropZoneTimeoutAttach = setTimeout(function () {
|
||||
window.dropZoneTimeoutAttach = null;
|
||||
dropZone.removeClass('in hover');
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
|
||||
setDropStyle("#dropAvatar", "#uploadAvatar");
|
||||
|
||||
var initUploader = function() {
|
||||
$('.dropzone .btn-choose-file').click(function() {
|
||||
$(this).parent().find('input').click();
|
||||
});
|
||||
|
||||
var $msg2 = $('#avatarUploadMsg');
|
||||
$('#uploadAvatar').fileupload({
|
||||
dataType: 'json',
|
||||
dropZone: $('#dropAvatar'),
|
||||
add: function(e, data) {
|
||||
var tpl = $('<div class="alert alert-info"><img class="loader" src="/tinymce/plugins/leaui_image/public/images/ajax-loader.gif"> <a class="close" data-dismiss="alert">×</a></div>');
|
||||
|
||||
// Append the file name and file size
|
||||
tpl.append(data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small>');
|
||||
|
||||
// Add the HTML to the UL element
|
||||
$msg2.html(tpl);
|
||||
data.context = $msg2;
|
||||
|
||||
// 检查文件大小
|
||||
var size = data.files[0].size;
|
||||
if(typeof size == 'number' && size > 10 * 1024 * 1024) {
|
||||
tpl.find("img").remove();
|
||||
tpl.removeClass("alert-info").addClass("alert-danger");
|
||||
tpl.append("Warning: File size is bigger than 10M");
|
||||
return;
|
||||
}
|
||||
|
||||
// Automatically upload the file once it is added to the queue
|
||||
var jqXHR;
|
||||
setTimeout(function() {
|
||||
jqXHR = data.submit();
|
||||
}, 10);
|
||||
},
|
||||
done: function(e, data) {
|
||||
if (data.result.Ok == true) {
|
||||
data.context.html("");
|
||||
var re = data.result;
|
||||
art.tips("Success");
|
||||
setTimeout(function() {
|
||||
location.reload();
|
||||
}, 1000);
|
||||
} else {
|
||||
var re = data.result;
|
||||
data.context.html("");
|
||||
var tpl = $('<div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div>');
|
||||
tpl.append('<b>Error:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.result.Msg);
|
||||
data.context.html(tpl);
|
||||
}
|
||||
},
|
||||
fail: function(e, data) {
|
||||
data.context.html("");
|
||||
var tpl = $('<div class="alert alert-danger"><a class="close" data-dismiss="alert">×</a></div>');
|
||||
tpl.append('<b>Error:</b> ' + data.files[0].name + ' <small>[<i>' + formatFileSize(data.files[0].size) + '</i>]</small> ' + data.errorThrown);
|
||||
data.context.html(tpl);
|
||||
setTimeout((function(tpl) {
|
||||
return function() {
|
||||
tpl.remove();
|
||||
}
|
||||
})(tpl), 3000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
initUploader();
|
||||
});
|
1
public/js/app/note-min.js
vendored
Normal file
1
public/js/app/note-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1674
public/js/app/note.js
Normal file
1674
public/js/app/note.js
Normal file
File diff suppressed because it is too large
Load Diff
1
public/js/app/notebook-min.js
vendored
Normal file
1
public/js/app/notebook-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
888
public/js/app/notebook.js
Normal file
888
public/js/app/notebook.js
Normal file
@ -0,0 +1,888 @@
|
||||
Notebook.curNotebookId = "";
|
||||
Notebook.cache = {}; // notebookId => {};
|
||||
Notebook.notebooks = []; // 按次序
|
||||
// <li role="presentation"><a role="menuitem" tabindex="-1" href="#">CSS</a></li>
|
||||
Notebook.notebookNavForListNote = ""; // html 为了note list上面和新建时的ul
|
||||
Notebook.notebookNavForNewNote = ""; // html 为了note list上面和新建时的ul
|
||||
|
||||
// 设置缓存
|
||||
Notebook.setCache = function(notebook) {
|
||||
var notebookId = notebook.NotebookId;
|
||||
if(!notebookId) {
|
||||
return;
|
||||
}
|
||||
if(!Notebook.cache[notebookId]) {
|
||||
Notebook.cache[notebookId] = {};
|
||||
}
|
||||
$.extend(Notebook.cache[notebookId], notebook);
|
||||
}
|
||||
|
||||
Notebook.getCurNotebookId = function() {
|
||||
return Notebook.curNotebookId;
|
||||
};
|
||||
|
||||
// 笔记本的笔记数量更新
|
||||
Notebook._updateNotebookNumberNotes = function(notebookId, n) {
|
||||
var self = this;
|
||||
var notebook = self.getNotebook(notebookId);
|
||||
if(!notebook) {
|
||||
return;
|
||||
}
|
||||
notebook.NumberNotes += n;
|
||||
if(notebook.NumberNotes < 0) {
|
||||
notebook.NumberNotes = 0;
|
||||
}
|
||||
$("#numberNotes_" + notebookId).html(notebook.NumberNotes);
|
||||
};
|
||||
// addNote, copyNote, moveNote
|
||||
Notebook.incrNotebookNumberNotes = function(notebookId) {
|
||||
var self = this;
|
||||
self._updateNotebookNumberNotes(notebookId, 1);
|
||||
};
|
||||
// moteNote, deleteNote
|
||||
Notebook.minusNotebookNumberNotes = function(notebookId) {
|
||||
var self = this;
|
||||
self._updateNotebookNumberNotes(notebookId, -1);
|
||||
};
|
||||
|
||||
// 得到notebook标题, 给note显示其notebook标题用
|
||||
// called by Note
|
||||
Notebook.getNotebook = function(notebookId) {
|
||||
return Notebook.cache[notebookId];
|
||||
}
|
||||
// called by Note
|
||||
Notebook.getNotebookTitle = function(notebookId) {
|
||||
var notebook = Notebook.cache[notebookId];
|
||||
if(notebook) {
|
||||
return notebook.Title;
|
||||
} else {
|
||||
return "未知";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 我的notebooks
|
||||
<ul class="folderBody" id="notebookList">
|
||||
<li><a class="active">所有</a></li>
|
||||
<li><a class="active">Hadoop</a></li>
|
||||
<li><a>August 13, 2013</a></li>
|
||||
</ul>
|
||||
*/
|
||||
|
||||
Notebook.getTreeSetting = function(isSearch, isShare){
|
||||
var noSearch = !isSearch;
|
||||
|
||||
var self = this;
|
||||
// 添加自定义dom
|
||||
function addDiyDom(treeId, treeNode) {
|
||||
var spaceWidth = 5;
|
||||
var switchObj = $("#" + treeId + " #" + treeNode.tId + "_switch"),
|
||||
icoObj = $("#" + treeId + " #" + treeNode.tId + "_ico");
|
||||
switchObj.remove();
|
||||
icoObj.before(switchObj);
|
||||
if(!isShare) {
|
||||
if(!Notebook.isAllNotebookId(treeNode.NotebookId) && !Notebook.isTrashNotebookId(treeNode.NotebookId)) {
|
||||
icoObj.after($('<span class="notebook-number-notes" id="numberNotes_' + treeNode.NotebookId + '">' + (treeNode.NumberNotes || 0) + '</span>'));
|
||||
icoObj.after($('<span class="fa notebook-setting" title="setting"></span>'));
|
||||
}
|
||||
} else {
|
||||
if(!Share.isDefaultNotebookId(treeNode.NotebookId)) {
|
||||
icoObj.after($('<span class="fa notebook-setting" title="setting"></span>'));
|
||||
}
|
||||
}
|
||||
if (treeNode.level > 1) {
|
||||
var spaceStr = "<span style='display: inline-block;width:" + (spaceWidth * treeNode.level)+ "px'></span>";
|
||||
switchObj.before(spaceStr);
|
||||
}
|
||||
}
|
||||
// 拖拽
|
||||
function beforeDrag(treeId, treeNodes) {
|
||||
for (var i=0,l=treeNodes.length; i<l; i++) {
|
||||
if (treeNodes[i].drag === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function beforeDrop(treeId, treeNodes, targetNode, moveType) {
|
||||
return targetNode ? targetNode.drop !== false : true;
|
||||
}
|
||||
function onDrop(e, treeId, treeNodes, targetNode, moveType) {
|
||||
var treeNode = treeNodes[0];
|
||||
// 搜索不能drag
|
||||
if(!targetNode) {
|
||||
return;
|
||||
}
|
||||
var parentNode;
|
||||
var treeObj = self.tree;
|
||||
var ajaxData = {curNotebookId: treeNode.NotebookId};
|
||||
|
||||
// 成为子节点, 那么只需要得到targetNode下所有的子结点即可
|
||||
if(moveType == "inner") {
|
||||
parentNode = targetNode;
|
||||
} else {
|
||||
parentNode = targetNode.getParentNode();
|
||||
}
|
||||
|
||||
// 在targetNode之前或之后,
|
||||
// 那么: 1) 需要将该parentNode下所有的node重新排序即可; 2) treeNodes[0]为parentNode的子
|
||||
if(!parentNode) {
|
||||
var nodes = treeObj.getNodes(); // 得到所有nodes
|
||||
} else {
|
||||
ajaxData.parentNotebookId = parentNode.NotebookId;
|
||||
var nextLevel = parentNode.level+1;
|
||||
function filter(node) {
|
||||
return node.level == nextLevel;
|
||||
}
|
||||
var nodes = treeObj.getNodesByFilter(filter, false, parentNode);
|
||||
}
|
||||
|
||||
ajaxData.siblings = [];
|
||||
for(var i in nodes) {
|
||||
var notebookId = nodes[i].NotebookId;
|
||||
if(!Notebook.isAllNotebookId(notebookId) && !Notebook.isTrashNotebookId(notebookId)) {
|
||||
ajaxData.siblings.push(notebookId);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
} 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,
|
||||
showIcon: false,
|
||||
selectedMulti: false,
|
||||
dblClickExpand: false,
|
||||
addDiyDom: addDiyDom
|
||||
},
|
||||
data: {
|
||||
key: {
|
||||
name: "Title",
|
||||
children: "Subs",
|
||||
}
|
||||
},
|
||||
edit: {
|
||||
enable: true,
|
||||
showRemoveBtn: false,
|
||||
showRenameBtn: false,
|
||||
drag: {
|
||||
isMove: noSearch,
|
||||
prev: noSearch,
|
||||
inner: noSearch,
|
||||
next: noSearch
|
||||
}
|
||||
},
|
||||
callback: {
|
||||
beforeDrag: beforeDrag,
|
||||
beforeDrop: beforeDrop,
|
||||
onDrop: onDrop,
|
||||
onClick: onClick,
|
||||
onDblClick: onDblClick,
|
||||
beforeRename: function(treeId, treeNode, newName, isCancel) {
|
||||
if(newName == "") {
|
||||
if(treeNode.IsNew) {
|
||||
// 删除之
|
||||
self.tree.removeNode(treeNode);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if(treeNode.Title == newName) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// 如果是新添加的
|
||||
if(treeNode.IsNew) {
|
||||
var parentNode = treeNode.getParentNode();
|
||||
var parentNotebookId = parentNode ? parentNode.NotebookId : "";
|
||||
|
||||
self.doAddNotebook(treeNode.NotebookId, newName, parentNotebookId);
|
||||
} else {
|
||||
self.doUpdateNotebookTitle(treeNode.NotebookId, newName);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 搜索不能拖拽
|
||||
if(isSearch) {
|
||||
}
|
||||
|
||||
return setting;
|
||||
}
|
||||
Notebook.allNotebookId = "0";
|
||||
Notebook.trashNotebookId = "-1";
|
||||
Notebook.curNotebookIsTrashOrAll = function() {
|
||||
return Notebook.curNotebookId == Notebook.trashNotebookId || Notebook.curNotebookId == Notebook.allNotebookId ;
|
||||
}
|
||||
Notebook.renderNotebooks = function(notebooks) {
|
||||
var self = this;
|
||||
|
||||
if(!notebooks || typeof notebooks != "object" || notebooks.length < 0) {
|
||||
notebooks = [];
|
||||
}
|
||||
|
||||
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; // 缓存之
|
||||
|
||||
self.tree = $.fn.zTree.init($("#notebookList"), self.getTreeSetting(), notebooks);
|
||||
|
||||
// 展开/折叠图标
|
||||
var $notebookList = $("#notebookList");
|
||||
$notebookList.hover(function () {
|
||||
if(!$(this).hasClass("showIcon")) {
|
||||
$(this).addClass("showIcon");
|
||||
}
|
||||
}, function() {
|
||||
$(this).removeClass("showIcon");
|
||||
});
|
||||
|
||||
// 缓存所有notebooks信息
|
||||
if(!isEmpty(notebooks)) {
|
||||
Notebook.curNotebookId = notebooks[0].NotebookId;
|
||||
self.cacheAllNotebooks(notebooks);
|
||||
}
|
||||
|
||||
// 渲染nav
|
||||
Notebook.renderNav();
|
||||
|
||||
// 渲染第一个notebook作为当前
|
||||
Notebook.changeNotebookNavForNewNote(notebooks[0].NotebookId);
|
||||
}
|
||||
|
||||
Notebook.cacheAllNotebooks = function(notebooks) {
|
||||
var self = this;
|
||||
for(var i in notebooks) {
|
||||
var notebook = notebooks[i];
|
||||
Notebook.cache[notebook.NotebookId] = notebook;
|
||||
if(!isEmpty(notebook.Subs)) {
|
||||
self.cacheAllNotebooks(notebook.Subs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// RenderNotebooks调用,
|
||||
// nav 为了新建, 快速选择, 移动笔记
|
||||
// 这些在添加,修改,删除notebooks都要变动!!!
|
||||
Notebook.renderNav = function(nav) {
|
||||
var self = this;
|
||||
self.changeNav();
|
||||
}
|
||||
|
||||
// 搜索notebook
|
||||
Notebook.searchNotebookForAddNote = function(key) {
|
||||
var self = this;
|
||||
if(key) {
|
||||
var notebooks = self.tree.getNodesByParamFuzzy("Title", key);
|
||||
notebooks = notebooks || [];
|
||||
// 过滤下, 把new, trash过滤掉
|
||||
var notebooks2 = [];
|
||||
for(var i in notebooks) {
|
||||
var notebookId = notebooks[i].NotebookId;
|
||||
if(!self.isAllNotebookId(notebookId) && !self.isTrashNotebookId(notebookId)) {
|
||||
notebooks2.push(notebooks[i]);
|
||||
}
|
||||
}
|
||||
if(isEmpty(notebooks2)) {
|
||||
$("#notebookNavForNewNote").html("");
|
||||
} else {
|
||||
$("#notebookNavForNewNote").html(self.getChangedNotebooks(notebooks2));
|
||||
}
|
||||
} else {
|
||||
$("#notebookNavForNewNote").html(self.everNavForNewNote);
|
||||
}
|
||||
}
|
||||
|
||||
// 搜索notebook
|
||||
Notebook.searchNotebookForList = function(key) {
|
||||
var self = this;
|
||||
var $search = $("#notebookListForSearch");
|
||||
var $notebookList = $("#notebookList");
|
||||
if(key) {
|
||||
$search.show();
|
||||
$notebookList.hide();
|
||||
|
||||
var notebooks = self.tree.getNodesByParamFuzzy("Title", key);
|
||||
log('search');
|
||||
log(notebooks);
|
||||
if(isEmpty(notebooks)) {
|
||||
$search.html("");
|
||||
} else {
|
||||
var setting = self.getTreeSetting(true);
|
||||
self.tree2 = $.fn.zTree.init($search, setting, notebooks);
|
||||
}
|
||||
} else {
|
||||
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('<li role="presentation" class="clearfix ?"><div class="new-note-left pull-left" title="为该笔记本新建笔记" href="#" notebookId="?">?</div><div title="为该笔记本新建markdown笔记" class="new-note-right pull-left" notebookId="?">M</div>', classes, notebook.NotebookId, notebook.Title, notebook.NotebookId);
|
||||
|
||||
if(!isEmpty(notebook.Subs)) {
|
||||
eachForNew += "<ul class='dropdown-menu'>";
|
||||
eachForNew += self.getChangedNotebooks(notebook.Subs);
|
||||
eachForNew += "</ul>";
|
||||
}
|
||||
|
||||
eachForNew += '</li>';
|
||||
|
||||
navForNewNote += eachForNew;
|
||||
}
|
||||
return navForNewNote;
|
||||
}
|
||||
|
||||
Notebook.everNavForNewNote = "";
|
||||
Notebook.everNotebooks = [];
|
||||
Notebook.changeNav = function() {
|
||||
var self = Notebook;
|
||||
var notebooks = Notebook.tree.getNodes();
|
||||
var pureNotebooks = notebooks.slice(1, -1); // 不含新和垃圾
|
||||
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
|
||||
<div id="shareNotebooks">
|
||||
<div class="folderNote closed">
|
||||
<div class="folderHeader">
|
||||
<a>
|
||||
<h1>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
Life's</h1>
|
||||
</a>
|
||||
</div>
|
||||
<ul class="folderBody">
|
||||
<li><a>Hadoop</a></li>
|
||||
<li><a>Node webkit</a></li>
|
||||
<li><a>Hadoop</a></li>
|
||||
<li><a>Node webkit</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
*/
|
||||
// TODO 层级
|
||||
Notebook.renderShareNotebooks = function(sharedUserInfos, shareNotebooks) {
|
||||
if(isEmpty(sharedUserInfos)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(!shareNotebooks || typeof shareNotebooks != "object" || shareNotebooks.length < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
var $shareNotebooks = $("#shareNotebooks");
|
||||
var user2ShareNotebooks = {};
|
||||
for(var i in shareNotebooks) {
|
||||
var userNotebooks = shareNotebooks[i];
|
||||
user2ShareNotebooks[userNotebooks.UserId] = userNotebooks;
|
||||
}
|
||||
for(var i in sharedUserInfos) {
|
||||
var userInfo = sharedUserInfos[i];
|
||||
var userNotebooks = user2ShareNotebooks[userInfo.UserId] || {ShareNotebooks:[]};
|
||||
|
||||
userNotebooks.ShareNotebooks = [{NotebookId: "-2", Title: "默认共享"}].concat(userNotebooks.ShareNotebooks)
|
||||
|
||||
var username = userInfo.Username || userInfo.Email;
|
||||
var header = tt('<div class="folderNote closed"><div class="folderHeader"><a><h1 title="? 的共享"><i class="fa fa-angle-right"></i>?</h1></a></div>', username, username);
|
||||
var body = '<ul class="folderBody">';
|
||||
for(var j in userNotebooks.ShareNotebooks) {
|
||||
var notebook = userNotebooks.ShareNotebooks[j];
|
||||
body += tt('<li><a notebookId="?">?</a></li>', notebook.NotebookId, notebook.Title)
|
||||
}
|
||||
body += "</ul>";
|
||||
|
||||
$shareNotebooks.append(header + body + "</div>")
|
||||
}
|
||||
}
|
||||
|
||||
// 左侧导航, 选中某个notebook
|
||||
Notebook.selectNotebook = function(target) {
|
||||
$(".notebook-item").removeClass("curSelectedNode");
|
||||
$(target).addClass("curSelectedNode");
|
||||
};
|
||||
|
||||
// 新建笔记导航
|
||||
Notebook.changeNotebookNavForNewNote = function(notebookId, title) {
|
||||
// 没有notebookId, 则选择第1个notebook
|
||||
// 第一个是全部笔记
|
||||
if(!notebookId) {
|
||||
var notebook = Notebook.notebooks[0];
|
||||
notebookId = notebook.NotebookId;
|
||||
title = notebook.Title;
|
||||
}
|
||||
if(!title) {
|
||||
var notebook = Notebook.cache[0];
|
||||
title = notebook.Title;
|
||||
}
|
||||
|
||||
if(!Notebook.isAllNotebookId(notebookId) && !Notebook.isTrashNotebookId(notebookId)) {
|
||||
$("#curNotebookForNewNote").html(title).attr("notebookId", notebookId);
|
||||
} else if(!$("#curNotebookForNewNote").attr("notebookId")) {
|
||||
// 但又没有一个笔记, 默认选第一个吧
|
||||
// 这里很可能会死循环, 万一用户没有其它笔记呢?
|
||||
// 服务端肯定要在新建一个用户时给他创建一个默认笔记本的
|
||||
if(Notebook.notebooks.length > 2) {
|
||||
var notebook = Notebook.notebooks[1];
|
||||
notebookId = notebook.NotebookId;
|
||||
title = notebook.Title;
|
||||
Notebook.changeNotebookNavForNewNote(notebookId, title);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 改变导航, 两处
|
||||
// 单击左侧, 单击新建下拉时调用
|
||||
// 1 选中左侧导航,
|
||||
// 2 notelist上面 >
|
||||
// 3 新建笔记 - js >
|
||||
// 转成我的nav <-> 共享
|
||||
Notebook.toggleToMyNav = function(userId, notebookId) {
|
||||
$("#sharedNotebookNavForListNav").hide();
|
||||
$("#myNotebookNavForListNav").show();
|
||||
|
||||
$("#newMyNote").show();
|
||||
$("#newSharedNote").hide();
|
||||
|
||||
// 搜索tag隐藏
|
||||
$("#tagSearch").hide();
|
||||
}
|
||||
Notebook.changeNotebookNav = function(notebookId) {
|
||||
Notebook.toggleToMyNav();
|
||||
|
||||
// 1
|
||||
Notebook.selectNotebook($(tt('#notebookList [notebookId="?"]', notebookId)));
|
||||
|
||||
var notebook = Notebook.cache[notebookId];
|
||||
|
||||
if(!notebook) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2
|
||||
$("#curNotebookForListNote").html(notebook.Title);
|
||||
|
||||
// 3
|
||||
Notebook.changeNotebookNavForNewNote(notebookId, notebook.Title);
|
||||
}
|
||||
|
||||
Notebook.isAllNotebookId = function(notebookId) {
|
||||
return notebookId == Notebook.allNotebookId;
|
||||
}
|
||||
Notebook.isTrashNotebookId = function(notebookId) {
|
||||
return notebookId == Notebook.trashNotebookId;
|
||||
}
|
||||
// 当前选中的笔记本是否是"所有"
|
||||
// called by Note
|
||||
Notebook.curActiveNotebookIsAll = function() {
|
||||
return Notebook.isAllNotebookId($("#notebookList .active").attr("notebookId"));
|
||||
}
|
||||
|
||||
// 改变笔记本
|
||||
// 0. 改变样式
|
||||
// 1. 改变note, 此时需要先保存
|
||||
// 2. ajax得到该notebook下的所有note
|
||||
// 3. 使用Note.RederNotes()
|
||||
Notebook.changeNotebook = function(notebookId) {
|
||||
Notebook.changeNotebookNav(notebookId);
|
||||
|
||||
Notebook.curNotebookId = notebookId;
|
||||
|
||||
// 1
|
||||
Note.curChangedSaveIt();
|
||||
|
||||
// 2 先清空所有
|
||||
Note.clearAll();
|
||||
|
||||
var url = "/note/ListNotes/";
|
||||
var param = {notebookId: notebookId};
|
||||
|
||||
// 废纸篓
|
||||
if(Notebook.isTrashNotebookId(notebookId)) {
|
||||
url = "/note/listTrashNotes";
|
||||
param = {};
|
||||
} else if(Notebook.isAllNotebookId(notebookId)) {
|
||||
param = {};
|
||||
// 得到全部的...
|
||||
cacheNotes = Note.getNotesByNotebookId();
|
||||
if(!isEmpty(cacheNotes)) { // 万一真的是没有呢?
|
||||
Note.renderNotesAndFirstOneContent(cacheNotes);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
cacheNotes = Note.getNotesByNotebookId(notebookId);
|
||||
if(!isEmpty(cacheNotes)) { // 万一真的是没有呢?
|
||||
Note.renderNotesAndFirstOneContent(cacheNotes);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 2 得到笔记本
|
||||
// 这里可以缓存起来, note按notebookId缓存
|
||||
ajaxGet(url, param, Note.renderNotesAndFirstOneContent);
|
||||
}
|
||||
|
||||
// 是否是当前选中的notebookId
|
||||
// 还包括共享
|
||||
// called by Note
|
||||
Notebook.isCurNotebook = function(notebookId) {
|
||||
return $(tt('#notebookList [notebookId="?"], #shareNotebooks [notebookId="?"]', notebookId, notebookId)).attr("class") == "active";
|
||||
}
|
||||
|
||||
// 改变nav, 为了新建note
|
||||
// called by Note
|
||||
Notebook.changeNotebookForNewNote = function(notebookId) {
|
||||
// 废纸篓
|
||||
if(Notebook.isTrashNotebookId(notebookId) || Notebook.isAllNotebookId(notebookId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Notebook.changeNotebookNav(notebookId);
|
||||
Notebook.curNotebookId = notebookId;
|
||||
|
||||
var url = "/note/ListNotes/";
|
||||
var param = {notebookId: notebookId};
|
||||
|
||||
// 2 得到笔记本
|
||||
// 这里可以缓存起来, note按notebookId缓存
|
||||
ajaxGet(url, param, function(ret) {
|
||||
// note 导航
|
||||
Note.renderNotes(ret, true);
|
||||
});
|
||||
};
|
||||
|
||||
//---------------------------
|
||||
// 显示共享信息
|
||||
Notebook.listNotebookShareUserInfo = function(target) {
|
||||
var notebookId = $(target).attr("notebookId");
|
||||
showDialogRemote("share/listNotebookShareUserInfo", {notebookId: notebookId});
|
||||
}
|
||||
// 共享笔记本
|
||||
Notebook.shareNotebooks= function(target) {
|
||||
var title = $(target).text();
|
||||
showDialog("dialogShareNote", {title: "分享笔记本给好友-" + title});
|
||||
setTimeout(function() {
|
||||
$("#friendsEmail").focus();
|
||||
}, 500);
|
||||
var notebookId = $(target).attr("notebookId");
|
||||
|
||||
shareNoteOrNotebook(notebookId, false);
|
||||
}
|
||||
|
||||
//-----------------------------
|
||||
// 设为blog/unset
|
||||
Notebook.setNotebook2Blog = function(target) {
|
||||
var notebookId = $(target).attr("notebookId");
|
||||
var notebook = Notebook.cache[notebookId];
|
||||
var isBlog = true;
|
||||
if(notebook.IsBlog != undefined) {
|
||||
isBlog = !notebook.IsBlog;
|
||||
}
|
||||
|
||||
// 那么, 如果当前是该notebook下, 重新渲染之
|
||||
if(Notebook.curNotebookId == notebookId) {
|
||||
if(isBlog) {
|
||||
$("#noteList .item-blog").show();
|
||||
} else {
|
||||
$("#noteList .item-blog").hide();
|
||||
}
|
||||
|
||||
// 如果当前在所有笔记本下
|
||||
} else if(Notebook.curNotebookId == Notebook.allNotebookId){
|
||||
$("#noteItemList .item").each(function(){
|
||||
var noteId = $(this).attr("noteId");
|
||||
var note = Note.cache[noteId];
|
||||
if(note.NotebookId == notebookId) {
|
||||
if(isBlog) $(this).find(".item-blog").show();
|
||||
else $(this).find(".item-blog").hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
ajaxPost("notebook/setNotebook2Blog", {notebookId: notebookId, isBlog: isBlog}, function(ret) {
|
||||
if(ret) {
|
||||
// 这里要设置notebook下的note的blog状态
|
||||
Note.setAllNoteBlogStatus(notebookId, isBlog);
|
||||
Notebook.setCache({NotebookId: notebookId, IsBlog: isBlog});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 添加, 修改完后都要对notebook的列表重新计算 TODO
|
||||
|
||||
// 修改笔记本标题
|
||||
Notebook.updateNotebookTitle = function(target) {
|
||||
var self = Notebook;
|
||||
var notebookId = $(target).attr("notebookId");
|
||||
|
||||
if(self.tree2) {
|
||||
self.tree2.editName(self.tree2.getNodeByTId(notebookId));
|
||||
} else {
|
||||
self.tree.editName(self.tree.getNodeByTId(notebookId));
|
||||
}
|
||||
}
|
||||
Notebook.doUpdateNotebookTitle = function(notebookId, newTitle) {
|
||||
var self = Notebook;
|
||||
ajaxPost("/notebook/updateNotebookTitle", {notebookId: notebookId, title: newTitle}, function(ret) {
|
||||
// 修改缓存
|
||||
Notebook.cache[notebookId].Title = newTitle;
|
||||
// 改变nav
|
||||
Notebook.changeNav();
|
||||
|
||||
// 同步
|
||||
if(self.tree2) {
|
||||
var notebook = self.tree.getNodeByTId(notebookId);
|
||||
notebook.Title = newTitle;
|
||||
self.tree.updateNode(notebook);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//-----------
|
||||
// 添加笔记本
|
||||
// 1 确保是展开的
|
||||
// 2 在所有后面添加<li></li>
|
||||
Notebook.addNotebookSeq = 1; // inputId
|
||||
Notebook.addNotebook = function() {
|
||||
var self = Notebook;
|
||||
if($("#myNotebooks").hasClass("closed")) {
|
||||
$("#myNotebooks .folderHeader").trigger("click");
|
||||
}
|
||||
|
||||
// 添加并修改
|
||||
self.tree.addNodes(null, {Title: "", NotebookId: getObjectId(), IsNew: true}, true, true);
|
||||
}
|
||||
|
||||
// rename 调用
|
||||
Notebook.doAddNotebook = function(notebookId, title, parentNotebookId) {
|
||||
var self = Notebook;
|
||||
ajaxPost("/notebook/addNotebook", {notebookId: notebookId, title: title, parentNotebookId: parentNotebookId}, function(ret) {
|
||||
if(ret.NotebookId) {
|
||||
Notebook.cache[ret.NotebookId] = ret;
|
||||
var notebook = self.tree.getNodeByTId(notebookId);
|
||||
$.extend(notebook, ret);
|
||||
notebook.IsNew = false;
|
||||
|
||||
// 选中之
|
||||
Notebook.changeNotebook(notebookId);
|
||||
|
||||
// 改变nav
|
||||
Notebook.changeNav();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//-------------
|
||||
// 添加子笔记本
|
||||
Notebook.addChildNotebook = function(target) {
|
||||
var self = Notebook;
|
||||
if($("#myNotebooks").hasClass("closed")) {
|
||||
$("#myNotebooks .folderHeader").trigger("click");
|
||||
}
|
||||
|
||||
var notebookId = $(target).attr("notebookId");
|
||||
|
||||
// 添加并修改
|
||||
self.tree.addNodes(self.tree.getNodeByTId(notebookId), {Title: "", NotebookId: getObjectId(), IsNew: true}, false, true);
|
||||
}
|
||||
|
||||
//-------------
|
||||
// 删除
|
||||
Notebook.deleteNotebook = function(target) {
|
||||
var self = Notebook;
|
||||
|
||||
var notebookId = $(target).attr("notebookId");
|
||||
if(!notebookId) {
|
||||
return;
|
||||
}
|
||||
|
||||
ajaxGet("/notebook/deleteNotebook", {notebookId: notebookId}, function(ret) {
|
||||
if(ret.Ok) {
|
||||
/*
|
||||
$(target).parent().remove();
|
||||
*/
|
||||
self.tree.removeNode(self.tree.getNodeByTId(notebookId));
|
||||
if(self.tree2) {
|
||||
self.tree2.removeNode(self.tree2.getNodeByTId(notebookId));
|
||||
}
|
||||
delete Notebook.cache[notebookId];
|
||||
|
||||
// 改变nav
|
||||
Notebook.changeNav();
|
||||
} else {
|
||||
alert(ret.Msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$(function() {
|
||||
//-------------------
|
||||
// 点击notebook
|
||||
/*
|
||||
$("#myNotebooks").on("click", "ul.folderBody li a", function() {
|
||||
var notebookId = $(this).attr("notebookId");
|
||||
Notebook.changeNotebook(notebookId);
|
||||
});
|
||||
*/
|
||||
// min
|
||||
$("#minNotebookList").on("click", "li", function() {
|
||||
var notebookId = $(this).find("a").attr("notebookId");
|
||||
Notebook.changeNotebook(notebookId);
|
||||
});
|
||||
|
||||
// 修改笔记本标题, blur后修改标题之
|
||||
/*
|
||||
enterBlur("#notebookList", "input#editNotebookTitle");
|
||||
$("#notebookList").on("blur", "input#editNotebookTitle", Notebook.doUpdateNotebookTitle);
|
||||
*/
|
||||
|
||||
//-------------------
|
||||
// 右键菜单
|
||||
var notebookListMenu = {
|
||||
width: 180,
|
||||
items: [
|
||||
{ text: getMsg("shareToFriends"), alias: 'shareToFriends', icon: "", faIcon: "fa-share-square-o", action: Notebook.listNotebookShareUserInfo},
|
||||
{ type: "splitLine" },
|
||||
{ text: getMsg("publicAsBlog"), alias: 'set2Blog', faIcon: "fa-bold", action: Notebook.setNotebook2Blog },
|
||||
{ text: getMsg("cancelPublic"), alias: 'unset2Blog',faIcon: "fa-undo", action: Notebook.setNotebook2Blog }, // Unset
|
||||
{ type: "splitLine" },
|
||||
{ text: getMsg("addChildNotebook"), faIcon: "fa-sitemap", action: Notebook.addChildNotebook },
|
||||
{ text: getMsg("rename"), faIcon: "fa-pencil", action: Notebook.updateNotebookTitle },
|
||||
{ text: getMsg("delete"), icon: "", alias: 'delete', faIcon: "fa-trash-o", action: Notebook.deleteNotebook }
|
||||
],
|
||||
onShow: applyrule,
|
||||
onContextMenu: beforeContextMenu,
|
||||
parent: "#notebookList ",
|
||||
children: "li a"
|
||||
}
|
||||
|
||||
// for search
|
||||
var notebookListMenu2 = {
|
||||
width: 180,
|
||||
items: [
|
||||
{ text: getMsg("shareToFriends"), alias: 'shareToFriends', icon: "", faIcon: "fa-share-square-o", action: Notebook.listNotebookShareUserInfo},
|
||||
{ type: "splitLine" },
|
||||
{ text: getMsg("publicAsBlog"), alias: 'set2Blog', faIcon: "fa-bold", action: Notebook.setNotebook2Blog },
|
||||
{ text: getMsg("cancelPublic"), alias: 'unset2Blog',faIcon: "fa-undo", action: Notebook.setNotebook2Blog }, // Unset
|
||||
{ type: "splitLine" },
|
||||
{ text: getMsg("rename"), icon: "", action: Notebook.updateNotebookTitle },
|
||||
{ text: getMsg("delete"), icon: "", alias: 'delete', faIcon: "fa-trash-o", action: Notebook.deleteNotebook }
|
||||
],
|
||||
onShow: applyrule,
|
||||
onContextMenu: beforeContextMenu,
|
||||
parent: "#notebookListForSearch ",
|
||||
children: "li a"
|
||||
}
|
||||
|
||||
function applyrule(menu) {
|
||||
var notebookId = $(this).attr("notebookId");
|
||||
var notebook = Notebook.cache[notebookId];
|
||||
if(!notebook) {
|
||||
return;
|
||||
}
|
||||
// disabled的items
|
||||
var items = [];
|
||||
// 是否已公开为blog
|
||||
if(!notebook.IsBlog) {
|
||||
items.push("unset2Blog");
|
||||
} else {
|
||||
items.push("set2Blog");
|
||||
}
|
||||
// 是否还有笔记
|
||||
if(Note.notebookHasNotes(notebookId)) {
|
||||
items.push("delete");
|
||||
}
|
||||
menu.applyrule({
|
||||
name: "target2",
|
||||
disable: true,
|
||||
items: items
|
||||
});
|
||||
}
|
||||
// 哪个不能
|
||||
function beforeContextMenu() {
|
||||
var notebookId = $(this).attr("notebookId");
|
||||
return !Notebook.isTrashNotebookId(notebookId) && !Notebook.isAllNotebookId(notebookId);
|
||||
}
|
||||
|
||||
Notebook.contextmenu = $("#notebookList li a").contextmenu(notebookListMenu);
|
||||
|
||||
Notebook.contextmenuSearch = $("#notebookListForSearch li a").contextmenu(notebookListMenu2);
|
||||
|
||||
// 添加笔记本
|
||||
$("#addNotebookPlus").click(function(e) {
|
||||
e.stopPropagation();
|
||||
Notebook.addNotebook();
|
||||
});
|
||||
|
||||
// notebook setting
|
||||
$("#notebookList").on("click", ".notebook-setting", function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
var $p = $(this).parent();
|
||||
Notebook.contextmenu.showMenu(e, $p);
|
||||
});
|
||||
$("#notebookListForSearch").on("click", ".notebook-setting", function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
var $p = $(this).parent();
|
||||
Notebook.contextmenuSearch.showMenu(e, $p);
|
||||
});
|
||||
});
|
1
public/js/app/page-min.js
vendored
Normal file
1
public/js/app/page-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
795
public/js/app/page.js
Normal file
795
public/js/app/page.js
Normal file
@ -0,0 +1,795 @@
|
||||
// 主页渲染
|
||||
//-------------
|
||||
|
||||
//----------------------
|
||||
// 编辑器模式
|
||||
function editorMode() {
|
||||
this.writingHash = "#writing";
|
||||
this.normalHash = "#normal";
|
||||
this.isWritingMode = location.hash == this.writingHash;
|
||||
|
||||
this.toggleA = null;
|
||||
}
|
||||
|
||||
editorMode.prototype.toggleAText = function(isWriting) {
|
||||
var self = this;
|
||||
setTimeout(function() {
|
||||
toggleA = $("#toggleEditorMode a");
|
||||
if(isWriting) {
|
||||
toggleA.attr("href", self.normalHash).text(getMsg("normalMode"));
|
||||
} else {
|
||||
toggleA.attr("href", self.writingHash).text(getMsg("writingMode"));
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
editorMode.prototype.isWriting = function(hash) {
|
||||
return hash == this.writingHash;
|
||||
}
|
||||
editorMode.prototype.init = function() {
|
||||
this.changeMode(this.isWritingMode);
|
||||
var self = this;
|
||||
$("#toggleEditorMode").click(function() {
|
||||
//
|
||||
saveBookmark();
|
||||
var $a = $(this).find("a");
|
||||
var isWriting = self.isWriting($a.attr("href"));
|
||||
self.changeMode(isWriting);
|
||||
//
|
||||
restoreBookmark();
|
||||
});
|
||||
}
|
||||
// 改变模式
|
||||
editorMode.prototype.changeMode = function(isWritingMode) {
|
||||
this.toggleAText(isWritingMode);
|
||||
if(isWritingMode) {
|
||||
this.writtingMode();
|
||||
} else {
|
||||
this.normalMode();
|
||||
}
|
||||
|
||||
$("#moreBtn i").removeClass("fa-angle-up").addClass("fa-angle-down");
|
||||
}
|
||||
|
||||
editorMode.prototype.resizeEditor = function() {
|
||||
// css还没渲染完
|
||||
setTimeout(function() {
|
||||
resizeEditor();
|
||||
}, 10);
|
||||
setTimeout(function() {
|
||||
resizeEditor();
|
||||
}, 20);
|
||||
setTimeout(function() {
|
||||
resizeEditor();
|
||||
}, 500);
|
||||
}
|
||||
editorMode.prototype.normalMode = function() {
|
||||
/*
|
||||
var w = $(document).width();
|
||||
var h = $(document).height();
|
||||
$("#lock").css({right:0, bottom:0});
|
||||
*/
|
||||
|
||||
var $c = $("#editorContent_ifr").contents();
|
||||
|
||||
$c.contents().find("#writtingMode").remove();
|
||||
$c.contents().find('link[href$="editor-writting-mode.css"]').remove();
|
||||
|
||||
$("#noteItemListWrap, #notesAndSort").show();
|
||||
$("#noteList").unbind("mouseenter").unbind("mouseleave");
|
||||
|
||||
var theme = UserInfo.Theme || "default";
|
||||
theme += ".css";
|
||||
$("#themeLink").attr("href", "/css/theme/" + theme);
|
||||
|
||||
$("#mceToolbar").css("height", "30px");
|
||||
|
||||
// $("#lock").animate({right:w},1000);
|
||||
|
||||
this.resizeEditor();
|
||||
|
||||
$("#noteList").width(UserInfo.NoteListWidth);
|
||||
$("#note").css("left", UserInfo.NoteListWidth);
|
||||
}
|
||||
editorMode.prototype.writtingMode = function() {
|
||||
// $("#pageInner").removeClass("animated fadeInUp");
|
||||
|
||||
$("#themeLink").attr("href", "/css/theme/writting-overwrite.css");
|
||||
|
||||
setTimeout(function() {
|
||||
var $c = $("#editorContent_ifr").contents();
|
||||
$c.contents().find("head").append('<link type="text/css" rel="stylesheet" href="/css/editor/editor-writting-mode.css" id="writtingMode">');
|
||||
}, 0);
|
||||
|
||||
$("#noteItemListWrap, #notesAndSort").fadeOut();
|
||||
$("#noteList").hover(function() {
|
||||
$("#noteItemListWrap, #notesAndSort").fadeIn();
|
||||
}, function() {
|
||||
$("#noteItemListWrap, #notesAndSort").fadeOut();
|
||||
});
|
||||
|
||||
// 点击扩展会使html的height生成, 切换后会覆盖css文件的
|
||||
$("#mceToolbar").css("height", "40px");
|
||||
|
||||
//$("#pageInner").addClass("animated fadeInUp");
|
||||
|
||||
this.resizeEditor();
|
||||
|
||||
$("#noteList").width(250);
|
||||
$("#note").css("left", 0);
|
||||
}
|
||||
|
||||
editorMode.prototype.getWritingCss = function() {
|
||||
if(this.isWritingMode) {
|
||||
return ["css/editor/editor-writting-mode.css"];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
var em = new editorMode();
|
||||
|
||||
//----------------
|
||||
// 拖拉改变变宽度
|
||||
var Resize = {
|
||||
lineMove: false,
|
||||
mdLineMove: false,
|
||||
target: null,
|
||||
|
||||
leftNotebook: $("#leftNotebook"),
|
||||
notebookSplitter: $("#notebookSplitter"),
|
||||
noteList: $("#noteList"),
|
||||
noteAndEditor: $("#noteAndEditor"),
|
||||
noteSplitter: $("#noteSplitter"),
|
||||
note: $("#note"),
|
||||
body: $("body"),
|
||||
leftColumn: $("#left-column"),
|
||||
rightColumn: $("#right-column"),
|
||||
mdSplitter: $("#mdSplitter"),
|
||||
|
||||
init: function() {
|
||||
var self = this;
|
||||
self.initEvent();
|
||||
},
|
||||
|
||||
initEvent: function() {
|
||||
var self = this;
|
||||
|
||||
// 鼠标点下
|
||||
$(".noteSplit").bind("mousedown", function(event) {
|
||||
event.preventDefault(); // 防止选择文本
|
||||
self.lineMove = true;
|
||||
$(this).css("background-color", "#ccc");
|
||||
self.target = $(this).attr("id");
|
||||
// 防止iframe捕获不了事件
|
||||
$("#noteMask").css("z-index", 99999); // .css("background-color", // "#ccc");
|
||||
});
|
||||
|
||||
// 鼠标点下
|
||||
self.mdSplitter.bind("mousedown", function(event) {
|
||||
event.preventDefault(); // 防止选择文本
|
||||
self.mdLineMove = true;
|
||||
$(this).css("background-color", "#ccc");
|
||||
});
|
||||
|
||||
// 鼠标移动时
|
||||
self.body.bind("mousemove", function(event) {
|
||||
if(self.lineMove) { // 如果没有这个if会导致不能选择文本
|
||||
event.preventDefault();
|
||||
self.resize3Columns(event);
|
||||
} else if(self.mdLineMove) {
|
||||
event.preventDefault();
|
||||
self.resizeMdColumns(event);
|
||||
}
|
||||
});
|
||||
|
||||
// 鼠标放开, 结束
|
||||
self.body.bind("mouseup", function(event) {
|
||||
self.stopResize();
|
||||
// 取消遮罩
|
||||
$("#noteMask").css("z-index", -1);
|
||||
});
|
||||
},
|
||||
// 停止, 保存数据
|
||||
stopResize: function() {
|
||||
var self = this;
|
||||
if(self.lineMove || self.mdLineMove) {
|
||||
// ajax保存
|
||||
ajaxGet("/user/updateColumnWidth", {mdEditorWidth: UserInfo.MdEditorWidth, notebookWidth: UserInfo.NotebookWidth, noteListWidth: UserInfo.NoteListWidth}, function() {
|
||||
});
|
||||
}
|
||||
self.lineMove = false;
|
||||
self.mdLineMove = false;
|
||||
$(".noteSplit").css("background", "none");
|
||||
self.mdSplitter.css("background", "none");
|
||||
},
|
||||
|
||||
// 最终调用该方法
|
||||
set3ColumnsWidth: function(notebookWidth, noteListWidth) {
|
||||
var self = this;
|
||||
if(notebookWidth < 150 || noteListWidth < 100) {
|
||||
return;
|
||||
}
|
||||
var noteWidth = self.body.width() - notebookWidth - noteListWidth;
|
||||
if(noteWidth < 400) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.leftNotebook.width(notebookWidth);
|
||||
self.notebookSplitter.css("left", notebookWidth);
|
||||
|
||||
self.noteAndEditor.css("left", notebookWidth);
|
||||
self.noteList.width(noteListWidth);
|
||||
self.noteSplitter.css("left", noteListWidth);
|
||||
self.note.css("left", noteListWidth);
|
||||
|
||||
UserInfo.NotebookWidth = notebookWidth;
|
||||
UserInfo.NoteListWidth = noteListWidth;
|
||||
},
|
||||
resize3Columns: function(event, isFromeIfr) {
|
||||
var self = this;
|
||||
if (isFromeIfr) {
|
||||
event.clientX += self.body.width() - self.note.width();
|
||||
}
|
||||
|
||||
var notebookWidth, noteListWidth;
|
||||
if(self.lineMove) {
|
||||
if (self.target == "notebookSplitter") {
|
||||
notebookWidth = event.clientX;
|
||||
noteListWidth = self.noteList.width();
|
||||
self.set3ColumnsWidth(notebookWidth, noteListWidth);
|
||||
} else {
|
||||
notebookWidth = self.leftNotebook.width();
|
||||
noteListWidth = event.clientX - notebookWidth;
|
||||
self.set3ColumnsWidth(notebookWidth, noteListWidth);
|
||||
}
|
||||
|
||||
resizeEditor();
|
||||
}
|
||||
},
|
||||
|
||||
// mdeditor
|
||||
resizeMdColumns: function(event) {
|
||||
var self = this;
|
||||
if (self.mdLineMove) {
|
||||
var mdEditorWidth = event.clientX - self.leftNotebook.width() - self.noteList.width();
|
||||
self.setMdColumnWidth(mdEditorWidth);
|
||||
}
|
||||
},
|
||||
// 设置宽度
|
||||
setMdColumnWidth: function(mdEditorWidth) {
|
||||
var self = this;
|
||||
if(mdEditorWidth > 100) {
|
||||
UserInfo.MdEditorWidth = mdEditorWidth;
|
||||
self.leftColumn.width(mdEditorWidth);
|
||||
self.rightColumn.css("left", mdEditorWidth);
|
||||
self.mdSplitter.css("left", mdEditorWidth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------
|
||||
// 手机端访问之
|
||||
Mobile = {
|
||||
// 点击之笔记
|
||||
// 切换到编辑器模式
|
||||
noteO: $("#note"),
|
||||
bodyO: $("body"),
|
||||
setMenuO: $("#setMenu"),
|
||||
hashChange: function() {
|
||||
var self = Mobile;
|
||||
var hash = location.hash;
|
||||
// noteId
|
||||
if(hash.indexOf("noteId") != -1) {
|
||||
self.toEditor(false);
|
||||
var noteId = hash.substr(8);
|
||||
Note.changeNote(noteId, false, false);
|
||||
} else {
|
||||
// 笔记本和笔记列表
|
||||
self.toNormal(false);
|
||||
}
|
||||
},
|
||||
init: function() {
|
||||
var self = this;
|
||||
self.isMobile();
|
||||
$(window).on("hashchange", self.hashChange);
|
||||
self.hashChange();
|
||||
/*
|
||||
$("#noteItemList").on("tap", ".item", function(event) {
|
||||
$(this).click();
|
||||
});
|
||||
$(document).on("swipeleft",function(e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
self.toEditor();
|
||||
});
|
||||
$(document).on("swiperight",function(e){
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
self.toNormal();
|
||||
});
|
||||
*/
|
||||
},
|
||||
isMobile: function() {
|
||||
var u = navigator.userAgent;
|
||||
LEA.isMobile = false;
|
||||
LEA.isMobile = /Mobile|Android|iPhone/i.test(u);
|
||||
if(!LEA.isMobile && $(document).width() <= 700){
|
||||
LEA.isMobile = true
|
||||
}
|
||||
return LEA.isMobile;
|
||||
},
|
||||
changeNote: function(noteId) {
|
||||
var self = this;
|
||||
if(!LEA.isMobile) {return true;}
|
||||
self.toEditor(true, noteId);
|
||||
return false;
|
||||
},
|
||||
|
||||
toEditor: function(changeHash, noteId) {
|
||||
var self = this;
|
||||
self.bodyO.addClass("full-editor");
|
||||
self.noteO.addClass("editor-show");
|
||||
if(changeHash) {
|
||||
if(!noteId) {
|
||||
noteId = Note.curNoteId;
|
||||
}
|
||||
location.hash = "noteId=" + noteId;
|
||||
}
|
||||
},
|
||||
toNormal: function(changeHash) {
|
||||
var self = this;
|
||||
self.bodyO.removeClass("full-editor");
|
||||
self.noteO.removeClass("editor-show");
|
||||
|
||||
if(changeHash) {
|
||||
location.hash = "notebookAndNote";
|
||||
}
|
||||
},
|
||||
switchPage: function() {
|
||||
var self = this;
|
||||
if(!LEA.isMobile) {return true;}
|
||||
if(self.bodyO.hasClass("full-editor")) {
|
||||
self.toNormal(true);
|
||||
} else {
|
||||
self.toEditor(true);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function initSlimScroll() {
|
||||
if(Mobile.isMobile()) {
|
||||
return;
|
||||
}
|
||||
$("#notebook").slimScroll({
|
||||
height: "100%", // $("#leftNotebook").height()+"px"
|
||||
});
|
||||
$("#noteItemList").slimScroll({
|
||||
height: "100%", // ($("#leftNotebook").height()-42)+"px"
|
||||
});
|
||||
$("#wmd-input").slimScroll({
|
||||
height: "100%", // $("#wmd-input").height()+"px"
|
||||
});
|
||||
$("#wmd-input").css("width", "100%");
|
||||
|
||||
$("#wmd-panel-preview").slimScroll({
|
||||
height: "100%", // $("#wmd-panel-preview").height()+"px"
|
||||
});
|
||||
|
||||
$("#wmd-panel-preview").css("width", "100%");
|
||||
}
|
||||
|
||||
//-----------
|
||||
// 初始化编辑器
|
||||
function initEditor() {
|
||||
// editor
|
||||
// toolbar 下拉扩展, 也要resizeEditor
|
||||
var mceToobarEverHeight = 0;
|
||||
$("#moreBtn").click(function() {
|
||||
saveBookmark();
|
||||
|
||||
var height = $("#mceToolbar").height();
|
||||
|
||||
// 现在是折叠的
|
||||
if (height < $("#popularToolbar").height()) {
|
||||
$("#mceToolbar").height($("#popularToolbar").height());
|
||||
$(this).find("i").removeClass("fa-angle-down").addClass("fa-angle-up");
|
||||
mceToobarEverHeight = height;
|
||||
} else {
|
||||
$("#mceToolbar").height(mceToobarEverHeight);
|
||||
$(this).find("i").removeClass("fa-angle-up").addClass("fa-angle-down");
|
||||
}
|
||||
|
||||
resizeEditor();
|
||||
|
||||
restoreBookmark();
|
||||
});
|
||||
|
||||
// 初始化编辑器
|
||||
tinymce.init({
|
||||
setup: function(ed) {
|
||||
ed.on('keydown', Note.saveNote);
|
||||
// indent outdent
|
||||
ed.on('keydown', function(e) {
|
||||
var num = e.which ? e.which : e.keyCode;
|
||||
if (num == 9) { // tab pressed
|
||||
|
||||
if(!e.shiftKey) {
|
||||
// ed.execCommand('Indent');
|
||||
// TODO 如果当前在li, ul, ol下不执行!!
|
||||
// 如果在pre下就加tab
|
||||
var node = ed.selection.getNode();
|
||||
if(node.nodeName == "PRE") {
|
||||
ed.execCommand('mceInsertRawHTML', false, '\x09'); // inserts tab
|
||||
} else {
|
||||
ed.execCommand('mceInsertRawHTML', false, " "); // inserts 空格
|
||||
}
|
||||
} else {
|
||||
// delete 4 个空格
|
||||
// ed.execCommand('Outdent');
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// 为了把下拉菜单关闭
|
||||
ed.on("click", function(e) {
|
||||
$("body").trigger("click");
|
||||
});
|
||||
|
||||
// 鼠标移上时
|
||||
ed.on("click", function() {
|
||||
log(ed.selection.getNode())
|
||||
});
|
||||
},
|
||||
|
||||
// fix TinyMCE Removes site base url
|
||||
// http://stackoverflow.com/questions/3360084/tinymce-removes-site-base-urls
|
||||
convert_urls:true,
|
||||
relative_urls:false,
|
||||
remove_script_host:false,
|
||||
|
||||
selector : "#editorContent",
|
||||
// height: 100,//这个应该是文档的高度, 而其上层的高度是$("#content").height(),
|
||||
// parentHeight: $("#content").height(),
|
||||
content_css : ["css/bootstrap.css", "css/editor/editor.css"].concat(em.getWritingCss()),
|
||||
skin : "custom",
|
||||
language: LEA.locale, // 语言
|
||||
plugins : [
|
||||
"autolink link leaui_image lists charmap hr", "paste",
|
||||
"searchreplace leanote_nav leanote_code tabfocus",
|
||||
"table directionality textcolor codemirror" ], // nonbreaking
|
||||
|
||||
toolbar1 : "formatselect | forecolor backcolor | bold italic underline strikethrough | leaui_image | leanote_code | bullist numlist | alignleft aligncenter alignright alignjustify",
|
||||
toolbar2 : "outdent indent blockquote | link unlink | table | hr removeformat | subscript superscript |searchreplace | code | pastetext pasteCopyImage | fontselect fontsizeselect",
|
||||
|
||||
// 使用tab键: http://www.tinymce.com/wiki.php/Plugin3x:nonbreaking
|
||||
// http://stackoverflow.com/questions/13543220/tiny-mce-how-to-allow-people-to-indent
|
||||
// nonbreaking_force_tab : true,
|
||||
|
||||
menubar : false,
|
||||
toolbar_items_size : 'small',
|
||||
statusbar : false,
|
||||
url_converter: false,
|
||||
font_formats : "Arial=arial,helvetica,sans-serif;"
|
||||
+ "Arial Black=arial black,avant garde;"
|
||||
+ "Times New Roman=times new roman,times;"
|
||||
+ "Courier New=courier new,courier;"
|
||||
+ "Tahoma=tahoma,arial,helvetica,sans-serif;"
|
||||
+ "Verdana=verdana,geneva;" + "宋体=SimSun;"
|
||||
+ "新宋体=NSimSun;" + "黑体=SimHei;"
|
||||
+ "微软雅黑=Microsoft YaHei",
|
||||
block_formats : "Header 1=h1;Header 2=h2;Header 3=h3; Header 4=h4;Pre=pre;Paragraph=p",
|
||||
codemirror: {
|
||||
indentOnInit: true, // Whether or not to indent code on init.
|
||||
path: 'CodeMirror', // Path to CodeMirror distribution
|
||||
config: { // CodeMirror config object
|
||||
//mode: 'application/x-httpd-php',
|
||||
lineNumbers: true
|
||||
},
|
||||
jsFiles: [ // Additional JS files to load
|
||||
// 'mode/clike/clike.js',
|
||||
//'mode/php/php.js'
|
||||
]
|
||||
},
|
||||
// This option specifies whether data:url images (inline images) should be removed or not from the pasted contents.
|
||||
// Setting this to "true" will allow the pasted images, and setting this to "false" will disallow pasted images.
|
||||
// For example, Firefox enables you to paste images directly into any contentEditable field. This is normally not something people want, so this option is "false" by default.
|
||||
paste_data_images: true
|
||||
});
|
||||
|
||||
// 刷新时保存 参考autosave插件
|
||||
window.onbeforeunload = function(e) {
|
||||
Note.curChangedSaveIt();
|
||||
}
|
||||
|
||||
// 全局ctrl + s
|
||||
$("body").on('keydown', Note.saveNote);
|
||||
}
|
||||
|
||||
//-----------------------
|
||||
// 导航
|
||||
var random = 1;
|
||||
function scrollTo(self, tagName, text) {
|
||||
var iframe = $("#editorContent_ifr").contents();
|
||||
var target = iframe.find(tagName + ":contains(" + text + ")");
|
||||
random++;
|
||||
|
||||
// 找到是第几个
|
||||
// 在nav是第几个
|
||||
var navs = $('#leanoteNavContent [data-a="' + tagName + '-' + encodeURI(text) + '"]');
|
||||
// alert('#leanoteNavContent [data-a="' + tagName + '-' + encodeURI(text) + '"]')
|
||||
var len = navs.size();
|
||||
for(var i = 0; i < len; ++i) {
|
||||
if(navs[i] == self) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (target.size() >= i+1) {
|
||||
target = target.eq(i);
|
||||
// 之前插入, 防止多行定位不准
|
||||
var top = target.offset().top;
|
||||
var nowTop = iframe.scrollTop();
|
||||
|
||||
// iframe.scrollTop(top);
|
||||
// $(iframe).animate({scrollTop: top}, 300); // 有问题
|
||||
|
||||
var d = 200; // 时间间隔
|
||||
for(var i = 0; i < d; i++) {
|
||||
setTimeout(
|
||||
(function(top) {
|
||||
return function() {
|
||||
iframe.scrollTop(top);
|
||||
}
|
||||
})(nowTop + 1.0*i*(top-nowTop)/d), i);
|
||||
}
|
||||
// 最后必然执行
|
||||
setTimeout(function() {
|
||||
iframe.scrollTop(top);
|
||||
}, d+5);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//--------------
|
||||
// 调用之
|
||||
$(function() {
|
||||
// 窗口缩放时
|
||||
$(window).resize(function() {
|
||||
Mobile.isMobile();
|
||||
resizeEditor();
|
||||
});
|
||||
|
||||
// 初始化编辑器
|
||||
initEditor();
|
||||
|
||||
// 左侧, folder 展开与关闭
|
||||
$(".folderHeader").click(function() {
|
||||
var body = $(this).next();
|
||||
var p = $(this).parent();
|
||||
if (!body.is(":hidden")) {
|
||||
$(".folderNote").removeClass("opened").addClass("closed");
|
||||
// body.hide();
|
||||
p.removeClass("opened").addClass("closed");
|
||||
$(this).find(".fa-angle-down").removeClass("fa-angle-down").addClass("fa-angle-right");
|
||||
} else {
|
||||
$(".folderNote").removeClass("opened").addClass("closed");
|
||||
// body.show();
|
||||
p.removeClass("closed").addClass("opened");
|
||||
$(this).find(".fa-angle-right").removeClass("fa-angle-right").addClass("fa-angle-down");
|
||||
}
|
||||
});
|
||||
|
||||
// 导航隐藏与显示
|
||||
$("#leanoteNav h1").on("click", function(e) {
|
||||
if (!$("#leanoteNav").hasClass("unfolder")) {
|
||||
$("#leanoteNav").addClass("unfolder");
|
||||
} else {
|
||||
$("#leanoteNav").removeClass("unfolder");
|
||||
}
|
||||
});
|
||||
|
||||
// 打开设置
|
||||
function openSetInfoDialog(whichTab) {
|
||||
showDialogRemote("/user/account", {tab: whichTab});
|
||||
}
|
||||
// 帐号设置
|
||||
$("#setInfo").click(function() {
|
||||
openSetInfoDialog(0);
|
||||
});
|
||||
// 邮箱验证
|
||||
$("#wrongEmail").click(function() {
|
||||
openSetInfoDialog(1);
|
||||
});
|
||||
|
||||
$("#setAvatarMenu").click(function() {
|
||||
showDialog2("#avatarDialog", {title: "头像设置", postShow: function() {
|
||||
}});
|
||||
});
|
||||
$("#setTheme").click(function() {
|
||||
showDialog2("#setThemeDialog", {title: "主题设置", postShow: function() {
|
||||
if (!UserInfo.Theme) {
|
||||
UserInfo.Theme = "default";
|
||||
}
|
||||
$("#themeForm input[value='" + UserInfo.Theme + "']").attr("checked", true);
|
||||
}});
|
||||
});
|
||||
|
||||
//---------
|
||||
// 主题
|
||||
$("#themeForm").on("click", "input", function(e) {
|
||||
var val = $(this).val();
|
||||
$("#themeLink").attr("href", "/css/theme/" + val + ".css");
|
||||
|
||||
ajaxPost("/user/updateTheme", {theme: val}, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
UserInfo.Theme = val
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//-------------
|
||||
// 邮箱验证
|
||||
if(!UserInfo.Verified) {
|
||||
// $("#leanoteMsg").hide();
|
||||
// $("#verifyMsg").show();
|
||||
}
|
||||
|
||||
// 禁止双击选中文字
|
||||
$("#notebook, #newMyNote, #myProfile, #topNav, #notesAndSort", "#leanoteNavTrigger").bind("selectstart", function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// 左侧隐藏或展示
|
||||
function updateLeftIsMin(is) {
|
||||
ajaxGet("/user/updateLeftIsMin", {leftIsMin: is})
|
||||
}
|
||||
function minLeft(save) {
|
||||
$("#leftNotebook").width(30);
|
||||
$("#notebook").hide();
|
||||
// 左侧
|
||||
$("#noteAndEditor").css("left", 30)
|
||||
$("#notebookSplitter").hide();
|
||||
|
||||
// $("#leftSwitcher").removeClass("fa-angle-left").addClass("fa-angle-right");
|
||||
|
||||
// logo
|
||||
$("#logo").hide();
|
||||
$("#leftSwitcher").hide();
|
||||
$("#leftSwitcher2").show();
|
||||
$("#leftNotebook .slimScrollDiv").hide();
|
||||
|
||||
if(save) {
|
||||
updateLeftIsMin(true);
|
||||
}
|
||||
}
|
||||
|
||||
function maxLeft(save) {
|
||||
$("#noteAndEditor").css("left", UserInfo.NotebookWidth);
|
||||
$("#leftNotebook").width(UserInfo.NotebookWidth);
|
||||
$("#notebook").show();
|
||||
$("#notebookSplitter").show();
|
||||
|
||||
// $("#leftSwitcher").removeClass("fa-angle-right").addClass("fa-angle-left");
|
||||
|
||||
$("#leftSwitcher2").hide();
|
||||
$("#logo").show();
|
||||
$("#leftSwitcher").show();
|
||||
$("#leftNotebook .slimScrollDiv").show();
|
||||
|
||||
if(save) {
|
||||
updateLeftIsMin(false);
|
||||
}
|
||||
}
|
||||
|
||||
$("#leftSwitcher2").click(function() {
|
||||
maxLeft(true);
|
||||
});
|
||||
$("#leftSwitcher").click(function() {
|
||||
if(Mobile.switchPage()) {
|
||||
minLeft(true);
|
||||
}
|
||||
});
|
||||
|
||||
// 得到最大dropdown高度
|
||||
// 废弃
|
||||
function getMaxDropdownHeight(obj) {
|
||||
var offset = $(obj).offset();
|
||||
var maxHeight = $(document).height()-offset.top;
|
||||
maxHeight -= 70;
|
||||
if(maxHeight < 0) {
|
||||
maxHeight = 0;
|
||||
}
|
||||
|
||||
var preHeight = $(obj).find("ul").height();
|
||||
return preHeight < maxHeight ? preHeight : maxHeight;
|
||||
}
|
||||
|
||||
// mini版
|
||||
// 点击展开
|
||||
$("#notebookMin div.minContainer").click(function() {
|
||||
var target = $(this).attr("target");
|
||||
maxLeft(true);
|
||||
if(target == "#notebookList") {
|
||||
if($("#myNotebooks").hasClass("closed")) {
|
||||
$("#myNotebooks .folderHeader").trigger("click");
|
||||
}
|
||||
} else if(target == "#tagNav") {
|
||||
if($("#myTag").hasClass("closed")) {
|
||||
$("#myTag .folderHeader").trigger("click");
|
||||
}
|
||||
} else {
|
||||
if($("#myShareNotebooks").hasClass("closed")) {
|
||||
$("#myShareNotebooks .folderHeader").trigger("click");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//------------------------
|
||||
// 界面设置, 左侧是否是隐藏的
|
||||
UserInfo.NotebookWidth = UserInfo.NotebookWidth || $("#notebook").width();
|
||||
UserInfo.NoteListWidth = UserInfo.NoteListWidth || $("#noteList").width();
|
||||
|
||||
Resize.init();
|
||||
Resize.set3ColumnsWidth(UserInfo.NotebookWidth, UserInfo.NoteListWidth);
|
||||
Resize.setMdColumnWidth(UserInfo.MdEditorWidth);
|
||||
|
||||
if (UserInfo.LeftIsMin) {
|
||||
minLeft(false);
|
||||
}
|
||||
|
||||
// end
|
||||
// 开始时显示loading......
|
||||
// 隐藏mask
|
||||
$("#mainMask").html("");
|
||||
$("#mainMask").hide(100);
|
||||
|
||||
// 4/25 防止dropdown太高
|
||||
// dropdown
|
||||
$('.dropdown').on('shown.bs.dropdown', function () {
|
||||
var $ul = $(this).find("ul");
|
||||
// $ul.css("max-height", getMaxDropdownHeight(this));
|
||||
});
|
||||
|
||||
//--------
|
||||
// 编辑器帮助
|
||||
$("#tipsBtn").click(function() {
|
||||
showDialog2("#tipsDialog");
|
||||
});
|
||||
|
||||
//--------
|
||||
// 建议
|
||||
$("#yourSuggestions").click(function() {
|
||||
showDialog2("#suggestionsDialog");
|
||||
});
|
||||
$("#suggestionBtn").click(function(e) {
|
||||
e.preventDefault();
|
||||
var suggestion = $.trim($("#suggestionTextarea").val());
|
||||
if(!suggestion) {
|
||||
$("#suggestionMsg").html("请输入您的建议, 谢谢!").show().addClass("alert-warning").removeClass("alert-success");
|
||||
$("#suggestionTextarea").focus();
|
||||
return;
|
||||
}
|
||||
$("#suggestionBtn").html("正在处理...").addClass("disabled");
|
||||
$("#suggestionMsg").html("正在处理...");
|
||||
$.post("/suggestion", {suggestion: suggestion}, function(ret) {
|
||||
$("#suggestionBtn").html("提交").removeClass("disabled");
|
||||
if(ret.Ok) {
|
||||
$("#suggestionMsg").html("谢谢反馈, 我们会第一时间处理, 祝您愉快!").addClass("alert-success").removeClass("alert-warning").show();
|
||||
} else {
|
||||
$("#suggestionMsg").html("出错了").show().addClass("alert-warning").removeClass("alert-success");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 编辑器模式
|
||||
em.init();
|
||||
|
||||
// 手机端?
|
||||
Mobile.init();
|
||||
});
|
||||
|
1
public/js/app/share-min.js
vendored
Normal file
1
public/js/app/share-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
583
public/js/app/share.js
Normal file
583
public/js/app/share.js
Normal file
@ -0,0 +1,583 @@
|
||||
//------------------------------------
|
||||
// 共享, notbeook, note
|
||||
//------------------------------------
|
||||
|
||||
// 默认共享notebook id
|
||||
Share.defaultNotebookId = "share0";
|
||||
Share.defaultNotebookTitle = getMsg("defaulthhare");
|
||||
Share.sharedUserInfos = {}; // userId => {}
|
||||
|
||||
// 在render时就创建, 以后复用之
|
||||
Share.userNavs = {}; // userId => {"forList":html, "forNew":html}
|
||||
|
||||
// 缓存都不要, 统一放在Note.cache中
|
||||
// 放在这里, 只是为了debug, 分离
|
||||
Share.notebookCache = {}; // notebooks 的cache
|
||||
Share.cache = {}; // note的cache
|
||||
|
||||
// 分享的弹出框是note的
|
||||
Share.dialogIsNote = true;
|
||||
|
||||
// 设置缓存 note
|
||||
Share.setCache = function(note) {
|
||||
if(!note || !note.NoteId) {
|
||||
return;
|
||||
}
|
||||
Share.cache[note.NoteId] = note;
|
||||
}
|
||||
|
||||
/**
|
||||
* 我的共享notebooks
|
||||
<div id="shareNotebooks">
|
||||
<div class="folderNote closed">
|
||||
<div class="folderHeader">
|
||||
<a>
|
||||
<h1>
|
||||
<i class="fa fa-angle-right"></i>
|
||||
Life's</h1>
|
||||
</a>
|
||||
</div>
|
||||
<ul class="folderBody">
|
||||
<li><a>Hadoop</a></li>
|
||||
<li><a>Node webkit</a></li>
|
||||
<li><a>Hadoop</a></li>
|
||||
<li><a>Node webkit</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
*/
|
||||
// TODO 层级
|
||||
// shareNotebooks = {userId => {}}
|
||||
Share.getNotebooksForNew = function(userId, notebooks) {
|
||||
var self = this;
|
||||
var navForNewNote = "";
|
||||
|
||||
var len = notebooks.length;
|
||||
for(var i = 0; i < len; ++i) {
|
||||
var notebook = notebooks[i];
|
||||
notebook.IsShared = true;
|
||||
notebook.UserId = userId;
|
||||
self.notebookCache[notebook.NotebookId] = notebook;
|
||||
// notebook的cache也缓存一份, 为了显示标题
|
||||
Notebook.cache[notebook.NotebookId] = notebook;
|
||||
|
||||
var classes = "";
|
||||
var subs = false;
|
||||
if(!isEmpty(notebook.Subs)) {
|
||||
log(11);
|
||||
log(notebook.Subs);
|
||||
var subs = self.getNotebooksForNew(userId, notebook.Subs);
|
||||
if(subs) {
|
||||
classes = "dropdown-submenu";
|
||||
}
|
||||
}
|
||||
|
||||
var eachForNew = "";
|
||||
if(notebook.Perm) {
|
||||
var eachForNew = tt('<li role="presentation" class="clearfix ?" userId="?" notebookId="?"><div class="new-note-left pull-left" title="为该笔记本新建笔记" href="#">?</div><div title="为该笔记本新建markdown笔记" class="new-note-right pull-left">M</div>', classes, userId, notebook.NotebookId, notebook.Title);
|
||||
if(subs) {
|
||||
eachForNew += "<ul class='dropdown-menu'>";
|
||||
eachForNew += subs;
|
||||
eachForNew += "</ul>";
|
||||
}
|
||||
eachForNew += '</li>';
|
||||
}
|
||||
|
||||
navForNewNote += eachForNew;
|
||||
}
|
||||
return navForNewNote;
|
||||
}
|
||||
Share.trees = {};
|
||||
Share.renderShareNotebooks = function(sharedUserInfos, shareNotebooks) {
|
||||
var self = Share;
|
||||
if(isEmpty(sharedUserInfos)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(!shareNotebooks || typeof shareNotebooks != "object" || shareNotebooks.length < 0) {
|
||||
shareNotebooks = {};
|
||||
}
|
||||
|
||||
var $shareNotebooks = $("#shareNotebooks");
|
||||
|
||||
// render每一个用户的share给我的笔记本, 之前先建一个默认共享
|
||||
for(var i in sharedUserInfos) {
|
||||
var userInfo = sharedUserInfos[i];
|
||||
var userNotebooksPre = shareNotebooks[userInfo.UserId] || [];
|
||||
|
||||
userNotebooks = [{NotebookId: self.defaultNotebookId, Title: Share.defaultNotebookTitle}].concat(userNotebooksPre)
|
||||
|
||||
self.notebookCache[self.defaultNotebookId] = userNotebooks[0];
|
||||
|
||||
var username = userInfo.Username || userInfo.Email;
|
||||
userInfo.Username = username;
|
||||
Share.sharedUserInfos[userInfo.UserId] = userInfo;
|
||||
var userId = userInfo.UserId;
|
||||
var header = tt('<li class="each-user"><div class="friend-header" fromUserId="?"><i class="fa fa-angle-down"></i><span>?</span> <span class="fa notebook-setting" title="setting"></span> </div>', userInfo.UserId, username);
|
||||
var friendId = "friendContainer_" + userId;
|
||||
var body = '<ul class="friend-notebooks ztree" id="' + friendId + '" fromUserId="' + userId + '"></ul>';
|
||||
$shareNotebooks.append(header + body + "</li>")
|
||||
|
||||
self.trees[userId] = $.fn.zTree.init($("#" + friendId), Notebook.getTreeSetting(true, true), userNotebooks);
|
||||
|
||||
self.userNavs[userId] = {"forNew": self.getNotebooksForNew(userId, userNotebooksPre)};
|
||||
log(self.userNavs);
|
||||
}
|
||||
|
||||
$(".friend-notebooks").hover(function () {
|
||||
if (!$(this).hasClass("showIcon")) {
|
||||
$(this).addClass("showIcon");
|
||||
}
|
||||
}, function() {
|
||||
$(this).removeClass("showIcon");
|
||||
});
|
||||
|
||||
$(".friend-header i").click(function() {
|
||||
var $this = $(this);
|
||||
var $tree = $(this).parent().next();
|
||||
if($tree.is(":hidden")) {
|
||||
$tree.slideDown("fast");
|
||||
$this.removeClass("fa-angle-right fa-angle-down").addClass("fa-angle-down");
|
||||
} else {
|
||||
$tree.slideUp("fast");
|
||||
$this.removeClass("fa-angle-right fa-angle-down").addClass("fa-angle-right");
|
||||
}
|
||||
});
|
||||
|
||||
//-----------------------------
|
||||
// contextmenu shareNotebooks
|
||||
// 删除共享笔记本
|
||||
var shareNotebookMenu = {
|
||||
width: 180,
|
||||
items: [
|
||||
{ text: getMsg("deleteSharedNotebook"), icon: "", faIcon: "fa-trash-o", action: Share.deleteShareNotebook }
|
||||
],
|
||||
onShow: applyrule,
|
||||
onContextMenu: beforeContextMenu,
|
||||
|
||||
parent: "#shareNotebooks",
|
||||
children: ".notebook-item",
|
||||
};
|
||||
function applyrule(menu) {
|
||||
return;
|
||||
}
|
||||
// 默认共享不能删除
|
||||
function beforeContextMenu() {
|
||||
var notebookId = $(this).attr("notebookId");
|
||||
return !Share.isDefaultNotebookId(notebookId);
|
||||
}
|
||||
|
||||
var menuNotebooks = $("#shareNotebooks").contextmenu(shareNotebookMenu);
|
||||
|
||||
//---------------------------
|
||||
// contextmenu shareNotebooks
|
||||
// 删除某用户所有的
|
||||
var shareUserMenu = {
|
||||
width: 180,
|
||||
items: [
|
||||
{ text: getMsg("deleteAllShared"), icon: "", faIcon: "fa-trash-o", action: Share.deleteUserShareNoteAndNotebook }
|
||||
],
|
||||
parent: "#shareNotebooks",
|
||||
children: ".friend-header",
|
||||
};
|
||||
|
||||
var menuUser = $("#shareNotebooks").contextmenu(shareUserMenu);
|
||||
|
||||
$(".friend-header").on("click", ".notebook-setting", function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
var $p = $(this).parent();
|
||||
menuUser.showMenu(e, $p);
|
||||
});
|
||||
$("#shareNotebooks .notebook-item").on("click", ".notebook-setting", function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
var $p = $(this).parent();
|
||||
menuNotebooks.showMenu(e, $p);
|
||||
});
|
||||
};
|
||||
|
||||
Share.isDefaultNotebookId = function(notebookId) {
|
||||
return Share.defaultNotebookId == notebookId;
|
||||
}
|
||||
|
||||
// 转成共享的nav
|
||||
// for list和for new
|
||||
// 如果forNew没有, 那么还是保持我的nav
|
||||
Share.toggleToSharedNav = function(userId, notebookId) {
|
||||
var self = this;
|
||||
// for list
|
||||
$("#curNotebookForListNote").html(Share.notebookCache[notebookId].Title + '(' + Share.sharedUserInfos[userId].Username + ")");
|
||||
|
||||
// for new
|
||||
// 如果该用户下有新建的note, 那么列出, 如果没有, 则列出我的笔记
|
||||
var forNew = Share.userNavs[userId].forNew;
|
||||
if(forNew) {
|
||||
$("#notebookNavForNewSharedNote").html(forNew);
|
||||
// 新建之, 可能当前选择的没有权限新建. 此时需要得到第一个
|
||||
var curNotebookId = "";
|
||||
var curNotebookTitle = "";
|
||||
if(Share.notebookCache[notebookId].Perm) {
|
||||
curNotebookId = notebookId;
|
||||
curNotebookTitle = Share.notebookCache[notebookId].Title;
|
||||
} else {
|
||||
// 得到第一个
|
||||
var $f = $("#notebookNavForNewSharedNote li").eq(0);
|
||||
curNotebookId = $f.attr("notebookId");
|
||||
curNotebookTitle = $f.find(".new-note-left").text();
|
||||
}
|
||||
|
||||
$("#curNotebookForNewSharedNote").html(curNotebookTitle + '(' + Share.sharedUserInfos[userId].Username + ')');
|
||||
$("#curNotebookForNewSharedNote").attr("notebookId", curNotebookId);
|
||||
$("#curNotebookForNewSharedNote").attr("userId", userId);
|
||||
|
||||
$("#newSharedNote").show();
|
||||
$("#newMyNote").hide();
|
||||
|
||||
} else {
|
||||
// 展示出我的笔记
|
||||
$("#newMyNote").show();
|
||||
$("#newSharedNote").hide();
|
||||
}
|
||||
|
||||
// 隐藏tag
|
||||
$("#tagSearch").hide();
|
||||
}
|
||||
|
||||
//改变笔记本
|
||||
//0. 改变样式
|
||||
//1. 改变note, 此时需要先保存
|
||||
//2. ajax得到该notebook下的所有note
|
||||
//3. 使用Note.RederNotes()
|
||||
Share.changeNotebook = function(userId, notebookId) {
|
||||
// 选中
|
||||
Notebook.selectNotebook($(tt('#friendContainer_? a[notebookId="?"]', userId, notebookId)));
|
||||
|
||||
// 改变nav!!!! TODO
|
||||
Share.toggleToSharedNav(userId, notebookId);
|
||||
|
||||
// 1
|
||||
Note.curChangedSaveIt();
|
||||
|
||||
// 2 先清空所有
|
||||
Note.clearAll();
|
||||
|
||||
var url = "/share/ListShareNotes/";
|
||||
var param = {userId: userId};
|
||||
if(!Share.isDefaultNotebookId(notebookId)) {
|
||||
param.notebookId = notebookId;
|
||||
}
|
||||
|
||||
// 2 得到笔记本
|
||||
// 这里可以缓存起来, note按notebookId缓存
|
||||
ajaxGet(url, param, function(ret) {
|
||||
// note 导航
|
||||
//
|
||||
// 如果是特定笔记本下的notes, 那么传过来的没有权限信息, 此时权限由notebookId决定
|
||||
if(param.notebookId) {
|
||||
|
||||
}
|
||||
Note.renderNotes(ret, false, true);
|
||||
// 渲染第一个
|
||||
// 这里, 有点小复杂, 还要判断权限...
|
||||
if(!isEmpty(ret)) {
|
||||
// 定位
|
||||
Note.changeNote(ret[0].NoteId, true);
|
||||
} else {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 是否有更新权限
|
||||
// called by Note
|
||||
Share.hasUpdatePerm = function(notebookId) {
|
||||
var note = Share.cache[notebookId];
|
||||
if(!note || !note.Perm) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//---------------------------
|
||||
// 我删除别人共享给我的笔记本
|
||||
Share.deleteShareNotebook = function(target) {
|
||||
if(confirm("Are you sure to delete it?")) {
|
||||
var notebookId = $(target).attr("notebookId");
|
||||
var fromUserId = $(target).closest(".friend-notebooks").attr("fromUserId"); // 谁共享给了我 from
|
||||
ajaxGet("/share/DeleteShareNotebookBySharedUser", {notebookId: notebookId, fromUserId: fromUserId}, function(ret) {
|
||||
if(ret) {
|
||||
$(target).parent().remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Share.deleteShareNote = function(target) {
|
||||
var noteId = $(target).attr("noteId");
|
||||
var fromUserId = $(target).attr("fromUserId"); // 谁共享给了我 from
|
||||
ajaxGet("/share/DeleteShareNoteBySharedUser", {noteId: noteId, fromUserId: fromUserId}, function(ret) {
|
||||
if(ret) {
|
||||
$(target).remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
Share.deleteUserShareNoteAndNotebook = function(target) {
|
||||
if(confirm("Are you sure to delete all shared notebooks and notes?")) {
|
||||
var fromUserId = $(target).attr("fromUserId"); // 谁共享给了我 from
|
||||
ajaxGet("/share/deleteUserShareNoteAndNotebook", {fromUserId: fromUserId}, function(ret) {
|
||||
if(ret) {
|
||||
$(target).parent().remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 新建shared note
|
||||
Share.changeNotebookForNewNote = function(notebookId) {
|
||||
// 改变nav for list, for new
|
||||
Notebook.selectNotebook($(tt('#shareNotebooks [notebookId="?"]', notebookId)));
|
||||
var userId = Share.notebookCache[notebookId].UserId;
|
||||
Share.toggleToSharedNav(userId, notebookId);
|
||||
|
||||
// 得到笔记本
|
||||
var url = "/share/ListShareNotes/";
|
||||
var param = {userId: userId, notebookId: notebookId};
|
||||
|
||||
// 2 得到笔记本
|
||||
// 这里可以缓存起来, note按notebookId缓存
|
||||
ajaxGet(url, param, function(ret) {
|
||||
// note 导航
|
||||
Note.renderNotes(ret, true, true);
|
||||
});
|
||||
}
|
||||
|
||||
// 删除笔记, 我有权限, 且是我创建的笔记
|
||||
Share.deleteSharedNote = function(target, contextmenuItem) {
|
||||
Note.deleteNote(target, contextmenuItem, true);
|
||||
}
|
||||
Share.copySharedNote = function(target, contextmenuItem) {
|
||||
Note.copyNote(target, contextmenuItem, true);
|
||||
}
|
||||
|
||||
Share.contextmenu = null;
|
||||
Share.initContextmenu = function(notebooksCopy) {
|
||||
if(Share.contextmenu) {
|
||||
Share.contextmenu.destroy();
|
||||
}
|
||||
|
||||
//---------------------
|
||||
// context menu
|
||||
//---------------------
|
||||
var noteListMenu = {
|
||||
width: 180,
|
||||
items: [
|
||||
{ text: getMsg("copyToMyNotebook"), alias: "copy", faIcon: "fa-copy",
|
||||
type: "group",
|
||||
width: 180,
|
||||
items: notebooksCopy
|
||||
},
|
||||
{ type: "splitLine" },
|
||||
{ text: getMsg("delete"), alias: "delete", icon: "", faIcon: "fa-trash-o", action: Share.deleteSharedNote }
|
||||
],
|
||||
onShow: applyrule,
|
||||
parent: "#noteItemList",
|
||||
children: ".item-shared",
|
||||
}
|
||||
function applyrule(menu) {
|
||||
var noteId = $(this).attr("noteId");
|
||||
var note = Share.cache[noteId];
|
||||
if(!note) {
|
||||
return;
|
||||
}
|
||||
var items = [];
|
||||
if(!(note.Perm && note.CreatedUserId == UserInfo.UserId)) {
|
||||
items.push("delete");
|
||||
}
|
||||
// 不是自己的创建的不能删除
|
||||
menu.applyrule({
|
||||
name: "target...",
|
||||
disable: true,
|
||||
items: items
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
Share.contextmenu = $("#noteItemList .item-shared").contextmenu(noteListMenu);
|
||||
}
|
||||
|
||||
$(function() {
|
||||
// note setting
|
||||
$("#noteItemList").on("click", ".item-shared .item-setting", function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
// 得到ID
|
||||
var $p = $(this).parent();
|
||||
Share.contextmenu.showMenu(e, $p);
|
||||
});
|
||||
|
||||
|
||||
|
||||
//---------------------------
|
||||
// 新建笔记
|
||||
// 1. 直接点击新建 OR
|
||||
// 2. 点击nav for new note
|
||||
$("#newSharedNoteBtn").click(function() {
|
||||
var notebookId = $("#curNotebookForNewSharedNote").attr('notebookId');
|
||||
var userId = $("#curNotebookForNewSharedNote").attr('userId');
|
||||
Note.newNote(notebookId, true, userId);
|
||||
});
|
||||
$("#newShareNoteMarkdownBtn").click(function() {
|
||||
var notebookId = $("#curNotebookForNewSharedNote").attr('notebookId');
|
||||
var userId = $("#curNotebookForNewSharedNote").attr('userId');
|
||||
Note.newNote(notebookId, true, userId, true);
|
||||
});
|
||||
$("#notebookNavForNewSharedNote").on("click", "li div", function() {
|
||||
var notebookId = $(this).parent().attr("notebookId");
|
||||
var userId = $(this).parent().attr("userId");
|
||||
|
||||
if($(this).text() == "M") {
|
||||
Note.newNote(notebookId, true, userId, true);
|
||||
} else {
|
||||
Note.newNote(notebookId, true, userId);
|
||||
}
|
||||
});
|
||||
|
||||
//------------------
|
||||
// 添加共享
|
||||
$("#leanoteDialogRemote").on("click", ".change-perm", function() {
|
||||
var self = this;
|
||||
var perm = $(this).attr("perm");
|
||||
var noteOrNotebookId = $(this).attr("noteOrNotebookId");
|
||||
var toUserId = $(this).attr("toUserId");
|
||||
var toHtml = getMsg("writable");
|
||||
var toPerm = "1";
|
||||
if(perm == "1") {
|
||||
toHtml = getMsg("readOnly");
|
||||
toPerm = "0";
|
||||
}
|
||||
var url = "/share/UpdateShareNotebookPerm";
|
||||
var param = {perm: toPerm, toUserId: toUserId};
|
||||
if(Share.dialogIsNote) {
|
||||
url = "/share/UpdateShareNotePerm";
|
||||
param.noteId = noteOrNotebookId;
|
||||
} else {
|
||||
param.notebookId = noteOrNotebookId;
|
||||
}
|
||||
ajaxGet(url, param, function(ret) {
|
||||
if(ret) {
|
||||
$(self).html(toHtml);
|
||||
$(self).attr("perm", toPerm);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#leanoteDialogRemote").on("click", ".delete-share", function() {
|
||||
var self = this;
|
||||
var noteOrNotebookId = $(this).attr("noteOrNotebookId");
|
||||
var toUserId = $(this).attr("toUserId");
|
||||
|
||||
var url = "/share/DeleteShareNotebook";
|
||||
var param = {toUserId: toUserId};
|
||||
if(Share.dialogIsNote) {
|
||||
url = "/share/DeleteShareNote";
|
||||
param.noteId = noteOrNotebookId;
|
||||
} else {
|
||||
param.notebookId = noteOrNotebookId;
|
||||
}
|
||||
|
||||
ajaxGet(url, param, function(ret) {
|
||||
if(ret) {
|
||||
$(self).parent().parent().remove();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 添加共享
|
||||
var seq = 1;
|
||||
$("#leanoteDialogRemote").on("click", "#addShareNotebookBtn", function() {
|
||||
seq++;
|
||||
var tpl = '<tr id="tr' + seq + '"><td>#</td><td><input id="friendsEmail" type="text" class="form-control" style="width: 200px" placeholder="' + getMsg('friendEmail') + '"/></td>';
|
||||
tpl += '<td><label for="readPerm' + seq + '"><input type="radio" name="perm' + seq + '" checked="checked" value="0" id="readPerm' + seq + '"> ' + getMsg('readOnly') + '</label>';
|
||||
tpl += ' <label for="writePerm' + seq + '"><input type="radio" name="perm' + seq + '" value="1" id="writePerm' + seq + '"> ' + getMsg('writable') + '</label></td>';
|
||||
tpl += '<td><button class="btn btn-success" onclick="addShareNoteOrNotebook(' + seq + ')">' + getMsg('share') + '</button>';
|
||||
tpl += ' <button class="btn btn-warning" onclick="deleteShareNoteOrNotebook(' + seq + ')">' + getMsg("delete") + '</button>';
|
||||
tpl += "</td></tr>";
|
||||
$("#shareNotebookTable tbody").prepend(tpl);
|
||||
|
||||
$("#tr" + seq + " #friendsEmail").focus();
|
||||
});
|
||||
|
||||
//-------------------
|
||||
// 发送邀请邮件
|
||||
$("#registerEmailBtn").click(function() {
|
||||
var content = $("#emailContent").val();
|
||||
var toEmail = $("#toEmail").val();
|
||||
if(!content) {
|
||||
showAlert("#registerEmailMsg", getMsg("emailBodyRequired"), "danger");
|
||||
return;
|
||||
}
|
||||
post("/user/sendRegisterEmail", {content: content, toEmail: toEmail}, function(ret) {
|
||||
showAlert("#registerEmailMsg", getMsg("sendSuccess"), "success");
|
||||
hideDialog2("#sendRegisterEmailDialog", 1000);
|
||||
}, this);
|
||||
});
|
||||
});
|
||||
|
||||
// trSeq 1,2,3...
|
||||
function addShareNoteOrNotebook(trSeq) {
|
||||
var trId = "#tr" + trSeq;
|
||||
var id = Share.dialogNoteOrNotebookId;
|
||||
|
||||
var emails = isEmailFromInput(trId + " #friendsEmail", "#shareMsg", getMsg("inputFriendEmail"));
|
||||
if(!emails) {
|
||||
return;
|
||||
}
|
||||
var shareNotePerm = $(trId + ' input[name="perm' + trSeq + '"]:checked').val() || 0;
|
||||
var perm = shareNotePerm;
|
||||
// emails = emails.split(";");
|
||||
var url = "share/addShareNote";
|
||||
var data = {noteId: id, emails: [emails], perm: shareNotePerm};
|
||||
if(!Share.dialogIsNote) {
|
||||
url = "share/addShareNotebook";
|
||||
data = {notebookId: id, emails: [emails], perm: shareNotePerm};
|
||||
}
|
||||
hideAlert("#shareMsg");
|
||||
post(url, data, function(ret) {
|
||||
var ret = ret[emails];
|
||||
if(ret) {
|
||||
// 成功
|
||||
// 成功了则去掉输入框
|
||||
if(ret.Ok) {
|
||||
var tpl = tt('<td>?</td>', '#');
|
||||
tpl += tt('<td>?</td>', emails);
|
||||
tpl += tt('<td><a href="#" noteOrNotebookId="?" perm="?" toUserId="?" title="' + getMsg("clickToChangePermission") + '" class="btn btn-default change-perm">?</a></td>', id, perm, ret.Id, !perm || perm == '0' ? getMsg("readOnly") : getMsg("writable"));
|
||||
tpl += tt('<td><a href="#" noteOrNotebookId="?" toUserId="?" class="btn btn-warning delete-share">' + getMsg("delete") +'</a></td>', id, ret.Id);
|
||||
$(trId).html(tpl);
|
||||
} else {
|
||||
var shareUrl = UrlPrefix + '/register?from=' + UserInfo.Username;
|
||||
showAlert("#shareMsg", getMsg('friendNotExits', [getMsg("app"), shareUrl]) + ' <a id="shareCopy" data-clipboard-target="copyDiv">' + getMsg("clickToCopy") + '</a> <span id="copyStatus"></span> <br /> ' + getMsg("sendInviteEmailToYourFriend") + ', <a href="#" onclick="sendRegisterEmail(\'' + emails + '\')">' + getMsg("send"), "warning");
|
||||
$("#copyDiv").text(shareUrl);
|
||||
initCopy("shareCopy", function(args) {
|
||||
if(args.text) {
|
||||
showMsg2("#copyStatus", getMsg("copySuccess"), 1000);
|
||||
} else {
|
||||
showMsg2("#copyStatus", getMsg("copyFailed"), 1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}, trId + " .btn-success");
|
||||
}
|
||||
|
||||
// 发送邀请邮件
|
||||
function sendRegisterEmail(email) {
|
||||
showDialog2("#sendRegisterEmailDialog", {postShow: function() {
|
||||
$("#emailContent").val(getMsg("inviteEmailBody", [UserInfo.Username, getMsg("app")]));
|
||||
setTimeout(function() {
|
||||
$("#emailContent").focus();
|
||||
}, 500);
|
||||
$("#toEmail").val(email);
|
||||
}});
|
||||
}
|
||||
|
||||
function deleteShareNoteOrNotebook(trSeq) {
|
||||
$("#tr" + trSeq).remove();
|
||||
}
|
1
public/js/app/tag-min.js
vendored
Normal file
1
public/js/app/tag-min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
Tag.classes={"蓝色":"label label-blue","红色":"label label-red","绿色":"label label-green","黄色":"label label-yellow",blue:"label label-blue",red:"label label-red",green:"label label-green",yellow:"label label-yellow"};Tag.mapCn2En={"蓝色":"blue","红色":"red","绿色":"green","黄色":"yellow"};Tag.mapEn2Cn={blue:"蓝色",red:"红色",green:"绿色",yellow:"黄色"};Tag.t=$("#tags");Tag.getTags=function(){var tags=[];Tag.t.children().each(function(){var text=$(this).text();text=text.substring(0,text.length-1);text=Tag.mapCn2En[text]||text;tags.push(text)});return tags};Tag.clearTags=function(){Tag.t.html("")};Tag.renderTags=function(tags){Tag.t.html("");if(isEmpty(tags)){return}for(var i=0;i<tags.length;++i){var tag=tags[i];Tag.appendTag(tag)}};function revertTagStatus(){$("#addTagTrigger").show();$("#addTagInput").hide()}function hideTagList(event){$("#tagDropdown").removeClass("open");if(event){event.stopPropagation()}}function showTagList(event){$("#tagDropdown").addClass("open");if(event){event.stopPropagation()}}Tag.renderReadOnlyTags=function(tags){$("#noteReadTags").html("");if(isEmpty(tags)){$("#noteReadTags").html(getMsg("noTag"))}var i=true;function getNextDefaultClasses(){if(i){return"label label-default";i=false}else{i=true;return"label label-info"}}for(var i in tags){var text=tags[i];text=Tag.mapEn2Cn[text]||text;var classes=Tag.classes[text];if(!classes){classes=getNextDefaultClasses()}tag=tt('<span class="?">?</span>',classes,text);$("#noteReadTags").append(tag)}};Tag.appendTag=function(tag){var isColor=false;var classes,text;if(typeof tag=="object"){classes=tag.classes;text=tag.text;if(!text){return}}else{tag=$.trim(tag);text=tag;if(!text){return}var classes=Tag.classes[text];if(classes){isColor=true}else{classes="label label-default"}}if(LEA.locale=="zh"){text=Tag.mapEn2Cn[text]||text}tag=tt('<span class="?">?<i title="'+getMsg("delete")+'">X</i></span>',classes,text);$("#tags").children().each(function(){if(isColor){var tagHtml=$("<div></div>").append($(this).clone()).html();if(tagHtml==tag){$(this).remove()}}else if(text+"X"==$(this).text()){$(this).remove()}});$("#tags").append(tag);hideTagList();if(!isColor){reRenderTags()}};function reRenderTags(){var defautClasses=["label label-default","label label-info"];var i=0;$("#tags").children().each(function(){var thisClasses=$(this).attr("class");if(thisClasses=="label label-default"||thisClasses=="label label-info"){$(this).removeClass(thisClasses).addClass(defautClasses[i%2]);i++}})}Tag.renderTagNav=function(tags){tags=tags||[];for(var i in tags){var tag=tags[i];if(tag=="red"||tag=="blue"||tag=="yellow"||tag=="green"){continue}var text=Tag.mapEn2Cn[tag]||tag;var classes=Tag.classes[tag]||"label label-default";$("#tagNav").append(tt('<li data-tag="?"><a> <span class="?">?</span></li>',text,classes,text))}};$(function(){$("#addTagTrigger").click(function(){$(this).hide();$("#addTagInput").show().focus().val("")});$("#addTagInput").click(function(event){showTagList(event)});$("#addTagInput").blur(function(){var val=$(this).val();if(val){Tag.appendTag(val,true)}return;$("#addTagTrigger").show();$("#addTagInput").hide()});$("#addTagInput").keydown(function(e){if(e.keyCode==13){hideTagList();if($("#addTagInput").val()){$(this).trigger("blur");$("#addTagTrigger").trigger("click")}else{$(this).trigger("blur")}}});$("#tagColor li").click(function(event){var a;if($(this).attr("role")){a=$(this).find("span")}else{a=$(this)}Tag.appendTag({classes:a.attr("class"),text:a.text()})});$("#tags").on("click","i",function(){$(this).parent().remove();reRenderTags()});function searchTag(){var tag=$.trim($(this).data("tag"));Note.curChangedSaveIt();Note.clearAll();$("#tagSearch").html($(this).html()).show();showLoading();ajaxGet("/note/searchNoteByTags",{tags:[tag]},function(notes){hideLoading();if(notes){Note.renderNotes(notes);if(!isEmpty(notes)){Note.changeNote(notes[0].NoteId)}}})}$("#myTag .folderBody").on("click","li",searchTag);$("#minTagNav").on("click","li",searchTag)});
|
300
public/js/app/tag.js
Normal file
300
public/js/app/tag.js
Normal file
@ -0,0 +1,300 @@
|
||||
// Tag
|
||||
|
||||
// 蓝色, 红色怎么存到数据库中? 直接存蓝色
|
||||
|
||||
Tag.classes = {
|
||||
"蓝色": "label label-blue",
|
||||
"红色": "label label-red",
|
||||
"绿色": "label label-green",
|
||||
"黄色": "label label-yellow",
|
||||
"blue": "label label-blue",
|
||||
"red": "label label-red",
|
||||
"green": "label label-green",
|
||||
"yellow": "label label-yellow"
|
||||
}
|
||||
|
||||
// 数据库中统一存En
|
||||
Tag.mapCn2En = {
|
||||
"蓝色": "blue",
|
||||
"红色": "red",
|
||||
"绿色": "green",
|
||||
"黄色": "yellow",
|
||||
}
|
||||
Tag.mapEn2Cn = {
|
||||
"blue": "蓝色",
|
||||
"red": "红色",
|
||||
"green": "绿色",
|
||||
"yellow": "黄色",
|
||||
}
|
||||
|
||||
Tag.t = $("#tags");
|
||||
|
||||
// called by Note
|
||||
Tag.getTags = function() {
|
||||
var tags = [];
|
||||
Tag.t.children().each(function(){
|
||||
var text = $(this).text();
|
||||
text = text.substring(0, text.length - 1); // 把X去掉
|
||||
text = Tag.mapCn2En[text] || text;
|
||||
tags.push(text);
|
||||
});
|
||||
// 需要去重吗? 正常情况下不会重复
|
||||
return tags;
|
||||
}
|
||||
|
||||
// called by Note
|
||||
Tag.clearTags = function() {
|
||||
Tag.t.html("");
|
||||
}
|
||||
|
||||
// 设置tags
|
||||
// called by Note
|
||||
Tag.renderTags = function(tags) {
|
||||
Tag.t.html("");
|
||||
if(isEmpty(tags)) {
|
||||
return;
|
||||
}
|
||||
// TODO 重构, 这样不高效
|
||||
for(var i = 0; i < tags.length; ++i) {
|
||||
var tag = tags[i];
|
||||
Tag.appendTag(tag);
|
||||
}
|
||||
}
|
||||
|
||||
// tag最初状态
|
||||
function revertTagStatus() {
|
||||
$("#addTagTrigger").show();
|
||||
$("#addTagInput").hide();
|
||||
// hideTagList();
|
||||
}
|
||||
|
||||
function hideTagList(event) {
|
||||
$("#tagDropdown").removeClass("open");
|
||||
if (event) {
|
||||
event.stopPropagation()
|
||||
}
|
||||
}
|
||||
function showTagList(event) {
|
||||
$("#tagDropdown").addClass("open");
|
||||
if (event) {
|
||||
event.stopPropagation()
|
||||
}
|
||||
}
|
||||
|
||||
// 只读模式下显示tags
|
||||
// called by Note
|
||||
Tag.renderReadOnlyTags = function(tags) {
|
||||
// 先清空
|
||||
$("#noteReadTags").html("");
|
||||
if(isEmpty(tags)) {
|
||||
$("#noteReadTags").html(getMsg("noTag"));
|
||||
}
|
||||
|
||||
var i = true;
|
||||
function getNextDefaultClasses() {
|
||||
if (i) {
|
||||
return "label label-default";
|
||||
i = false
|
||||
} else {
|
||||
i = true;
|
||||
return "label label-info";
|
||||
}
|
||||
}
|
||||
|
||||
for(var i in tags) {
|
||||
var text = tags[i];
|
||||
text = Tag.mapEn2Cn[text] || text;
|
||||
var classes = Tag.classes[text];
|
||||
if(!classes) {
|
||||
classes = getNextDefaultClasses();
|
||||
}
|
||||
tag = tt('<span class="?">?</span>', classes, text);
|
||||
|
||||
$("#noteReadTags").append(tag);
|
||||
}
|
||||
}
|
||||
|
||||
// 添加tag
|
||||
// tag = {classes:"label label-red", text:"红色"}
|
||||
// tag = life
|
||||
Tag.appendTag = function(tag) {
|
||||
var isColor = false;
|
||||
var classes, text;
|
||||
|
||||
if (typeof tag == "object") {
|
||||
classes = tag.classes;
|
||||
text = tag.text;
|
||||
if(!text) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
tag = $.trim(tag);
|
||||
text = tag;
|
||||
if(!text) {
|
||||
return;
|
||||
}
|
||||
var classes = Tag.classes[text];
|
||||
if(classes) {
|
||||
isColor = true;
|
||||
} else {
|
||||
classes = "label label-default";
|
||||
}
|
||||
}
|
||||
|
||||
if(LEA.locale == "zh") {
|
||||
text = Tag.mapEn2Cn[text] || text;
|
||||
}
|
||||
tag = tt('<span class="?">?<i title="' + getMsg("delete") + '">X</i></span>', classes, text);
|
||||
|
||||
// 避免重复
|
||||
$("#tags").children().each(function() {
|
||||
if (isColor) {
|
||||
var tagHtml = $("<div></div>").append($(this).clone()).html();
|
||||
if (tagHtml == tag) {
|
||||
$(this).remove();
|
||||
}
|
||||
} else if (text + "X" == $(this).text()) {
|
||||
$(this).remove();
|
||||
}
|
||||
});
|
||||
|
||||
$("#tags").append(tag);
|
||||
|
||||
hideTagList();
|
||||
|
||||
if (!isColor) {
|
||||
reRenderTags();
|
||||
}
|
||||
}
|
||||
|
||||
// 为了颜色间隔, add, delete时调用
|
||||
function reRenderTags() {
|
||||
var defautClasses = [ "label label-default", "label label-info" ];
|
||||
var i = 0;
|
||||
$("#tags").children().each(
|
||||
function() {
|
||||
var thisClasses = $(this).attr("class");
|
||||
if (thisClasses == "label label-default"
|
||||
|| thisClasses == "label label-info") {
|
||||
$(this).removeClass(thisClasses).addClass(
|
||||
defautClasses[i % 2]);
|
||||
i++;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//-----------
|
||||
// 左侧nav en -> cn
|
||||
Tag.renderTagNav = function(tags) {
|
||||
tags = tags || [];
|
||||
for(var i in tags) {
|
||||
var tag = tags[i];
|
||||
if(tag == "red" || tag == "blue" || tag == "yellow" || tag == "green") {
|
||||
continue;
|
||||
}
|
||||
var text = Tag.mapEn2Cn[tag] || tag;
|
||||
var classes = Tag.classes[tag] || "label label-default";
|
||||
$("#tagNav").append(tt('<li data-tag="?"><a> <span class="?">?</span></li>', text, classes, text));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 事件
|
||||
$(function() {
|
||||
// tag
|
||||
$("#addTagTrigger").click(function() {
|
||||
$(this).hide();
|
||||
$("#addTagInput").show().focus().val("");
|
||||
});
|
||||
|
||||
$("#addTagInput").click(function(event) {
|
||||
showTagList(event);
|
||||
});
|
||||
|
||||
$("#addTagInput").blur(function() {
|
||||
var val = $(this).val();
|
||||
if(val) {
|
||||
Tag.appendTag(val, true);
|
||||
}
|
||||
return;
|
||||
// 下面不能有, 有就有问题
|
||||
$("#addTagTrigger").show();
|
||||
$("#addTagInput").hide();
|
||||
// revertTagStatus();
|
||||
});
|
||||
$('#addTagInput').keydown(function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
hideTagList();
|
||||
// 如果有值, 再生成, 没值直接隐藏
|
||||
if ($("#addTagInput").val()) {
|
||||
$(this).trigger("blur");
|
||||
$("#addTagTrigger").trigger("click");
|
||||
} else {
|
||||
$(this).trigger("blur");
|
||||
}
|
||||
}
|
||||
});
|
||||
// 点击下拉时也会触发input的blur事件
|
||||
$("#tagColor li").click(function(event) {
|
||||
var a;
|
||||
if($(this).attr("role")) {
|
||||
a = $(this).find("span");
|
||||
} else {
|
||||
a = $(this);
|
||||
}
|
||||
Tag.appendTag({
|
||||
classes : a.attr("class"),
|
||||
text : a.text()
|
||||
});
|
||||
});
|
||||
// 这是个问题, 为什么? 捕获不了事件?, input的blur造成
|
||||
/*
|
||||
$(".label").click(function(event) {
|
||||
var a = $(this);
|
||||
Tag.appendTag({
|
||||
classes : a.attr("class"),
|
||||
text : a.text()
|
||||
});
|
||||
// event.stopPropagation();
|
||||
});
|
||||
*/
|
||||
|
||||
$("#tags").on("click", "i", function() {
|
||||
$(this).parent().remove();
|
||||
reRenderTags();
|
||||
});
|
||||
|
||||
//-------------
|
||||
// nav 标签搜索
|
||||
function searchTag() {
|
||||
var tag = $.trim($(this).data("tag"));
|
||||
// tag = Tag.mapCn2En[tag] || tag;
|
||||
|
||||
// 学习changeNotebook
|
||||
|
||||
// 1
|
||||
Note.curChangedSaveIt();
|
||||
|
||||
// 2 先清空所有
|
||||
// 也会把curNoteId清空
|
||||
Note.clearAll();
|
||||
|
||||
$("#tagSearch").html($(this).html()).show();
|
||||
showLoading();
|
||||
ajaxGet("/note/searchNoteByTags", {tags: [tag]}, function(notes) {
|
||||
hideLoading();
|
||||
if(notes) {
|
||||
// 和note搜索一样
|
||||
// 设空, 防止发生上述情况
|
||||
// Note.curNoteId = "";
|
||||
|
||||
Note.renderNotes(notes);
|
||||
if(!isEmpty(notes)) {
|
||||
Note.changeNote(notes[0].NoteId);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
$("#myTag .folderBody").on("click", "li", searchTag);
|
||||
$("#minTagNav").on("click", "li", searchTag);
|
||||
});
|
Reference in New Issue
Block a user