249 lines · 5.8 KB · JavaScript
RawDownload
app.views.DocList = class DocList extends app.View {  static className = "_list";  static attributes = { role: "navigation" };   static events = {    open: "onOpen",    close: "onClose",    click: "onClick",  };   static routes = { after: "afterRoute" };   static 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 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(...(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]?.name !== 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?.fullPath());  }   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) {        this.onEnabled = this.onEnabled.bind(this);        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);    }  }};