main
tamguo 7 years ago
parent 9d1dd77f6f
commit 76e30f065a

@ -194,6 +194,9 @@ public class DocumentController {
}
}
/**
*
*/
@RequestMapping(value = "removeFile" , method = RequestMethod.POST)
@ResponseBody
public Result removeFile(String id) {
@ -202,6 +205,7 @@ public class DocumentController {
} catch (Exception e) {
return Result.result(1, null, "删除失败");
}
return Result.successResult("删除成功");
return Result.result(0, null, "删除成功");
}
}

@ -0,0 +1,91 @@
package com.tamguo.web.member;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.baomidou.mybatisplus.mapper.Condition;
import com.tamguo.common.utils.Result;
import com.tamguo.modules.book.model.DocumentEntity;
import com.tamguo.modules.book.model.enums.DocumentStatusEnum;
import com.tamguo.modules.book.service.IDocumentService;
@Controller
@RequestMapping(value="member/document")
public class HistoryDocController {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private IDocumentService iDocumentService;
/**
*
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "history" , method = RequestMethod.POST)
public ModelAndView history(String id , ModelAndView model) {
model.setViewName("member/book/history");
DocumentEntity document = iDocumentService.selectById(id);
model.addObject("document", document);
model.addObject("historyList", iDocumentService.selectList(Condition.create().eq("batch_no", document.getBatchNo()).eq("status", DocumentStatusEnum.HISTORY.getValue()).orderDesc(Arrays.asList("create_date"))));
return model;
}
/**
*
*/
@RequestMapping(value = "history/delete" , method = RequestMethod.POST)
@ResponseBody
public Result delete(String id) {
try {
iDocumentService.deleteById(id);
} catch (Exception e) {
logger.error(e.getMessage() , e);
return Result.failResult("删除失败!");
}
return Result.successResult("删除成功!");
}
/**
*
*/
@SuppressWarnings("unchecked")
@RequestMapping(value = "history/restore" , method = RequestMethod.POST)
@ResponseBody
public Result restore(String id) {
try {
DocumentEntity history = iDocumentService.selectById(id);
String content = history.getContent();
String markdown = history.getMarkdown();
DocumentEntity document = iDocumentService.selectOne(Condition.create().eq("batch_no", history.getBatchNo()).eq("status", DocumentStatusEnum.NORMAL.getValue()));
document.setContent(content);
document.setMarkdown(markdown);
document.setCover("no");
iDocumentService.modify(document);
return Result.successResult(document);
} catch (Exception e) {
logger.error(e.getMessage() , e);
return Result.failResult("恢复失败!");
}
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "history/compare/{id}" , method = RequestMethod.POST)
@ResponseBody
public ModelAndView compare(@PathVariable String id , ModelAndView model) {
model.setViewName("member/book/compare");
DocumentEntity history = iDocumentService.selectById(id);
model.addObject("history", history);
model.addObject("document", iDocumentService.selectOne(Condition.create().eq("status", DocumentStatusEnum.NORMAL.getValue()).eq("batch_no", history.getBatchNo())));
return model;
}
}

@ -0,0 +1,128 @@
/* cyrillic-ext */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/C7bP6N8yXZ-PGLzbFLtQKRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/iLJc6PpCnnbQjYc1Jq4v0xJtnKITppOI_IvcXXDNrsc.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* devanagari */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/5pCv5Yz4eMu9gmvX8nNhfRJtnKITppOI_IvcXXDNrsc.woff2) format('woff2');
unicode-range: U+02BC, U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200B-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
}
/* greek-ext */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/gEkd0pn-sMtQ_P4HUpi6WBJtnKITppOI_IvcXXDNrsc.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/iPF-u8L1qkTPHaKjvXERnxJtnKITppOI_IvcXXDNrsc.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/mTzVK0-EJOCaJiOPeaz-hxJtnKITppOI_IvcXXDNrsc.woff2) format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/erE3KsIWUumgD1j_Ca-V-xJtnKITppOI_IvcXXDNrsc.woff2) format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 400;
src: local('Noto Sans'), local('NotoSans'), url(notosans/v6/LeFlHvsZjXu2c3ZRgBq9nFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
/* cyrillic-ext */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ16-j2U0lmluP9RWlSytm3ho.woff2) format('woff2');
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
}
/* cyrillic */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ15X5f-9o1vgP2EXwfjgl7AY.woff2) format('woff2');
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
/* devanagari */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ10Tj6bCwSDA5u__Fbjwz3f0.woff2) format('woff2');
unicode-range: U+02BC, U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200B-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
}
/* greek-ext */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1xWV49_lSm1NYrwo-zkhivY.woff2) format('woff2');
unicode-range: U+1F00-1FFF;
}
/* greek */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ16aRobkAwv3vxw3jMhVENGA.woff2) format('woff2');
unicode-range: U+0370-03FF;
}
/* vietnamese */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1_8zf_FOSsgRmwsS7Aa9k2w.woff2) format('woff2');
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1z0LW-43aMEzIO6XUTLjad8.woff2) format('woff2');
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Noto Sans';
font-style: normal;
font-weight: 700;
src: local('Noto Sans Bold'), local('NotoSans-Bold'), url(notosans/v6/PIbvSEyHEdL91QLOQRnZ1-gdm0LZdjqr5-oayXSOefg.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}

