|
|
|
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");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|