|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS002: Fix invalid constructor
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
|
|
|
|
* DS206: Consider reworking classes to avoid initClass
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
|
|
|
|
*/
|
|
|
|
const Cls = (app.views.Sidebar = class Sidebar extends app.View {
|
|
|
|
constructor(...args) {
|
|
|
|
this.resetHoverOnMouseMove = this.resetHoverOnMouseMove.bind(this);
|
|
|
|
this.resetHover = this.resetHover.bind(this);
|
|
|
|
this.showResults = this.showResults.bind(this);
|
|
|
|
this.onReady = this.onReady.bind(this);
|
|
|
|
this.onScopeChange = this.onScopeChange.bind(this);
|
|
|
|
this.onSearching = this.onSearching.bind(this);
|
|
|
|
this.onSearchClear = this.onSearchClear.bind(this);
|
|
|
|
this.onFocus = this.onFocus.bind(this);
|
|
|
|
this.onSelect = this.onSelect.bind(this);
|
|
|
|
this.onClick = this.onClick.bind(this);
|
|
|
|
this.onAltR = this.onAltR.bind(this);
|
|
|
|
this.onEscape = this.onEscape.bind(this);
|
|
|
|
this.afterRoute = this.afterRoute.bind(this);
|
|
|
|
super(...args);
|
|
|
|
}
|
|
|
|
|
|
|
|
static initClass() {
|
|
|
|
this.el = '._sidebar';
|
|
|
|
|
|
|
|
this.events = {
|
|
|
|
focus: 'onFocus',
|
|
|
|
select: 'onSelect',
|
|
|
|
click: 'onClick'
|
|
|
|
};
|
|
|
|
|
|
|
|
this.routes =
|
|
|
|
{after: 'afterRoute'};
|
|
|
|
|
|
|
|
this.shortcuts = {
|
|
|
|
altR: 'onAltR',
|
|
|
|
escape: 'onEscape'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
init() {
|
|
|
|
if (!app.isMobile()) { this.addSubview(this.hover = new app.views.SidebarHover(this.el)); }
|
|
|
|
this.addSubview(this.search = new app.views.Search);
|
|
|
|
|
|
|
|
this.search
|
|
|
|
.on('searching', this.onSearching)
|
|
|
|
.on('clear', this.onSearchClear)
|
|
|
|
.scope
|
|
|
|
.on('change', this.onScopeChange);
|
|
|
|
|
|
|
|
this.results = new app.views.Results(this, this.search);
|
|
|
|
this.docList = new app.views.DocList;
|
|
|
|
|
|
|
|
app.on('ready', this.onReady);
|
|
|
|
|
|
|
|
$.on(document.documentElement, 'mouseleave', () => this.hide());
|
|
|
|
$.on(document.documentElement, 'mouseenter', () => this.resetDisplay({forceNoHover: false}));
|
|
|
|
}
|
|
|
|
|
|
|
|
hide() {
|
|
|
|
this.removeClass('show');
|
|
|
|
}
|
|
|
|
|
|
|
|
display() {
|
|
|
|
this.addClass('show');
|
|
|
|
}
|
|
|
|
|
|
|
|
resetDisplay(options) {
|
|
|
|
if (options == null) { options = {}; }
|
|
|
|
if (!this.hasClass('show')) { return; }
|
|
|
|
this.removeClass('show');
|
|
|
|
|
|
|
|
if ((options.forceNoHover !== false) && !this.hasClass('no-hover')) {
|
|
|
|
this.addClass('no-hover');
|
|
|
|
$.on(window, 'mousemove', this.resetHoverOnMouseMove);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
resetHoverOnMouseMove() {
|
|
|
|
$.off(window, 'mousemove', this.resetHoverOnMouseMove);
|
|
|
|
return $.requestAnimationFrame(this.resetHover);
|
|
|
|
}
|
|
|
|
|
|
|
|
resetHover() {
|
|
|
|
return this.removeClass('no-hover');
|
|
|
|
}
|
|
|
|
|
|
|
|
showView(view) {
|
|
|
|
if (this.view !== view) {
|
|
|
|
if (this.hover != null) {
|
|
|
|
this.hover.hide();
|
|
|
|
}
|
|
|
|
this.saveScrollPosition();
|
|
|
|
if (this.view != null) {
|
|
|
|
this.view.deactivate();
|
|
|
|
}
|
|
|
|
this.view = view;
|
|
|
|
this.render();
|
|
|
|
this.view.activate();
|
|
|
|
this.restoreScrollPosition();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
this.html(this.view);
|
|
|
|
}
|
|
|
|
|
|
|
|
showDocList() {
|
|
|
|
this.showView(this.docList);
|
|
|
|
}
|
|
|
|
|
|
|
|
showResults() {
|
|
|
|
this.display();
|
|
|
|
this.showView(this.results);
|
|
|
|
}
|
|
|
|
|
|
|
|
reset() {
|
|
|
|
this.display();
|
|
|
|
this.showDocList();
|
|
|
|
this.docList.reset();
|
|
|
|
this.search.reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
onReady() {
|
|
|
|
this.view = this.docList;
|
|
|
|
this.render();
|
|
|
|
this.view.activate();
|
|
|
|
}
|
|
|
|
|
|
|
|
onScopeChange(newDoc, previousDoc) {
|
|
|
|
if (previousDoc) { this.docList.closeDoc(previousDoc); }
|
|
|
|
if (newDoc) { this.docList.reveal(newDoc.toEntry()); } else { this.scrollToTop(); }
|
|
|
|
}
|
|
|
|
|
|
|
|
saveScrollPosition() {
|
|
|
|
if (this.view === this.docList) {
|
|
|
|
this.scrollTop = this.el.scrollTop;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
restoreScrollPosition() {
|
|
|
|
if ((this.view === this.docList) && this.scrollTop) {
|
|
|
|
this.el.scrollTop = this.scrollTop;
|
|
|
|
this.scrollTop = null;
|
|
|
|
} else {
|
|
|
|
this.scrollToTop();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
scrollToTop() {
|
|
|
|
this.el.scrollTop = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
onSearching() {
|
|
|
|
this.showResults();
|
|
|
|
}
|
|
|
|
|
|
|
|
onSearchClear() {
|
|
|
|
this.resetDisplay();
|
|
|
|
this.showDocList();
|
|
|
|
}
|
|
|
|
|
|
|
|
onFocus(event) {
|
|
|
|
this.display();
|
|
|
|
if (event.target !== this.el) { $.scrollTo(event.target, this.el, 'continuous', {bottomGap: 2}); }
|
|
|
|
}
|
|
|
|
|
|
|
|
onSelect() {
|
|
|
|
this.resetDisplay();
|
|
|
|
}
|
|
|
|
|
|
|
|
onClick(event) {
|
|
|
|
if (event.which !== 1) { return; }
|
|
|
|
if (__guardMethod__($.eventTarget(event), 'hasAttribute', o => o.hasAttribute('data-reset-list'))) {
|
|
|
|
$.stopEvent(event);
|
|
|
|
this.onAltR();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onAltR() {
|
|
|
|
this.reset();
|
|
|
|
this.docList.reset({revealCurrent: true});
|
|
|
|
this.display();
|
|
|
|
}
|
|
|
|
|
|
|
|
onEscape() {
|
|
|
|
let doc;
|
|
|
|
this.reset();
|
|
|
|
this.resetDisplay();
|
|
|
|
if ((doc = this.search.getScopeDoc())) { this.docList.reveal(doc.toEntry()); } else { this.scrollToTop(); }
|
|
|
|
}
|
|
|
|
|
|
|
|
onDocEnabled() {
|
|
|
|
this.docList.onEnabled();
|
|
|
|
this.reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
afterRoute(name, context) {
|
|
|
|
if ((app.shortcuts.eventInProgress != null ? app.shortcuts.eventInProgress.name : undefined) === 'escape') { return; }
|
|
|
|
if (!context.init && app.router.isIndex()) { this.reset(); }
|
|
|
|
this.resetDisplay();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
Cls.initClass();
|
|
|
|
|
|
|
|
function __guardMethod__(obj, methodName, transform) {
|
|
|
|
if (typeof obj !== 'undefined' && obj !== null && typeof obj[methodName] === 'function') {
|
|
|
|
return transform(obj, methodName);
|
|
|
|
} else {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
}
|