| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- app.views.Mobile = class Mobile extends app.View {
- static className = "_mobile";
- static elements = {
- body: "body",
- content: "._container",
- sidebar: "._sidebar",
- docPicker: "._settings ._sidebar",
- };
- static shortcuts = { escape: "onEscape" };
- static routes = { after: "afterRoute" };
- static detect() {
- if (Cookies.get("override-mobile-detect") != null) {
- return JSON.parse(Cookies.get("override-mobile-detect"));
- }
- try {
- return (
- window.matchMedia("(max-width: 480px)").matches ||
- window.matchMedia("(max-width: 767px)").matches ||
- window.matchMedia("(max-height: 767px) and (max-width: 1024px)")
- .matches ||
- // Need to sniff the user agent because some Android and Windows Phone devices don't take
- // resolution (dpi) into account when reporting device width/height.
- (navigator.userAgent.includes("Android") &&
- navigator.userAgent.includes("Mobile")) ||
- navigator.userAgent.includes("IEMobile")
- );
- } catch (error) {
- return false;
- }
- }
- static detectAndroidWebview() {
- try {
- return /(Android).*( Version\/.\.. ).*(Chrome)/.test(navigator.userAgent);
- } catch (error) {
- return false;
- }
- }
- constructor() {
- super(document.documentElement);
- }
- init() {
- $.on($("._search"), "touchend", () => this.onTapSearch());
- this.toggleSidebar = $("button[data-toggle-sidebar]");
- this.toggleSidebar.removeAttribute("hidden");
- $.on(this.toggleSidebar, "click", () => this.onClickToggleSidebar());
- this.back = $("button[data-back]");
- this.back.removeAttribute("hidden");
- $.on(this.back, "click", () => this.onClickBack());
- this.forward = $("button[data-forward]");
- this.forward.removeAttribute("hidden");
- $.on(this.forward, "click", () => this.onClickForward());
- this.docPickerTab = $('button[data-tab="doc-picker"]');
- this.docPickerTab.removeAttribute("hidden");
- $.on(this.docPickerTab, "click", (event) =>
- this.onClickDocPickerTab(event),
- );
- this.settingsTab = $('button[data-tab="settings"]');
- this.settingsTab.removeAttribute("hidden");
- $.on(this.settingsTab, "click", (event) => this.onClickSettingsTab(event));
- app.document.sidebar.search.on("searching", () => this.showSidebar());
- this.activate();
- }
- showSidebar() {
- let selection;
- if (this.isSidebarShown()) {
- window.scrollTo(0, 0);
- return;
- }
- this.contentTop = window.scrollY;
- this.content.style.display = "none";
- this.sidebar.style.display = "block";
- if ((selection = this.findByClass(app.views.ListSelect.activeClass))) {
- const scrollContainer =
- window.scrollY === this.body.scrollTop
- ? this.body
- : document.documentElement;
- $.scrollTo(selection, scrollContainer, "center");
- } else {
- window.scrollTo(
- 0,
- (this.findByClass(app.views.ListFold.activeClass) && this.sidebarTop) ||
- 0,
- );
- }
- }
- hideSidebar() {
- if (!this.isSidebarShown()) {
- return;
- }
- this.sidebarTop = window.scrollY;
- this.sidebar.style.display = "none";
- this.content.style.display = "block";
- window.scrollTo(0, this.contentTop || 0);
- }
- isSidebarShown() {
- return this.sidebar.style.display !== "none";
- }
- onClickBack() {
- return history.back();
- }
- onClickForward() {
- return history.forward();
- }
- onClickToggleSidebar() {
- if (this.isSidebarShown()) {
- this.hideSidebar();
- } else {
- this.showSidebar();
- }
- }
- onClickDocPickerTab(event) {
- $.stopEvent(event);
- this.showDocPicker();
- }
- onClickSettingsTab(event) {
- $.stopEvent(event);
- this.showSettings();
- }
- showDocPicker() {
- window.scrollTo(0, 0);
- this.docPickerTab.classList.add("active");
- this.settingsTab.classList.remove("active");
- this.docPicker.style.display = "block";
- this.content.style.display = "none";
- }
- showSettings() {
- window.scrollTo(0, 0);
- this.docPickerTab.classList.remove("active");
- this.settingsTab.classList.add("active");
- this.docPicker.style.display = "none";
- this.content.style.display = "block";
- }
- onTapSearch() {
- return window.scrollTo(0, 0);
- }
- onEscape() {
- return this.hideSidebar();
- }
- afterRoute(route) {
- this.hideSidebar();
- if (route === "settings") {
- this.showDocPicker();
- } else {
- this.content.style.display = "block";
- }
- if (page.canGoBack()) {
- this.back.removeAttribute("disabled");
- } else {
- this.back.setAttribute("disabled", "disabled");
- }
- if (page.canGoForward()) {
- this.forward.removeAttribute("disabled");
- } else {
- this.forward.setAttribute("disabled", "disabled");
- }
- }
- };
|