1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-19 21:29:42 +02:00
documize/gui/app/utils/toc.js

285 lines
7.6 KiB
JavaScript
Raw Normal View History

2016-07-07 18:54:16 -07:00
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
function getState(toc, page) {
let state = {
tocTools: {
2016-08-30 21:22:34 +02:00
upTarget: "",
downTarget: "",
2016-07-07 18:54:16 -07:00
indentIncrement: 0,
2016-08-30 21:22:34 +02:00
allowIndent: false,
allowOutdent: false
},
actionablePage: false,
upDisabled: true,
downDisabled: true,
indentDisabled: true,
outdentDisabled: true,
pageId: ''
2016-07-07 18:54:16 -07:00
};
if (is.undefined(page)) {
return state;
}
state.pageId = page.get('id');
var index = _.findIndex(toc, function(i) { return i.get('page.id') === page.get('id'); });
2016-07-07 18:54:16 -07:00
if (index === -1) {
return state;
}
var upPage = _.isUndefined(toc[index - 1]) ? toc[index - 1] : toc[index - 1].get('page');
var downPage = _.isUndefined(toc[index + 1]) ? toc[index + 1] : toc[index + 1].get('page');
2016-07-07 18:54:16 -07:00
if (_.isUndefined(upPage)) {
state.tocTools.upTarget = '';
}
if (_.isUndefined(downPage)) {
state.tocTools.downTarget = '';
}
// can we go up?
// can we indent?
if (!_.isUndefined(upPage)) {
// can only go up if someone is same or higher level?
var index2 = _.findIndex(toc, function(i) { return i.get('page.id') === upPage.get('id'); });
2016-07-07 18:54:16 -07:00
if (index2 !== -1) {
// up
for (var i = index2; i >= 0; i--) {
if (page.get('level') > toc[i].get('page.level')) {
2016-07-07 18:54:16 -07:00
break;
}
if (page.get('level') === toc[i].get('page.level')) {
state.tocTools.upTarget = toc[i].get('page.id');
2016-07-07 18:54:16 -07:00
break;
}
}
// indent?
2016-08-30 21:22:34 +02:00
state.tocTools.allowIndent = upPage.get('level') >= page.get('level');
state.tocTools.indentIncrement = upPage.get('level') - page.get('level');
2016-07-07 18:54:16 -07:00
if (state.tocTools.indentIncrement === 0) {
state.tocTools.indentIncrement = 1;
}
}
}
// can we go down?
if (!_.isUndefined(downPage)) {
// can only go down if someone below is at our level or higher
var index3 = _.findIndex(toc, function(i) { return i.get('page.id') === downPage.get('id'); });
2016-07-07 18:54:16 -07:00
if (index3 !== -1) {
for (var i3 = index3; i3 < toc.length; i3++) {
if (toc[i3].get('page.level') < page.get('level')) {
2016-07-07 18:54:16 -07:00
break;
}
if (page.get('level') === toc[i3].get('page.level')) {
state.tocTools.downTarget = toc[i3].get('page.id');
2016-07-07 18:54:16 -07:00
break;
}
}
}
2016-08-31 11:43:06 +02:00
if (page.get('level') > downPage.get('level')) {
2016-07-07 18:54:16 -07:00
state.tocTools.downTarget = '';
}
}
// can we outdent?
2016-08-31 11:43:06 +02:00
state.tocTools.allowOutdent = page.get('level') > 1;
2016-07-07 18:54:16 -07:00
state.upDisabled = state.tocTools.upTarget === '';
state.downDisabled = state.tocTools.downTarget === '';
2016-08-30 21:22:34 +02:00
state.indentDisabled = !state.tocTools.allowIndent;
2016-07-07 18:54:16 -07:00
state.outdentDisabled = !state.tocTools.allowOutdent;
state.actionablePage = is.not.empty(state.tocTools.upTarget) ||
is.not.empty(state.tocTools.downTarget) ||
state.tocTools.allowIndent || state.tocTools.allowOutdent;
return state;
}
// move up page and any associated kids
function moveUp(state, pages, current) {
var page1 = _.find(pages, function(i) { return i.get('page.id') === state.tocTools.upTarget });
2016-07-07 18:54:16 -07:00
var page2 = null;
var pendingChanges = [];
if (is.not.undefined(page1)) page1 = page1.get('page');
2016-07-07 18:54:16 -07:00
if (is.undefined(current) || is.undefined(page1)) {
return pendingChanges;
}
var index1 = _.findIndex(pages, function(i) { return i.get('page.id') === page1.get('id'); });
2016-07-07 18:54:16 -07:00
if (index1 !== -1) {
if (is.not.undefined(pages[index1 - 1])) page2 = pages[index1 - 1].get('page');
2016-07-07 18:54:16 -07:00
}
2016-08-30 21:22:34 +02:00
var sequence1 = page1.get('sequence');
var sequence2 = is.not.null(page2) && is.not.undefined(page2) ? page2.get('sequence') : 0;
var index = _.findIndex(pages, function(i) { return i.get('page.id') === current.get('id'); });
2016-07-07 18:54:16 -07:00
if (index !== -1) {
var sequence = (sequence1 + sequence2) / 2;
pendingChanges.push({
pageId: current.get('id'),
2016-07-07 18:54:16 -07:00
sequence: sequence
});
for (var i = index + 1; i < pages.length; i++) {
if (pages[i].get('page.level') <= current.get('level')) {
2016-07-07 18:54:16 -07:00
break;
}
2016-08-30 21:22:34 +02:00
sequence = (sequence + page1.get('sequence')) / 2;
2016-07-07 18:54:16 -07:00
pendingChanges.push({
pageId: pages[i].get('page.id'),
2016-07-07 18:54:16 -07:00
sequence: sequence
});
}
}
return pendingChanges;
}
// move down page and any associated kids
function moveDown(state, pages, current) {
var pageIndex = _.findIndex(pages, function(i) { return i.get('page.id') === current.get('id'); });
var downTarget = _.find(pages, function(i) { return i.get('page.id') === state.tocTools.downTarget; });
if (is.not.undefined(downTarget)) downTarget = downTarget.get('page');
var downTargetIndex = _.findIndex(pages, function(i) { return i.get('page.id') === downTarget.get('id'); });
2016-07-07 18:54:16 -07:00
var pendingChanges = [];
if (pageIndex === -1 || downTargetIndex === -1) {
return pendingChanges;
}
var startingSequence = 0;
var upperSequence = 0;
var cutOff = _.rest(pages, downTargetIndex);
2016-08-30 21:22:34 +02:00
var siblings = _.reject(cutOff, function (p) {
return p.get('page.level') !== current.get('level') || p.get('page.id') === current.get('id') || p.get('page.id') === downTarget.get('id');
2016-07-07 18:54:16 -07:00
});
if (siblings.length > 0) {
var aboveThisGuy = siblings[0].get('page');
var belowThisGuyIndex = _.findIndex(pages, function(i) { return i.get('page.id') === aboveThisGuy.get('id'); })
var belowThisGuy = pages[belowThisGuyIndex - 1];
if (is.not.null(belowThisGuy)) belowThisGuy = belowThisGuy.get('page');
2016-07-07 18:54:16 -07:00
2016-08-30 21:22:34 +02:00
if (is.not.null(belowThisGuy) && belowThisGuy.get('level') > current.get('level')) {
startingSequence = (aboveThisGuy.get('sequence') + belowThisGuy.get('sequence')) / 2;
upperSequence = aboveThisGuy.get('sequence');
2016-07-07 18:54:16 -07:00
} else {
var otherGuy = pages[downTargetIndex + 1].get('page');
2016-07-07 18:54:16 -07:00
2016-08-30 21:22:34 +02:00
startingSequence = (otherGuy.get('sequence') + downTarget.get('sequence')) / 2;
upperSequence = otherGuy.get('sequence');
2016-07-07 18:54:16 -07:00
}
} else {
// startingSequence = downTarget.sequence * 2;
startingSequence = cutOff[cutOff.length - 1].get('page.sequence') * 2;
2016-07-07 18:54:16 -07:00
upperSequence = startingSequence * 2;
2016-08-30 21:22:34 +02:00
}
2016-07-07 18:54:16 -07:00
pendingChanges.push({
pageId: current.get('id'),
2016-07-07 18:54:16 -07:00
sequence: startingSequence
});
var sequence = (startingSequence + upperSequence) / 2;
for (var i = pageIndex + 1; i < pages.length; i++) {
if (pages[i].get('page.level') <= current.get('level')) {
2016-07-07 18:54:16 -07:00
break;
}
var sequence2 = (sequence + upperSequence) / 2;
pendingChanges.push({
pageId: pages[i].get('page.id'),
2016-07-07 18:54:16 -07:00
sequence: sequence2
});
}
return pendingChanges;
}
// indent page and any associated kisds
function indent(state, pages, current) {
var pageIndex = _.findIndex(pages, function(i) { return i.get('page.id') === current.get('id'); });
2016-07-07 18:54:16 -07:00
var pendingChanges = [];
pendingChanges.push({
pageId: current.get('id'),
2016-08-30 21:22:34 +02:00
level: current.get('level') + state.tocTools.indentIncrement
2016-07-07 18:54:16 -07:00
});
for (var i = pageIndex + 1; i < pages.length; i++) {
if (pages[i].get('page.level') <= current.get('level')) {
2016-07-07 18:54:16 -07:00
break;
}
pendingChanges.push({
pageId: pages[i].get('page.id'),
level: pages[i].get('page.level') + state.tocTools.indentIncrement
2016-07-07 18:54:16 -07:00
});
}
return pendingChanges;
}
function outdent(state, pages, current) {
var pageIndex = _.findIndex(pages, function(i) { return i.get('page.id') === current.get('id'); });
2016-07-07 18:54:16 -07:00
var pendingChanges = [];
pendingChanges.push({
pageId: current.get('id'),
2016-08-30 21:22:34 +02:00
level: current.get('level') - 1
2016-07-07 18:54:16 -07:00
});
for (var i = pageIndex + 1; i < pages.length; i++) {
if (pages[i].get('page.level') <= current.get('level')) {
2016-07-07 18:54:16 -07:00
break;
}
pendingChanges.push({
pageId: pages[i].get('page.id'),
level: pages[i].get('page.level') - 1
2016-07-07 18:54:16 -07:00
});
}
return pendingChanges;
}
export default {
getState,
moveUp,
moveDown,
indent,
outdent
};