mindoc/static/js/editor.js

601 lines
18 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* Created by lifei6671 on 2017/4/29 0029.
*/
/**
* 打开最后选中的节点
*/
function openLastSelectedNode() {
//如果文档树或编辑器没有准备好则不加载文档
if (window.treeCatalog == null || window.editor == null) {
return false;
}
var $isSelected = false;
if (window.localStorage) {
var $selectedNodeId = window.sessionStorage.getItem("MinDoc::LastLoadDocument:" + window.book.identify);
try {
if ($selectedNodeId) {
//遍历文档树判断是否存在节点
$.each(window.documentCategory, function (i, n) {
if (n.id == $selectedNodeId && !$isSelected) {
var $node = {"id": n.id};
window.treeCatalog.deselect_all();
window.treeCatalog.select_node($node);
$isSelected = true;
}
});
}
} catch ($ex) {
console.log($ex)
}
}
//如果节点不存在,则默认选中第一个节点
if (!$isSelected && window.documentCategory.length > 0) {
var doc = window.documentCategory[0];
if (doc && doc.id > 0) {
var node = {"id": doc.id};
$("#sidebar").jstree(true).select_node(node);
$isSelected = true;
}
}
return $isSelected;
}
/**
* 设置最后选中的文档
* @param $node
*/
function setLastSelectNode($node) {
if (window.localStorage) {
if (typeof $node === "undefined" || !$node) {
window.sessionStorage.removeItem("MinDoc::LastLoadDocument:" + window.book.identify);
} else {
var nodeId = $node.id ? $node.id : $node.node.id;
window.sessionStorage.setItem("MinDoc::LastLoadDocument:" + window.book.identify, nodeId);
}
}
}
/**
* 保存排序
* @param node
* @param parent
*/
function jstree_save(node, parent) {
var parentNode = window.treeCatalog.get_node(parent.parent);
var nodeData = window.getSiblingSort(parentNode);
if (parent.parent !== parent.old_parent) {
parentNode = window.treeCatalog.get_node(parent.old_parent);
var newNodeData = window.getSiblingSort(parentNode);
if (newNodeData.length > 0) {
nodeData = nodeData.concat(newNodeData);
}
}
var index = layer.load(1, {
shade: [0.1, '#fff'] //0.1透明度的白色背景
});
locales = {
'zh-CN': {
saveSortSucc: '',
},
'en': {
saveSortSucc: 'Save sort success',
}
}
$.ajax({
url: window.sortURL,
type: "post",
data: JSON.stringify(nodeData),
success: function (res) {
layer.close(index);
if (res.errcode === 0) {
layer.msg(locales[lang].saveSortSucc);
} else {
layer.msg(res.message);
}
}
})
}
/**
* 创建文档
*/
function openCreateCatalogDialog($node) {
var $then = $("#addDocumentModal");
var doc_id = $node ? $node.id : 0;
$then.find("input[name='parent_id']").val(doc_id);
$then.find("input[name='doc_id']").val('');
$then.find("input[name='doc_name']").val('');
$then.modal("show");
}
/**
* 处理排序
* @param node
* @returns {Array}
*/
function getSiblingSort(node) {
var data = [];
for (var key in node.children) {
var index = data.length;
data[index] = {
"id": parseInt(node.children[key]),
"sort": parseInt(key),
"parent": Number(node.id) ? Number(node.id) : 0
};
}
return data;
}
/**
* 删除一个文档
* @param $node
*/
function openDeleteDocumentDialog($node) {
locales = {
'zh-CN': {
saveSortSucc: '',
confirmDeleteDoc: '',
confirm: '',
cancel: '',
deleteFailed: '',
confirmLeave: ''
},
'en': {
saveSortSucc: 'Save sort success',
confirmDeleteDoc: 'Are you sure you want to delete this document?',
confirm: 'Confirm',
cancel: 'Cancel',
deleteFailed: 'Delete Failed',
confirmLeave: 'The content you entered has not been saved. Are you sure you want to leave this page?'
}
}
langs = locales[lang];
var index = layer.confirm(langs.confirmDeleteDoc, {
btn: [langs.confirm, langs.cancel] //按钮
}, function () {
$.post(window.deleteURL, {"identify": window.book.identify, "doc_id": $node.id}).done(function (res) {
layer.close(index);
if (res.errcode === 0) {
window.treeCatalog.delete_node($node);
window.documentCategory.remove(function (item) {
return item.id == $node.id;
});
// console.log(window.documentCategory)
setLastSelectNode();
} else {
layer.msg(lang.deleteFailed, {icon: 2})
}
}).fail(function () {
layer.close(index);
layer.msg(lang.deleteFailed, {icon: 2})
});
});
}
/**
* 打开文档编辑界面
* @param $node
*/
function openEditCatalogDialog($node) {
var $then = $("#addDocumentModal");
var doc_id = parseInt($node ? $node.id : 0);
var text = $node ? $node.text : '';
var parentId = $node && $node.parent !== '#' ? $node.parent : 0;
$then.find("input[name='doc_id']").val(doc_id);
$then.find("input[name='parent_id']").val(parentId);
$then.find("input[name='doc_name']").val(text);
var open = $node.a_attr && $node.a_attr.opened ? $node.a_attr.opened : 0;
console.log($node)
$then.find("input[name='is_open'][value='" + open + "']").prop("checked", "checked");
for (var index in window.documentCategory) {
var item = window.documentCategory[index];
if (item.id === doc_id) {
$then.find("input[name='doc_identify']").val(item.identify);
break;
}
}
$then.modal({show: true});
}
/**
* 将一个节点推送到现有数组中
* @param $node
*/
function pushDocumentCategory($node) {
for (var index in window.documentCategory) {
var item = window.documentCategory[index];
if (item.id === $node.id) {
window.documentCategory[index] = $node;
return;
}
}
window.documentCategory.push($node);
}
/**
* 将数据重置到Vue列表中
* @param $lists
*/
function pushVueLists($lists) {
window.vueApp.lists = [];
$.each($lists, function (i, item) {
window.vueApp.lists.push(item);
});
}
/**
* 发布项目
*/
function releaseBook() {
locales = {
'zh-CN': {
publishToQueue: '',
},
'en': {
publishToQueue: 'The publish task has been pushed to the queue</br> and will be executed soon.',
}
}
$.ajax({
url: window.releaseURL,
data: {"identify": window.book.identify},
type: "post",
dataType: "json",
success: function (res) {
if (res.errcode === 0) {
layer.msg(locales[lang].publishToQueue);
} else {
layer.msg(res.message);
}
}
});
}
//实现小提示
$("[data-toggle='tooltip']").hover(function () {
var title = $(this).attr('data-title');
var direction = $(this).attr("data-direction");
var tips = 3;
if (direction === "top") {
tips = 1;
} else if (direction === "right") {
tips = 2;
} else if (direction === "bottom") {
tips = 3;
} else if (direction === "left") {
tips = 4;
}
index = layer.tips(title, this, {
tips: tips
});
}, function () {
layer.close(index);
});
//弹出创建文档的遮罩层
$("#btnAddDocument").on("click", function () {
$("#addDocumentModal").modal("show");
});
//用于还原创建文档的遮罩层
$("#addDocumentModal").on("hidden.bs.modal", function () {
$(this).find("form").html(window.sessionStorage.getItem("MinDoc::addDocumentModal"));
var $then = $("#addDocumentModal");
$then.find("input[name='parent_id']").val('');
$then.find("input[name='doc_id']").val('');
$then.find("input[name='doc_name']").val('');
}).on("shown.bs.modal", function () {
$(this).find("input[name='doc_name']").focus();
}).on("show.bs.modal", function () {
window.sessionStorage.setItem("MinDoc::addDocumentModal", $(this).find("form").html())
});
function showError($msg, $id) {
if (!$id) {
$id = "#form-error-message"
}
$($id).addClass("error-message").removeClass("success-message").text($msg);
return false;
}
function showSuccess($msg, $id) {
if (!$id) {
$id = "#form-error-message"
}
$($id).addClass("success-message").removeClass("error-message").text($msg);
return true;
}
window.documentHistory = function () {
locales = {
'zh-CN': {
hisVer: '',
},
'en': {
hisVer: 'Historic version',
}
}
layer.open({
type: 2,
title: locales[lang].hisVer,
shadeClose: true,
shade: 0.8,
area: ['700px', '80%'],
content: window.historyURL + "?identify=" + window.book.identify + "&doc_id=" + window.selectNode.id,
end: function () {
if (window.SelectedId) {
var selected = {
node: {
id: window.SelectedId
}
};
window.loadDocument(selected);
window.SelectedId = null;
}
}
});
};
function uploadImage($id, $callback) {
locales = {
'zh-CN': {
unsupportType: '',
uploadFailed: ''
},
'en': {
unsupportType: 'Unsupport image type',
uploadFailed: 'Upload image failed'
}
}
/** 粘贴上传图片 **/
document.getElementById($id).addEventListener('paste', function (e) {
if (e.clipboardData && e.clipboardData.items) {
var clipboard = e.clipboardData;
for (var i = 0, len = clipboard.items.length; i < len; i++) {
if (clipboard.items[i].kind === 'file' || clipboard.items[i].type.indexOf('image') > -1) {
var imageFile = clipboard.items[i].getAsFile();
var fileName = String((new Date()).valueOf());
switch (imageFile.type) {
case "image/png" :
fileName += ".png";
break;
case "image/jpg" :
fileName += ".jpg";
break;
case "image/jpeg" :
fileName += ".jpeg";
break;
case "image/gif" :
fileName += ".gif";
break;
default :
layer.msg(locales[lang].unsupportType);
return;
}
var form = new FormData();
form.append('editormd-image-file', imageFile, fileName);
var layerIndex = 0;
$.ajax({
url: window.imageUploadURL,
type: "POST",
dataType: "json",
data: form,
processData: false,
contentType: false,
beforeSend: function () {
layerIndex = $callback('before');
},
error: function () {
layer.close(layerIndex);
$callback('error');
layer.msg(locales[lang].uploadFailed);
},
success: function (data) {
layer.close(layerIndex);
$callback('success', data);
if (data.errcode !== 0) {
layer.msg(data.message);
}
}
});
e.preventDefault();
}
}
}
});
}
function uploadResource($id, $callback) {
locales = {
'zh-CN': {
unsupportType: '/',
uploadFailed: '/'
},
'en': {
unsupportType: 'Unsupport image/video type',
uploadFailed: 'Upload image/video failed'
}
}
/** 粘贴上传的资源 **/
document.getElementById($id).addEventListener('paste', function (e) {
if (e.clipboardData && e.clipboardData.items) {
var clipboard = e.clipboardData;
for (var i = 0, len = clipboard.items.length; i < len; i++) {
if (clipboard.items[i].kind === 'file' || clipboard.items[i].type.indexOf('image') > -1) {
var resource = clipboard.items[i].getAsFile();
var fileName = String((new Date()).valueOf());
console.log(resource.type)
switch (resource.type) {
case "image/png" :
fileName += ".png";
break;
case "image/jpg" :
fileName += ".jpg";
break;
case "image/jpeg" :
fileName += ".jpeg";
break;
case "image/gif" :
fileName += ".gif";
break;
case "video/mp4":
fileName += ".mp4";
break;
case "video/webm":
fileName += ".webm";
break;
default :
layer.msg(locales[lang].unsupportType);
return;
}
var form = new FormData();
form.append('editormd-resource-file', resource, fileName);
var layerIndex = 0;
$.ajax({
url: window.imageUploadURL,
type: "POST",
dataType: "json",
data: form,
processData: false,
contentType: false,
beforeSend: function () {
layerIndex = $callback('before');
},
error: function () {
layer.close(layerIndex);
$callback('error');
layer.msg(locales[lang].uploadFailed);
},
success: function (data) {
layer.close(layerIndex);
$callback('success', data);
}
});
e.preventDefault();
}
}
}
});
}
/**
* 初始化代码高亮
*/
function initHighlighting() {
$('pre code,pre.ql-syntax').each(function (i, block) {
hljs.highlightBlock(block);
});
}
$(function () {
locales = {
'zh-CN': {
attachments: ' ',
},
'en': {
attachments: ' attachments',
}
}
window.vueApp = new Vue({
el: "#attachList",
data: {
lists: []
},
delimiters: ['${', '}'],
methods: {
removeAttach: function ($attach_id) {
var $this = this;
var item = $this.lists.filter(function ($item) {
return $item.attachment_id == $attach_id;
});
if (item && item[0].hasOwnProperty("state")) {
$this.lists = $this.lists.filter(function ($item) {
return $item.attachment_id != $attach_id;
});
return;
}
$.ajax({
url: window.removeAttachURL,
type: "post",
data: {"attach_id": $attach_id},
success: function (res) {
if (res.errcode === 0) {
$this.lists = $this.lists.filter(function ($item) {
return $item.attachment_id != $attach_id;
});
} else {
layer.msg(res.message);
}
}
});
}
},
watch: {
lists: function ($lists) {
$("#attachInfo").text(" " + $lists.length + locales[lang].attachments)
}
}
});
/**
* 启动自动保存默认30s自动保存一次
*/
if (window.book && window.book.auto_save) {
setTimeout(function () {
setInterval(function () {
var $then = $("#markdown-save");
if (!window.saveing && $then.hasClass("change")) {
$then.trigger("click");
}
}, 30000);
}, 30000);
}
/**
* 当离开窗口时存在未保存的文档会提示保存
*/
$(window).on("beforeunload", function () {
if ($("#markdown-save").hasClass("change")) {
return '';
}
});
});