1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-21 14:19:43 +02:00
documize/gui/app/components/document/document-toc.js

225 lines
5.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
import { computed } from '@ember/object';
import Component from '@ember/component';
2017-10-03 17:52:03 -04:00
import tocUtil from '../../utils/toc';
2016-07-07 18:54:16 -07:00
import NotifierMixin from '../../mixins/notifier';
2017-12-09 12:21:14 +00:00
export default Component.extend(NotifierMixin, {
document: {},
folder: {},
pages: [],
2017-03-09 12:51:21 +00:00
currentPageId: "",
2016-07-07 18:54:16 -07:00
state: {
actionablePage: false,
upDisabled: true,
downDisabled: true,
indentDisabled: true,
outdentDisabled: true
},
emptyState: computed('pages', function () {
return this.get('pages.length') === 0;
}),
isDesktop: true,
2017-10-03 17:52:03 -04:00
didReceiveAttrs() {
2017-03-07 16:10:13 +00:00
this._super(...arguments);
this.set('showToc', is.not.undefined(this.get('pages')) && this.get('pages').get('length') > 0);
2017-03-07 16:10:13 +00:00
2017-03-09 12:51:21 +00:00
if (is.not.null(this.get('currentPageId'))) {
this.send('onEntryClick', this.get('currentPageId'));
}
},
didInsertElement() {
2017-03-07 16:10:13 +00:00
this._super(...arguments);
this.setSize();
this.eventBus.subscribe('documentPageAdded', this, 'onDocumentPageAdded');
this.eventBus.subscribe('resized', this, 'onResize');
2016-10-05 17:12:47 -07:00
},
2016-07-07 18:54:16 -07:00
willDestroyElement() {
2017-03-07 16:10:13 +00:00
this._super(...arguments);
this.eventBus.unsubscribe('documentPageAdded');
this.eventBus.unsubscribe('resized');
},
2016-07-07 18:54:16 -07:00
onDocumentPageAdded(pageId) {
this.send('onEntryClick', pageId);
this.setSize();
},
onResize() {
this.setSize();
},
setSize() {
this.set('isDesktop', $(window).width() >= 1800);
let h = $(window).height() - $("#nav-bar").height() - 140;
$("#doc-toc").css('max-height', h);
let i = $("#doc-view").offset();
if (is.not.undefined(i)) {
let l = i.left - 100;
if (l > 350) l = 350;
$("#doc-toc").width(l);
}
},
2016-07-07 18:54:16 -07:00
// Controls what user can do with the toc (left sidebar)
// Identifies the target pages
setState(pageId) {
2017-03-09 12:51:21 +00:00
this.set('currentPageId', pageId);
2016-07-07 18:54:16 -07:00
let toc = this.get('pages');
let page = _.findWhere(toc, { id: pageId });
2016-07-07 18:54:16 -07:00
let state = tocUtil.getState(toc, page);
if (!this.get('permissions.documentEdit') || is.empty(pageId)) {
2016-11-12 12:09:05 -08:00
state.actionablePage = false;
state.upDisabled = state.downDisabled = state.indentDisabled = state.outdentDisabled = true;
}
2016-07-07 18:54:16 -07:00
this.set('state', state);
},
2016-07-07 18:54:16 -07:00
actions: {
// Page up -- above pages shunt down
pageUp() {
2016-07-07 18:54:16 -07:00
if (this.get('state.upDisabled')) {
return;
}
2016-07-07 18:54:16 -07:00
let state = this.get('state');
let pages = this.get('pages');
2017-03-09 12:51:21 +00:00
let page = _.findWhere(pages, { id: this.get('currentPageId') });
2016-07-07 18:54:16 -07:00
let pendingChanges = tocUtil.moveUp(state, pages, page);
if (pendingChanges.length > 0) {
2017-03-07 16:10:13 +00:00
this.attrs.onPageSequenceChange(pendingChanges);
2016-07-07 18:54:16 -07:00
2017-03-09 12:51:21 +00:00
this.send('onEntryClick', this.get('currentPageId'));
this.showNotification("Moved up");
2016-07-07 18:54:16 -07:00
}
},
2016-07-07 18:54:16 -07:00
// Move down -- pages below shift up
pageDown() {
2016-07-07 18:54:16 -07:00
if (this.get('state.downDisabled')) {
return;
}
2016-07-07 18:54:16 -07:00
let state = this.get('state');
var pages = this.get('pages');
2017-03-09 12:51:21 +00:00
var page = _.findWhere(pages, { id: this.get('currentPageId') });
2016-07-07 18:54:16 -07:00
let pendingChanges = tocUtil.moveDown(state, pages, page);
if (pendingChanges.length > 0) {
2017-03-07 16:10:13 +00:00
this.attrs.onPageSequenceChange(pendingChanges);
2016-07-07 18:54:16 -07:00
2017-03-09 12:51:21 +00:00
this.send('onEntryClick', this.get('currentPageId'));
this.showNotification("Moved down");
2016-07-07 18:54:16 -07:00
}
},
2016-07-07 18:54:16 -07:00
// Indent -- changes a page from H2 to H3, etc.
pageIndent() {
2016-07-07 18:54:16 -07:00
if (this.get('state.indentDisabled')) {
return;
}
2016-07-07 18:54:16 -07:00
let state = this.get('state');
var pages = this.get('pages');
2017-03-09 12:51:21 +00:00
var page = _.findWhere(pages, { id: this.get('currentPageId') });
2016-07-07 18:54:16 -07:00
let pendingChanges = tocUtil.indent(state, pages, page);
if (pendingChanges.length > 0) {
2017-03-07 16:10:13 +00:00
this.attrs.onPageLevelChange(pendingChanges);
2016-07-07 18:54:16 -07:00
this.showNotification("Indent");
2017-03-09 12:51:21 +00:00
this.send('onEntryClick', this.get('currentPageId'));
2016-07-07 18:54:16 -07:00
}
},
2016-07-07 18:54:16 -07:00
// Outdent -- changes a page from H3 to H2, etc.
pageOutdent() {
if (this.get('state.outdentDisabled')) {
return;
}
2016-07-07 18:54:16 -07:00
let state = this.get('state');
var pages = this.get('pages');
2017-03-09 12:51:21 +00:00
var page = _.findWhere(pages, { id: this.get('currentPageId') });
2016-07-07 18:54:16 -07:00
let pendingChanges = tocUtil.outdent(state, pages, page);
if (pendingChanges.length > 0) {
2017-03-07 16:10:13 +00:00
this.attrs.onPageLevelChange(pendingChanges);
2016-07-07 18:54:16 -07:00
this.showNotification("Outdent");
2017-03-09 12:51:21 +00:00
this.send('onEntryClick', this.get('currentPageId'));
2016-07-07 18:54:16 -07:00
}
},
2016-07-07 18:54:16 -07:00
onEntryClick(id) {
this.setState(id);
2017-03-07 16:10:13 +00:00
this.attrs.onGotoPage(id);
2016-11-10 15:37:16 -08:00
}
}
2016-07-07 18:54:16 -07:00
});
/*
Specs
-----
1. Must max max height to prevent off screen problems
2. Must be usable on mobile and desktop
3. Must be sticky and always visible (at least desktop)
4. Must set width or leave to grid system
Solution
--------
1. max-height calc on insert/repaint
1. overflow: scroll
2. on mobile/sm/md/lg we can put in little box to side of doc meta
and then set to fixed height based on screen size
2. on xl we can put into sidebar
3. sticky on xl desktop is fine as sidebar uses fixed position
and content has max-height with overflow
3. sticky on col/sm/md/lg is not available
Notes
-----
We could go with container-fluid and use full width of screen.
This would work on all devices and take more space on
$(window).width() needs to be 1800 or more for sticky sidebar...
$("#nav-bar").height()
$(window).height() - $("#nav-bar").height() - 100
Two choices:
if width >= 1800 then sidebar sticky outside container
if widht < 1800 then switch to container-fluid?
...but what about height?
...put next to doc--meta
*/