@ -306,7 +306,7 @@ window.documentHistory = function() {
shadeClose: true,
shade: 0.8,
area: ['700px','80%'],
content: window.historyURL + "?identify=" + window.book.identify + "&doc_id=" + window.selectNode.id,
content: window.historyURL + "?id=" + window.selectNode.id,
end : function () {
if(window.SelectedId){
var selected = {node:{

@ -0,0 +1,85 @@
body { margin: 0; }
#banner { background: transparent url(images/banner.png); width: 33px; height: 30px; position: absolute; left: 3px; top: 3px; }
.wicked-menu { font-family: 'Noto Sans', sans-serif; margin: 2px 0 2px 40px; }
.wicked-menu a.link { margin-left: 10px; }
.ui-widget { font-size:13px; }
/* color dialog */
#dialog-colors { }
#dialog-colors label { width: 85px; display: inline-block; font-weight: bold; padding: 5px; }
#dialog-colors input[type=text] { width: 70px; border: 1px solid #444; float:right; }
#dialog-colors fieldset { -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; border: 1px solid #ccc; width: 222px; padding-right: 15px; }
/* import dialog */
#dialog-upload label { font-weight: bold; display: inline-block; width: 80px; line-height: 1.5em; }
.no-title .ui-dialog-titlebar { display:none; }
.no-title .ui-dialog-content { padding: 0; }
#file-lhs-progress,
#file-rhs-progress { height: 22px; width: 240px; vertical-align: middle; line-height: 1.5em; display: none; }
.progress-label { float: left; width: 100%; color: #fff; font-weight: bold; font-size: .8em; padding-left: 10px; }
/* icons */
.icon-undo { background-image: url(images/undo.png); }
.icon-redo { background-image: url(images/redo.png); }
.icon-save { background-image: url(images/download.png); }
.icon-check { background-image: url(images/check.png); }
.icon-import { background-image: url(images/upload.png); }
.icon-swap { background-image: url(images/swap.png); }
.icon-arrow-right { background-image: url(images/arrow-right.png); }
.icon-arrow-right-v { background-image: url(images/arrow-right-v.png); }
.icon-arrow-right-vv { background-image: url(images/arrow-right-vv.png); }
.icon-arrow-left-v { background-image: url(images/arrow-left-v.png); }
.icon-arrow-left-vv { background-image: url(images/arrow-left-vv.png); }
.icon-arrow-up { background-image: url(images/arrow-up-v.png); }
.icon-arrow-down { background-image: url(images/arrow-down-v.png); }
.icon-x-mark { background-image: url(images/x-mark.png); }
.icon-share { background-image: url(images/share.png); }
.tipsy-inner {
padding: 8px;
text-align: center;
max-width: 250px;
font-family: arial, sans-serif;
font-weight: bold;
font-size: 1.2em;
}
.find {
position: absolute;
top: 0px;
right: 0px;
z-index: 4;
padding: 10px 20px 10px 10px;
background-color: #f5f5f5;
float: right;
border-left: 1px solid #ccc;
border-bottom: 1px solid #ccc;
border-bottom-left-radius: 10px;
max-height: 26px;
-webkit-box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0;
-moz-box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0;
box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0;
display: none;
}
.find > button {
padding: 3px 0px;
border: 1px solid #ccc;
border-radius: 3px;
height: 25px;
width: 26px;
vertical-align: top;
cursor: pointer;
}
.find > button:hover {
background-color: #f5f5f5;
border: 1px solid #aaa;
}
.find > button > span.icon {
width: 16px;
height: 16px;
display: inline-block;
text-align: center;
background-position: center center;
}

@ -0,0 +1,699 @@
$(document).ready(function() {
function getParameters() {
var parameters = {};
window.location.search.substr(1).split('&').forEach(function(pair) {
if (pair === '') return;
var parts = pair.split('=');
if (parts.length === 2 && parts[1].search(/^(true|1)$/i) >= 0) {
parameters[parts[0]] = true;
}
else if (parts.length === 2 && parts[1].search(/^(false|0)$/i) >= 0) {
parameters[parts[0]] = false;
}
else parameters[parts[0]] = parts[1] && decodeURIComponent(parts[1].replace(/\+/g, ' '));
});
return {
get: function(name, defaultValue) {
if (parameters.hasOwnProperty(name)) return parameters[name];
return defaultValue;
}
};
}
var parameters = getParameters();
if (parameters.get('test', false)) {
var li = $('<li>Tests</li>');
var ul = $('<ul>');
for (var i = 1; i <= 8; ++i) {
ul.append($('<li id="examples-test' + i + '">Test ' + i + '</li>'));
}
li.append(ul);
$('#main-menu').append(li);
}
function handleFind(column) {
if (!column.length) {
return false;
}
var ed = $('#mergely');
var find = column.find('.find');
var input = find.find('input[type="text"]');
var side = column.attr('id').indexOf('-lhs') > 0 ? 'lhs' : 'rhs';
var origautoupdate = ed.mergely('options').autoupdate;
find.slideDown('fast', function() {
input.focus();
// disable autoupdate, clear both sides of diff
ed.mergely('options', {autoupdate: false});
ed.mergely('unmarkup');
});
find.find('.find-prev').click(function() {
ed.mergely('search', side, input.val(), 'prev');
});
find.find('.find-next').click(function() {
ed.mergely('search', side, input.val(), 'next');
});
find.find('.find-close').click(function() {
find.css('display', 'none')
ed.mergely('options', {autoupdate: origautoupdate});
});
input.keydown(function(evt) {
if (evt.which != 13 && evt.which != 27) return true;
if (evt.which == 27) {
find.css('display', 'none');
ed.mergely('options', {autoupdate: origautoupdate});
}
ed.mergely('search', side, input.val());
return false;
});
}
$(document).keydown(function(event) {
if (!( String.fromCharCode(event.which).toLowerCase() == 'f' && event.ctrlKey)) return true;
event.preventDefault();
var range = window.getSelection().getRangeAt(0);
var column = $(range.commonAncestorContainer).parents('.mergely-column');
handleFind(column);
return false;
});
String.prototype.random = function(length) {
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
var randomstring = ''
for (var i=0; i<length; i++) {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum+1);
}
return randomstring;
}
// body is pre-hidden for better rendering
$('body').css("visibility", "");
var ed = $('#mergely');
var menu = $('#main-menu');
var toolbar = $('#toolbar');
ed.mergely({
width: 'auto',
height: 'auto',
cmsettings: {
lineNumbers: true,
readOnly: false
}
});
ed.mergely("lhs", $("#historyContent").html());
ed.mergely("rhs", $("#documentContent").html());
// if (parameters.get('lhs', null)) {
// var url = parameters.get('lhs');
// crossdomainGET(ed, 'lhs', url);
// }
// if (parameters.get('rhs', null)) {
// var url = parameters.get('rhs');
// crossdomainGET(ed, 'rhs', url);
// }
// set query string options
var urloptions = {};
var optmap = {
au: 'autoupdate',
ws: 'ignorews',
cs: 'ignorecase',
sb: 'sidebar',
vp: 'viewport',
wl: 'wrap_lines',
ln: 'line_numbers'
};
var doopt = false;
for (var name in optmap) {
if (!optmap.hasOwnProperty(name)) continue;
if (parameters.get(name, null) !== null) {
urloptions[optmap[name]] = parameters.get(name);
doopt = true;
}
}
if (parameters.get('rm', null) !== null) {
// special-case url property
urloptions.rhs_margin = parameters.get('rm') ? 'left' : 'right';
}
if (doopt) {
// apply query-string options
ed.mergely('options', urloptions);
}
// set query string colors
// cb: change border
// cg: change background
// ab: added border
// ag: added background
// db: deleted border
// dg: deleted background
var color_defaults = {
cb: 'cccccc', cg: 'fafafa',
ab: 'a3d1ff', ag: 'ddeeff',
db: 'ff7f7f', dg: 'ffe9e9'
};
applyParameterCss(false);
//history.pushState({}, null, '');
window.addEventListener('popstate', function(ev) {
if (ev.state) {
parameters = getParameters();
applyParameterCss(false);
}
});
// Load
if (key.length === 8) {
$.when(
$.ajax({
type: 'GET', async: true, dataType: 'text',
data: { 'key':key, 'name': 'lhs' },
url: '/ajax/handle_get.php',
success: function (response) {
ed.mergely('lhs', response);
},
error: function(xhr, ajaxOptions, thrownError){
}
}),
$.ajax({
type: 'GET', async: true, dataType: 'text',
data: { 'key':key, 'name': 'rhs' },
url: '/ajax/handle_get.php',
success: function (response) {
ed.mergely('rhs', response);
},
error: function(xhr, ajaxOptions, thrownError){
}
})
).done(function() {
var anchor = window.location.hash.substring(1);
if (anchor) {
// if an anchor has been provided, then parse the anchor in the
// form of: 'lhs' or 'rhs', followed by a line, e.g: lhs100.
var m = anchor.match(/([lr]hs)([0-9]+)/);
if (m && m.length == 3) {
console.log(m);
ed.mergely('scrollTo', m[1], parseInt(m[2],10));
}
}
});
}
// find
var find = $('.find');
var flhs = find.clone().attr('id', 'mergely-editor-lhs-find');
var frhs = find.clone().attr('id', 'mergely-editor-rhs-find');
$('#mergely-editor-lhs').append(flhs);
$('#mergely-editor-rhs').append(frhs);
find.remove();
var iconconf = {
'options-autodiff': {
get: function() { return ed.mergely('options').autoupdate },
set: function(value) {
var au = !ed.mergely('options').autoupdate;
ed.mergely('options', {autoupdate: au});
var params = updateQueryStringParam('au', au ? 1 : 0, 1);
updateHistory(params);
}
},
'options-ignorews': {
get: function() { return ed.mergely('options').ignorews },
set: function(value) {
var ws = !ed.mergely('options').ignorews;
ed.mergely('options', {ignorews: ws});
var params = updateQueryStringParam('ws', ws ? 1 : 0, 0);
updateHistory(params);
}
},
'options-ignorecase': {
get: function() { return ed.mergely('options').ignorecase },
set: function(value) {
var cs = !ed.mergely('options').ignorecase;
ed.mergely('options', {ignorecase: cs});
var params = updateQueryStringParam('cs', cs ? 1 : 0, 0);
updateHistory(params);
}
},
'options-sidebars': {
get: function() { console.log('sidebar', this); return ed.mergely('options').sidebar },
set: function(value) {
var sb = !ed.mergely('options').sidebar;
ed.mergely('options', {sidebar: sb});
var params = updateQueryStringParam('sb', sb ? 1 : 0, 1);
updateHistory(params);
}
},
'options-viewport': {
get: function() { console.log('viewport', this); return ed.mergely('options').viewport },
set: function(value) {
var vp = !ed.mergely('options').viewport;
ed.mergely('options', {viewport: vp});
var params = updateQueryStringParam('vp', vp ? 1 : 0, 0);
updateHistory(params);
}
},
'options-swapmargin': {
get: function() { return (ed.mergely('options').rhs_margin == 'left'); },
set: function(value) {
var rm = ed.mergely('options').rhs_margin == 'left' ? 'right' : 'left';
ed.mergely('options', {rhs_margin: rm });
var params = updateQueryStringParam('rm', rm == 'left' ? 1 : 0, 0);
updateHistory(params);
}
},
'options-linenumbers': {
get: function() { console.log('wrap', this); return ed.mergely('options').line_numbers },
set: function(value) {
var ln = !ed.mergely('options').line_numbers;
ed.mergely('options', {line_numbers: ln});
var params = updateQueryStringParam('ln', ln ? 1 : 0, 1);
updateHistory(params);
}
},
'options-wrap': {
get: function() { console.log('wrap', this); return ed.mergely('options').wrap_lines },
set: function(value) {
var wl = !ed.mergely('options').wrap_lines;
ed.mergely('options', {wrap_lines: wl});
var params = updateQueryStringParam('wl', wl ? 1 : 0, 0);
updateHistory(params);
}
},
'edit-left-readonly': {
get: function() { return ed.mergely('cm', 'lhs').getOption('readOnly'); },
set: function(value) { ed.mergely('cm', 'lhs').setOption('readOnly', value); }
},
'edit-right-readonly': {
get: function() { return ed.mergely('cm', 'rhs').getOption('readOnly'); },
set: function(value) { ed.mergely('cm', 'rhs').setOption('readOnly', value); }
}
}
var menu_opts = {
hasIcon: function(id) {
return iconconf.hasOwnProperty(id);
},
getIcon: function(id) {
if (iconconf[id].get()) return 'icon-check';
}
};
function handle_operation(id) {
if (id == 'file-new') {
window.location = '/editor';
}
else if (id === 'file-save') {
var rhs = ed.mergely('get', 'rhs');
if(window.top.hasOwnProperty("editor")){
if(window.top.editor.hasOwnProperty("$txt")){
window.top.editor.$txt.html(rhs);
}else{
window.top.editor.clear();
window.top.editor.insertValue(rhs);
}
window.top.layer.closeAll();
}
}else if (id == 'file-share') {
handleShare(ed);
}
else if (id == 'file-import') {
importFiles(ed);
}
else if (id == 'edit-left-undo') {
ed.mergely('cm', 'lhs').getDoc().undo();
}
else if (id == 'edit-left-redo') {
ed.mergely('cm', 'lhs').getDoc().redo();
}
else if (id == 'edit-right-undo') {
ed.mergely('cm', 'rhs').getDoc().undo();
}
else if (id == 'edit-right-redo') {
ed.mergely('cm', 'rhs').getDoc().redo();
}
else if (id == 'edit-left-find') {
handleFind(ed.find('#mergely-editor-lhs'));
}
else if (id == 'edit-left-merge-right') {
ed.mergely('mergeCurrentChange', 'rhs');
}
else if (id == 'edit-left-merge-right-file') {
ed.mergely('merge', 'rhs');
}
else if ([
'edit-left-readonly',
'edit-right-readonly',
'options-autodiff',
'options-sidebars',
'options-swapmargin',
'options-viewport',
'options-ignorews',
'options-ignorecase',
'options-wrap',
'options-linenumbers',
].indexOf(id) >= 0) {
iconconf[id].set(!iconconf[id].get());
menu.wickedmenu('update', id);
}
else if (id == 'edit-left-clear') {
ed.mergely('clear', 'lhs');
}
else if (id == 'edit-right-find') {
handleFind(ed.find('#mergely-editor-rhs'));
}
else if (id == 'edit-right-merge-left') {
ed.mergely('mergeCurrentChange', 'lhs');
}
else if (id == 'edit-right-merge-left-file') {
ed.mergely('merge', 'lhs');
}
else if (id == 'edit-right-clear') {
ed.mergely('clear', 'rhs');
}
else if (id == 'options-colors') {
colorSettings(ed);
}
else if (id == 'view-swap') {
ed.mergely('swap');
}
else if (id == 'view-refresh') {
ed.mergely('update');
}
else if (id == 'view-change-next') {
ed.mergely('scrollToDiff', 'next');
}
else if (id == 'view-change-prev') {
ed.mergely('scrollToDiff', 'prev');
}
else if (id == 'view-clear') {
ed.mergely('unmarkup');
}
else if (id.indexOf('examples-') == 0) {
var test_config = {
test1: {lhs: 'one\ntwo\nthree', rhs: 'two\nthree'},
test2: {lhs: 'two\nthree', rhs: 'one\ntwo\nthree'},
test3: {lhs: 'one\nthree', rhs: 'one\ntwo\nthree'},
test4: {lhs: 'one\ntwo\nthree', rhs: 'one\nthree'},
test5: {lhs: 'to bee, or not to be', rhs: 'to be, or not to bee'},
test6: {lhs: 'to be, or not to be z', rhs: 'to be, to be'},
test7: {lhs: 'remained, & to assume', rhs: 'and to assume'},
test8: {lhs: 'to be, or not to be', rhs: 'to be, or not to be'}
};
var test = id.split('examples-')[1];
ed.mergely('lhs', test_config[test]['lhs']);
ed.mergely('rhs', test_config[test]['rhs']);
}
return false;
}
menu.wickedmenu(menu_opts).bind('selected', function(ev, id) {
return handle_operation(id);
});
toolbar.wickedtoolbar({}).bind('selected', function(ev, id) {
if (!id) return false;
return handle_operation(id.replace(/^tb-/, ''));
});
toolbar.find('li[title]').tipsy({opacity: 1});
menu.find('li[title]').tipsy({opacity: 1, delayIn: 1000, gravity: 'w'});
function handleShare(ed) {
var fork = $(this).attr('id') == 'fork';
if (key == '') key = ''.random(8);
var count = 0;
function post_save(side, text) {
$.ajax({
type: 'POST', async: true, dataType: 'text',
url: '/ajax/handle_file.php',
data: { 'key': key, 'name': side, 'content': text },
success: function (nkey) {
++count;
if (count == 2) {
var url = '/ajax/handle_save.php?key=' + key;
if (fork) url += '&nkey=' + ''.random(8);
$.ajax({
type: 'GET', async: false, dataType: 'text',
url: url,
success: function (nkey) {
// redirect
if (nkey.length) window.location.href = '/' + $.trim(nkey) + '/';
},
error: function(xhr, ajaxOptions, thrownError){
}
});
}
},
error: function(xhr, ajaxOptions, thrownError){
alert(thrownError);
}
});
}
function save_files() {
var lhs = ed.mergely('get', 'lhs');
var rhs = ed.mergely('get', 'rhs');
post_save('lhs', lhs);
post_save('rhs', rhs);
}
$( '#dialog-confirm' ).dialog({
resizable: false, width: 350, modal: true,
buttons: {
'Save for Sharing': function() {
$( this ).dialog( 'close' );
save_files();
},
Cancel: function() {
$( this ).dialog( 'close' );
}
}
});
}
function crossdomainGET(ed, side, url) {
$.ajax({
type: 'GET', dataType: 'text',
data: {url: url},
url: '/ajax/handle_crossdomain.php',
contentType: 'text/plain',
success: function (response) {
ed.mergely(side, response);
},
error: function(xhr, ajaxOptions, thrownError){
console.error('error', xhr, ajaxOptions, thrownError);
}
});
}
function importFiles(ed) {
// -------------
// file uploader - html5 file upload to browser
function file_load(target, side) {
var file = target.files[0];
var reader = new FileReader();
var $target = $(target);
function trigger(name, event) { $target.trigger(name, event); }
reader.onloadstart = function(evt) { trigger('start'); }
reader.onprogress = function(evt) { trigger('progress', evt); }
reader.onload = function(evt) { trigger('loaded', evt.target.result); }
reader.onerror = function (evt) {
alert(evt.target.error.name);
}
try {
reader.readAsText(file, 'UTF-8');
}
catch (e) {
console.error(e);
alert(e);
}
}
var file_data = {};
$('#file-lhs, #file-rhs').change(function (evt) {
var re = new RegExp('.*[\\\\/](.*)$');
var match = re.exec($(this).val());
var fname = match ? match[1] : 'unknown';
var progressbar = $('#' + evt.target.id + '-progress');
file_load(evt.target);
$(evt.target).bind('start', function(ev){
$(evt.target).css('display', 'none');
progressbar.css('display', 'inline-block');
});
$(evt.target).bind('progress', function(ev, progress){
var loaded = (progress.loaded / progress.total) * 100;
progressbar.find('> .progress-label').text(loaded + '%');
progressbar.progressbar('value', loaded);
});
$(evt.target).bind('loaded', function(ev, file){
progressbar.progressbar('value', 100);
progressbar.find('> .progress-label').text(fname);
file_data[evt.target.id] = file;
});
});
$('#file-lhs-progress').progressbar({value: 0});
$('#file-rhs-progress').progressbar({value: 0});
$('#dialog-upload .tabs').tabs();
function callbackName(data) {
console.log('callbackName', data);
}
$('#dialog-upload').dialog({
dialogClass: 'no-title',
resizable: false,
width: '450px',
modal: true,
buttons: {
Import: function() {
$(this).dialog('close');
var urls = { lhs: $('#url-lhs').val(), rhs: $('#url-rhs').val() };
for (var side in urls) {
var url = urls[side];
if (!url) continue;
crossdomainGET(ed, side, url);
}
if (file_data.hasOwnProperty('file-lhs')) {
ed.mergely('lhs', file_data['file-lhs']);
}
if (file_data.hasOwnProperty('file-rhs')) {
ed.mergely('rhs', file_data['file-rhs']);
}
},
Cancel: function() {
$(this).dialog('close');
}
}
});
}
function colorSettings(ed) {
// get current settings
var sd = $('<span style="display:none" class="mergely ch d lhs start end">C</span>');
var sa = $('<span style="display:none" class="mergely bg a rhs start end">C</span>');
var sc = $('<span style="display:none" class="mergely c rhs start end">C</span>');
$('body').append(sd);
$('body').append(sa);
$('body').append(sc);
var conf = {
'c-border': {id: '#c-border', getColor: function() { return sc.css('border-top-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
'c-bg': {id: '#c-bg', getColor: function() { return sc.css('background-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
'a-border': {id: '#a-border', getColor: function() { return sa.css('border-top-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
'a-bg': {id: '#a-bg', getColor: function() { return sa.css('background-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
'd-border': {id: '#d-border', getColor: function() { return sd.css('border-top-color'); }, setColor: function(color) { $('#'+this.id).val(color) }},
'd-bg': {id: '#d-bg', getColor: function() { return sd.css('background-color'); }, setColor: function(color) { $('#'+this.id).val(color) }}
};
$.each(conf, function(key, item){$(item.id).val(item.getColor()); });
var f = $.farbtastic('#picker');
$('.colorwell').each(function(){ f.linkTo(this); }).focus(function(){
var tthis = $(this);
f.linkTo(this);
var item = conf[tthis.attr('id')];
f.setColor(item.getColor());
});
$('#dialog-colors').dialog({
width: 490, modal: true,
buttons: {
Apply: function() {
var cborder = $('#c-border').val();
var aborder = $('#a-border').val();
var dborder = $('#d-border').val();
var abg = $('#a-bg').val();
var dbg = $('#d-bg').val();
var cbg = $('#c-bg').val();
var textCss = makeColorCss(cborder, cbg, aborder, abg, dborder, dbg);
applyColorCss(textCss, cborder, cbg, aborder, abg, dborder, dbg, true);
},
Reset: function() {
},
Close: function() {
$(this).dialog('close');
}
}
});
}
function makeColorCss(changeBorder, changeBackground, addedBorder, addedBackground, deletedBorder, deletedBackground) {
var text =
'.mergely.a.rhs.start{border-top-color:' + addedBorder + ';}\n\
.mergely.a.lhs.start.end,\n\
.mergely.a.rhs.end{border-bottom-color:' + addedBorder + ';}\n\
.mergely.a.rhs{background-color:' + addedBackground + ';}\n\
.mergely.d.lhs{background-color:' + deletedBackground + ';}\n\
.mergely.d.lhs.end,\n\
.mergely.d.rhs.start.end{border-bottom-color:' + deletedBorder + ';}\n\
.mergely.d.rhs.start.end.first{border-top-color:' + deletedBorder + ';}\n\
.mergely.d.lhs.start{border-top-color:' + deletedBorder + ';}\n\
.mergely.c.lhs,\n\
.mergely.c.rhs{background-color:' + changeBackground + ';}\n\
.mergely.c.lhs.start,\n\
.mergely.c.rhs.start{border-top-color:' + changeBorder + ';}\n\
.mergely.c.lhs.end,\n\
.mergely.c.rhs.end{border-bottom-color:' + changeBorder + ';}\n\
.mergely.ch.a.rhs{background-color:' + addedBackground + ';}\n\
.mergely.ch.d.lhs{background-color:' + deletedBackground + ';color: #888;}';
return text;
}
function applyParameterCss(saveState) {
var cb = '#' + parameters.get('cb',color_defaults.cb),
cg = '#' + parameters.get('cg',color_defaults.cg),
ab = '#' + parameters.get('ab',color_defaults.ab),
ag = '#' + parameters.get('ag',color_defaults.ag),
db = '#' + parameters.get('db',color_defaults.db),
dg = '#' + parameters.get('dg',color_defaults.dg);
applyColorCss(makeColorCss(cb, cg, ab, ag, db, dg), cb, cg, ab, ag, db, dg, saveState);
}
function applyColorCss(cssText, changeBorder, changeBackground, addedBorder, addedBackground, deletedBorder, deletedBackground, saveState) {
$('<style type="text/css">' + cssText + '</style>').appendTo('head');
ed.mergely('options', {
fgcolor:{a:addedBorder,c:changeBorder,d:deletedBorder}
});
var params = updateQueryStringParam('cb', changeBorder.replace(/#/g, ''), color_defaults.cb);
params = updateQueryStringParam('cg', changeBackground.replace(/#/g, ''), color_defaults.cg, params);
params = updateQueryStringParam('ab', addedBorder.replace(/#/g, ''), color_defaults.ab, params);
params = updateQueryStringParam('ag', addedBackground.replace(/#/g, ''), color_defaults.ag, params);
params = updateQueryStringParam('db', deletedBorder.replace(/#/g, ''), color_defaults.db, params);
params = updateQueryStringParam('dg', deletedBackground.replace(/#/g, ''), color_defaults.dg, params);
if (saveState) {
updateHistory(params);
}
}
function updateHistory(params) {
var baseUrl = [location.protocol, '//', location.host, location.pathname].join('');
window.history.pushState({}, null, baseUrl + params);
}
// Explicitly save/update a url parameter using HTML5's replaceState().
function updateQueryStringParam(key, value, defaultValue, urlQueryString) {
urlQueryString = urlQueryString || document.location.search;
var parts = urlQueryString.replace(/^\?/, '').split(/&/), found = false;
for (var i in parts) {
if (parts[i].startsWith(key + '=')) {
found = true;
if (value === defaultValue) {
// value is default value, remove option
parts.splice(i, 1);
}
else {
// make new value
parts[i] = key + '=' + value;
}
break;
}
else if (parts[i].length === 0) {
parts.splice(i, 1);
break;
}
}
if (!found) {
parts.push(key + '=' + value);
}
return (parts.length) ? '?' + parts.join('&') : '';
}
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

@ -0,0 +1,51 @@
/**
* Farbtastic Color Picker 1.2
* © 2008 Steven Wittens
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
.farbtastic {
position: relative;
}
.farbtastic * {
position: absolute;
cursor: crosshair;
}
.farbtastic, .farbtastic .wheel {
width: 195px;
height: 195px;
}
.farbtastic .color, .farbtastic .overlay {
top: 47px;
left: 47px;
width: 101px;
height: 101px;
}
.farbtastic .wheel {
background: url(wheel.png) no-repeat;
width: 195px;
height: 195px;
}
.farbtastic .overlay {
background: url(mask.png) no-repeat;
}
.farbtastic .marker {
width: 17px;
height: 17px;
margin: -8px 0 0 -8px;
overflow: hidden;
background: url(marker.png) no-repeat;
}

@ -0,0 +1,367 @@
/**
* Farbtastic Color Picker 1.2
* © 2008 Steven Wittens
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
jQuery.fn.farbtastic = function (callback) {
$.farbtastic(this, callback);
return this;
};
jQuery.farbtastic = function (container, callback) {
var container = $(container).get(0);
return container.farbtastic || (container.farbtastic = new jQuery._farbtastic(container, callback));
}
jQuery._farbtastic = function (container, callback) {
// Store farbtastic object
var fb = this;
// Insert markup
$(container).html('<div class="farbtastic"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
var e = $('.farbtastic', container);
fb.wheel = $('.wheel', container).get(0);
// Dimensions
fb.radius = 84;
fb.square = 100;
fb.width = 194;
// Fix background PNGs in IE6
if (navigator.appVersion.match(/MSIE [0-6]\./)) {
$('*', e).each(function () {
if (this.currentStyle.backgroundImage != 'none') {
var image = this.currentStyle.backgroundImage;
image = this.currentStyle.backgroundImage.substring(5, image.length - 2);
$(this).css({
'backgroundImage': 'none',
'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
});
}
});
}
/**
* Link to the given element(s) or callback.
*/
fb.linkTo = function (callback) {
// Unbind previous nodes
if (typeof fb.callback == 'object') {
$(fb.callback).unbind('keyup', fb.updateValue);
}
// Reset color
fb.color = null;
// Bind callback or elements
if (typeof callback == 'function') {
fb.callback = callback;
}
else if (typeof callback == 'object' || typeof callback == 'string') {
fb.callback = $(callback);
fb.callback.bind('keyup', fb.updateValue);
if (fb.callback.get(0).value) {
fb.setColor(fb.callback.get(0).value);
}
}
return this;
}
fb.updateValue = function (event) {
if (this.value && this.value != fb.color) {
fb.setColor(this.value);
}
}
/**
* Change color with HTML syntax #123456
*/
fb.setColor = function (color) {
var unpack = fb.unpack(color);
// JAMIE WAS HERE rgb(r, g, b) modification
if (!unpack && color) {
color = fb.RGBToHex(color);
if (color) unpack = fb.unpack(color);
}
// JAMIE WAS HERE rgb(r, g, b) modification
if (fb.color != color && unpack) {
fb.color = color;
fb.rgb = unpack;
fb.hsl = fb.RGBToHSL(fb.rgb);
fb.updateDisplay();
}
return this;
}
/**
* Change color with HSL triplet [0..1, 0..1, 0..1]
*/
fb.setHSL = function (hsl) {
fb.hsl = hsl;
fb.rgb = fb.HSLToRGB(hsl);
fb.color = fb.pack(fb.rgb);
fb.updateDisplay();
return this;
}
/////////////////////////////////////////////////////
/**
* Retrieve the coordinates of the given event relative to the center
* of the widget.
*/
fb.widgetCoords = function (event) {
var x, y;
var el = event.target || event.srcElement;
var reference = fb.wheel;
if (typeof event.offsetX != 'undefined') {
// Use offset coordinates and find common offsetParent
var pos = { x: event.offsetX, y: event.offsetY };
// Send the coordinates upwards through the offsetParent chain.
var e = el;
while (e) {
e.mouseX = pos.x;
e.mouseY = pos.y;
pos.x += e.offsetLeft;
pos.y += e.offsetTop;
e = e.offsetParent;
}
// Look for the coordinates starting from the wheel widget.
var e = reference;
var offset = { x: 0, y: 0 }
while (e) {
if (typeof e.mouseX != 'undefined') {
x = e.mouseX - offset.x;
y = e.mouseY - offset.y;
break;
}
offset.x += e.offsetLeft;
offset.y += e.offsetTop;
e = e.offsetParent;
}
// Reset stored coordinates
e = el;
while (e) {
e.mouseX = undefined;
e.mouseY = undefined;
e = e.offsetParent;
}
}
else {
// Use absolute coordinates
var pos = fb.absolutePosition(reference);
x = (event.pageX || 0*(event.clientX + $('html').get(0).scrollLeft)) - pos.x;
y = (event.pageY || 0*(event.clientY + $('html').get(0).scrollTop)) - pos.y;
}
// Subtract distance to middle
return { x: x - fb.width / 2, y: y - fb.width / 2 };
}
/**
* Mousedown handler
*/
fb.mousedown = function (event) {
// Capture mouse
if (!document.dragging) {
$(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);
document.dragging = true;
}
// Check which area is being dragged
var pos = fb.widgetCoords(event);
fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;
// Process
fb.mousemove(event);
return false;
}
/**
* Mousemove handler
*/
fb.mousemove = function (event) {
// Get coordinates relative to color picker center
var pos = fb.widgetCoords(event);
// Set new HSL parameters
if (fb.circleDrag) {
var hue = Math.atan2(pos.x, -pos.y) / 6.28;
if (hue < 0) hue += 1;
fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
}
else {
var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
fb.setHSL([fb.hsl[0], sat, lum]);
}
return false;
}
/**
* Mouseup handler
*/
fb.mouseup = function () {
// Uncapture mouse
$(document).unbind('mousemove', fb.mousemove);
$(document).unbind('mouseup', fb.mouseup);
document.dragging = false;
}
/**
* Update the markers and styles
*/
fb.updateDisplay = function () {
// Markers
var angle = fb.hsl[0] * 6.28;
$('.h-marker', e).css({
left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
});
$('.sl-marker', e).css({
left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
});
// Saturation/Luminance gradient
$('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));
// Linked elements or callback
if (typeof fb.callback == 'object') {
// Set background/foreground color
$(fb.callback).css({
backgroundColor: fb.color,
color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
});
// Change linked value
$(fb.callback).each(function() {
if (this.value && this.value != fb.color) {
this.value = fb.color;
}
});
}
else if (typeof fb.callback == 'function') {
fb.callback.call(fb, fb.color);
}
}
/**
* Get absolute position of element
*/
fb.absolutePosition = function (el) {
var r = { x: el.offsetLeft, y: el.offsetTop };
// Resolve relative to offsetParent
if (el.offsetParent) {
var tmp = fb.absolutePosition(el.offsetParent);
r.x += tmp.x;
r.y += tmp.y;
}
return r;
};
/* Various color utility functions */
fb.pack = function (rgb) {
var r = Math.round(rgb[0] * 255);
var g = Math.round(rgb[1] * 255);
var b = Math.round(rgb[2] * 255);
return '#' + (r < 16 ? '0' : '') + r.toString(16) +
(g < 16 ? '0' : '') + g.toString(16) +
(b < 16 ? '0' : '') + b.toString(16);
}
fb.unpack = function (color) {
if (color.length == 7) {
return [parseInt('0x' + color.substring(1, 3)) / 255,
parseInt('0x' + color.substring(3, 5)) / 255,
parseInt('0x' + color.substring(5, 7)) / 255];
}
else if (color.length == 4) {
return [parseInt('0x' + color.substring(1, 2)) / 15,
parseInt('0x' + color.substring(2, 3)) / 15,
parseInt('0x' + color.substring(3, 4)) / 15];
}
}
fb.HSLToRGB = function (hsl) {
var m1, m2, r, g, b;
var h = hsl[0], s = hsl[1], l = hsl[2];
m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
m1 = l * 2 - m2;
return [this.hueToRGB(m1, m2, h+0.33333),
this.hueToRGB(m1, m2, h),
this.hueToRGB(m1, m2, h-0.33333)];
}
fb.hueToRGB = function (m1, m2, h) {
h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
if (h * 2 < 1) return m2;
if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
return m1;
}
// JAMIE WAS HERE
fb.RGBToHex = function(color) {
var exp = new RegExp(/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3}\s*)\)/i);
if(exp.test(color)) {
var results = exp.exec(color);
var r = parseInt(results[1]).toString(16);
var g = parseInt(results[2]).toString(16);
var b = parseInt(results[3]).toString(16);
if (r.length < 2) r = '0' + r;
if (g.length < 2) g = '0' + g;
if (b.length < 2) b = '0' + b;
return '#' + r + g + b;
}
}
// JAMIE WAS HERE
fb.RGBToHSL = function (rgb) {
var min, max, delta, h, s, l;
var r = rgb[0], g = rgb[1], b = rgb[2];
min = Math.min(r, Math.min(g, b));
max = Math.max(r, Math.max(g, b));
delta = max - min;
l = (min + max) / 2;
s = 0;
if (l > 0 && l < 1) {
s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
}
h = 0;
if (delta > 0) {
if (max == r && max != g) h += (g - b) / delta;
if (max == g && max != b) h += (2 + (b - r) / delta);
if (max == b && max != r) h += (4 + (r - g) / delta);
h /= 6;
}
return [h, s, l];
}
// Install mousedown handler (the others are set on the document on-demand)
$('*', e).mousedown(fb.mousedown);
// Init color
fb.setColor('#000000');
// Set linked elements/callback
if (callback) {
fb.linkTo(callback);
}
}

@ -0,0 +1,258 @@
// tipsy, facebook style tooltips for jquery
// version 1.0.0a
// (c) 2008-2010 jason frame [jason@onehackoranother.com]
// released under the MIT license
(function($) {
function maybeCall(thing, ctx) {
return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
};
function isElementInDOM(ele) {
while (ele = ele.parentNode) {
if (ele == document) return true;
}
return false;
};
function Tipsy(element, options) {
this.$element = $(element);
this.options = options;
this.enabled = true;
this.fixTitle();
};
Tipsy.prototype = {
show: function() {
var title = this.getTitle();
if (title && this.enabled) {
var $tip = this.tip();
$tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
$tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
$tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);
var pos = $.extend({}, this.$element.offset(), {
width: this.$element[0].offsetWidth,
height: this.$element[0].offsetHeight
});
var actualWidth = $tip[0].offsetWidth,
actualHeight = $tip[0].offsetHeight,
gravity = maybeCall(this.options.gravity, this.$element[0]);
var tp;
switch (gravity.charAt(0)) {
case 'n':
tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
break;
case 's':
tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
break;
case 'e':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
break;
case 'w':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
break;
}
if (gravity.length == 2) {
if (gravity.charAt(1) == 'w') {
tp.left = pos.left + pos.width / 2 - 15;
} else {
tp.left = pos.left + pos.width / 2 - actualWidth + 15;
}
}
$tip.css(tp).addClass('tipsy-' + gravity);
$tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0);
if (this.options.className) {
$tip.addClass(maybeCall(this.options.className, this.$element[0]));
}
if (this.options.fade) {
$tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
} else {
$tip.css({visibility: 'visible', opacity: this.options.opacity});
}
}
},
hide: function() {
if (this.options.fade) {
this.tip().stop().fadeOut(function() { $(this).remove(); });
} else {
this.tip().remove();
}
},
fixTitle: function() {
var $e = this.$element;
if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
$e.attr('original-title', $e.attr('title') || '').removeAttr('title');
}
},
getTitle: function() {
var title, $e = this.$element, o = this.options;
this.fixTitle();
var title, o = this.options;
if (typeof o.title == 'string') {
title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
} else if (typeof o.title == 'function') {
title = o.title.call($e[0]);
}
title = ('' + title).replace(/(^\s*|\s*$)/, "");
return title || o.fallback;
},
tip: function() {
if (!this.$tip) {
this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
this.$tip.data('tipsy-pointee', this.$element[0]);
}
return this.$tip;
},
validate: function() {
if (!this.$element[0].parentNode) {
this.hide();
this.$element = null;
this.options = null;
}
},
enable: function() { this.enabled = true; },
disable: function() { this.enabled = false; },
toggleEnabled: function() { this.enabled = !this.enabled; }
};
$.fn.tipsy = function(options) {
if (options === true) {
return this.data('tipsy');
} else if (typeof options == 'string') {
var tipsy = this.data('tipsy');
if (tipsy) tipsy[options]();
return this;
}
options = $.extend({}, $.fn.tipsy.defaults, options);
function get(ele) {
var tipsy = $.data(ele, 'tipsy');
if (!tipsy) {
tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
$.data(ele, 'tipsy', tipsy);
}
return tipsy;
}
function enter() {
var tipsy = get(this);
tipsy.hoverState = 'in';
if (options.delayIn == 0) {
tipsy.show();
} else {
tipsy.fixTitle();
setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
}
};
function leave() {
var tipsy = get(this);
tipsy.hoverState = 'out';
if (options.delayOut == 0) {
tipsy.hide();
} else {
setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
}
};
if (!options.live) this.each(function() { get(this); });
if (options.trigger != 'manual') {
var binder = options.live ? 'live' : 'bind',
eventIn = options.trigger == 'hover' ? 'mouseenter' : 'focus',
eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
this[binder](eventIn, enter)[binder](eventOut, leave);
}
return this;
};
$.fn.tipsy.defaults = {
className: null,
delayIn: 0,
delayOut: 0,
fade: false,
fallback: '',
gravity: 'n',
html: false,
live: false,
offset: 0,
opacity: 0.8,
title: 'title',
trigger: 'hover'
};
$.fn.tipsy.revalidate = function() {
$('.tipsy').each(function() {
var pointee = $.data(this, 'tipsy-pointee');
if (!pointee || !isElementInDOM(pointee)) {
$(this).remove();
}
});
};
// Overwrite this method to provide options on a per-element basis.
// For example, you could store the gravity in a 'tipsy-gravity' attribute:
// return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
// (remember - do not modify 'options' in place!)
$.fn.tipsy.elementOptions = function(ele, options) {
return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
};
$.fn.tipsy.autoNS = function() {
return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
};
$.fn.tipsy.autoWE = function() {
return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
};
/**
* yields a closure of the supplied parameters, producing a function that takes
* no arguments and is suitable for use as an autogravity function like so:
*
* @param margin (int) - distance from the viewable region edge that an
* element should be before setting its tooltip's gravity to be away
* from that edge.
* @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
* if there are no viewable region edges effecting the tooltip's
* gravity. It will try to vary from this minimally, for example,
* if 'sw' is preferred and an element is near the right viewable
* region edge, but not the top edge, it will set the gravity for
* that element's tooltip to be 'se', preserving the southern
* component.
*/
$.fn.tipsy.autoBounds = function(margin, prefer) {
return function() {
var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
boundTop = $(document).scrollTop() + margin,
boundLeft = $(document).scrollLeft() + margin,
$this = $(this);
if ($this.offset().top < boundTop) dir.ns = 'n';
if ($this.offset().left < boundLeft) dir.ew = 'w';
if ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e';
if ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's';
return dir.ns + (dir.ew ? dir.ew : '');
}
};
})(jQuery);

@ -0,0 +1,25 @@
.tipsy { font-size: 10px; position: absolute; padding: 5px; z-index: 100000; }
.tipsy-inner { background-color: #000; color: #FFF; max-width: 200px; padding: 5px 8px 4px 8px; text-align: center; }
/* Rounded corners */
.tipsy-inner { border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
/* Uncomment for shadow */
/*.tipsy-inner { box-shadow: 0 0 5px #000000; -webkit-box-shadow: 0 0 5px #000000; -moz-box-shadow: 0 0 5px #000000; }*/
.tipsy-arrow { position: absolute; width: 0; height: 0; line-height: 0; border: 5px dashed #000; }
/* Rules to colour arrows */
.tipsy-arrow-n { border-bottom-color: #000; }
.tipsy-arrow-s { border-top-color: #000; }
.tipsy-arrow-e { border-left-color: #000; }
.tipsy-arrow-w { border-right-color: #000; }
.tipsy-n .tipsy-arrow { top: 0px; left: 50%; margin-left: -5px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-nw .tipsy-arrow { top: 0; left: 10px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent;}
.tipsy-ne .tipsy-arrow { top: 0; right: 10px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent;}
.tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-se .tipsy-arrow { bottom: 0; right: 10px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-e .tipsy-arrow { right: 0; top: 50%; margin-top: -5px; border-left-style: solid; border-right: none; border-top-color: transparent; border-bottom-color: transparent; }
.tipsy-w .tipsy-arrow { left: 0; top: 50%; margin-top: -5px; border-right-style: solid; border-left: none; border-top-color: transparent; border-bottom-color: transparent; }

@ -0,0 +1,152 @@
/*
The MIT License (MIT)
Copyright (c) 2013 jamie.peabody@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
/* menu configurable options */
.wicked-menu { z-index: 7; } /* cm uses index <= 6 */
.wicked-menu { font-size: 13px; }
.wicked-menu, .wicked-menu ul, .wicked-menu li > a.menu-item {
color: #333; /* text color */
}
.wicked-menu li > a { color: #000; text-decoration:none;} /* regular link color */
.wicked-menu li > a:hover { text-decoration:underline; } /* regular link:hover */
.wicked-menu > li.hover > a.menu-item,
.wicked-menu, .wicked-menu ul {
background-color: #fff; /* background color */
}
.wicked-menu > li.hover,
.wicked-menu ul li:hover > ul,
.wicked-menu ul {
border: 1px solid #cbcbcb; /* menu border color */
}
.wicked-menu li:hover { background: #efefef; } /* hover menu background color */
.wicked-menu ul,
.wicked-menu > li.hover,
.wicked-menu ul li:hover > ul { /* drop shadow */
-webkit-box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0;
-moz-box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0;
box-shadow: rgba(0, 0, 0, .2) 0 2px 4px 0;
}
/* -- global settings -- */
.wicked-menu { margin: 0px; padding: 0px; }
.wicked-menu, .wicked-menu ul { margin: 0; padding: 0; }
.wicked-menu li { display: inline-block; list-style-type: none; cursor:pointer; }
.wicked-menu li > a.menu-item { text-decoration: none; }
.wicked-menu ul { display: none; }
.wicked-menu ul li { width: 100%; position: relative; }
.wicked-menu ul li > a.menu-item > span { padding-left: 10px; }
/* top menu */
.wicked-menu > li > a > *, .wicked-menu > li { display: inline-block; }
.wicked-menu li > ul > li > * { padding: 5px; display: inline-block; } /* padding other menu-item */
.wicked-menu > li > a.menu-item > * { padding: 7px 7px; }
.wicked-menu > li { position: relative; border: 1px solid transparent; }
.wicked-menu > li.hover > a.menu-item > * { padding: 7px 7px 3px 7px; }
.wicked-menu > li.hover > a.menu-item {
/* lose the top-level focus indicator on hover */
outline: none;
position: relative;
display: inline-block;
z-index: 8;
}
/* menu items */
.wicked-menu li.hover > ul,
.wicked-menu ul li:hover > ul { display: block; position: absolute; }
.wicked-menu ul li:hover > ul { margin-top: 5px; }
/* drop menu */
.wicked-menu ul { z-index: 7; min-width: 210px; top: 2.1em; left: -1px; }
.wicked-menu > li.hover {
/* for the top-level menu, after hovering do not show background */
background: transparent; position: relative;
}
.wicked-menu ul > li > a.menu-item { line-height: 2.35em; display:inline-block; width:100%; padding: 0; }
/* menu layout for icons and hotkeys */
.wicked-menu span.hotkey { float: right; margin-right: 10px; }
.wicked-menu ul > li > a.menu-item > span.icon {
padding-left: 31px;
background-position: 7px center;
background-color: transparent;
background-repeat: no-repeat;
}
.wicked-menu ul li:hover > ul { min-width: 210px; top: 0px; left: 100%; }
.wicked-menu li.separator { border-top: 1px solid #e5e5e5; height: 3px; display: block; line-height: 3em; margin-top: 3px; }
.wicked-menu li.separator:hover { background: transparent; cursor:default; }
/* -------------------------------------------------------------------------- */
/* toolbar configurable options */
.wicked-toolbar {
background-color: #f5f5f5;
height: 30px;
border: 1px solid #e5e5e5;
border-right: 0;
border-left: 0;
margin: 0;
}
.wicked-toolbar li span {
width: 1px;
color: transparent;
display: inline-block;
}
.wicked-toolbar li {
height: 22px;
width: 28px;
margin: 3px;
vertical-align: middle;
display: inline-block;
text-align: center;
border: 1px solid transparent;
}
.wicked-toolbar li.separator {
border-right:1px solid #e5e5e5;
width: 1px;
}
.wicked-toolbar li.hover {
border: 1px solid #ccc;
border-radius: 2px;
box-shadow: rgba(0, 0, 0, .1) 0 1px 3px 0;
-webkit-transition: all 0.25s ease;
-moz-transition: all 0.25s ease;
-o-transition: all 0.25s ease;
transition: all 0.25s ease;
}
.wicked-toolbar .icon {
width: 16px;
height: 16px;
background-position: center center;
background-color: transparent;
background-repeat: no-repeat;
vertical-align: middle;
}
.wicked-toolbar a {
display: block;
vertical-align: middle;
height: 100%;
text-decoration: none;
}

@ -0,0 +1,288 @@
/*
The MIT License (MIT)
Copyright (c) 2013 jamie.peabody@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
;(function( $, window, document, undefined ){
var pluginName = 'wickedtoolbar';
var SHIFT = new RegExp(/shift/i);
var ALT = new RegExp(/alt/i);
var CTRL = new RegExp(/ctrl/i);
var ARROW_DOWN = new RegExp(/↓/);
var ARROW_UP = new RegExp(/↑/);
var ARROW_LEFT = new RegExp(/←/);
var ARROW_RIGHT = new RegExp(/→/);
var keys = {
shift: 16,
alt: 17,
ctrl: 18,
meta: 91,
arrow_up: 38,
arrow_down: 40,
arrow_left: 37,
arrow_right: 39
};
var defaults = {
hasIcon: function(id) { },
getIcon: function(id) { }
};
function MenuBase(element, options) {
var self = this;
this.element = $(element);
this.settings = $.extend({}, defaults, options);
this.bindings = [];
// for each menu item, modify and wrap in div
this.element.find('li').each(function () {
var tthis = $(this);
// since the DOM is modifying wrt to icons, it can match the li[data-cion] from
// the HTML definition, or the span.icon from the modified DOM
var icons = tthis.closest('ul').find('li[data-icon], span.icon').length > 0;
var tnode = tthis.contents().filter(function() { return this.nodeType == 3; }).first();
var text = tnode.text().trim();
// remove the text node
tnode.remove();
if (!text || !text.length) return; // not a regular menu item
// change: <li>Text</li>
// to: <li>
// <a>
// <span>Text</span>
// </a>
// </li>
var li = tthis;
var div = $('<a class="menu-item" href="#">');
div.click(function(ev) {
$(this).focus();
// li.id > a
var id = $(this).parent().attr('id');
if (id) {
self.element.trigger('selected', [id]);
$(this).parents('.hover').removeClass('hover');
}
return false;
});
var span;
if (self.settings._type == 'menu') {
span = $('<span>' + text + '</span>');
}
else {
span = $('<span></span>');
}
div.append(span);
if (self.settings._type == 'menu') {
// accesskey
var accesskey = tthis.attr('accesskey');
if (accesskey) {
div.attr('accesskey', accesskey);
tthis.removeAttr('accesskey');
}
// hotkey
var hotkey = tthis.attr('data-hotkey');
if (hotkey) {
tthis.removeAttr('data-hotkey');
div.append('<span class="hotkey">' + hotkey + '</span>');
if (!accesskey) {
// add our own handler
var parts = hotkey.split('+');
var bind = {};
for (var i = 0; i < parts.length; ++i) {
if (SHIFT.test(parts[i])) {
bind.shiftKey = true;
}
else if (ALT.test(parts[i])) {
bind.altKey = true;
}
else if (CTRL.test(parts[i])) {
bind.ctrlKey = true;
}
else if (ARROW_DOWN.test(parts[i])) {
bind.which = keys.arrow_down;
}
else if (ARROW_UP.test(parts[i])) {
bind.which = keys.arrow_up;
}
else if (ARROW_RIGHT.test(parts[i])) {
bind.which = keys.arrow_right;
}
else if (ARROW_LEFT.test(parts[i])) {
bind.which = keys.arrow_left;
}
}
bind.target = div;
self.bindings.push(bind);
}
}
}
// icon
var id = tthis.attr('id'), icon;
if (self.settings.hasIcon(id)) {
span.addClass('icon');
icon = self.settings.getIcon(id);
if (icon) {
span.addClass(icon);
}
}
icon = tthis.attr('data-icon');
if (icon) {
tthis.removeAttr('data-icon');
span.addClass('icon ' + icon);
}
else if (icons) {
span.addClass('icon');
}
li.prepend(div);
});
$(document).on('keydown', function(ev) {
for (var i = 0; i < self.bindings.length; ++i) {
var bind = self.bindings[i];
// handle custom key events
if ((bind.shiftKey === undefined ? true : (bind.shiftKey === ev.shiftKey)) &&
(bind.ctrlKey === undefined ? true : (bind.ctrlKey === ev.ctrlKey)) &&
(bind.altKey === undefined ? true : (bind.altKey === ev.altKey)) &&
bind.which && ev.which && (bind.which === ev.which)) {
bind.target.trigger('click');
ev.preventDefault();
}
}
});
}
MenuBase.prototype.update = function (id) {
var li = this.element.find('#' + id), icon;
var span = li.find('span:first-child');
if (this.settings.hasIcon(id)) {
span.removeClass(); // this could be brutally unfair
span.addClass('icon');
icon = this.settings.getIcon(id);
if (icon) {
span.addClass(icon);
}
}
};
// ------------
// Menu
// ------------
function Menu(element, options) {
options._type = 'menu';
$.extend(this, new MenuBase(element, options)) ;
this.constructor();
}
Menu.prototype.constructor = function () {
this.element.addClass('wicked-ui wicked-menu');
var self = this;
var dohover = function(ev) {
$(this).parent().addClass('hover');
if ($(this).closest('ul').hasClass('wicked-menu')) {
// if the closest ul is a 'menu' (i.e. if this item is a top-level menu), then
// aply focus
$(this).focus();
}
if (!self.accessing) {
// Set 'accessing' to true and one document click to cancel it
self.accessing = true;
$(document).one('click', function() {
if (!self.accessing) return;
self.accessing = false;
self.element.find('.hover').removeClass('hover');
});
}
};
this.element.find('> li > a.menu-item').click(dohover);
this.element.find('> li > ul > li ul.drop-menu').each(function() {
// li > a + ul
$(this).prev('a.menu-item').addClass('icon-arrow-right');
$(this).prev('a.menu-item').hover(dohover);
$(this).prev('a.menu-item').mouseleave(
function() {
$(this).parent().removeClass('hover');
}
);
});
this.element.find('> li > a.menu-item').hover(
function() {
if (!self.accessing) return;
self.element.find('.hover').removeClass('hover');
$.proxy(dohover, this)();
}
);
};
// ------------
// Toolbar
// ------------
function Toolbar(element, options) {
options._type = 'toolbar';
$.extend(this, new MenuBase(element, options)) ;
this.constructor();
}
Toolbar.prototype.constructor = function () {
this.element.addClass('wicked-ui wicked-toolbar');
this.element.find('> li > a.menu-item').hover(
function(){ $(this).parent().addClass('hover'); },
function(){ $(this).parent().removeClass('hover'); }
);
};
var plugins = { wickedmenu: Menu, wickedtoolbar: Toolbar };
for (var key in plugins) {
(function(name, Plugin){
$.fn[name] = function (options) {
var args = arguments;
return this.each(function () {
if (typeof options === 'object' || !options) {
if (!$.data(this, 'plugin_' + name)) {
$.data(this, 'plugin_' + name, new Plugin( this, options ));
}
}
else {
var d = $.data(this, 'plugin_' + name);
if (!d) {
$.error('jQuery.' + name + ' plugin does not exist');
return;
}
return d[options](Array.prototype.slice.call(args, 1));
}
});
};
})(key, plugins[key])
}
})( jQuery, window, document );

@ -0,0 +1,334 @@
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
color: black;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror-cursor {
border-left: 1px solid black;
border-right: none;
width: 0;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
border: 0;
background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
background-color: #7e7;
}
@-moz-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@-webkit-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-ruler {
border-left: 1px solid #ccc;
position: absolute;
}
/* DEFAULT THEME */
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
.CodeMirror-composing { border-bottom: 2px solid; }
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
position: relative;
overflow: hidden;
background: white;
}
.CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */
/* 30px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -30px; margin-right: -30px;
padding-bottom: 30px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
}
.CodeMirror-sizer {
position: relative;
border-right: 30px solid transparent;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actual scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
margin-bottom: -30px;
/* Hack to make IE7 behave */
*zoom:1;
*display:inline;
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
background: none !important;
border: none !important;
}
.CodeMirror-gutter-background {
position: absolute;
top: 0; bottom: 0;
z-index: 4;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-gutter-wrapper {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
-webkit-tap-highlight-color: transparent;
}
.CodeMirror-wrap pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
overflow: auto;
}
.CodeMirror-widget {}
.CodeMirror-code {
outline: none;
}
/* Force content-box sizing for the elements where we expect it */
.CodeMirror-scroll,
.CodeMirror-sizer,
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-cursor { position: absolute; }
.CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3;
}
div.CodeMirror-dragcursors {
visibility: visible;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
.cm-searching {
background: #ffa;
background: rgba(255, 255, 0, .4);
}
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }

File diff suppressed because one or more lines are too long

@ -0,0 +1,45 @@
/* required */
.mergely-column textarea { width: 80px; height: 200px; }
.mergely-column { float: left; }
.mergely-margin { float: left; }
.mergely-canvas { float: left; width: 28px; }
/* resizeable */
.mergely-resizer { width: 100%; height: 100%; }
/* style configuration */
.mergely-column { border: 1px solid #ccc; }
.mergely-active { border: 1px solid #a3d1ff; }
.mergely.a,.mergely.d,.mergely.c { color: #000; }
.mergely.a.rhs.start { border-top: 1px solid #a3d1ff; }
.mergely.a.lhs.start.end,
.mergely.a.rhs.end { border-bottom: 1px solid #a3d1ff; }
.mergely.a.rhs { background-color: #ddeeff; }
.mergely.a.lhs.start.end.first { border-bottom: 0; border-top: 1px solid #a3d1ff; }
.mergely.d.lhs { background-color: #ffe9e9; }
.mergely.d.lhs.end,
.mergely.d.rhs.start.end { border-bottom: 1px solid #f8e8e8; }
.mergely.d.rhs.start.end.first { border-bottom: 0; border-top: 1px solid #f8e8e8; }
.mergely.d.lhs.start { border-top: 1px solid #f8e8e8; }
.mergely.c.lhs,
.mergely.c.rhs { background-color: #fafafa; }
.mergely.c.lhs.start,
.mergely.c.rhs.start { border-top: 1px solid #a3a3a3; }
.mergely.c.lhs.end,
.mergely.c.rhs.end { border-bottom: 1px solid #a3a3a3; }
.mergely.ch.a.rhs { background-color: #ddeeff; }
.mergely.ch.d.lhs { background-color: #ffe9e9; text-decoration: line-through; color: red !important; }
.mergely.current.start { border-top: 1px solid #000 !important; }
.mergely.current.end { border-bottom: 1px solid #000 !important; }
.mergely.current.lhs.a.start.end,
.mergely.current.rhs.d.start.end { border-top: 0 !important; }
.mergely.current.CodeMirror-linenumber { color: #F9F9F9; font-weight: bold; background-color: #777; }
.CodeMirror-linenumber { cursor: pointer; }
.CodeMirror-code { color: #717171; }

File diff suppressed because one or more lines are too long

@ -0,0 +1,131 @@
(function(){
var Pos = CodeMirror.Pos;
function SearchCursor(cm, query, pos, caseFold) {
this.atOccurrence = false; this.cm = cm;
if (caseFold == null && typeof query == "string") caseFold = false;
pos = pos ? cm.clipPos(pos) : Pos(0, 0);
this.pos = {from: pos, to: pos};
// The matches method is filled in based on the type of query.
// It takes a position and a direction, and returns an object
// describing the next occurrence of the query, or null if no
// more matches were found.
if (typeof query != "string") { // Regexp match
if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g");
this.matches = function(reverse, pos) {
if (reverse) {
query.lastIndex = 0;
var line = cm.getLine(pos.line).slice(0, pos.ch), match = query.exec(line), start = 0;
while (match) {
start += match.index + 1;
line = line.slice(start);
query.lastIndex = 0;
var newmatch = query.exec(line);
if (newmatch) match = newmatch;
else break;
}
start--;
} else {
query.lastIndex = pos.ch;
var line = cm.getLine(pos.line), match = query.exec(line),
start = match && match.index;
}
if (match && match[0])
return {from: Pos(pos.line, start),
to: Pos(pos.line, start + match[0].length),
match: match};
};
} else { // String query
if (caseFold) query = query.toLowerCase();
var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
var target = query.split("\n");
// Different methods for single-line and multi-line queries
if (target.length == 1) {
if (!query.length) {
// Empty string would match anything and never progress, so
// we define it to match nothing instead.
this.matches = function() {};
} else {
this.matches = function(reverse, pos) {
var line = fold(cm.getLine(pos.line)), len = query.length, match;
if (reverse ? (pos.ch >= len && (match = line.lastIndexOf(query, pos.ch - len)) != -1)
: (match = line.indexOf(query, pos.ch)) != -1)
return {from: Pos(pos.line, match),
to: Pos(pos.line, match + len)};
};
}
} else {
this.matches = function(reverse, pos) {
var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(cm.getLine(ln));
var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match));
if (reverse ? offsetA >= pos.ch || offsetA != match.length
: offsetA <= pos.ch || offsetA != line.length - match.length)
return;
for (;;) {
if (reverse ? !ln : ln == cm.lineCount() - 1) return;
line = fold(cm.getLine(ln += reverse ? -1 : 1));
match = target[reverse ? --idx : ++idx];
if (idx > 0 && idx < target.length - 1) {
if (line != match) return;
else continue;
}
var offsetB = (reverse ? line.lastIndexOf(match) : line.indexOf(match) + match.length);
if (reverse ? offsetB != line.length - match.length : offsetB != match.length)
return;
var start = Pos(pos.line, offsetA), end = Pos(ln, offsetB);
return {from: reverse ? end : start, to: reverse ? start : end};
}
};
}
}
}
SearchCursor.prototype = {
findNext: function() {return this.find(false);},
findPrevious: function() {return this.find(true);},
find: function(reverse) {
var self = this, pos = this.cm.clipPos(reverse ? this.pos.from : this.pos.to);
function savePosAndFail(line) {
var pos = Pos(line, 0);
self.pos = {from: pos, to: pos};
self.atOccurrence = false;
return false;
}
for (;;) {
if (this.pos = this.matches(reverse, pos)) {
if (!this.pos.from || !this.pos.to) { console.log(this.matches, this.pos); }
this.atOccurrence = true;
return this.pos.match || true;
}
if (reverse) {
if (!pos.line) return savePosAndFail(0);
pos = Pos(pos.line-1, this.cm.getLine(pos.line-1).length);
}
else {
var maxLine = this.cm.lineCount();
if (pos.line == maxLine - 1) return savePosAndFail(maxLine);
pos = Pos(pos.line + 1, 0);
}
}
},
from: function() {if (this.atOccurrence) return this.pos.from;},
to: function() {if (this.atOccurrence) return this.pos.to;},
replace: function(newText) {
if (!this.atOccurrence) return;
var lines = CodeMirror.splitLines(newText);
this.cm.replaceRange(lines, this.pos.from, this.pos.to);
this.pos.to = Pos(this.pos.from.line + lines.length - 1,
lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0));
}
};
CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) {
return new SearchCursor(this, query, pos, caseFold);
});
})();

@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>文档比较 - Tamguo</title>
<link rel="shortcut icon" href="https://cdn.iminho.me/favicon.ico" />
<link th:href="${domainName + 'fonts/notosans.css'}" rel='stylesheet' type='text/css' />
<link type='text/css' rel='stylesheet' th:href="${domainName + 'mergely/editor/lib/wicked-ui.css'}" />
<link type='text/css' rel='stylesheet' th:href="${domainName + 'mergely/editor/lib/tipsy/tipsy.css'}" />
<link type="text/css" rel="stylesheet" th:href="${domainName + 'mergely/editor/lib/farbtastic/farbtastic.css'}" />
<link type="text/css" rel="stylesheet" th:href="${domainName + 'mergely/lib/codemirror.css'}" />
<link type="text/css" rel="stylesheet" th:href="${domainName + 'mergely/lib/mergely.css'}" />
<link type='text/css' rel='stylesheet' th:href="${domainName + 'mergely/editor/editor.css'}" />
<script type="text/javascript" th:src="${domainName + 'jquery/1.12.4/jquery.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/lib/wicked-ui.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/lib/tipsy/jquery.tipsy.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/lib/farbtastic/farbtastic.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/lib/codemirror.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/lib/mergely.min.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/editor/editor.js'}"></script>
<script type="text/javascript" th:src="${domainName + 'mergely/lib/searchcursor.js'}"></script>
<script type="text/javascript">
var key = '';
</script>
</head>
<body style="visibility:hidden">
<ul id="toolbar">
<li id="tb-file-save" data-icon="icon-save" title="保存">保存合并</li>
<li class="separator"></li>
<li id="tb-view-change-prev" data-icon="icon-arrow-up" title="上一处差异">上一处差异</li>
<li id="tb-view-change-next" data-icon="icon-arrow-down" title="下一处差异">下一处差异</li>
<li class="separator"></li>
<li id="tb-edit-right-merge-left" data-icon="icon-arrow-left-v" title="合并到左侧">合并到左侧</li>
<li id="tb-edit-left-merge-right" data-icon="icon-arrow-right-v" title="合并到右侧">合并到右侧</li>
<li id="tb-view-swap" data-icon="icon-swap" title="左右切换">左右切换</li>
</ul>
<div class="find">
<input type="text" placeholder="请输入关键字"/>
<button class="find-prev"><span class="icon icon-arrow-up"></span></button>
<button class="find-next"><span class="icon icon-arrow-down"></span></button>
<button class="find-close"><span class="icon icon-x-mark"></span></button>
</div>
<div style="position: absolute;top: 33px;bottom: 10px;left: 5px;right: 5px;overflow-y: hidden;padding-bottom: 2px;">
<div id="mergely"></div>
</div>
<template id="historyContent" th:utext="${history.markdown}">## 测试文件
@ 爱仕达sad
#@@@@
72
6
1
as5
dsad
as3
da24
sd
@@
@@@
@@@
@
@
@@
@@@</template>
<template id="documentContent" th:utext="${document.markdown}">## 测试文件
2
@ 爱仕达sad2
#@@@@1
72
6
1
as5
dsad
as3
da24
sd
@@
@@@
@@@
@
@
@@
@@@</template>
<script type="text/javascript" th:src="${domainName + 'layer/layer.js'}"></script>
</body>
</html>

@ -20,7 +20,7 @@
window.editURL = "[[${domainName}]]" + "member/document/";
window.releaseURL = "[[${domainName}]]" + "/book/xingzheng/release";
window.sortURL = "[[${domainName}]]" + "/book/xingzheng/sort";
window.historyURL = "[[${domainName}]]" + "/history/get";
window.historyURL = "[[${domainName}]]" + "member/document/history";
window.removeAttachURL = "[[${domainName}]]" + "member/document/removeFile";
window.highlightStyle = "github";
window.template = { "getUrl":"[[${domainName}]]" + "/api/template/get", "listUrl" : "[[${domainName}]]" + "/api/template/list", "deleteUrl" : "[[${domainName}]]" + "/api/template/remove", "saveUrl" :"[[${domainName}]]" + "/api/template/add"}

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="https://cdn.iminho.me/favicon.ico">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="SmartWiki" />
<title>历史版本 - Tamguo</title>
<link th:href="${domainName + 'bootstrap/css/bootstrap.min.css'}" rel="stylesheet">
<script th:src="${domainName + 'jquery/1.12.4/jquery.min.js'}"></script>
<style type="text/css">
.container{margin: 5px auto;}
</style>
</head>
<body>
<div class="container">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<td class="col-sm-6">修改时间</td>
<td class="col-sm-2">修改人</td>
<td class="col-sm-2">操作</td>
</tr>
</thead>
<tbody>
<tr th:each="history,status:${historyList}">
<td th:text="${#dates.format(history.updateDate, 'yyyy-MM-dd HH:mm:ss')}">2018-11-14 06:55:34</td>
<td th:text="${history.owner}">admin</td>
<td>
<button class="btn btn-danger btn-sm delete-btn" th:attr="data-id=${history.id}" data-loading-text="删除中...">
删除
</button>
<button class="btn btn-success btn-sm restore-btn" th:attr="data-id=${history.id}" data-loading-text="恢复中...">
恢复
</button>
<button class="btn btn-success btn-sm compare-btn" th:attr="data-id=${history.id}">
合并
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<script th:src="${domainName + 'bootstrap/js/bootstrap.min.js'}"></script>
<script th:src="${domainName + 'layer/layer.js'}" type="text/javascript" ></script>
<script type="text/javascript">
$(function () {
$(".delete-btn").on("click",function () {
var id = $(this).attr('data-id');
var $btn = $(this).button('loading');
var $then = $(this);
if(!id){
layer.msg('参数错误');
}else{
$.ajax({
url : "[[${domainName}]]" + "member/document/history/delete",
type : "post",
dataType : "json",
data : { "id" : id },
success :function (res) {
if(res.code === 0){
$then.parents('tr').remove().empty();
}else{
layer.msg(res.message);
}
},
error : function () {
$btn.button('reset');
}
})
}
});
$(".restore-btn").on("click",function () {
var id = $(this).attr('data-id');
var $btn = $(this).button('loading');
var $then = $(this);
var index = parent.layer.getFrameIndex(window.name);
if(!id){
layer.msg('参数错误');
}else{
$.ajax({
url : "[[${domainName}]]" + "member/document/history/restore",
type : "post",
dataType : "json",
data : { "id" : id },
success :function (res) {
if(res.code === 0){
var $node = { "node" : { "id" : res.result.id}};
parent.loadDocument($node);
parent.layer.close(index);
}else{
layer.msg(res.message);
}
},
error : function () {
$btn.button('reset');
}
})
}
});
$(".compare-btn").on("click",function () {
var historyId = $(this).attr("data-id");
window.compareIndex = window.top.layer.open({
type: 2,
title: '文档比较【左侧为历史文档,右侧为当前文档,请将文档合并到右侧】',
shade: 0.8,
area: ['380px', '90%'],
content: "[[${domainName}]]" + "member/document/history/compare/" + historyId
});
window.top.layer.full(window.compareIndex);
});
});
</script>
</body>
</html>

@ -19,6 +19,7 @@ public class DocumentEntity extends Model<DocumentEntity>{
@TableId
private String id;
private String batchNo;
private String parentId;
private String bookId;
private String owner;
@ -153,5 +154,11 @@ public class DocumentEntity extends Model<DocumentEntity>{
public void setFileUploads(List<FileUploadEntity> fileUploads) {
this.fileUploads = fileUploads;
}
public String getBatchNo() {
return batchNo;
}
public void setBatchNo(String batchNo) {
this.batchNo = batchNo;
}
}

@ -45,11 +45,13 @@ public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, DocumentEnt
document.setParentId(entity.getParentId());
document.setUpdateDate(new Date());
document.setStatus(DocumentStatusEnum.HISTORY);
document.setBatchNo(entity.getBatchNo());
this.insert(document);
}
}
@SuppressWarnings("static-access")
@Transactional(readOnly=false)
@Override
public void create(DocumentEntity document) {
@ -57,6 +59,7 @@ public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, DocumentEnt
document.setCreateDate(new Date());
document.setUpdateDate(new Date());
document.setOwner("system");
document.setBatchNo(new com.baomidou.mybatisplus.toolkit.IdWorker().getIdStr());
this.insert(document);
}

Loading…
Cancel
Save