|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS002: Fix invalid constructor
|
|
|
|
* DS101: Remove unnecessary use of Array.from
|
|
|
|
* 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.DocList = class DocList extends app.View {
|
|
|
|
constructor(...args) {
|
|
|
|
this.render = this.render.bind(this);
|
|
|
|
this.onOpen = this.onOpen.bind(this);
|
|
|
|
this.onClose = this.onClose.bind(this);
|
|
|
|
this.onClick = this.onClick.bind(this);
|
|
|
|
this.onEnabled = this.onEnabled.bind(this);
|
|
|
|
this.afterRoute = this.afterRoute.bind(this);
|
|
|
|
super(...args);
|
|
|
|
}
|
|
|
|
|
|
|
|
static initClass() {
|
|
|
|
this.className = '_list';
|
|
|
|
this.attributes =
|
|
|
|
{role: 'navigation'};
|
|
|
|
|
|
|
|
this.events = {
|
|
|
|
open: 'onOpen',
|
|
|
|
close: 'onClose',
|
|
|
|
click: 'onClick'
|
|
|
|
};
|
|
|
|
|
|
|
|
this.routes =
|
|
|
|
{after: 'afterRoute'};
|
|
|
|
|
|
|
|
this.elements = {
|
|
|
|
disabledTitle: '._list-title',
|
|
|
|
disabledList: '._disabled-list'
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
init() {
|
|
|
|
this.lists = {};
|
|
|
|
|
|
|
|
this.addSubview(this.listFocus = new app.views.ListFocus(this.el));
|
|
|
|
this.addSubview(this.listFold = new app.views.ListFold(this.el));
|
|
|
|
this.addSubview(this.listSelect = new app.views.ListSelect(this.el));
|
|
|
|
|
|
|
|
app.on('ready', this.render);
|
|
|
|
}
|
|
|
|
|
|
|
|
activate() {
|
|
|
|
if (super.activate(...arguments)) {
|
|
|
|
for (var slug in this.lists) { var list = this.lists[slug]; list.activate(); }
|
|
|
|
this.listSelect.selectCurrent();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
deactivate() {
|
|
|
|
if (super.deactivate(...arguments)) {
|
|
|
|
for (var slug in this.lists) { var list = this.lists[slug]; list.deactivate(); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
let html = '';
|
|
|
|
for (var doc of Array.from(app.docs.all())) {
|
|
|
|
html += this.tmpl('sidebarDoc', doc, {fullName: app.docs.countAllBy('name', doc.name) > 1});
|
|
|
|
}
|
|
|
|
this.html(html);
|
|
|
|
if (!app.isSingleDoc() && (app.disabledDocs.size() !== 0)) { this.renderDisabled(); }
|
|
|
|
}
|
|
|
|
|
|
|
|
renderDisabled() {
|
|
|
|
this.append(this.tmpl('sidebarDisabled', {count: app.disabledDocs.size()}));
|
|
|
|
this.refreshElements();
|
|
|
|
this.renderDisabledList();
|
|
|
|
}
|
|
|
|
|
|
|
|
renderDisabledList() {
|
|
|
|
if (app.settings.get('hideDisabled')) {
|
|
|
|
this.removeDisabledList();
|
|
|
|
} else {
|
|
|
|
this.appendDisabledList();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
appendDisabledList() {
|
|
|
|
let doc;
|
|
|
|
let html = '';
|
|
|
|
const docs = [].concat(...Array.from(app.disabledDocs.all() || []));
|
|
|
|
|
|
|
|
while ((doc = docs.shift())) {
|
|
|
|
if (doc.version != null) {
|
|
|
|
var versions = '';
|
|
|
|
while (true) {
|
|
|
|
versions += this.tmpl('sidebarDoc', doc, {disabled: true});
|
|
|
|
if ((docs[0] != null ? docs[0].name : undefined) !== doc.name) { break; }
|
|
|
|
doc = docs.shift();
|
|
|
|
}
|
|
|
|
html += this.tmpl('sidebarDisabledVersionedDoc', doc, versions);
|
|
|
|
} else {
|
|
|
|
html += this.tmpl('sidebarDoc', doc, {disabled: true});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.append(this.tmpl('sidebarDisabledList', html));
|
|
|
|
this.disabledTitle.classList.add('open-title');
|
|
|
|
this.refreshElements();
|
|
|
|
}
|
|
|
|
|
|
|
|
removeDisabledList() {
|
|
|
|
if (this.disabledList) { $.remove(this.disabledList); }
|
|
|
|
this.disabledTitle.classList.remove('open-title');
|
|
|
|
this.refreshElements();
|
|
|
|
}
|
|
|
|
|
|
|
|
reset(options) {
|
|
|
|
if (options == null) { options = {}; }
|
|
|
|
this.listSelect.deselect();
|
|
|
|
if (this.listFocus != null) {
|
|
|
|
this.listFocus.blur();
|
|
|
|
}
|
|
|
|
this.listFold.reset();
|
|
|
|
if (options.revealCurrent || app.isSingleDoc()) { this.revealCurrent(); }
|
|
|
|
}
|
|
|
|
|
|
|
|
onOpen(event) {
|
|
|
|
$.stopEvent(event);
|
|
|
|
const doc = app.docs.findBy('slug', event.target.getAttribute('data-slug'));
|
|
|
|
|
|
|
|
if (doc && !this.lists[doc.slug]) {
|
|
|
|
this.lists[doc.slug] = doc.types.isEmpty() ?
|
|
|
|
new app.views.EntryList(doc.entries.all())
|
|
|
|
:
|
|
|
|
new app.views.TypeList(doc);
|
|
|
|
$.after(event.target, this.lists[doc.slug].el);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onClose(event) {
|
|
|
|
$.stopEvent(event);
|
|
|
|
const doc = app.docs.findBy('slug', event.target.getAttribute('data-slug'));
|
|
|
|
|
|
|
|
if (doc && this.lists[doc.slug]) {
|
|
|
|
this.lists[doc.slug].detach();
|
|
|
|
delete this.lists[doc.slug];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
select(model) {
|
|
|
|
this.listSelect.selectByHref(model != null ? model.fullPath() : undefined);
|
|
|
|
}
|
|
|
|
|
|
|
|
reveal(model) {
|
|
|
|
this.openDoc(model.doc);
|
|
|
|
if (model.type) { this.openType(model.getType()); }
|
|
|
|
this.focus(model);
|
|
|
|
this.paginateTo(model);
|
|
|
|
this.scrollTo(model);
|
|
|
|
}
|
|
|
|
|
|
|
|
focus(model) {
|
|
|
|
if (this.listFocus != null) {
|
|
|
|
this.listFocus.focus(this.find(`a[href='${model.fullPath()}']`));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
revealCurrent() {
|
|
|
|
let model;
|
|
|
|
if (model = app.router.context.type || app.router.context.entry) {
|
|
|
|
this.reveal(model);
|
|
|
|
this.select(model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
openDoc(doc) {
|
|
|
|
if (app.disabledDocs.contains(doc) && doc.version) { this.listFold.open(this.find(`[data-slug='${doc.slug_without_version}']`)); }
|
|
|
|
this.listFold.open(this.find(`[data-slug='${doc.slug}']`));
|
|
|
|
}
|
|
|
|
|
|
|
|
closeDoc(doc) {
|
|
|
|
this.listFold.close(this.find(`[data-slug='${doc.slug}']`));
|
|
|
|
}
|
|
|
|
|
|
|
|
openType(type) {
|
|
|
|
this.listFold.open(this.lists[type.doc.slug].find(`[data-slug='${type.slug}']`));
|
|
|
|
}
|
|
|
|
|
|
|
|
paginateTo(model) {
|
|
|
|
if (this.lists[model.doc.slug] != null) {
|
|
|
|
this.lists[model.doc.slug].paginateTo(model);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
scrollTo(model) {
|
|
|
|
$.scrollTo(this.find(`a[href='${model.fullPath()}']`), null, 'top', {margin: app.isMobile() ? 48 : 0});
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleDisabled() {
|
|
|
|
if (this.disabledTitle.classList.contains('open-title')) {
|
|
|
|
this.removeDisabledList();
|
|
|
|
app.settings.set('hideDisabled', true);
|
|
|
|
} else {
|
|
|
|
this.appendDisabledList();
|
|
|
|
app.settings.set('hideDisabled', false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onClick(event) {
|
|
|
|
let slug;
|
|
|
|
const target = $.eventTarget(event);
|
|
|
|
if (this.disabledTitle && $.hasChild(this.disabledTitle, target) && (target.tagName !== 'A')) {
|
|
|
|
$.stopEvent(event);
|
|
|
|
this.toggleDisabled();
|
|
|
|
} else if (slug = target.getAttribute('data-enable')) {
|
|
|
|
$.stopEvent(event);
|
|
|
|
const doc = app.disabledDocs.findBy('slug', slug);
|
|
|
|
if (doc) { app.enableDoc(doc, this.onEnabled, this.onEnabled); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onEnabled() {
|
|
|
|
this.reset();
|
|
|
|
this.render();
|
|
|
|
}
|
|
|
|
|
|
|
|
afterRoute(route, context) {
|
|
|
|
if (context.init) {
|
|
|
|
if (this.activated) { this.reset({revealCurrent: true}); }
|
|
|
|
} else {
|
|
|
|
this.select(context.type || context.entry);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
Cls.initClass();
|