diff --git a/dist/main.min.js b/dist/main.min.js index f52c5d7..58de551 100644 --- a/dist/main.min.js +++ b/dist/main.min.js @@ -824,6 +824,7 @@ // src/class-storage.js var Storage = class { constructor() { + this.store = null; if (typeof browser === "undefined") { this.store = window.localStorage; } else { @@ -865,6 +866,7 @@ constructor() { this.active = false; this.store = new class_storage_default(); + this.cache = {}; } async discoverApiRoot() { let wpApiSettings = null; @@ -915,10 +917,39 @@ makeParamString(data) { const params = new URLSearchParams(); Object.keys(data).forEach((paramKey) => { - params.append(paramKey, data[paramKey]); + if (Array.isArray(data[paramKey])) { + const arrayParamKey = paramKey + "[]"; + data[paramKey].forEach((item) => params.append(arrayParamKey, item)); + } else { + params.append(paramKey, data[paramKey]); + } }); return params.toString(); } + statuses() { + if (this.apiNonce) { + return ["publish", "future", "draft", "pending", "private"]; + } else { + return ["publish"]; + } + } + types() { + return globalThis.turboAdmin.turboAdminPalette.postTypes; + } + async getPosts(searchString) { + if (this.cache[searchString] !== void 0) { + return this.cache[searchString]; + } + const response = await this.get("search", { + search: searchString, + per_page: 100, + type: "post", + subtype: "any" + }); + const result = await response.json(); + this.cache[searchString] = result; + return result; + } async get(path, data = {}) { const init = { method: "GET", @@ -948,14 +979,15 @@ this.paletteData = paletteData; this.postTypes = []; this.fetchPostTypes(); - this.contentItems = []; - this.paletteItems = this.buildPaletteItems(); + this.paletteItems = []; + this.itemIndex = {}; + this.buildPaletteItems(); this.selectedItem = this.paletteItems[0]; this.openedSubMenu = null; this.selectedSubItem = null; this.updatePaletteItems(); this.navigating = false; - this.debouncedUpdateFn = null; + this.debounceTimeout; this.paletteFuseOptions = []; this.paletteFuse = null; if (typeof import_fuse_6_4_6.default !== "function") { @@ -966,9 +998,6 @@ }; this.paletteFuse = new import_fuse_6_4_6.default(this.paletteItems, this.paletteFuseOptions); document.addEventListener("keydown", (e) => this.handleGlobalKey(e)); - this.paletteInputElement.addEventListener("keydown", (e) => { - this.paletteActions(e); - }); this.paletteElement.addEventListener("click", (e) => { this.checkForPaletteItemClick(e); this.checkForClickToClose(e); @@ -999,7 +1028,8 @@ }); } buildPaletteItems() { - const paletteItems = []; + this.paletteItems = []; + this.itemIndex = {}; this.paletteData.forEach((item) => { const li = document.createElement("li"); const a = document.createElement("a"); @@ -1010,17 +1040,45 @@ title = item.parentTitle + ": " + title; } a.innerHTML = title; - paletteItems.push(li); + this.addPaletteListItem(li); }); + } + addPaletteListItem(listItem) { + this.paletteItems.push(listItem); + const link = listItem.querySelector("a"); + if (link) { + this.itemIndex[link.href] = 1; + } + } + contentItemExists(url) { + return Boolean(this.itemIndex[url]); + } + injectContentItems(contentItems) { + console.log("Injecting items"); const profileLinkElem = document.getElementById("wp-admin-bar-edit-profile"); let profileLink = null; if (profileLinkElem) { profileLink = profileLinkElem.querySelector("a").href; } - if (this.contentItems && this.contentItems.length > 0) { - this.contentItems.forEach((item) => { - const type = this.postTypes[item.subtype] ? this.postTypes[item.subtype].name : item.subtype; - const title = `${item.title} (${type})`; + let oxygenLinkElem = document.getElementById("toplevel_page_ct_dashboard_page"); + if (!oxygenLinkElem) { + oxygenLinkElem = document.getElementById("wp-admin-bar-oxygen_admin_bar_menu"); + } + if (!oxygenLinkElem) { + oxygenLinkElem = Number(window.localStorage.getItem("ta-has-oxygen-builder")); + } + window.localStorage.setItem("ta-has-oxygen-builder", Boolean(oxygenLinkElem) ? "1" : "0"); + if (contentItems.length > 0) { + contentItems.forEach((item) => { + const itemTitle = item.title; + const itemType = item.type; + const itemUrl = item.url; + if (this.contentItemExists(itemUrl)) { + console.log("Not adding duplicate"); + return; + } + const itemTypeName = this.postTypes[itemType] ? this.postTypes[itemType].name : itemType; + const title = `${itemTitle} (${itemTypeName})`; const li = document.createElement("li"); const a = document.createElement("a"); const subMenu = document.createElement("div"); @@ -1028,14 +1086,14 @@ const subMenuItems = document.createElement("ul"); subMenu.classList.add("ta-submenu"); subMenuTitle.classList.add("ta-submenu-title"); - subMenuTitle.textContent = this.htmlDecode(title); + subMenuTitle.textContent = this.htmlDecode(itemTitle); subMenuItems.classList.add("ta-submenu-items"); subMenu.appendChild(subMenuTitle); subMenu.appendChild(subMenuItems); const subMenuItem1 = document.createElement("li"); const subMenuLink1 = document.createElement("a"); subMenuLink1.innerText = "View"; - subMenuLink1.href = item.url; + subMenuLink1.href = itemUrl; subMenuItem1.appendChild(subMenuLink1); subMenuItems.appendChild(subMenuItem1); if (profileLink) { @@ -1047,25 +1105,38 @@ subMenuItem2.appendChild(subMenuLink2); subMenuItems.appendChild(subMenuItem2); } + if (oxygenLinkElem) { + const oxygenLink = globalThis.taWp.home + `?page_id=${item.id}&ct_builder=true&ct_inner=true`; + const subMenuItem32 = document.createElement("li"); + const subMenuLink32 = document.createElement("a"); + subMenuLink32.innerText = "Edit with Oxygen"; + subMenuLink32.href = oxygenLink; + subMenuItem32.appendChild(subMenuLink32); + subMenuItems.appendChild(subMenuItem32); + } const subMenuItem3 = document.createElement("li"); const subMenuLink3 = document.createElement("a"); subMenuLink3.innerText = "Copy link"; - subMenuLink3.href = item.url; + subMenuLink3.href = itemUrl; subMenuLink3.setAttribute("data-action", "clipboard"); subMenuItem3.appendChild(subMenuLink3); subMenuItems.appendChild(subMenuItem3); li.classList.add("ta-has-child-menu"); li.appendChild(a); li.appendChild(subMenu); - a.href = item.url; + a.href = itemUrl; a.innerHTML = title; - paletteItems.push(li); + this.addPaletteListItem(li); }); } - return paletteItems; + this.paletteFuse = new import_fuse_6_4_6.default(this.paletteItems, this.paletteFuseOptions); + this.paletteItems = this.paletteFuse.search(this.paletteInputElement.value).map((i) => i.item); + this.updatePaletteItems(); } - handleGlobalKey(e) { + async handleGlobalKey(e) { if (this.shortcutKeysPressed(e)) { + e.preventDefault(); + e.stopPropagation(); if (this.paletteShown()) { this.hidePalette(); } else { @@ -1079,8 +1150,8 @@ this.hidePalette(); } } - if ((e.code === "ArrowUp" || e.code === "ArrowDown" || e.code === "Enter") && this.paletteShown()) { - e.preventDefault(); + if (this.paletteShown()) { + await this.paletteActions(e); } } shortcutKeysPressed(keyEvent) { @@ -1092,26 +1163,20 @@ }, false); return keysPressed; } - debouncedPaletteSearchAndUpdate() { - if (this.debouncedUpdateFn === null) { - this.debouncedUpdateFn = this.debounce(this.paletteSearchAndUpdate); + async debouncedPaletteSearchAndUpdate() { + if (this.paletteInputElement.value !== "" && this.paletteInputElement.value.length <= 2 || this.postTypes === []) { + this.debounceTimeout = null; + await this.paletteSearchAndUpdate(); + return; + } + if (!this.debounceTimeout) { + this.debounceTimeout = setTimeout(async function() { + this.debounceTimeout = null; + await this.paletteSearchAndUpdate(); + }.bind(this), 750); } - this.debouncedUpdateFn(); - } - debounce(fn) { - var timeout; - return function() { - var context = this; - var args = arguments; - if (timeout) { - window.cancelAnimationFrame(timeout); - } - timeout = window.requestAnimationFrame(function() { - fn.apply(context, args); - }); - }; } - paletteActions(e) { + async paletteActions(e) { if (e.code === "ArrowDown" && this.paletteShown()) { e.preventDefault(); this.moveDown(); @@ -1126,7 +1191,10 @@ this.doAction(this.metaPressed(e)); return; } - this.paletteSearchAndUpdate(); + if (this.isSubMenuOpen()) { + return; + } + await this.debouncedPaletteSearchAndUpdate(); } showPalette() { this.paletteInputElement.value = ""; @@ -1232,6 +1300,8 @@ const subMenuHeight = subMenuElement.offsetHeight; this.paletteItemsElement.style.minHeight = subMenuHeight + "px"; subMenuElement.classList.add("active"); + this.paletteInputElement.disabled = true; + this.paletteInputElement.blur(); this.selectedSubItem = subMenuElement.querySelector("li"); this.openedSubMenu = subMenuElement; this.setSelectedElement(); @@ -1245,6 +1315,8 @@ this.paletteItemsElement.style.minHeight = "auto"; this.selectedSubItem = null; this.openedSubMenu = null; + this.paletteInputElement.disabled = false; + this.paletteInputElement.focus(); } doAction(metaPressed = false) { if (this.isSubMenuOpen()) { @@ -1280,19 +1352,18 @@ this.updatePaletteItems(); } async paletteSearch() { - if (globalThis.contentApi.active && this.paletteInputElement.value.length > 2) { - this.paletteInnerElement.classList.add("loading"); - const response = await globalThis.contentApi.get("search", {search: this.paletteInputElement.value, per_page: 100}); - this.contentItems = await response.json(); - this.paletteInnerElement.classList.remove("loading"); - } else { - this.contentItems = []; - } - this.paletteItems = this.buildPaletteItems(); + this.buildPaletteItems(); if (this.paletteInputElement.value !== "") { this.paletteFuse = new import_fuse_6_4_6.default(this.paletteItems, this.paletteFuseOptions); this.paletteItems = this.paletteFuse.search(this.paletteInputElement.value).map((i) => i.item); } + if (globalThis.contentApi.active && this.postTypes !== [] && this.paletteInputElement.value.length > 2) { + this.paletteInnerElement.classList.add("loading"); + globalThis.contentApi.getPosts(this.paletteInputElement.value).then((results) => { + this.injectContentItems(results); + this.paletteInnerElement.classList.remove("loading"); + }); + } } updatePaletteItems() { const newItems = document.createElement("ul"); @@ -1312,13 +1383,28 @@ // src/class-turbo-admin-wp-block-editor-fullscreen-kill.js var TurboAdminWpBlockEditorFullscreenKill = class { constructor() { - setTimeout(() => { - document.body.classList.remove("is-fullscreen-mode"); - document.body.classList.add("turbo-admin-killed-fullscreen"); - const newStyles = document.createElement("style"); - newStyles.innerHTML = "body.turbo-admin-killed-fullscreen .edit-post-fullscreen-mode-close { display: none; }"; - document.body.appendChild(newStyles); - }, 400); + const attrObserver = new MutationObserver((mutations) => { + mutations.forEach((mu) => { + if (mu.type !== "attributes" && mu.attributeName !== "class") { + return; + } + if (mu.target.classList.contains("is-fullscreen-mode")) { + this.killFullScreenEditor(); + } + }); + }); + attrObserver.observe(document.body, {attributes: true}); + this.killFullScreenEditor(); + } + killFullScreenEditor() { + if (!document.body.classList.contains("is-fullscreen-mode")) { + return; + } + document.body.classList.remove("is-fullscreen-mode"); + document.body.classList.add("turbo-admin-killed-fullscreen"); + const newStyles = document.createElement("style"); + newStyles.innerHTML = "body.turbo-admin-killed-fullscreen .edit-post-fullscreen-mode-close { display: none; }"; + document.body.appendChild(newStyles); } }; var class_turbo_admin_wp_block_editor_fullscreen_kill_default = TurboAdminWpBlockEditorFullscreenKill; @@ -1326,19 +1412,333 @@ // src/class-turbo-admin-wp-block-editor-welcome-guide-kill.js var TurboAdminWpBlockEditorWelcomeGuideKill = class { constructor() { - setTimeout(() => { - const welcomeGuide = document.querySelector(".edit-post-welcome-guide"); - if (welcomeGuide) { - const closeButton = welcomeGuide.querySelector(".components-modal__header button"); - if (closeButton) { - closeButton.click(); + const attrObserver = new MutationObserver((mutations) => { + mutations.forEach((mu) => { + if (document.body.classList.contains("ta-killed-post-welcome-guide")) { + return; + } + if (mu.type !== "attributes" && mu.attributeName !== "class") { + return; + } + if (!mu.target.classList.contains("modal-open")) { + return; } + const welcomeGuide = document.querySelector(".edit-post-welcome-guide"); + if (welcomeGuide) { + this.killWelcomeGuide(); + } + }); + }); + attrObserver.observe(document.body, {attributes: true}); + this.killWelcomeGuide(); + } + killWelcomeGuide() { + const welcomeGuide = document.querySelector(".edit-post-welcome-guide"); + if (welcomeGuide) { + const closeButton = welcomeGuide.querySelector(".components-modal__header button"); + if (closeButton) { + closeButton.click(); + document.body.classList.add("ta-killed-post-welcome-guide"); } - }, 400); + } } }; var class_turbo_admin_wp_block_editor_welcome_guide_kill_default = TurboAdminWpBlockEditorWelcomeGuideKill; + // src/class-turbo-admin-wp-notices.js + var TurboAdminWpNotices = class { + constructor(rememberedNoticeIds) { + if (!document.querySelector("body.wp-admin")) { + return; + } + this.noticeSelectors = [ + "#wpbody-content > .notice", + "#wpbody-content > .wrap > .notice", + "#wpbody-content > .wrap > .updated", + "#gf_dashboard_message", + ".jitm-banner", + ".fs-notice", + "#updraft-dashnotice", + ".woocommerce-message", + "#akismet_setup_prompt", + "#wf-onboarding-plugin-header", + ".llar-notice-review" + ]; + this.allowedClasses = [ + "notice-success", + "notice-error", + "notice-failure", + "updated" + ]; + if (rememberedNoticeIds) { + this.rememberedNoticeIds = rememberedNoticeIds.length > 0 ? rememberedNoticeIds : []; + } else { + this.rememberedNoticeIds = []; + } + const toolbar = document.getElementById("wpadminbar"); + if (!toolbar) { + return; + } + if (rememberedNoticeIds && rememberedNoticeIds.length > 0) { + rememberedNoticeIds.forEach((id) => { + if (typeof id === "string" && id.length > 0) { + this.noticeSelectors.push("#" + id); + } + }); + } + console.log("Notice Selectors", this.noticeSelectors); + const notices = document.querySelectorAll(this.noticeSelectors.join(",")); + console.log("Notices", notices); + notices.forEach((notice) => { + this.maybeAddIdToNotice(notice); + if (this.keepNotice(notice)) { + const rememberButton = document.createElement("button"); + rememberButton.classList.add("ta-remember-notice-button"); + rememberButton.innerText = "Move to panel"; + const forgetButton = document.createElement("button"); + forgetButton.classList.add("ta-forget-notice-button"); + forgetButton.innerText = "Move to dashboard"; + notice.classList.add("ta-added-pos-relative"); + notice.appendChild(rememberButton); + notice.appendChild(forgetButton); + rememberButton.addEventListener("click", this.rememberNotice.bind(this), false, true); + forgetButton.addEventListener("click", this.forgetNotice.bind(this), false, true); + } + }); + const noticesToHide = Array.from(notices).filter((notice) => { + if (this.rememberedNoticeIds.includes(notice.id)) { + return true; + } + if (this.keepNotice(notice)) { + return false; + } + if (notice.offsetHeight === 0 || notice.offsetWidth === 0) { + return false; + } + return true; + }); + console.log("Notices to hide", noticesToHide); + const noticesLinkWrapper = document.createElement("div"); + noticesLinkWrapper.id = "ta-notices-link-wrap"; + noticesLinkWrapper.classList.add("hide-if-no-js", "screen-meta-toggle"); + noticesLinkWrapper.style.margin = "0 0 0 6px"; + noticesLinkWrapper.style.float = "left"; + if (noticesToHide.length === 0) { + noticesLinkWrapper.style.display = "none"; + } + const noticesButton = document.createElement("button"); + noticesButton.type = "button"; + noticesButton.id = "ta-notices-link"; + noticesButton.classList.add("button", "show-settings"); + noticesButton.innerHTML = 'Notices ' + noticesToHide.length + ""; + noticesButton.setAttribute("aria-controls", "ta-notices-wrap"); + noticesButton.addEventListener("click", this.toggleNoticesPanel.bind(this), false); + noticesLinkWrapper.appendChild(noticesButton); + const screenMetaLinks = document.getElementById("screen-meta-links"); + screenMetaLinks.appendChild(noticesLinkWrapper); + const noticesPanel = document.createElement("div"); + noticesPanel.id = "ta-notices-wrap"; + noticesPanel.style.display = "none"; + noticesPanel.dataset.open = "no"; + const noticesPanelInner = document.createElement("div"); + noticesPanelInner.id = "ta-notices-panel-inner"; + noticesToHide.forEach((notice) => { + notice.classList.add("inline"); + noticesPanelInner.append(notice); + }); + noticesPanel.appendChild(noticesPanelInner); + const screenMeta = document.getElementById("screen-meta"); + screenMeta.appendChild(noticesPanel); + } + keepNotice(noticeElem) { + return this.allowedClasses.reduce((found, current) => { + return found || noticeElem.classList.contains(current); + }, false); + } + rememberNotice(ev) { + const noticesLinkWrap = document.getElementById("ta-notices-link-wrap"); + const panel = document.getElementById("wp-admin-bar-ta-notices"); + const panelInner = document.getElementById("ta-notices-panel-inner"); + const countElem = document.getElementById("ta-notice-count"); + const count = parseInt(countElem.innerText, 10); + const notice = ev.target.closest(this.noticeSelectors.join(",")); + const noticeId = notice.id; + console.log(`Remembering ${noticeId}`); + panelInner.appendChild(notice); + if (count === 0) { + noticesLinkWrap.style.display = "block"; + } + this.updateScreenMetaHeight(); + countElem.innerText = parseInt(countElem.innerText, 10) + 1; + this.saveRememberedNotice(noticeId); + } + saveRememberedNotice(noticeId) { + this.rememberedNoticeIds.push(noticeId); + if (typeof browser === "object") { + browser.runtime.sendMessage({ + action: "rememberNotice", + noticeId + }); + } else { + window.localStorage.setItem("rememberedNoticeIds", JSON.stringify(this.rememberedNoticeIds)); + } + } + forgetNotice(ev) { + const noticesLinkWrap = document.getElementById("ta-notices-link-wrap"); + const panelInner = document.getElementById("ta-notices-panel-inner"); + const countElem = document.getElementById("ta-notice-count"); + const count = parseInt(countElem.innerText, 10); + const notice = ev.target.closest(this.noticeSelectors.join(",")); + const noticeId = notice.id; + console.log(`Forgetting ${noticeId}`); + notice.remove(); + const message = document.createElement("div"); + const p = document.createElement("p"); + message.classList.add("notice", "ta-forget-notice-message"); + p.textContent = "Notice will be back in dashboard on next page load"; + message.appendChild(p); + panelInner.appendChild(message); + this.updateScreenMetaHeight(); + countElem.innerText = (count - 1).toString(); + this.saveForgottenNotice(noticeId); + } + saveForgottenNotice(noticeId) { + this.rememberedNoticeIds.push(noticeId); + if (typeof browser === "object") { + browser.runtime.sendMessage({ + action: "rememberNotice", + noticeId + }); + } else { + this.rememberedNoticeIds = this.rememberedNoticeIds.filter((id) => id !== noticeId); + window.localStorage.setItem("rememberedNoticeIds", JSON.stringify(this.rememberedNoticeIds)); + } + } + maybeAddIdToNotice(notice) { + if (notice.id && notice.id !== "" && notice.id !== "message") { + return; + } + const classes = notice.classList; + notice.id = Array.from(notice.classList).join("-"); + } + wordpressScreenMetaEventsExist() { + return typeof window.screenMeta === "object" && window.screenMeta.toggles.filter("#ta-notices-link").length > 0; + } + updateScreenMetaHeight() { + if (this.wordpressScreenMetaEventsExist()) { + return; + } + const screenMeta = document.getElementById("screen-meta"); + const noticesPanel = document.getElementById("ta-notices-wrap"); + const height = noticesPanel.offsetHeight; + screenMeta.style.maxHeight = height.toString(10) + "px"; + } + toggleNoticesPanel(ev) { + if (this.wordpressScreenMetaEventsExist()) { + return; + } + const animationSeconds = 0.3; + const screenMeta = document.getElementById("screen-meta"); + const noticesPanel = document.getElementById("ta-notices-wrap"); + if (noticesPanel.dataset.open === "no") { + this.toggleOtherScreenMetaTabs(); + noticesPanel.dataset.open = "yes"; + screenMeta.style.transition = `max-height ${animationSeconds.toString(10)}s`; + screenMeta.style.maxHeight = "0"; + screenMeta.style.overflow = "hidden"; + screenMeta.style.display = "block"; + noticesPanel.style.display = "block"; + const height = noticesPanel.offsetHeight; + screenMeta.style.maxHeight = height.toString(10) + "px"; + } else { + noticesPanel.dataset.open = "no"; + const height = noticesPanel.offsetHeight; + screenMeta.style.maxHeight = "0"; + setTimeout(() => { + noticesPanel.style.display = ""; + screenMeta.style.display = ""; + screenMeta.style.transition = ""; + screenMeta.style.overflow = ""; + screenMeta.style.maxHeight = ""; + this.toggleOtherScreenMetaTabs(); + }, animationSeconds * 1e3); + } + } + toggleOtherScreenMetaTabs() { + const otherTabs = document.querySelectorAll("#screen-meta-links .screen-meta-toggle:not(#ta-notices-link-wrap)"); + otherTabs.forEach((tab) => { + if (tab.style.visibility === "hidden") { + tab.style.visibility = ""; + } else { + tab.style.visibility = "hidden"; + } + }); + } + }; + var class_turbo_admin_wp_notices_default = TurboAdminWpNotices; + + // src/class-list-table-shortcuts.js + var ListTableShortcuts = class { + constructor() { + const me = this; + this.currentRow = null; + this.currentRowIndex = 0; + this.listTable = document.querySelector(".wp-list-table"); + if (!this.listTable) { + return; + } + this.tableRows = this.listTable.querySelectorAll("tbody#the-list > tr"); + document.addEventListener("keyup", (e) => this.handleKeyup(e)); + } + handleKeyup(ev) { + if (document.activeElement.tagName !== "BODY") { + return; + } + if (ev.key === "j") { + this.tableMoveDown(); + } else if (ev.key === "k") { + this.tableMoveUp(); + } else if (ev.key.toLowerCase() === "enter" && this.currentRow !== null) { + this.openTableRowItem(); + } + } + tableMoveDown() { + this.preTableChange(); + if (this.currentRow === null) { + this.currentRowIndex = 0; + } else { + this.currentRowIndex++; + } + this.updateTable(); + } + tableMoveUp() { + this.preTableChange(); + if (this.currentRowIndex > 0) { + this.currentRowIndex--; + this.updateTable(); + } + } + preTableChange() { + if (this.currentRow !== null) { + this.tableRows[this.currentRowIndex].classList.remove("ta-active-table-row"); + } + } + updateTable() { + this.currentRow = this.tableRows[this.currentRowIndex]; + if (!this.tableRows[this.currentRowIndex].classList.contains("ta-active-table-row")) { + this.tableRows[this.currentRowIndex].classList.add("ta-active-table-row"); + } + } + openTableRowItem() { + console.log(this); + const link = this.currentRow.querySelector("a.row-title"); + if (link) { + link.click(); + } + } + }; + var class_list_table_shortcuts_default = ListTableShortcuts; + // src/class-turbo-admin.js var TurboAdmin = class { constructor(options) { @@ -1347,6 +1747,8 @@ return; } this.options = options; + } + async init() { this.wp = globalThis.taWp; this.menu = []; if (!this.wp.isBackend) { @@ -1374,6 +1776,9 @@ if (this.options["block-editor-welcome-screen-kill"] === true) { this.turboAdminWelcomeKill = new class_turbo_admin_wp_block_editor_welcome_guide_kill_default(); } + if (this.options["list-table-keyboard-shortcuts"] === true) { + this.turboAdminListTableShortcuts = new class_list_table_shortcuts_default(); + } if (globalThis.contentApi.userLoggedIn()) { } } @@ -1489,6 +1894,27 @@ detectSelector: "#wp-admin-bar-my-sites #wp-admin-bar-my-sites-list .ab-submenu a", itemTitleFunction: (element) => "Sites: " + element.closest(".menupop").querySelector("a").innerText + " - " + element.innerText, itemUrlFunction: (element) => element.href + }, + { + detectType: "dom", + detectSelector: "#ct-edit-template-builder", + itemTitleFunction: () => "Edit with Oxygen", + itemUrlFunction: (element) => element.href, + noCache: true + }, + { + detectType: "dom", + detectSelector: ".oxygen-back-to-wp-menu .oxygen-toolbar-button-dropdown a:not(:last-of-type)", + itemTitleFunction: (element) => "Back to WP: " + element.textContent, + itemUrlFunction: (element) => { + if (element.href) { + return element.href; + } else { + let url = new URL(window.location.href); + return url.origin + url.pathname; + } + }, + noCache: true } ]); extraItems.forEach((item) => { @@ -1547,24 +1973,78 @@ this.home = ""; this.loginUrl = ""; this.apiLinkUrl = ""; - this.getUrls(); + } + async completeInit() { this.previousUrl = window.localStorage.getItem("ta-palette-data-site"); + this.siteUrl = window.localStorage.getItem("ta-palette-data-siteurl"); + this.home = window.localStorage.getItem("ta-palette-data-home"); + this.isBackend = this.getIsBackend(); + await this.getUrls(); this.siteChanged = this.home !== this.previousUrl; - this.isBackend = this.isBackend(); window.localStorage.setItem("ta-palette-data-site", this.home); } - isBackend() { + getIsBackend() { return document.body.classList.contains("wp-admin"); } - getUrls() { + ensureTrailingSlash(url) { + if (url.endsWith("/")) { + return url; + } else { + return url + "/"; + } + } + async testUrl(url, responseUrlMustContain = "") { + const init = { + method: "HEAD", + mode: "cors", + cache: "no-cache", + credentials: "same-origin" + }; + const response = await fetch(url, init); + if (response.redirected && !response.url.includes(responseUrlMustContain)) { + return false; + } + if (!response.ok) { + return false; + } + return response.url; + } + async findWhichUrlWorks(urls, responseUrlMustContain = "") { + let workingUrl = false; + let result; + for (let i = 0; i < urls.length; i++) { + if (workingUrl) + continue; + result = await this.testUrl(urls[i], responseUrlMustContain); + if (result !== false) { + workingUrl = result; + } + } + return workingUrl; + } + async guessSiteUrlFromHome(homeUrl) { + const homeWithSlash = this.ensureTrailingSlash(homeUrl); + return homeWithSlash + "wp-admin/"; + } + async guessHome() { + const currentUrl = new URL(window.location); + const origin = this.ensureTrailingSlash(currentUrl.origin); + return origin; + } + guessHomeFromSiteUrl(siteUrl) { + return siteUrl.replace(/wp-admin\/?/, ""); + } + async getUrls() { const apiLink = document.querySelector('link[rel="https://api.w.org/"]'); if (apiLink) { this.apiLinkUrl = apiLink.href; } - if (this.isBackend()) { + if (this.isBackend) { this.siteUrl = window.location.href.match(/(^.*wp-admin)/)[1]; this.home = document.getElementById("wp-admin-bar-site-name").querySelector("a").href; - } else { + window.localStorage.setItem("ta-palette-data-siteurl", this.siteUrl); + window.localStorage.setItem("ta-palette-data-home", this.home); + } else if (!this.siteUrl || !this.home) { if (document.getElementById("wpadminbar")) { this.siteUrl = document.getElementById("wp-admin-bar-dashboard").querySelector("a").href; if (this.apiLinkUrl) { @@ -1575,7 +2055,7 @@ this.home = this.apiLinkUrl.replace(/index.php\?rest_route.*/, ""); } } else { - this.home = this.siteUrl.replace(/wp-admin\/?/, ""); + this.home = this.guessHomeFromSiteUrl(this.siteUrl); } } else { if (this.apiLinkUrl) { @@ -1585,12 +2065,25 @@ if (this.apiLinkUrl.includes("index.php?rest_route")) { this.home = this.apiLinkUrl.replace(/index.php\?rest_route.*/, ""); } - this.siteUrl = this.home + "wp-admin/"; + if (this.home) { + this.siteUrl = await this.guessSiteUrlFromHome(this.home); + } else { + this.siteUrl = this.guessSiteUrl(); + } + } else { + this.home = await this.guessHome(); + if (this.home) { + this.siteUrl = await this.guessSiteUrlFromHome(this.home); + } } } } - this.siteUrl = this.siteUrl.replace(/(.+)\/$/, "$1"); - this.home = this.home.replace(/(.+)\/$/, "$1"); + if (this.siteUrl) { + this.siteUrl = this.siteUrl.replace(/(.+)\/$/, "$1"); + } + if (this.home) { + this.home = this.home.replace(/(.+)\/$/, "$1"); + } } }; var class_wp_default = Wp; @@ -1603,21 +2096,29 @@ console.log("Weird. Turbo Admin could not find any settings"); return; } - document.addEventListener("DOMContentLoaded", (e) => { - turboAdmin = new class_turbo_admin_default(globalThis.turboAdminOptions); - }); globalThis.turboAdminOptions = settings[taStorageKey]; globalThis.taWp = new class_wp_default(); + await globalThis.taWp.completeInit(); + console.log("Turbo Admin: WP is initialised"); globalThis.contentApi = new class_content_api_default(); await globalThis.contentApi.discoverApiRoot(); + console.log("Turbo Admin: Content API is initialised"); globalThis.turboAdmin = new class_turbo_admin_default(globalThis.turboAdminOptions); + await globalThis.turboAdmin.init(); + if (settings[taStorageKey]["hide-notices"]) { + globalThis.turboAdminWpNotices = new class_turbo_admin_wp_notices_default(settings[taStorageKey].rememberedNoticeIds); + } } document.addEventListener("DOMContentLoaded", async (e) => { globalThis.turboAdminOptions = {}; globalThis.turboAdminOptions[taStorageKey] = { shortcutKeys: globalThis.wpTurboAdmin.keys, "block-editor-fullscreen-disable": false, - "block-editor-welcome-screen-kill": false + "block-editor-welcome-screen-kill": false, + "live-dev-notice": false, + "list-table-keyboard-shortcuts": globalThis.wpTurboAdmin["listTableShortcuts"] === "1", + "hide-notices": globalThis.wpTurboAdmin["hideNotices"] === "1", + rememberedNoticeIds: JSON.parse(window.localStorage.getItem("rememberedNoticeIds")) ?? new Array() }; await taInit(globalThis.turboAdminOptions); }); diff --git a/dist/main.min.js.map b/dist/main.min.js.map index 62c13fe..4e775a1 100644 --- a/dist/main.min.js.map +++ b/dist/main.min.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../src/fuse-6.4.6.js", "../src/class-turbo-admin-palette.js", "../src/class-turbo-admin-menu-item.js", "../src/class-storage.js", "../src/class-content-api.js", "../src/class-turbo-admin-wp-block-editor-fullscreen-kill.js", "../src/class-turbo-admin-wp-block-editor-welcome-guide-kill.js", "../src/class-turbo-admin.js", "../src/class-wp.js", "../src/main.js"], - "sourcesContent": ["/**\n * Fuse.js v6.4.6 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2021 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\nvar e, t; e = this, t = function () { \"use strict\"; function e(t) { return (e = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e })(t) } function t(e, t) { if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\") } function n(e, t) { for (var n = 0; n < t.length; n++) { var r = t[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) } } function r(e, t, r) { return t && n(e.prototype, t), r && n(e, r), e } function i(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function o(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); t && (r = r.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), n.push.apply(n, r) } return n } function c(e) { for (var t = 1; t < arguments.length; t++) { var n = null != arguments[t] ? arguments[t] : {}; t % 2 ? o(Object(n), !0).forEach((function (t) { i(e, t, n[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : o(Object(n)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)) })) } return e } function a(e, t) { if (\"function\" != typeof t && null !== t) throw new TypeError(\"Super expression must either be null or a function\"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && u(e, t) } function s(e) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } function u(e, t) { return (u = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function h(e, t) { return !t || \"object\" != typeof t && \"function\" != typeof t ? function (e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e }(e) : t } function f(e) { var t = function () { if (\"undefined\" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if (\"function\" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, r = s(e); if (t) { var i = s(this).constructor; n = Reflect.construct(r, arguments, i) } else n = r.apply(this, arguments); return h(this, n) } } function l(e) { return function (e) { if (Array.isArray(e)) return d(e) }(e) || function (e) { if (\"undefined\" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || function (e, t) { if (e) { if (\"string\" == typeof e) return d(e, t); var n = Object.prototype.toString.call(e).slice(8, -1); return \"Object\" === n && e.constructor && (n = e.constructor.name), \"Map\" === n || \"Set\" === n ? Array.from(e) : \"Arguments\" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? d(e, t) : void 0 } }(e) || function () { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\") }() } function d(e, t) { (null == t || t > e.length) && (t = e.length); for (var n = 0, r = new Array(t); n < t; n++)r[n] = e[n]; return r } function v(e) { return Array.isArray ? Array.isArray(e) : \"[object Array]\" === b(e) } function g(e) { return \"string\" == typeof e } function y(e) { return \"number\" == typeof e } function p(e) { return !0 === e || !1 === e || function (e) { return m(e) && null !== e }(e) && \"[object Boolean]\" == b(e) } function m(t) { return \"object\" === e(t) } function k(e) { return null != e } function M(e) { return !e.trim().length } function b(e) { return null == e ? void 0 === e ? \"[object Undefined]\" : \"[object Null]\" : Object.prototype.toString.call(e) } var x = function (e) { return \"Invalid value for key \".concat(e) }, L = function (e) { return \"Pattern length exceeds max of \".concat(e, \".\") }, S = Object.prototype.hasOwnProperty, w = function () { function e(n) { var r = this; t(this, e), this._keys = [], this._keyMap = {}; var i = 0; n.forEach((function (e) { var t = _(e); i += t.weight, r._keys.push(t), r._keyMap[t.id] = t, i += t.weight })), this._keys.forEach((function (e) { e.weight /= i })) } return r(e, [{ key: \"get\", value: function (e) { return this._keyMap[e] } }, { key: \"keys\", value: function () { return this._keys } }, { key: \"toJSON\", value: function () { return JSON.stringify(this._keys) } }]), e }(); function _(e) { var t = null, n = null, r = null, i = 1; if (g(e) || v(e)) r = e, t = O(e), n = j(e); else { if (!S.call(e, \"name\")) throw new Error(function (e) { return \"Missing \".concat(e, \" property in key\") }(\"name\")); var o = e.name; if (r = o, S.call(e, \"weight\") && (i = e.weight) <= 0) throw new Error(function (e) { return \"Property 'weight' in key '\".concat(e, \"' must be a positive integer\") }(o)); t = O(o), n = j(o) } return { path: t, id: n, weight: i, src: r } } function O(e) { return v(e) ? e : e.split(\".\") } function j(e) { return v(e) ? e.join(\".\") : e } var A = c({}, { isCaseSensitive: !1, includeScore: !1, keys: [], shouldSort: !0, sortFn: function (e, t) { return e.score === t.score ? e.idx < t.idx ? -1 : 1 : e.score < t.score ? -1 : 1 } }, {}, { includeMatches: !1, findAllMatches: !1, minMatchCharLength: 1 }, {}, { location: 0, threshold: .6, distance: 100 }, {}, { useExtendedSearch: !1, getFn: function (e, t) { var n = [], r = !1; return function e(t, i, o) { if (k(t)) if (i[o]) { var c = t[i[o]]; if (!k(c)) return; if (o === i.length - 1 && (g(c) || y(c) || p(c))) n.push(function (e) { return null == e ? \"\" : function (e) { if (\"string\" == typeof e) return e; var t = e + \"\"; return \"0\" == t && 1 / e == -1 / 0 ? \"-0\" : t }(e) }(c)); else if (v(c)) { r = !0; for (var a = 0, s = c.length; a < s; a += 1)e(c[a], i, o + 1) } else i.length && e(c, i, o + 1) } else n.push(t) }(e, g(t) ? t.split(\".\") : t, 0), r ? n : n[0] }, ignoreLocation: !1, ignoreFieldNorm: !1 }), I = /[^ ]+/g; function C() { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 3, t = new Map, n = Math.pow(10, e); return { get: function (e) { var r = e.match(I).length; if (t.has(r)) return t.get(r); var i = 1 / Math.sqrt(r), o = parseFloat(Math.round(i * n) / n); return t.set(r, o), o }, clear: function () { t.clear() } } } var E = function () { function e() { var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, r = n.getFn, i = void 0 === r ? A.getFn : r; t(this, e), this.norm = C(3), this.getFn = i, this.isCreated = !1, this.setIndexRecords() } return r(e, [{ key: \"setSources\", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; this.docs = e } }, { key: \"setIndexRecords\", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; this.records = e } }, { key: \"setKeys\", value: function () { var e = this, t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; this.keys = t, this._keysMap = {}, t.forEach((function (t, n) { e._keysMap[t.id] = n })) } }, { key: \"create\", value: function () { var e = this; !this.isCreated && this.docs.length && (this.isCreated = !0, g(this.docs[0]) ? this.docs.forEach((function (t, n) { e._addString(t, n) })) : this.docs.forEach((function (t, n) { e._addObject(t, n) })), this.norm.clear()) } }, { key: \"add\", value: function (e) { var t = this.size(); g(e) ? this._addString(e, t) : this._addObject(e, t) } }, { key: \"removeAt\", value: function (e) { this.records.splice(e, 1); for (var t = e, n = this.size(); t < n; t += 1)this.records[t].i -= 1 } }, { key: \"getValueForItemAtKeyId\", value: function (e, t) { return e[this._keysMap[t]] } }, { key: \"size\", value: function () { return this.records.length } }, { key: \"_addString\", value: function (e, t) { if (k(e) && !M(e)) { var n = { v: e, i: t, n: this.norm.get(e) }; this.records.push(n) } } }, { key: \"_addObject\", value: function (e, t) { var n = this, r = { i: t, $: {} }; this.keys.forEach((function (t, i) { var o = n.getFn(e, t.path); if (k(o)) if (v(o)) !function () { for (var e = [], t = [{ nestedArrIndex: -1, value: o }]; t.length;) { var c = t.pop(), a = c.nestedArrIndex, s = c.value; if (k(s)) if (g(s) && !M(s)) { var u = { v: s, i: a, n: n.norm.get(s) }; e.push(u) } else v(s) && s.forEach((function (e, n) { t.push({ nestedArrIndex: n, value: e }) })) } r.$[i] = e }(); else if (!M(o)) { var c = { v: o, n: n.norm.get(o) }; r.$[i] = c } })), this.records.push(r) } }, { key: \"toJSON\", value: function () { return { keys: this.keys, records: this.records } } }]), e }(); function $(e, t) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = n.getFn, i = void 0 === r ? A.getFn : r, o = new E({ getFn: i }); return o.setKeys(e.map(_)), o.setSources(t), o.create(), o } function R(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = t.errors, r = void 0 === n ? 0 : n, i = t.currentLocation, o = void 0 === i ? 0 : i, c = t.expectedLocation, a = void 0 === c ? 0 : c, s = t.distance, u = void 0 === s ? A.distance : s, h = t.ignoreLocation, f = void 0 === h ? A.ignoreLocation : h, l = r / e.length; if (f) return l; var d = Math.abs(a - o); return u ? l + d / u : d ? 1 : l } function F() { for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : A.minMatchCharLength, n = [], r = -1, i = -1, o = 0, c = e.length; o < c; o += 1) { var a = e[o]; a && -1 === r ? r = o : a || -1 === r || ((i = o - 1) - r + 1 >= t && n.push([r, i]), r = -1) } return e[o - 1] && o - r >= t && n.push([r, o - 1]), n } function P(e) { for (var t = {}, n = 0, r = e.length; n < r; n += 1) { var i = e.charAt(n); t[i] = (t[i] || 0) | 1 << r - n - 1 } return t } var N = function () { function e(n) { var r = this, i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, o = i.location, c = void 0 === o ? A.location : o, a = i.threshold, s = void 0 === a ? A.threshold : a, u = i.distance, h = void 0 === u ? A.distance : u, f = i.includeMatches, l = void 0 === f ? A.includeMatches : f, d = i.findAllMatches, v = void 0 === d ? A.findAllMatches : d, g = i.minMatchCharLength, y = void 0 === g ? A.minMatchCharLength : g, p = i.isCaseSensitive, m = void 0 === p ? A.isCaseSensitive : p, k = i.ignoreLocation, M = void 0 === k ? A.ignoreLocation : k; if (t(this, e), this.options = { location: c, threshold: s, distance: h, includeMatches: l, findAllMatches: v, minMatchCharLength: y, isCaseSensitive: m, ignoreLocation: M }, this.pattern = m ? n : n.toLowerCase(), this.chunks = [], this.pattern.length) { var b = function (e, t) { r.chunks.push({ pattern: e, alphabet: P(e), startIndex: t }) }, x = this.pattern.length; if (x > 32) { for (var L = 0, S = x % 32, w = x - S; L < w;)b(this.pattern.substr(L, 32), L), L += 32; if (S) { var _ = x - 32; b(this.pattern.substr(_), _) } } else b(this.pattern, 0) } } return r(e, [{ key: \"searchIn\", value: function (e) { var t = this.options, n = t.isCaseSensitive, r = t.includeMatches; if (n || (e = e.toLowerCase()), this.pattern === e) { var i = { isMatch: !0, score: 0 }; return r && (i.indices = [[0, e.length - 1]]), i } var o = this.options, c = o.location, a = o.distance, s = o.threshold, u = o.findAllMatches, h = o.minMatchCharLength, f = o.ignoreLocation, d = [], v = 0, g = !1; this.chunks.forEach((function (t) { var n = t.pattern, i = t.alphabet, o = t.startIndex, y = function (e, t, n) { var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, i = r.location, o = void 0 === i ? A.location : i, c = r.distance, a = void 0 === c ? A.distance : c, s = r.threshold, u = void 0 === s ? A.threshold : s, h = r.findAllMatches, f = void 0 === h ? A.findAllMatches : h, l = r.minMatchCharLength, d = void 0 === l ? A.minMatchCharLength : l, v = r.includeMatches, g = void 0 === v ? A.includeMatches : v, y = r.ignoreLocation, p = void 0 === y ? A.ignoreLocation : y; if (t.length > 32) throw new Error(L(32)); for (var m, k = t.length, M = e.length, b = Math.max(0, Math.min(o, M)), x = u, S = b, w = d > 1 || g, _ = w ? Array(M) : []; (m = e.indexOf(t, S)) > -1;) { var O = R(t, { currentLocation: m, expectedLocation: b, distance: a, ignoreLocation: p }); if (x = Math.min(O, x), S = m + k, w) for (var j = 0; j < k;)_[m + j] = 1, j += 1 } S = -1; for (var I = [], C = 1, E = k + M, $ = 1 << k - 1, P = 0; P < k; P += 1) { for (var N = 0, D = E; N < D;) { var z = R(t, { errors: P, currentLocation: b + D, expectedLocation: b, distance: a, ignoreLocation: p }); z <= x ? N = D : E = D, D = Math.floor((E - N) / 2 + N) } E = D; var K = Math.max(1, b - D + 1), q = f ? M : Math.min(b + D, M) + k, W = Array(q + 2); W[q + 1] = (1 << P) - 1; for (var J = q; J >= K; J -= 1) { var T = J - 1, U = n[e.charAt(T)]; if (w && (_[T] = +!!U), W[J] = (W[J + 1] << 1 | 1) & U, P && (W[J] |= (I[J + 1] | I[J]) << 1 | 1 | I[J + 1]), W[J] & $ && (C = R(t, { errors: P, currentLocation: T, expectedLocation: b, distance: a, ignoreLocation: p })) <= x) { if (x = C, (S = T) <= b) break; K = Math.max(1, 2 * b - S) } } var V = R(t, { errors: P + 1, currentLocation: b, expectedLocation: b, distance: a, ignoreLocation: p }); if (V > x) break; I = W } var B = { isMatch: S >= 0, score: Math.max(.001, C) }; if (w) { var G = F(_, d); G.length ? g && (B.indices = G) : B.isMatch = !1 } return B }(e, n, i, { location: c + o, distance: a, threshold: s, findAllMatches: u, minMatchCharLength: h, includeMatches: r, ignoreLocation: f }), p = y.isMatch, m = y.score, k = y.indices; p && (g = !0), v += m, p && k && (d = [].concat(l(d), l(k))) })); var y = { isMatch: g, score: g ? v / this.chunks.length : 1 }; return g && r && (y.indices = d), y } }]), e }(), D = function () { function e(n) { t(this, e), this.pattern = n } return r(e, [{ key: \"search\", value: function () { } }], [{ key: \"isMultiMatch\", value: function (e) { return z(e, this.multiRegex) } }, { key: \"isSingleMatch\", value: function (e) { return z(e, this.singleRegex) } }]), e }(); function z(e, t) { var n = e.match(t); return n ? n[1] : null } var K = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = e === this.pattern; return { isMatch: t, score: t ? 0 : 1, indices: [0, this.pattern.length - 1] } } }], [{ key: \"type\", get: function () { return \"exact\" } }, { key: \"multiRegex\", get: function () { return /^=\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^=(.*)$/ } }]), i }(D), q = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = -1 === e.indexOf(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"inverse-exact\" } }, { key: \"multiRegex\", get: function () { return /^!\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^!(.*)$/ } }]), i }(D), W = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = e.startsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, this.pattern.length - 1] } } }], [{ key: \"type\", get: function () { return \"prefix-exact\" } }, { key: \"multiRegex\", get: function () { return /^\\^\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^\\^(.*)$/ } }]), i }(D), J = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = !e.startsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"inverse-prefix-exact\" } }, { key: \"multiRegex\", get: function () { return /^!\\^\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^!\\^(.*)$/ } }]), i }(D), T = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = e.endsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [e.length - this.pattern.length, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"suffix-exact\" } }, { key: \"multiRegex\", get: function () { return /^\"(.*)\"\\$$/ } }, { key: \"singleRegex\", get: function () { return /^(.*)\\$$/ } }]), i }(D), U = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = !e.endsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"inverse-suffix-exact\" } }, { key: \"multiRegex\", get: function () { return /^!\"(.*)\"\\$$/ } }, { key: \"singleRegex\", get: function () { return /^!(.*)\\$$/ } }]), i }(D), V = function (e) { a(i, e); var n = f(i); function i(e) { var r, o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, c = o.location, a = void 0 === c ? A.location : c, s = o.threshold, u = void 0 === s ? A.threshold : s, h = o.distance, f = void 0 === h ? A.distance : h, l = o.includeMatches, d = void 0 === l ? A.includeMatches : l, v = o.findAllMatches, g = void 0 === v ? A.findAllMatches : v, y = o.minMatchCharLength, p = void 0 === y ? A.minMatchCharLength : y, m = o.isCaseSensitive, k = void 0 === m ? A.isCaseSensitive : m, M = o.ignoreLocation, b = void 0 === M ? A.ignoreLocation : M; return t(this, i), (r = n.call(this, e))._bitapSearch = new N(e, { location: a, threshold: u, distance: f, includeMatches: d, findAllMatches: g, minMatchCharLength: p, isCaseSensitive: k, ignoreLocation: b }), r } return r(i, [{ key: \"search\", value: function (e) { return this._bitapSearch.searchIn(e) } }], [{ key: \"type\", get: function () { return \"fuzzy\" } }, { key: \"multiRegex\", get: function () { return /^\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^(.*)$/ } }]), i }(D), B = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { for (var t, n = 0, r = [], i = this.pattern.length; (t = e.indexOf(this.pattern, n)) > -1;)n = t + i, r.push([t, n - 1]); var o = !!r.length; return { isMatch: o, score: o ? 0 : 1, indices: r } } }], [{ key: \"type\", get: function () { return \"include\" } }, { key: \"multiRegex\", get: function () { return /^'\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^'(.*)$/ } }]), i }(D), G = [K, B, W, J, U, T, q, V], H = G.length, Q = / +(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/; function X(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return e.split(\"|\").map((function (e) { for (var n = e.trim().split(Q).filter((function (e) { return e && !!e.trim() })), r = [], i = 0, o = n.length; i < o; i += 1) { for (var c = n[i], a = !1, s = -1; !a && ++s < H;) { var u = G[s], h = u.isMultiMatch(c); h && (r.push(new u(h, t)), a = !0) } if (!a) for (s = -1; ++s < H;) { var f = G[s], l = f.isSingleMatch(c); if (l) { r.push(new f(l, t)); break } } } return r })) } var Y = new Set([V.type, B.type]), Z = function () { function e(n) { var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, i = r.isCaseSensitive, o = void 0 === i ? A.isCaseSensitive : i, c = r.includeMatches, a = void 0 === c ? A.includeMatches : c, s = r.minMatchCharLength, u = void 0 === s ? A.minMatchCharLength : s, h = r.ignoreLocation, f = void 0 === h ? A.ignoreLocation : h, l = r.findAllMatches, d = void 0 === l ? A.findAllMatches : l, v = r.location, g = void 0 === v ? A.location : v, y = r.threshold, p = void 0 === y ? A.threshold : y, m = r.distance, k = void 0 === m ? A.distance : m; t(this, e), this.query = null, this.options = { isCaseSensitive: o, includeMatches: a, minMatchCharLength: u, findAllMatches: d, ignoreLocation: f, location: g, threshold: p, distance: k }, this.pattern = o ? n : n.toLowerCase(), this.query = X(this.pattern, this.options) } return r(e, [{ key: \"searchIn\", value: function (e) { var t = this.query; if (!t) return { isMatch: !1, score: 1 }; var n = this.options, r = n.includeMatches; e = n.isCaseSensitive ? e : e.toLowerCase(); for (var i = 0, o = [], c = 0, a = 0, s = t.length; a < s; a += 1) { var u = t[a]; o.length = 0, i = 0; for (var h = 0, f = u.length; h < f; h += 1) { var d = u[h], v = d.search(e), g = v.isMatch, y = v.indices, p = v.score; if (!g) { c = 0, i = 0, o.length = 0; break } if (i += 1, c += p, r) { var m = d.constructor.type; Y.has(m) ? o = [].concat(l(o), l(y)) : o.push(y) } } if (i) { var k = { isMatch: !0, score: c / i }; return r && (k.indices = o), k } } return { isMatch: !1, score: 1 } } }], [{ key: \"condition\", value: function (e, t) { return t.useExtendedSearch } }]), e }(), ee = []; function te(e, t) { for (var n = 0, r = ee.length; n < r; n += 1) { var i = ee[n]; if (i.condition(e, t)) return new i(e, t) } return new N(e, t) } var ne = \"$and\", re = \"$or\", ie = \"$path\", oe = \"$val\", ce = function (e) { return !(!e[ne] && !e[re]) }, ae = function (e) { return !!e[ie] }, se = function (e) { return !v(e) && m(e) && !ce(e) }, ue = function (e) { return i({}, ne, Object.keys(e).map((function (t) { return i({}, t, e[t]) }))) }; function he(e, t) { var n = t.ignoreFieldNorm, r = void 0 === n ? A.ignoreFieldNorm : n; e.forEach((function (e) { var t = 1; e.matches.forEach((function (e) { var n = e.key, i = e.norm, o = e.score, c = n ? n.weight : null; t *= Math.pow(0 === o && c ? Number.EPSILON : o, (c || 1) * (r ? 1 : i)) })), e.score = t })) } function fe(e, t) { var n = e.matches; t.matches = [], k(n) && n.forEach((function (e) { if (k(e.indices) && e.indices.length) { var n = { indices: e.indices, value: e.value }; e.key && (n.key = e.key.src), e.idx > -1 && (n.refIndex = e.idx), t.matches.push(n) } })) } function le(e, t) { t.score = e.score } function de(e, t) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = n.includeMatches, i = void 0 === r ? A.includeMatches : r, o = n.includeScore, c = void 0 === o ? A.includeScore : o, a = []; return i && a.push(fe), c && a.push(le), e.map((function (e) { var n = e.idx, r = { item: t[n], refIndex: n }; return a.length && a.forEach((function (t) { t(e, r) })), r })) } var ve = function () { function e(n) { var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, i = arguments.length > 2 ? arguments[2] : void 0; t(this, e), this.options = c({}, A, {}, r), this.options.useExtendedSearch, this._keyStore = new w(this.options.keys), this.setCollection(n, i) } return r(e, [{ key: \"setCollection\", value: function (e, t) { if (this._docs = e, t && !(t instanceof E)) throw new Error(\"Incorrect 'index' type\"); this._myIndex = t || $(this.options.keys, this._docs, { getFn: this.options.getFn }) } }, { key: \"add\", value: function (e) { k(e) && (this._docs.push(e), this._myIndex.add(e)) } }, { key: \"remove\", value: function () { for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : function () { return !1 }, t = [], n = 0, r = this._docs.length; n < r; n += 1) { var i = this._docs[n]; e(i, n) && (this.removeAt(n), n -= 1, r -= 1, t.push(i)) } return t } }, { key: \"removeAt\", value: function (e) { this._docs.splice(e, 1), this._myIndex.removeAt(e) } }, { key: \"getIndex\", value: function () { return this._myIndex } }, { key: \"search\", value: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = t.limit, r = void 0 === n ? -1 : n, i = this.options, o = i.includeMatches, c = i.includeScore, a = i.shouldSort, s = i.sortFn, u = i.ignoreFieldNorm, h = g(e) ? g(this._docs[0]) ? this._searchStringList(e) : this._searchObjectList(e) : this._searchLogical(e); return he(h, { ignoreFieldNorm: u }), a && h.sort(s), y(r) && r > -1 && (h = h.slice(0, r)), de(h, this._docs, { includeMatches: o, includeScore: c }) } }, { key: \"_searchStringList\", value: function (e) { var t = te(e, this.options), n = this._myIndex.records, r = []; return n.forEach((function (e) { var n = e.v, i = e.i, o = e.n; if (k(n)) { var c = t.searchIn(n), a = c.isMatch, s = c.score, u = c.indices; a && r.push({ item: n, idx: i, matches: [{ score: s, value: n, norm: o, indices: u }] }) } })), r } }, { key: \"_searchLogical\", value: function (e) { var t = this, n = function (e, t) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = n.auto, i = void 0 === r || r, o = function e(n) { var r = Object.keys(n), o = ae(n); if (!o && r.length > 1 && !ce(n)) return e(ue(n)); if (se(n)) { var c = o ? n[ie] : r[0], a = o ? n[oe] : n[c]; if (!g(a)) throw new Error(x(c)); var s = { keyId: j(c), pattern: a }; return i && (s.searcher = te(a, t)), s } var u = { children: [], operator: r[0] }; return r.forEach((function (t) { var r = n[t]; v(r) && r.forEach((function (t) { u.children.push(e(t)) })) })), u }; return ce(e) || (e = ue(e)), o(e) }(e, this.options), r = this._myIndex.records, i = {}, o = []; return r.forEach((function (e) { var r = e.$, c = e.i; if (k(r)) { var a = function e(n, r, i) { if (!n.children) { var o = n.keyId, c = n.searcher, a = t._findMatches({ key: t._keyStore.get(o), value: t._myIndex.getValueForItemAtKeyId(r, o), searcher: c }); return a && a.length ? [{ idx: i, item: r, matches: a }] : [] } switch (n.operator) { case ne: for (var s = [], u = 0, h = n.children.length; u < h; u += 1) { var f = e(n.children[u], r, i); if (!f.length) return []; s.push.apply(s, l(f)) } return s; case re: for (var d = [], v = 0, g = n.children.length; v < g; v += 1) { var y = e(n.children[v], r, i); if (y.length) { d.push.apply(d, l(y)); break } } return d } }(n, r, c); a.length && (i[c] || (i[c] = { idx: c, item: r, matches: [] }, o.push(i[c])), a.forEach((function (e) { var t, n = e.matches; (t = i[c].matches).push.apply(t, l(n)) }))) } })), o } }, { key: \"_searchObjectList\", value: function (e) { var t = this, n = te(e, this.options), r = this._myIndex, i = r.keys, o = r.records, c = []; return o.forEach((function (e) { var r = e.$, o = e.i; if (k(r)) { var a = []; i.forEach((function (e, i) { a.push.apply(a, l(t._findMatches({ key: e, value: r[i], searcher: n }))) })), a.length && c.push({ idx: o, item: r, matches: a }) } })), c } }, { key: \"_findMatches\", value: function (e) { var t = e.key, n = e.value, r = e.searcher; if (!k(n)) return []; var i = []; if (v(n)) n.forEach((function (e) { var n = e.v, o = e.i, c = e.n; if (k(n)) { var a = r.searchIn(n), s = a.isMatch, u = a.score, h = a.indices; s && i.push({ score: u, key: t, value: n, idx: o, norm: c, indices: h }) } })); else { var o = n.v, c = n.n, a = r.searchIn(o), s = a.isMatch, u = a.score, h = a.indices; s && i.push({ score: u, key: t, value: o, norm: c, indices: h }) } return i } }]), e }(); return ve.version = \"6.4.6\", ve.createIndex = $, ve.parseIndex = function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = t.getFn, r = void 0 === n ? A.getFn : n, i = e.keys, o = e.records, c = new E({ getFn: r }); return c.setKeys(i), c.setIndexRecords(o), c }, ve.config = A, function () { ee.push.apply(ee, arguments) }(Z), ve }, \"object\" == typeof exports && \"undefined\" != typeof module ? module.exports = t() : \"function\" == typeof define && define.amd ? define(t) : (e = e || self).Fuse = t();\n", "/*\n * Some notes on how this works...\n *\n * paletteData is passed into the constructor and is the initial list of items\n * these are TurboAdminMenuItem objects\n *\n * At any point, buildPaletteItems() can be called to turn the paletteData\n * into an array of \"li\" nodes.\n *\n * updatePaletteItems inserts the paletteItems into the \"ul\" list and sets the\n * selectedElement\n *\n * The selectedItem is always one of the paletteItems\n *\n * paletteSearch rebuilds the paletteItems from the paletteData using\n * buildPaletteItems, and then filters the list with FuseJS\n */\n\nimport Fuse from './fuse-6.4.6.js';\nimport TurboAdminMenuItem from './class-turbo-admin-menu-item';\nimport ContentApi from './class-content-api.js';\n\nexport default class TurboAdminPalette {\n\n\tconstructor(paletteData, options) {\n\n\t\tconsole.log('Initialising TurboAdmin');\n\n\t\tthis.options = options;\n\n\t\tthis.paletteElement = document.getElementById('ta-command-palette-container');\n this.paletteInnerElement = document.getElementById('ta-command-palette');\n\t\tthis.paletteInputElement = document.getElementById('ta-command-palette-input');\n\t\tthis.paletteItemsElement = document.getElementById('ta-command-palette-items');\n\n\t\t// Get palette data\n\t\tthis.paletteData = paletteData;\n\n // Get post type data from API\n this.postTypes = [];\n this.fetchPostTypes();\n\n // Set empty contentItems\n this.contentItems = [];\n\n\t\t// Convert into LI elements\n\t\tthis.paletteItems = this.buildPaletteItems();\n\n\t\tthis.selectedItem = this.paletteItems[0];\n this.openedSubMenu = null;\n this.selectedSubItem = null;\n\n\t\t// Add them to the DOM\n\t\tthis.updatePaletteItems();\n\n // Set state\n this.navigating = false;\n this.debouncedUpdateFn = null;\n\n\t\tthis.paletteFuseOptions = [];\n\t\tthis.paletteFuse = null;\n\n\t\tif (typeof (Fuse) !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.paletteFuseOptions = {\n\t\t\tkeys: ['innerText'],\n\t\t}\n\n\t\tthis.paletteFuse = new Fuse(this.paletteItems, this.paletteFuseOptions);\n\n\t\tdocument.addEventListener('keydown', e => this.handleGlobalKey(e));\n\n\t\tthis.paletteInputElement.addEventListener('keydown', e => {\n\t\t\tthis.paletteActions(e);\n\t\t});\n\n\t\tthis.paletteElement.addEventListener('click', e => {\n\t\t\tthis.checkForPaletteItemClick(e);\n this.checkForClickToClose(e);\n\t\t});\n\n this.paletteItemsElement.addEventListener('mouseover', e => {\n this.setHoveredItem(e.target);\n });\n\t}\n\n htmlDecode(input) {\n var doc = new DOMParser().parseFromString(input, \"text/html\");\n return doc.documentElement.textContent;\n }\n\n isMac() {\n return navigator.platform.startsWith('Mac');\n }\n\n metaPressed(e) {\n return this.isMac() ? e.metaKey : e.ctrlKey;\n }\n\n fetchPostTypes() {\n if (! globalThis.contentApi.active) {\n this.postTypes = [];\n return;\n }\n\n globalThis.contentApi.get('types').then(\n response => {\n response.json().then(\n types => {\n this.postTypes = types;\n }\n );\n }\n );\n }\n\n\tbuildPaletteItems() {\n\t\tconst paletteItems = [];\n\n\t\tthis.paletteData.forEach(item => {\n\t\t\tconst li = document.createElement('li');\n\t\t\tconst a = document.createElement('a');\n\t\t\tli.appendChild(a);\n\t\t\ta.href = item.action;\n\t\t\tlet title = item.title;\n\t\t\tif (item.parentTitle) {\n\t\t\t\ttitle = item.parentTitle + \": \" + title;\n\t\t\t}\n\t\t\ta.innerHTML = title;\n\t\t\tpaletteItems.push(li);\n\t\t});\n\n // We'll need this in the loop below.\n const profileLinkElem = document.getElementById('wp-admin-bar-edit-profile');\n let profileLink = null;\n if (profileLinkElem) {\n profileLink = profileLinkElem.querySelector('a').href;\n }\n\n if (this.contentItems && this.contentItems.length > 0) {\n this.contentItems.forEach(item => {\n const type = this.postTypes[item.subtype] ? this.postTypes[item.subtype].name : item.subtype;\n const title = `${item.title} (${type})`;\n\n const li = document.createElement('li');\n const a = document.createElement('a');\n const subMenu = document.createElement('div');\n const subMenuTitle = document.createElement('div');\n const subMenuItems = document.createElement('ul');\n subMenu.classList.add('ta-submenu');\n subMenuTitle.classList.add('ta-submenu-title');\n\n subMenuTitle.textContent = this.htmlDecode(title);\n subMenuItems.classList.add('ta-submenu-items');\n subMenu.appendChild(subMenuTitle);\n subMenu.appendChild(subMenuItems);\n\n const subMenuItem1 = document.createElement('li');\n const subMenuLink1 = document.createElement('a');\n subMenuLink1.innerText = \"View\";\n subMenuLink1.href = item.url;\n subMenuItem1.appendChild(subMenuLink1);\n subMenuItems.appendChild(subMenuItem1);\n\n if (profileLink) {\n // Need to get edit URL. This seems like the best way for now.\n const editLink = profileLink.replace('profile.php', `post.php?post=${item.id}&action=edit`);\n\n const subMenuItem2 = document.createElement('li');\n const subMenuLink2 = document.createElement('a');\n subMenuLink2.innerText = \"Edit\";\n subMenuLink2.href = editLink;\n subMenuItem2.appendChild(subMenuLink2);\n subMenuItems.appendChild(subMenuItem2);\n }\n\n const subMenuItem3 = document.createElement('li');\n const subMenuLink3 = document.createElement('a');\n subMenuLink3.innerText = \"Copy link\";\n // Because this is an href we're setting it gets URI encoded!\n subMenuLink3.href = item.url;\n subMenuLink3.setAttribute('data-action', 'clipboard');\n subMenuItem3.appendChild(subMenuLink3);\n subMenuItems.appendChild(subMenuItem3);\n\n\n li.classList.add('ta-has-child-menu');\n\n li.appendChild(a);\n li.appendChild(subMenu);\n\n a.href = item.url;\n a.innerHTML = title;\n paletteItems.push(li);\n })\n }\n\n\t\treturn paletteItems;\n\t}\n\n\thandleGlobalKey(e) {\n\t\tif (this.shortcutKeysPressed(e)) {\n\t\t\tif (this.paletteShown()) {\n\t\t\t\tthis.hidePalette();\n\t\t\t} else {\n\t\t\t\tthis.showPalette();\n\t\t\t}\n\t\t}\n\n\t\tif (e.code === 'Escape' && this.paletteShown()) {\n\t\t\tif (this.isSubMenuOpen()){\n this.closeSubMenu();\n } else {\n this.hidePalette();\n }\n\t\t}\n\t\t// Disable keyUp and keyDown if palette shown\n // Arrow\n\t\tif ((e.code === 'ArrowUp'\n || e.code === 'ArrowDown'\n || e.code === 'Enter') && this.paletteShown()) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tshortcutKeysPressed(keyEvent) {\n // The reduce here works through all the different possible key combos\n // (more than one can be specified in options)\n\t\tconst keysPressed = this.options.shortcutKeys.reduce(\n\t\t\t(keyPressed, combo) => {\n\t\t\t\tif (keyPressed) {\n\t\t\t\t\treturn keyPressed;\n\t\t\t\t}\n return ((!navigator.platform.startsWith('Mac')) || (combo.meta === keyEvent.metaKey))\n && (combo.alt === keyEvent.altKey)\n && (combo.shift === keyEvent.shiftKey)\n && (combo.ctrl === keyEvent.ctrlKey)\n && (\n keyEvent.code === 'Key' + combo.key.toUpperCase()\n || (combo.key === ' ' && keyEvent.code.toUpperCase() === 'SPACE')\n );\n }, false);\n\t\treturn keysPressed;\n\t}\n\n debouncedPaletteSearchAndUpdate() {\n if (null === this.debouncedUpdateFn) {\n this.debouncedUpdateFn = this.debounce(this.paletteSearchAndUpdate)\n }\n this.debouncedUpdateFn();\n }\n\n debounce(fn) {\n // Setup a timer\n var timeout;\n\n // Return a function to run debounced\n return function () {\n\n // Setup the arguments\n var context = this;\n var args = arguments;\n\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup the new requestAnimationFrame()\n timeout = window.requestAnimationFrame(function () {\n fn.apply(context, args);\n });\n\n }\n\n };\n\n\tpaletteActions(e) {\n\t\tif (e.code === 'ArrowDown' && this.paletteShown()) {\n\t\t\te.preventDefault();\n\t\t\tthis.moveDown();\n\t\t\treturn;\n\t\t}\n\t\tif (e.code === 'ArrowUp' && this.paletteShown()) {\n\t\t\te.preventDefault();\n\t\t\tthis.moveUp();\n\t\t\treturn;\n\t\t}\n\t\tif (e.code === 'Enter' && this.paletteShown()) {\n this.doAction(this.metaPressed(e));\n return;\n\t\t}\n\t\tthis.paletteSearchAndUpdate();\n\t}\n\n\tshowPalette() {\n\t\tthis.paletteInputElement.value = '';\n\t\tthis.paletteElement?.classList.add('active');\n\t\tthis.paletteInputElement?.focus();\n\t}\n\n\thidePalette() {\n this.navigating = false;\n\t\tthis.paletteElement?.classList.remove('active');\n if (this.isSubMenuOpen()) {\n this.closeSubMenu();\n }\n\t}\n\n\tpaletteShown() {\n\t\treturn this.paletteElement?.classList.contains('active');\n\t}\n\n checkForPaletteItemClick(e) {\n if (e.target.tagName === 'A') {\n e.preventDefault();\n if (this.isSubMenuOpen()) {\n this.selectedSubItem = e.target.closest('li');\n } else {\n this.selectedItem = e.target.closest('li');\n }\n this.setSelectedElement();\n\n this.doAction(this.metaPressed(e));\n }\n }\n\n\tcheckForClickToClose(e) {\n\t\tif (e.target.id === this.paletteElement.id) {\n\t\t\tthis.hidePalette();\n\t\t}\n\t}\n\n\tsetSelectedElement() {\n if (this.isSubMenuOpen()) {\n this.paletteItemsElement?.querySelectorAll('.ta-submenu.active li.selected')?.forEach(e => e.classList.remove('selected'));\n this.selectedSubItem.classList.add('selected');\n } else {\n this.paletteItemsElement?.querySelectorAll('li.selected')?.forEach(e => e.classList.remove('selected'));\n if (this.selectedItem) {\n this.selectedItem.classList.add('selected');\n this.scrollList();\n }\n }\n\t}\n\n\tscrollList() {\n\t\t// Scrolling up\n\t\tif (this.selectedItem.offsetTop < this.paletteItemsElement.scrollTop) {\n\t\t\tthis.paletteItemsElement.scrollTop = this.selectedItem.offsetTop;\n\t\t}\n\t\t// Scrolling down\n\t\tif (this.selectedItem.offsetTop + this.selectedItem.offsetHeight > this.paletteItemsElement.offsetHeight + this.paletteItemsElement.scrollTop) {\n\t\t\tthis.paletteItemsElement.scrollTop = this.selectedItem.offsetTop + this.selectedItem.offsetHeight - this.paletteItemsElement.offsetHeight;\n\t\t}\n\t}\n\n setHoveredItem(element) {\n // Only do this for li's\n if ('LI' === element.tagName) {\n this.navigating = true;\n if (this.isSubMenuOpen()) {\n this.selectedSubItem = element;\n } else {\n this.selectedItem = element;\n }\n this.setSelectedElement();\n }\n }\n\n\tmoveDown() {\n if (this.isSubMenuOpen()) {\n const nextItem = this.selectedSubItem.nextElementSibling;\n this.navigating = true;\n if (nextItem) {\n this.selectedSubItem = nextItem;\n this.setSelectedElement();\n }\n } else {\n const nextItem = this.selectedItem.nextElementSibling;\n this.navigating = true;\n if (nextItem) {\n this.selectedItem = nextItem;\n this.setSelectedElement();\n }\n }\n\t}\n\n\tmoveUp() {\n if (this.isSubMenuOpen()) {\n const prevItem = this.selectedSubItem.previousElementSibling;\n this.navigating = true;\n if (prevItem) {\n this.selectedSubItem = prevItem;\n this.setSelectedElement();\n }\n } else {\n const prevItem = this.selectedItem.previousElementSibling;\n this.navigating = true;\n if (prevItem) {\n this.selectedItem = prevItem;\n this.setSelectedElement();\n }\n }\n }\n\n isSubMenuOpen() {\n return null !== this.openedSubMenu;\n }\n\n openSubMenu(subMenuElement) {\n // Set height in case main menu is smaller than sub menu\n const subMenuHeight = subMenuElement.offsetHeight;\n this.paletteItemsElement.style.minHeight = subMenuHeight + \"px\";\n subMenuElement.classList.add('active');\n this.selectedSubItem = subMenuElement.querySelector('li');\n this.openedSubMenu = subMenuElement;\n this.setSelectedElement();\n }\n\n closeSubMenu(subMenuElement = null) {\n if (null === subMenuElement) {\n subMenuElement = document.querySelector('.ta-submenu.active');\n }\n subMenuElement.classList.remove('active');\n this.selectedSubItem.classList.remove('active');\n this.paletteItemsElement.style.minHeight = 'auto';\n this.selectedSubItem = null;\n this.openedSubMenu = null;\n }\n\n\tdoAction(metaPressed = false) {\n if (this.isSubMenuOpen()) {\n this.actOnItem(this.selectedSubItem, metaPressed);\n return;\n }\n if (this.selectedItem.classList.contains('ta-has-child-menu')) {\n const subMenu = this.selectedItem.querySelector('.ta-submenu');\n this.openSubMenu(subMenu);\n return;\n }\n\n this.actOnItem(this.selectedItem, metaPressed);\n }\n\n actOnItem(item, metaPressed) {\n this.hidePalette();\n const link = item.querySelector('a');\n const url = link.href;\n\n if ('clipboard' === link.dataset.action) {\n navigator.clipboard.writeText(url);\n return;\n }\n\n if (metaPressed) {\n window.open(url, '_blank');\n } else {\n window.location = url;\n }\n }\n\n\tselectedItemDisplayed() {\n\t\treturn Array.from(this.paletteItemsElement.childNodes).includes(this.selectedItem);\n\t}\n\n\tasync paletteSearchAndUpdate() {\n\t\tawait this.paletteSearch();\n\t\tthis.updatePaletteItems();\n\t}\n\n\tasync paletteSearch() {\n // Don't search everything!\n if (globalThis.contentApi.active && this.paletteInputElement.value.length > 2) {\n this.paletteInnerElement.classList.add('loading');\n const response = await globalThis.contentApi.get('search', { search: this.paletteInputElement.value, per_page: 100 });\n this.contentItems = await response.json();\n this.paletteInnerElement.classList.remove('loading');\n // console.log(this.contentItems)\n } else {\n this.contentItems = [];\n }\n\n this.paletteItems = this.buildPaletteItems();\n\n\t\tif (this.paletteInputElement.value !== '') {\n // Reset the search to work on the new items\n this.paletteFuse = new Fuse(this.paletteItems, this.paletteFuseOptions);\n\t\t\tthis.paletteItems = this.paletteFuse.search(this.paletteInputElement.value).map(i => i.item);\n\t\t}\n\t}\n\n\tupdatePaletteItems() {\n\t\tconst newItems = document.createElement('ul');\n\t\tnewItems.id = 'ta-command-palette-items';\n\n\t\tthis.paletteItems.forEach(i => {\n\t\t\tnewItems.appendChild(i);\n\t\t})\n\n\t\tthis.paletteItemsElement.replaceChildren(...newItems.children);\n\n\t\tif (!this.navigating || !this.selectedItemDisplayed()) {\n\t\t\tthis.selectedItem = this.paletteItems[0];\n\t\t}\n\n\t\tthis.setSelectedElement();\n\t}\n\n}\n", "export default class TurboAdminMenuItem {\n\n\tconstructor(title, action, parentTitle, noCache = false) {\n\t\tthis.title = title;\n\t\tthis.action = action;\n\t\tthis.parentTitle = parentTitle;\n this.noCache = noCache;\n\t}\n\n sameAs(item) {\n return item.title === this.title &&\n item.action === this.action &&\n item.parentTitle === this.parentTitle;\n }\n}\n", "export default class Storage {\n\n constructor() {\n if ('undefined' === typeof (browser)) {\n this.store = window.localStorage;\n } else {\n this.store = browser.storage.local;\n }\n }\n\n async set(dataObject) {\n if ('undefined' === typeof (browser)) {\n const keys = Object.keys(dataObject);\n keys.forEach(key => this.store.setItem(key, JSON.stringify(dataObject[key])));\n } else {\n await this.store.set(dataObject);\n }\n }\n\n async get(key) {\n if ('undefined' === typeof (browser)) {\n let returnObj = {};\n let item = this.store.getItem(key);\n if (! item) {\n return returnObj;\n }\n let itemObject = null;\n try {\n itemObject = JSON.parse(this.store.getItem(key));\n } catch (e) {\n itemObject = null;\n }\n returnObj[key] = itemObject;\n return returnObj;\n } else {\n return await this.store.get(key);\n }\n }\n\n}\n", "import Storage from './class-storage.js';\n\nexport default class ContentApi {\n\n constructor() {\n // this.discoverApiRoot().then(e => null);\n // console.log('Discovered API base: ', this.apiBase);\n this.active = false;\n this.store = new Storage();\n }\n\n async discoverApiRoot() {\n let wpApiSettings = null;\n this.storageKey = 'wpApiSettings.' + globalThis.taWp.home;\n\n // Could be in the wp-api-request-js-extra (on wp-admin side)\n const wpApiSettingsScript = document.getElementById('wp-api-request-js-extra');\n if (wpApiSettingsScript) {\n const wpApiSettingsString = wpApiSettingsScript.innerHTML.match(/var\\s+wpApiSettings\\s+=\\s+(.+);/)[1];\n const wpApiSettings = JSON.parse(wpApiSettingsString);\n const objectToSave = {};\n objectToSave[this.storageKey] = wpApiSettings;\n await this.store.set(objectToSave);\n this.apiRoot = wpApiSettings.root;\n this.apiBase = this.apiRoot + wpApiSettings.versionString;\n this.apiNonce = wpApiSettings.nonce;\n // Clear the nonce if one is set and we're not logged in\n this.maybeExpireNonce(wpApiSettings);\n this.active = true;\n return;\n }\n\n // Getting from extension storage returns a object with the key\n // as the key. Which is weird.\n wpApiSettings = await this.store.get(this.storageKey);\n if (wpApiSettings\n && Object.keys(wpApiSettings).length !== 0\n && wpApiSettings[this.storageKey]\n && 'object' === typeof(wpApiSettings[this.storageKey])) {\n // Get the key'ed item out of the object\n wpApiSettings = wpApiSettings[this.storageKey];\n this.apiRoot = wpApiSettings.root;\n this.apiBase = this.apiRoot + wpApiSettings.versionString;\n this.apiNonce = wpApiSettings.nonce;\n // Clear the nonce if one is set and we're not logged in\n this.maybeExpireNonce(wpApiSettings);\n this.active = true;\n return;\n }\n\n // Could be in \n if (globalThis.taWp.apiLinkUrl) {\n this.apiRoot = globalThis.taWp.apiLinkUrl;\n // Just guess this\n this.apiBase = this.apiRoot + 'wp/v2/';\n this.active = true;\n return;\n }\n }\n\n userLoggedIn() {\n return document.body.classList.contains('logged-in') ||\n document.body.classList.contains('wp-admin');\n }\n\n async maybeExpireNonce(wpApiSettings) {\n if (wpApiSettings?.nonce && ! this.userLoggedIn()) {\n // Clear apiSetting nonce\n this.apiNonce = null;\n wpApiSettings.nonce = null;\n const objectToSave = {};\n objectToSave[this.storageKey] = wpApiSettings;\n await this.store.set(objectToSave);\n }\n }\n\n makeParamString(data) {\n const params = new URLSearchParams();\n\n Object.keys(data).forEach(paramKey => {\n params.append(paramKey, data[paramKey]);\n });\n\n return params.toString();\n }\n\n async get(path, data = {}) {\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n }\n\n // Add the nonce if there is one\n if (this.apiNonce) {\n data._wpnonce = this.apiNonce;\n }\n\n const params = this.makeParamString(data);\n\n const response = await fetch(`${this.apiBase}${path}/?${params}`);\n\n return response;\n }\n\n}\n", "/**\n * It's impossible to change the setting to off, because the\n * extension's content script runs in a sandbox and can't access\n * the wp object. But we can just toggle the class every time.\n */\nexport default class TurboAdminWpBlockEditorFullscreenKill {\n\n constructor() {\n // This needs a slight delay as it needs to happen after the editor\n // is initialised\n setTimeout(() => {\n document.body.classList.remove('is-fullscreen-mode');\n document.body.classList.add('turbo-admin-killed-fullscreen');\n\n const newStyles = document.createElement('style');\n newStyles.innerHTML = \"body.turbo-admin-killed-fullscreen .edit-post-fullscreen-mode-close { display: none; }\";\n document.body.appendChild(newStyles);\n }, 400);\n }\n\n}\n", "/**\n *\n */\nexport default class TurboAdminWpBlockEditorWelcomeGuideKill {\n\n constructor() {\n // This needs a slight delay as it needs to happen after the editor\n // is initialised\n setTimeout(() => {\n const welcomeGuide = document.querySelector('.edit-post-welcome-guide');\n if (welcomeGuide) {\n const closeButton = welcomeGuide.querySelector('.components-modal__header button');\n if (closeButton) {\n closeButton.click();\n }\n }\n }, 400);\n }\n\n}\n", "/*\n * This is the common Turbo Admin library.\n *\n * It's (currently) WordPress-specific, but can be loaded by\n * either the Extension OR the Plugin\n *\n * It takes an options object:\n *\n * options: {\n * shortcutKeys: [\n * // Array of shortcut key definitions, like:\n * {\n * {\n * meta: false,\n * alt: true,\n * ctrl: true,\n * shift: true,\n * key: 'p'\n * }\n * }\n * ],\n * appendToElement {\n * // Optional CSS selector to define what to append the palette to\n * 'body'\n * },\n * extraItems: [\n * // Optional array of extra item configs used to generate new item objects\n * {\n * 'detectType': 'url',\n * 'detectPattern': 'wp-login',\n * 'itemTitle': 'View/visit site',\n * 'itemUrlFunction': () => this.home\n * },\n * ],\n * extraItemsRaw: [\n * // Optional array of raw item objects to be added\n * {\n * 'title': ,\n * 'action': ,\n * 'parentTitle': ,\n * }\n * ]\n * }\n */\nimport TurboAdminPalette from './class-turbo-admin-palette.js';\nimport TurboAdminMenuItem from './class-turbo-admin-menu-item.js';\nimport TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js';\nimport TurboAdminWpBlockEditorWelcomeGuideKill from './class-turbo-admin-wp-block-editor-welcome-guide-kill.js';\n\nexport default class TurboAdmin {\n\n constructor(options) {\n if (document.getElementById('ta-command-palette-container')) {\n console.log('TurboAdmin already initialised - I won\\'t make a second copy!');\n return;\n }\n\n this.options = options;\n // Grab the global Wp object instance\n this.wp = globalThis.taWp;\n\n this.menu = [];\n // Check for saved menu when on front-end\n if (! this.wp.isBackend) {\n // Only use the cached items if the current URL matches the last site URL\n // This handles changes of multi-site site!\n // We ONLY need to do this on the front-end as the back-end will always\n // refresh the menu.\n if (! this.wp.siteChanged) {\n // Get from localStorage\n const savedMenu = window.localStorage.getItem('ta-palette-data');\n\n if (null !== savedMenu) {\n // Check for .logged-in class on body\n if (document.body.classList.contains('logged-in')) {\n // If still logged in merge (?) the items\n this.menu = JSON.parse(savedMenu);\n }\n }\n }\n } else {\n // On the back end, get the WordPress dashboard menu items\n this.menu = this.getMenu();\n }\n\n // Add other additional items\n this.addAdditionalMenuItems();\n // Add items passed in using extraItemsRaw\n this.menu = this.menu.concat(this.options.extraItemsRaw ?? []);\n // Sort the menu\n this.menu.sort((a, b) => (a.parentTitle + a.title).localeCompare(b.parentTitle + b.title));\n\n // Filter out no-cache items and save to localStorage.\n const itemsToSave = this.menu.filter(item => (! item.noCache));\n window.localStorage.setItem('ta-palette-data', JSON.stringify(itemsToSave));\n\n // Add palette markup to the DOM\n this.addPalette();\n // Initialise controls on the palette\n this.turboAdminPalette = new TurboAdminPalette(this.menu, this.options);\n\n if (true === this.options['block-editor-fullscreen-disable']) {\n // Initialise fullscreen kill\n this.turboAdminFullscreenKill = new TurboAdminWpBlockEditorFullscreenKill();\n }\n\n if (true === this.options['block-editor-welcome-screen-kill']) {\n this.turboAdminWelcomeKill = new TurboAdminWpBlockEditorWelcomeGuideKill();\n }\n\n // Add other things if we're logged in and have an API nonce\n if (globalThis.contentApi.userLoggedIn()) {\n // What shall we do?\n }\n }\n\n getMenu() {\n const items = [];\n const menuTop = document.getElementById('adminmenu');\n if (menuTop) {\n const topDOMItems = menuTop.querySelectorAll('li.menu-top');\n topDOMItems.forEach(el => {\n const a = el.querySelector('a.menu-top');\n const title = a.querySelector('.wp-menu-name').innerHTML;\n const action = a.href;\n const parentTitle = '';\n const item = new TurboAdminMenuItem(title, action, parentTitle);\n items.push(item);\n\n const subMenu = el.querySelector('.wp-submenu');\n if (!subMenu) {\n return;\n }\n const subItems = subMenu.querySelectorAll('li a');\n if (!subItems) {\n return;\n }\n subItems.forEach(subEl => {\n const parentTitle = title;\n const childTitle = subEl.innerHTML;\n const childAction = subEl.href;\n const item = new TurboAdminMenuItem(childTitle, childAction, parentTitle);\n items.push(item);\n })\n });\n }\n return items;\n }\n\n addAdditionalMenuItems() {\n\n /*\n * I'd LOVE for this to be config driven\n *\n * [\n * {\n * 'detectType': 'url',\n * 'detectPattern': 'wp-login',\n * 'itemTitle': 'View/visit site',\n * 'itemUrlFunction': () => this.home\n * },\n * {\n * 'detectType': 'dom',\n * 'detectSelector': '#wpadminbar',\n * 'itemTitle': 'Logout',\n * 'itemUrlFunction': () => logoutUrl\n * }\n * Can we add actionTypes as well? To do clicks and navigates?\n * ]\n */\n\n // Get passed-in extraItems\n let extraItems = this.options.extraItems ?? [];\n\n // Merge in defaults\n extraItems = extraItems.concat(\n [\n {\n 'detectType': 'dom',\n 'detectSelector': 'body.wp-admin #wp-admin-bar-view-site a',\n 'itemTitleFunction': () => 'View/visit site',\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-dashboard a',\n 'itemTitleFunction': (element) => element.textContent,\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wpadminbar',\n 'itemTitleFunction': () => 'Logout',\n 'itemUrlFunction': () => document.getElementById('wp-admin-bar-logout')?.querySelector('a')?.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-edit a',\n 'itemTitleFunction': (item) => item.textContent,\n 'itemUrlFunction': (item) => item.href,\n 'noCache': true,\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-view a',\n 'itemTitleFunction': (item) => item.textContent,\n 'itemUrlFunction': (item) => item.href,\n 'noCache': true,\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-new-content .ab-submenu a',\n 'itemTitleFunction': (item) => 'New ' + item.textContent,\n 'itemUrlFunction': (item) => item.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-customize a',\n 'itemTitleFunction': (item) => item.textContent,\n 'itemUrlFunction': (item) => item.href\n },\n {\n 'detectType': 'dom',\n 'detectSelectorNone': '#wpadminbar, #loginform',\n 'itemTitleFunction': () => \"Log in\",\n 'itemUrlFunction': () => {\n if (globalThis.taWp.home) {\n return globalThis.taWp.siteUrl;\n }\n // Try getting wp-admin\n return 'javascript:alert(\\'Sorry, could not detect login URL.\\')';\n }\n },\n // This is on the login screen\n {\n 'detectType': 'dom',\n 'detectSelector': '#backtoblog a',\n 'itemTitleFunction': () => \"View/visit site\",\n 'itemUrlFunction': (element) => element.href\n },\n // Multisite items\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-my-sites #wp-admin-bar-network-admin > a',\n 'itemTitleFunction': () => \"Network Admin\",\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-my-sites #wp-admin-bar-network-admin .ab-submenu a',\n 'itemTitleFunction': (element) => 'Network Admin: ' + element.textContent,\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-my-sites #wp-admin-bar-my-sites-list .ab-submenu a',\n 'itemTitleFunction': (element) => \"Sites: \" + element.closest('.menupop').querySelector('a').innerText + ' - ' + element.innerText,\n 'itemUrlFunction': (element) => element.href\n }\n ]\n );\n\n extraItems.forEach(item => {\n let detected = false;\n let elements = null;\n if (item.detectType === 'url') {\n detected = Boolean(window.location.href.includes(item.detectPattern));\n } else if (item.detectType === 'dom') {\n if (item.detectSelector) {\n elements = document.querySelectorAll(item.detectSelector);\n detected = Boolean(elements);\n } else if (item.detectSelectorNone) {\n elements = document.querySelectorAll(item.detectSelectorNone);\n detected = elements.length === 0;\n // Need to pass SOMETHING to the loop below\n elements = document.querySelectorAll('body');\n }\n }\n if (!detected) {\n return;\n }\n\n elements.forEach(element => {\n const newItem = new TurboAdminMenuItem(item.itemTitleFunction(element), item.itemUrlFunction(element), '', item?.noCache);\n // Might already have one so check.\n if (this.menu.some(menuItem => {\n // This must be newItem.sameAs, not menuItem.sameAs because the menuItem\n // may have been loaded from saved menu and may not actually be an instance\n // of a TurboAdminMenuItem.\n return newItem.sameAs(menuItem)\n } )) {\n return;\n }\n // We don't already have one. So add it.\n this.menu.push(newItem);\n });\n })\n }\n\n addPalette() {\n // Container\n const container = document.createElement('div');\n container.id = 'ta-command-palette-container';\n // Palette\n const palette = document.createElement('div');\n palette.id = 'ta-command-palette';\n // Input field\n const input = document.createElement('input');\n input.id = \"ta-command-palette-input\";\n input.name = \"ta-command-palette-input\";\n input.type = \"text\";\n // Set this to stop stuff trying to fill it.\n input.setAttribute('autocomplete', 'off');\n // List\n const list = document.createElement('ul');\n list.id = \"ta-command-palette-items\";\n // Join it all up\n container.appendChild(palette);\n palette.appendChild(input);\n palette.appendChild(list);\n\n document.querySelector(this.options.appendToElement ?? 'body').appendChild(container);\n }\n\n}\n", "export default class Wp {\n\n constructor() {\n\n // Set home and siteUrl\n this.siteUrl = '';\n this.home = '';\n this.loginUrl = '';\n this.apiLinkUrl = '';\n\n this.getUrls();\n\n // Fetch previously loaded site URL\n this.previousUrl = window.localStorage.getItem('ta-palette-data-site');\n\n /**\n * Tells you if the best-guess site URL of the current page is different\n * to that of the previously saved site URL.\n */\n this.siteChanged = this.home !== this.previousUrl;\n\n /**\n * Are we in the back-end?\n */\n this.isBackend = this.isBackend();\n\n // Save current site URL for next time\n window.localStorage.setItem('ta-palette-data-site', this.home);\n }\n\n isBackend() {\n return document.body.classList.contains('wp-admin');\n }\n\n getUrls() {\n const apiLink = document.querySelector('link[rel=\"https://api.w.org/\"]');\n if (apiLink) {\n this.apiLinkUrl = apiLink.href;\n }\n // Figure out the siteurl and home - this is different on the front and back end\n if (this.isBackend()) {\n this.siteUrl = window.location.href.match(/(^.*wp-admin)/)[1];\n this.home = document.getElementById('wp-admin-bar-site-name').querySelector('a').href;\n } else {\n // If we're not in the backend then (in the extension at least) we\n // could be on the front-end and not logged in, so check for an\n // admin bar and grab from that if there is one.\n if (document.getElementById('wpadminbar')) {\n this.siteUrl = document.getElementById('wp-admin-bar-dashboard').querySelector('a').href;\n // Try for the API link\n if (this.apiLinkUrl) {\n if (this.apiLinkUrl.includes('/wp-json')) {\n this.home = this.apiLinkUrl.replace('wp-json/', '');\n }\n if (this.apiLinkUrl.includes('index.php?rest_route')) {\n this.home = this.apiLinkUrl.replace(/index.php\\?rest_route.*/, '');\n }\n } else {\n // Guess from the siteUrl\n this.home = this.siteUrl.replace(/wp-admin\\/?/, '');\n }\n\n } else {\n // Try for the API link\n if (this.apiLinkUrl) {\n if (this.apiLinkUrl.includes('/wp-json')) {\n this.home = this.apiLinkUrl.replace('wp-json/', '');\n }\n if (this.apiLinkUrl.includes('index.php?rest_route')) {\n this.home = this.apiLinkUrl.replace(/index.php\\?rest_route.*/, '');\n }\n this.siteUrl = this.home + 'wp-admin/';\n }\n }\n }\n\n // Always trim the / for comparisons\n this.siteUrl = this.siteUrl.replace(/(.+)\\/$/, '$1');\n this.home = this.home.replace(/(.+)\\/$/, '$1');\n\n // console.log('siteUrl: ', this.siteUrl);\n // console.log('home: ', this.home);\n }\n\n}\n", "import TurboAdmin from './class-turbo-admin.js';\nimport ContentApi from './class-content-api.js';\nimport Wp from './class-wp.js';\n\nconst taStorageKey = 'turbo-admin-settings';\n\n// Note that in the extension, the globalThis is not the browser's global scope,\n// it is sandboxed. So we can't check across the plugin/extension boundary here.\nasync function taInit(settings) {\n\n globalThis.turboAdmin = null;\n\n // Handle empty settings\n if (typeof(settings[taStorageKey]) === 'undefined') {\n console.log('Weird. Turbo Admin could not find any settings');\n return;\n }\ndocument.addEventListener('DOMContentLoaded', e => {\n\tturboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n});\n\n globalThis.turboAdminOptions = settings[taStorageKey];\n\n // Get Wp stuff ready\n globalThis.taWp = new Wp();\n\n // Get/set api settings\n globalThis.contentApi = new ContentApi();\n await globalThis.contentApi.discoverApiRoot();\n\n globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n}\n\ndocument.addEventListener('DOMContentLoaded', async e => {\n\tglobalThis.turboAdminOptions = {};\n\tglobalThis.turboAdminOptions[taStorageKey] = {\n\t\t// wpTurboAdmin is set using wp_localize_script\n\t\tshortcutKeys: globalThis.wpTurboAdmin.keys,\n // These don't apply to the plugin version\n 'block-editor-fullscreen-disable': false,\n 'block-editor-welcome-screen-kill': false,\n\t}\n\tawait taInit(globalThis.turboAdminOptions);\n});\n"], - "mappings": "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", + "sources": ["../src/fuse-6.4.6.js", "../src/class-turbo-admin-palette.js", "../src/class-turbo-admin-menu-item.js", "../src/class-storage.js", "../src/class-content-api.js", "../src/class-turbo-admin-wp-block-editor-fullscreen-kill.js", "../src/class-turbo-admin-wp-block-editor-welcome-guide-kill.js", "../src/class-turbo-admin-wp-notices.js", "../src/class-list-table-shortcuts.js", "../src/class-turbo-admin.js", "../src/class-wp.js", "../src/main.js"], + "sourcesContent": ["/**\n * Fuse.js v6.4.6 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2021 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\nvar e, t; e = this, t = function () { \"use strict\"; function e(t) { return (e = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) { return typeof e } : function (e) { return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e })(t) } function t(e, t) { if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\") } function n(e, t) { for (var n = 0; n < t.length; n++) { var r = t[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r) } } function r(e, t, r) { return t && n(e.prototype, t), r && n(e, r), e } function i(e, t, n) { return t in e ? Object.defineProperty(e, t, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[t] = n, e } function o(e, t) { var n = Object.keys(e); if (Object.getOwnPropertySymbols) { var r = Object.getOwnPropertySymbols(e); t && (r = r.filter((function (t) { return Object.getOwnPropertyDescriptor(e, t).enumerable }))), n.push.apply(n, r) } return n } function c(e) { for (var t = 1; t < arguments.length; t++) { var n = null != arguments[t] ? arguments[t] : {}; t % 2 ? o(Object(n), !0).forEach((function (t) { i(e, t, n[t]) })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : o(Object(n)).forEach((function (t) { Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)) })) } return e } function a(e, t) { if (\"function\" != typeof t && null !== t) throw new TypeError(\"Super expression must either be null or a function\"); e.prototype = Object.create(t && t.prototype, { constructor: { value: e, writable: !0, configurable: !0 } }), t && u(e, t) } function s(e) { return (s = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { return e.__proto__ || Object.getPrototypeOf(e) })(e) } function u(e, t) { return (u = Object.setPrototypeOf || function (e, t) { return e.__proto__ = t, e })(e, t) } function h(e, t) { return !t || \"object\" != typeof t && \"function\" != typeof t ? function (e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e }(e) : t } function f(e) { var t = function () { if (\"undefined\" == typeof Reflect || !Reflect.construct) return !1; if (Reflect.construct.sham) return !1; if (\"function\" == typeof Proxy) return !0; try { return Date.prototype.toString.call(Reflect.construct(Date, [], (function () { }))), !0 } catch (e) { return !1 } }(); return function () { var n, r = s(e); if (t) { var i = s(this).constructor; n = Reflect.construct(r, arguments, i) } else n = r.apply(this, arguments); return h(this, n) } } function l(e) { return function (e) { if (Array.isArray(e)) return d(e) }(e) || function (e) { if (\"undefined\" != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e) }(e) || function (e, t) { if (e) { if (\"string\" == typeof e) return d(e, t); var n = Object.prototype.toString.call(e).slice(8, -1); return \"Object\" === n && e.constructor && (n = e.constructor.name), \"Map\" === n || \"Set\" === n ? Array.from(e) : \"Arguments\" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? d(e, t) : void 0 } }(e) || function () { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\") }() } function d(e, t) { (null == t || t > e.length) && (t = e.length); for (var n = 0, r = new Array(t); n < t; n++)r[n] = e[n]; return r } function v(e) { return Array.isArray ? Array.isArray(e) : \"[object Array]\" === b(e) } function g(e) { return \"string\" == typeof e } function y(e) { return \"number\" == typeof e } function p(e) { return !0 === e || !1 === e || function (e) { return m(e) && null !== e }(e) && \"[object Boolean]\" == b(e) } function m(t) { return \"object\" === e(t) } function k(e) { return null != e } function M(e) { return !e.trim().length } function b(e) { return null == e ? void 0 === e ? \"[object Undefined]\" : \"[object Null]\" : Object.prototype.toString.call(e) } var x = function (e) { return \"Invalid value for key \".concat(e) }, L = function (e) { return \"Pattern length exceeds max of \".concat(e, \".\") }, S = Object.prototype.hasOwnProperty, w = function () { function e(n) { var r = this; t(this, e), this._keys = [], this._keyMap = {}; var i = 0; n.forEach((function (e) { var t = _(e); i += t.weight, r._keys.push(t), r._keyMap[t.id] = t, i += t.weight })), this._keys.forEach((function (e) { e.weight /= i })) } return r(e, [{ key: \"get\", value: function (e) { return this._keyMap[e] } }, { key: \"keys\", value: function () { return this._keys } }, { key: \"toJSON\", value: function () { return JSON.stringify(this._keys) } }]), e }(); function _(e) { var t = null, n = null, r = null, i = 1; if (g(e) || v(e)) r = e, t = O(e), n = j(e); else { if (!S.call(e, \"name\")) throw new Error(function (e) { return \"Missing \".concat(e, \" property in key\") }(\"name\")); var o = e.name; if (r = o, S.call(e, \"weight\") && (i = e.weight) <= 0) throw new Error(function (e) { return \"Property 'weight' in key '\".concat(e, \"' must be a positive integer\") }(o)); t = O(o), n = j(o) } return { path: t, id: n, weight: i, src: r } } function O(e) { return v(e) ? e : e.split(\".\") } function j(e) { return v(e) ? e.join(\".\") : e } var A = c({}, { isCaseSensitive: !1, includeScore: !1, keys: [], shouldSort: !0, sortFn: function (e, t) { return e.score === t.score ? e.idx < t.idx ? -1 : 1 : e.score < t.score ? -1 : 1 } }, {}, { includeMatches: !1, findAllMatches: !1, minMatchCharLength: 1 }, {}, { location: 0, threshold: .6, distance: 100 }, {}, { useExtendedSearch: !1, getFn: function (e, t) { var n = [], r = !1; return function e(t, i, o) { if (k(t)) if (i[o]) { var c = t[i[o]]; if (!k(c)) return; if (o === i.length - 1 && (g(c) || y(c) || p(c))) n.push(function (e) { return null == e ? \"\" : function (e) { if (\"string\" == typeof e) return e; var t = e + \"\"; return \"0\" == t && 1 / e == -1 / 0 ? \"-0\" : t }(e) }(c)); else if (v(c)) { r = !0; for (var a = 0, s = c.length; a < s; a += 1)e(c[a], i, o + 1) } else i.length && e(c, i, o + 1) } else n.push(t) }(e, g(t) ? t.split(\".\") : t, 0), r ? n : n[0] }, ignoreLocation: !1, ignoreFieldNorm: !1 }), I = /[^ ]+/g; function C() { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 3, t = new Map, n = Math.pow(10, e); return { get: function (e) { var r = e.match(I).length; if (t.has(r)) return t.get(r); var i = 1 / Math.sqrt(r), o = parseFloat(Math.round(i * n) / n); return t.set(r, o), o }, clear: function () { t.clear() } } } var E = function () { function e() { var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, r = n.getFn, i = void 0 === r ? A.getFn : r; t(this, e), this.norm = C(3), this.getFn = i, this.isCreated = !1, this.setIndexRecords() } return r(e, [{ key: \"setSources\", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; this.docs = e } }, { key: \"setIndexRecords\", value: function () { var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; this.records = e } }, { key: \"setKeys\", value: function () { var e = this, t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : []; this.keys = t, this._keysMap = {}, t.forEach((function (t, n) { e._keysMap[t.id] = n })) } }, { key: \"create\", value: function () { var e = this; !this.isCreated && this.docs.length && (this.isCreated = !0, g(this.docs[0]) ? this.docs.forEach((function (t, n) { e._addString(t, n) })) : this.docs.forEach((function (t, n) { e._addObject(t, n) })), this.norm.clear()) } }, { key: \"add\", value: function (e) { var t = this.size(); g(e) ? this._addString(e, t) : this._addObject(e, t) } }, { key: \"removeAt\", value: function (e) { this.records.splice(e, 1); for (var t = e, n = this.size(); t < n; t += 1)this.records[t].i -= 1 } }, { key: \"getValueForItemAtKeyId\", value: function (e, t) { return e[this._keysMap[t]] } }, { key: \"size\", value: function () { return this.records.length } }, { key: \"_addString\", value: function (e, t) { if (k(e) && !M(e)) { var n = { v: e, i: t, n: this.norm.get(e) }; this.records.push(n) } } }, { key: \"_addObject\", value: function (e, t) { var n = this, r = { i: t, $: {} }; this.keys.forEach((function (t, i) { var o = n.getFn(e, t.path); if (k(o)) if (v(o)) !function () { for (var e = [], t = [{ nestedArrIndex: -1, value: o }]; t.length;) { var c = t.pop(), a = c.nestedArrIndex, s = c.value; if (k(s)) if (g(s) && !M(s)) { var u = { v: s, i: a, n: n.norm.get(s) }; e.push(u) } else v(s) && s.forEach((function (e, n) { t.push({ nestedArrIndex: n, value: e }) })) } r.$[i] = e }(); else if (!M(o)) { var c = { v: o, n: n.norm.get(o) }; r.$[i] = c } })), this.records.push(r) } }, { key: \"toJSON\", value: function () { return { keys: this.keys, records: this.records } } }]), e }(); function $(e, t) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = n.getFn, i = void 0 === r ? A.getFn : r, o = new E({ getFn: i }); return o.setKeys(e.map(_)), o.setSources(t), o.create(), o } function R(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = t.errors, r = void 0 === n ? 0 : n, i = t.currentLocation, o = void 0 === i ? 0 : i, c = t.expectedLocation, a = void 0 === c ? 0 : c, s = t.distance, u = void 0 === s ? A.distance : s, h = t.ignoreLocation, f = void 0 === h ? A.ignoreLocation : h, l = r / e.length; if (f) return l; var d = Math.abs(a - o); return u ? l + d / u : d ? 1 : l } function F() { for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : A.minMatchCharLength, n = [], r = -1, i = -1, o = 0, c = e.length; o < c; o += 1) { var a = e[o]; a && -1 === r ? r = o : a || -1 === r || ((i = o - 1) - r + 1 >= t && n.push([r, i]), r = -1) } return e[o - 1] && o - r >= t && n.push([r, o - 1]), n } function P(e) { for (var t = {}, n = 0, r = e.length; n < r; n += 1) { var i = e.charAt(n); t[i] = (t[i] || 0) | 1 << r - n - 1 } return t } var N = function () { function e(n) { var r = this, i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, o = i.location, c = void 0 === o ? A.location : o, a = i.threshold, s = void 0 === a ? A.threshold : a, u = i.distance, h = void 0 === u ? A.distance : u, f = i.includeMatches, l = void 0 === f ? A.includeMatches : f, d = i.findAllMatches, v = void 0 === d ? A.findAllMatches : d, g = i.minMatchCharLength, y = void 0 === g ? A.minMatchCharLength : g, p = i.isCaseSensitive, m = void 0 === p ? A.isCaseSensitive : p, k = i.ignoreLocation, M = void 0 === k ? A.ignoreLocation : k; if (t(this, e), this.options = { location: c, threshold: s, distance: h, includeMatches: l, findAllMatches: v, minMatchCharLength: y, isCaseSensitive: m, ignoreLocation: M }, this.pattern = m ? n : n.toLowerCase(), this.chunks = [], this.pattern.length) { var b = function (e, t) { r.chunks.push({ pattern: e, alphabet: P(e), startIndex: t }) }, x = this.pattern.length; if (x > 32) { for (var L = 0, S = x % 32, w = x - S; L < w;)b(this.pattern.substr(L, 32), L), L += 32; if (S) { var _ = x - 32; b(this.pattern.substr(_), _) } } else b(this.pattern, 0) } } return r(e, [{ key: \"searchIn\", value: function (e) { var t = this.options, n = t.isCaseSensitive, r = t.includeMatches; if (n || (e = e.toLowerCase()), this.pattern === e) { var i = { isMatch: !0, score: 0 }; return r && (i.indices = [[0, e.length - 1]]), i } var o = this.options, c = o.location, a = o.distance, s = o.threshold, u = o.findAllMatches, h = o.minMatchCharLength, f = o.ignoreLocation, d = [], v = 0, g = !1; this.chunks.forEach((function (t) { var n = t.pattern, i = t.alphabet, o = t.startIndex, y = function (e, t, n) { var r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, i = r.location, o = void 0 === i ? A.location : i, c = r.distance, a = void 0 === c ? A.distance : c, s = r.threshold, u = void 0 === s ? A.threshold : s, h = r.findAllMatches, f = void 0 === h ? A.findAllMatches : h, l = r.minMatchCharLength, d = void 0 === l ? A.minMatchCharLength : l, v = r.includeMatches, g = void 0 === v ? A.includeMatches : v, y = r.ignoreLocation, p = void 0 === y ? A.ignoreLocation : y; if (t.length > 32) throw new Error(L(32)); for (var m, k = t.length, M = e.length, b = Math.max(0, Math.min(o, M)), x = u, S = b, w = d > 1 || g, _ = w ? Array(M) : []; (m = e.indexOf(t, S)) > -1;) { var O = R(t, { currentLocation: m, expectedLocation: b, distance: a, ignoreLocation: p }); if (x = Math.min(O, x), S = m + k, w) for (var j = 0; j < k;)_[m + j] = 1, j += 1 } S = -1; for (var I = [], C = 1, E = k + M, $ = 1 << k - 1, P = 0; P < k; P += 1) { for (var N = 0, D = E; N < D;) { var z = R(t, { errors: P, currentLocation: b + D, expectedLocation: b, distance: a, ignoreLocation: p }); z <= x ? N = D : E = D, D = Math.floor((E - N) / 2 + N) } E = D; var K = Math.max(1, b - D + 1), q = f ? M : Math.min(b + D, M) + k, W = Array(q + 2); W[q + 1] = (1 << P) - 1; for (var J = q; J >= K; J -= 1) { var T = J - 1, U = n[e.charAt(T)]; if (w && (_[T] = +!!U), W[J] = (W[J + 1] << 1 | 1) & U, P && (W[J] |= (I[J + 1] | I[J]) << 1 | 1 | I[J + 1]), W[J] & $ && (C = R(t, { errors: P, currentLocation: T, expectedLocation: b, distance: a, ignoreLocation: p })) <= x) { if (x = C, (S = T) <= b) break; K = Math.max(1, 2 * b - S) } } var V = R(t, { errors: P + 1, currentLocation: b, expectedLocation: b, distance: a, ignoreLocation: p }); if (V > x) break; I = W } var B = { isMatch: S >= 0, score: Math.max(.001, C) }; if (w) { var G = F(_, d); G.length ? g && (B.indices = G) : B.isMatch = !1 } return B }(e, n, i, { location: c + o, distance: a, threshold: s, findAllMatches: u, minMatchCharLength: h, includeMatches: r, ignoreLocation: f }), p = y.isMatch, m = y.score, k = y.indices; p && (g = !0), v += m, p && k && (d = [].concat(l(d), l(k))) })); var y = { isMatch: g, score: g ? v / this.chunks.length : 1 }; return g && r && (y.indices = d), y } }]), e }(), D = function () { function e(n) { t(this, e), this.pattern = n } return r(e, [{ key: \"search\", value: function () { } }], [{ key: \"isMultiMatch\", value: function (e) { return z(e, this.multiRegex) } }, { key: \"isSingleMatch\", value: function (e) { return z(e, this.singleRegex) } }]), e }(); function z(e, t) { var n = e.match(t); return n ? n[1] : null } var K = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = e === this.pattern; return { isMatch: t, score: t ? 0 : 1, indices: [0, this.pattern.length - 1] } } }], [{ key: \"type\", get: function () { return \"exact\" } }, { key: \"multiRegex\", get: function () { return /^=\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^=(.*)$/ } }]), i }(D), q = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = -1 === e.indexOf(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"inverse-exact\" } }, { key: \"multiRegex\", get: function () { return /^!\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^!(.*)$/ } }]), i }(D), W = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = e.startsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, this.pattern.length - 1] } } }], [{ key: \"type\", get: function () { return \"prefix-exact\" } }, { key: \"multiRegex\", get: function () { return /^\\^\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^\\^(.*)$/ } }]), i }(D), J = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = !e.startsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"inverse-prefix-exact\" } }, { key: \"multiRegex\", get: function () { return /^!\\^\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^!\\^(.*)$/ } }]), i }(D), T = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = e.endsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [e.length - this.pattern.length, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"suffix-exact\" } }, { key: \"multiRegex\", get: function () { return /^\"(.*)\"\\$$/ } }, { key: \"singleRegex\", get: function () { return /^(.*)\\$$/ } }]), i }(D), U = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { var t = !e.endsWith(this.pattern); return { isMatch: t, score: t ? 0 : 1, indices: [0, e.length - 1] } } }], [{ key: \"type\", get: function () { return \"inverse-suffix-exact\" } }, { key: \"multiRegex\", get: function () { return /^!\"(.*)\"\\$$/ } }, { key: \"singleRegex\", get: function () { return /^!(.*)\\$$/ } }]), i }(D), V = function (e) { a(i, e); var n = f(i); function i(e) { var r, o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, c = o.location, a = void 0 === c ? A.location : c, s = o.threshold, u = void 0 === s ? A.threshold : s, h = o.distance, f = void 0 === h ? A.distance : h, l = o.includeMatches, d = void 0 === l ? A.includeMatches : l, v = o.findAllMatches, g = void 0 === v ? A.findAllMatches : v, y = o.minMatchCharLength, p = void 0 === y ? A.minMatchCharLength : y, m = o.isCaseSensitive, k = void 0 === m ? A.isCaseSensitive : m, M = o.ignoreLocation, b = void 0 === M ? A.ignoreLocation : M; return t(this, i), (r = n.call(this, e))._bitapSearch = new N(e, { location: a, threshold: u, distance: f, includeMatches: d, findAllMatches: g, minMatchCharLength: p, isCaseSensitive: k, ignoreLocation: b }), r } return r(i, [{ key: \"search\", value: function (e) { return this._bitapSearch.searchIn(e) } }], [{ key: \"type\", get: function () { return \"fuzzy\" } }, { key: \"multiRegex\", get: function () { return /^\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^(.*)$/ } }]), i }(D), B = function (e) { a(i, e); var n = f(i); function i(e) { return t(this, i), n.call(this, e) } return r(i, [{ key: \"search\", value: function (e) { for (var t, n = 0, r = [], i = this.pattern.length; (t = e.indexOf(this.pattern, n)) > -1;)n = t + i, r.push([t, n - 1]); var o = !!r.length; return { isMatch: o, score: o ? 0 : 1, indices: r } } }], [{ key: \"type\", get: function () { return \"include\" } }, { key: \"multiRegex\", get: function () { return /^'\"(.*)\"$/ } }, { key: \"singleRegex\", get: function () { return /^'(.*)$/ } }]), i }(D), G = [K, B, W, J, U, T, q, V], H = G.length, Q = / +(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/; function X(e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return e.split(\"|\").map((function (e) { for (var n = e.trim().split(Q).filter((function (e) { return e && !!e.trim() })), r = [], i = 0, o = n.length; i < o; i += 1) { for (var c = n[i], a = !1, s = -1; !a && ++s < H;) { var u = G[s], h = u.isMultiMatch(c); h && (r.push(new u(h, t)), a = !0) } if (!a) for (s = -1; ++s < H;) { var f = G[s], l = f.isSingleMatch(c); if (l) { r.push(new f(l, t)); break } } } return r })) } var Y = new Set([V.type, B.type]), Z = function () { function e(n) { var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, i = r.isCaseSensitive, o = void 0 === i ? A.isCaseSensitive : i, c = r.includeMatches, a = void 0 === c ? A.includeMatches : c, s = r.minMatchCharLength, u = void 0 === s ? A.minMatchCharLength : s, h = r.ignoreLocation, f = void 0 === h ? A.ignoreLocation : h, l = r.findAllMatches, d = void 0 === l ? A.findAllMatches : l, v = r.location, g = void 0 === v ? A.location : v, y = r.threshold, p = void 0 === y ? A.threshold : y, m = r.distance, k = void 0 === m ? A.distance : m; t(this, e), this.query = null, this.options = { isCaseSensitive: o, includeMatches: a, minMatchCharLength: u, findAllMatches: d, ignoreLocation: f, location: g, threshold: p, distance: k }, this.pattern = o ? n : n.toLowerCase(), this.query = X(this.pattern, this.options) } return r(e, [{ key: \"searchIn\", value: function (e) { var t = this.query; if (!t) return { isMatch: !1, score: 1 }; var n = this.options, r = n.includeMatches; e = n.isCaseSensitive ? e : e.toLowerCase(); for (var i = 0, o = [], c = 0, a = 0, s = t.length; a < s; a += 1) { var u = t[a]; o.length = 0, i = 0; for (var h = 0, f = u.length; h < f; h += 1) { var d = u[h], v = d.search(e), g = v.isMatch, y = v.indices, p = v.score; if (!g) { c = 0, i = 0, o.length = 0; break } if (i += 1, c += p, r) { var m = d.constructor.type; Y.has(m) ? o = [].concat(l(o), l(y)) : o.push(y) } } if (i) { var k = { isMatch: !0, score: c / i }; return r && (k.indices = o), k } } return { isMatch: !1, score: 1 } } }], [{ key: \"condition\", value: function (e, t) { return t.useExtendedSearch } }]), e }(), ee = []; function te(e, t) { for (var n = 0, r = ee.length; n < r; n += 1) { var i = ee[n]; if (i.condition(e, t)) return new i(e, t) } return new N(e, t) } var ne = \"$and\", re = \"$or\", ie = \"$path\", oe = \"$val\", ce = function (e) { return !(!e[ne] && !e[re]) }, ae = function (e) { return !!e[ie] }, se = function (e) { return !v(e) && m(e) && !ce(e) }, ue = function (e) { return i({}, ne, Object.keys(e).map((function (t) { return i({}, t, e[t]) }))) }; function he(e, t) { var n = t.ignoreFieldNorm, r = void 0 === n ? A.ignoreFieldNorm : n; e.forEach((function (e) { var t = 1; e.matches.forEach((function (e) { var n = e.key, i = e.norm, o = e.score, c = n ? n.weight : null; t *= Math.pow(0 === o && c ? Number.EPSILON : o, (c || 1) * (r ? 1 : i)) })), e.score = t })) } function fe(e, t) { var n = e.matches; t.matches = [], k(n) && n.forEach((function (e) { if (k(e.indices) && e.indices.length) { var n = { indices: e.indices, value: e.value }; e.key && (n.key = e.key.src), e.idx > -1 && (n.refIndex = e.idx), t.matches.push(n) } })) } function le(e, t) { t.score = e.score } function de(e, t) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = n.includeMatches, i = void 0 === r ? A.includeMatches : r, o = n.includeScore, c = void 0 === o ? A.includeScore : o, a = []; return i && a.push(fe), c && a.push(le), e.map((function (e) { var n = e.idx, r = { item: t[n], refIndex: n }; return a.length && a.forEach((function (t) { t(e, r) })), r })) } var ve = function () { function e(n) { var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, i = arguments.length > 2 ? arguments[2] : void 0; t(this, e), this.options = c({}, A, {}, r), this.options.useExtendedSearch, this._keyStore = new w(this.options.keys), this.setCollection(n, i) } return r(e, [{ key: \"setCollection\", value: function (e, t) { if (this._docs = e, t && !(t instanceof E)) throw new Error(\"Incorrect 'index' type\"); this._myIndex = t || $(this.options.keys, this._docs, { getFn: this.options.getFn }) } }, { key: \"add\", value: function (e) { k(e) && (this._docs.push(e), this._myIndex.add(e)) } }, { key: \"remove\", value: function () { for (var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : function () { return !1 }, t = [], n = 0, r = this._docs.length; n < r; n += 1) { var i = this._docs[n]; e(i, n) && (this.removeAt(n), n -= 1, r -= 1, t.push(i)) } return t } }, { key: \"removeAt\", value: function (e) { this._docs.splice(e, 1), this._myIndex.removeAt(e) } }, { key: \"getIndex\", value: function () { return this._myIndex } }, { key: \"search\", value: function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = t.limit, r = void 0 === n ? -1 : n, i = this.options, o = i.includeMatches, c = i.includeScore, a = i.shouldSort, s = i.sortFn, u = i.ignoreFieldNorm, h = g(e) ? g(this._docs[0]) ? this._searchStringList(e) : this._searchObjectList(e) : this._searchLogical(e); return he(h, { ignoreFieldNorm: u }), a && h.sort(s), y(r) && r > -1 && (h = h.slice(0, r)), de(h, this._docs, { includeMatches: o, includeScore: c }) } }, { key: \"_searchStringList\", value: function (e) { var t = te(e, this.options), n = this._myIndex.records, r = []; return n.forEach((function (e) { var n = e.v, i = e.i, o = e.n; if (k(n)) { var c = t.searchIn(n), a = c.isMatch, s = c.score, u = c.indices; a && r.push({ item: n, idx: i, matches: [{ score: s, value: n, norm: o, indices: u }] }) } })), r } }, { key: \"_searchLogical\", value: function (e) { var t = this, n = function (e, t) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = n.auto, i = void 0 === r || r, o = function e(n) { var r = Object.keys(n), o = ae(n); if (!o && r.length > 1 && !ce(n)) return e(ue(n)); if (se(n)) { var c = o ? n[ie] : r[0], a = o ? n[oe] : n[c]; if (!g(a)) throw new Error(x(c)); var s = { keyId: j(c), pattern: a }; return i && (s.searcher = te(a, t)), s } var u = { children: [], operator: r[0] }; return r.forEach((function (t) { var r = n[t]; v(r) && r.forEach((function (t) { u.children.push(e(t)) })) })), u }; return ce(e) || (e = ue(e)), o(e) }(e, this.options), r = this._myIndex.records, i = {}, o = []; return r.forEach((function (e) { var r = e.$, c = e.i; if (k(r)) { var a = function e(n, r, i) { if (!n.children) { var o = n.keyId, c = n.searcher, a = t._findMatches({ key: t._keyStore.get(o), value: t._myIndex.getValueForItemAtKeyId(r, o), searcher: c }); return a && a.length ? [{ idx: i, item: r, matches: a }] : [] } switch (n.operator) { case ne: for (var s = [], u = 0, h = n.children.length; u < h; u += 1) { var f = e(n.children[u], r, i); if (!f.length) return []; s.push.apply(s, l(f)) } return s; case re: for (var d = [], v = 0, g = n.children.length; v < g; v += 1) { var y = e(n.children[v], r, i); if (y.length) { d.push.apply(d, l(y)); break } } return d } }(n, r, c); a.length && (i[c] || (i[c] = { idx: c, item: r, matches: [] }, o.push(i[c])), a.forEach((function (e) { var t, n = e.matches; (t = i[c].matches).push.apply(t, l(n)) }))) } })), o } }, { key: \"_searchObjectList\", value: function (e) { var t = this, n = te(e, this.options), r = this._myIndex, i = r.keys, o = r.records, c = []; return o.forEach((function (e) { var r = e.$, o = e.i; if (k(r)) { var a = []; i.forEach((function (e, i) { a.push.apply(a, l(t._findMatches({ key: e, value: r[i], searcher: n }))) })), a.length && c.push({ idx: o, item: r, matches: a }) } })), c } }, { key: \"_findMatches\", value: function (e) { var t = e.key, n = e.value, r = e.searcher; if (!k(n)) return []; var i = []; if (v(n)) n.forEach((function (e) { var n = e.v, o = e.i, c = e.n; if (k(n)) { var a = r.searchIn(n), s = a.isMatch, u = a.score, h = a.indices; s && i.push({ score: u, key: t, value: n, idx: o, norm: c, indices: h }) } })); else { var o = n.v, c = n.n, a = r.searchIn(o), s = a.isMatch, u = a.score, h = a.indices; s && i.push({ score: u, key: t, value: o, norm: c, indices: h }) } return i } }]), e }(); return ve.version = \"6.4.6\", ve.createIndex = $, ve.parseIndex = function (e) { var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = t.getFn, r = void 0 === n ? A.getFn : n, i = e.keys, o = e.records, c = new E({ getFn: r }); return c.setKeys(i), c.setIndexRecords(o), c }, ve.config = A, function () { ee.push.apply(ee, arguments) }(Z), ve }, \"object\" == typeof exports && \"undefined\" != typeof module ? module.exports = t() : \"function\" == typeof define && define.amd ? define(t) : (e = e || self).Fuse = t();\n", "/*\n * Some notes on how this works...\n *\n * paletteData is passed into the constructor and is the initial list of items\n * these are TurboAdminMenuItem objects\n *\n * At any point, buildPaletteItems() can be called to turn the paletteData\n * into an array of \"li\" nodes.\n *\n * updatePaletteItems inserts the paletteItems into the \"ul\" list and sets the\n * selectedElement\n *\n * The selectedItem is always one of the paletteItems\n *\n * paletteSearch rebuilds the paletteItems from the paletteData using\n * buildPaletteItems, and then filters the list with FuseJS\n */\n\nimport Fuse from './fuse-6.4.6.js';\nimport TurboAdminMenuItem from './class-turbo-admin-menu-item';\nimport ContentApi from './class-content-api.js';\n\nexport default class TurboAdminPalette {\n\n\tconstructor(paletteData, options) {\n\n\t\tconsole.log('Initialising TurboAdmin');\n\n this.options = options;\n\n /** @type {HTMLDivElement} */\n this.paletteElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-container'));\n /** @type {HTMLDivElement} */\n this.paletteInnerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette'));\n\t\t/** @type {HTMLInputElement} */\n this.paletteInputElement = /** @type {HTMLInputElement} */ (document.getElementById('ta-command-palette-input'));\n\t\t/** @type {HTMLUListElement} */\n this.paletteItemsElement = /** @type {HTMLUListElement} */ (document.getElementById('ta-command-palette-items'));\n\n\t\t// Get palette data\n\t\tthis.paletteData = paletteData;\n\n // Get post type data from API\n this.postTypes = [];\n this.fetchPostTypes();\n\n // paletteItems is the list of 'li' elements used to build the palette\n this.paletteItems = [];\n\n // itemIndex is a \"cache\" of URLs used to check if we already\n // have an item in the palette\n this.itemIndex = {};\n\n // Convert into LI elements\n this.buildPaletteItems();\n\n\n\t\tthis.selectedItem = this.paletteItems[0];\n this.openedSubMenu = null;\n this.selectedSubItem = null;\n\n\t\t// Add them to the DOM\n\t\tthis.updatePaletteItems();\n\n // Set state\n this.navigating = false;\n this.debounceTimeout;\n\n\t\tthis.paletteFuseOptions = [];\n\t\tthis.paletteFuse = null;\n\n\t\tif (typeof (Fuse) !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.paletteFuseOptions = {\n\t\t\tkeys: ['innerText'],\n\t\t}\n\n\t\tthis.paletteFuse = new Fuse(this.paletteItems, this.paletteFuseOptions);\n\n\t\tdocument.addEventListener('keydown', e => this.handleGlobalKey(e));\n\n\t\tthis.paletteElement.addEventListener('click', e => {\n\t\t\tthis.checkForPaletteItemClick(e);\n this.checkForClickToClose(e);\n\t\t});\n\n this.paletteItemsElement.addEventListener('mouseover', e => {\n this.setHoveredItem(e.target);\n });\n\t}\n\n htmlDecode(input) {\n var doc = new DOMParser().parseFromString(input, \"text/html\");\n return doc.documentElement.textContent;\n }\n\n isMac() {\n return navigator.platform.startsWith('Mac');\n }\n\n metaPressed(e) {\n return this.isMac() ? e.metaKey : e.ctrlKey;\n }\n\n fetchPostTypes() {\n if (! globalThis.contentApi.active) {\n this.postTypes = [];\n return;\n }\n\n globalThis.contentApi.get('types').then(\n response => {\n response.json().then(\n types => {\n this.postTypes = types;\n }\n );\n }\n );\n }\n\n\tbuildPaletteItems() {\n this.paletteItems = [];\n this.itemIndex = {};\n\n\t\tthis.paletteData.forEach(item => {\n\t\t\tconst li = document.createElement('li');\n\t\t\tconst a = document.createElement('a');\n\t\t\tli.appendChild(a);\n\t\t\ta.href = item.action;\n\t\t\tlet title = item.title;\n\t\t\tif (item.parentTitle) {\n\t\t\t\ttitle = item.parentTitle + \": \" + title;\n\t\t\t}\n\t\t\ta.innerHTML = title;\n this.addPaletteListItem(li);\n\t\t});\n\t}\n\n // This takes a 'li' element and adds it to the paletteItems.\n // It also updates any caches and stuff.\n addPaletteListItem(listItem) {\n this.paletteItems.push(listItem);\n\n const link = listItem.querySelector('a');\n if (link) {\n this.itemIndex[link.href] = 1;\n }\n }\n\n contentItemExists(url) {\n return Boolean(this.itemIndex[url]);\n }\n\n injectContentItems(contentItems) {\n console.log('Injecting items');\n\n // We'll need this in the loop below.\n const profileLinkElem = document.getElementById('wp-admin-bar-edit-profile');\n let profileLink = null;\n if (profileLinkElem) {\n profileLink = profileLinkElem.querySelector('a').href;\n }\n\n // TODO: Can we not do this on every content item inject?\n // Check for presence of Oxygen Page builder\n /** @type {HTMLElement|string|Number} */\n let oxygenLinkElem = document.getElementById('toplevel_page_ct_dashboard_page');\n // Also check for a menu bar item\n if (! oxygenLinkElem) {\n oxygenLinkElem = document.getElementById('wp-admin-bar-oxygen_admin_bar_menu');\n }\n // Check to see if Oxygen link is cached\n if (! oxygenLinkElem) {\n oxygenLinkElem = Number(window.localStorage.getItem('ta-has-oxygen-builder'));\n }\n // Save Oxygen builder status\n window.localStorage.setItem('ta-has-oxygen-builder', Boolean(oxygenLinkElem) ? '1' : '0' );\n\n if (contentItems.length > 0) {\n contentItems.forEach(item => {\n const itemTitle = item.title;\n // const itemTitle = item.title.rendered;\n const itemType = item.type;\n const itemUrl = item.url;\n\n // console.log('Adding item: ' + itemTitle);\n\n // // Check if item already exists\n if (this.contentItemExists(itemUrl)) {\n console.log('Not adding duplicate');\n return;\n }\n\n const itemTypeName = this.postTypes[itemType] ? this.postTypes[itemType].name : itemType;\n const title = `${itemTitle} (${itemTypeName})`;\n\n const li = document.createElement('li');\n const a = document.createElement('a');\n const subMenu = document.createElement('div');\n const subMenuTitle = document.createElement('div');\n const subMenuItems = document.createElement('ul');\n subMenu.classList.add('ta-submenu');\n subMenuTitle.classList.add('ta-submenu-title');\n\n subMenuTitle.textContent = this.htmlDecode(itemTitle);\n subMenuItems.classList.add('ta-submenu-items');\n subMenu.appendChild(subMenuTitle);\n subMenu.appendChild(subMenuItems);\n\n const subMenuItem1 = document.createElement('li');\n const subMenuLink1 = document.createElement('a');\n subMenuLink1.innerText = \"View\";\n subMenuLink1.href = itemUrl;\n subMenuItem1.appendChild(subMenuLink1);\n subMenuItems.appendChild(subMenuItem1);\n\n if (profileLink) {\n // Need to get edit URL. This seems like the best way for now.\n const editLink = profileLink.replace('profile.php', `post.php?post=${item.id}&action=edit`);\n\n const subMenuItem2 = document.createElement('li');\n const subMenuLink2 = document.createElement('a');\n subMenuLink2.innerText = \"Edit\";\n subMenuLink2.href = editLink;\n subMenuItem2.appendChild(subMenuLink2);\n subMenuItems.appendChild(subMenuItem2);\n }\n\n if (oxygenLinkElem) {\n // Oxygen Edit Links are like: https://example.com.com/?page_id=26&ct_builder=true&ct_inner=true\n const oxygenLink = globalThis.taWp.home + `?page_id=${item.id}&ct_builder=true&ct_inner=true`;\n\n const subMenuItem3 = document.createElement('li');\n const subMenuLink3 = document.createElement('a');\n subMenuLink3.innerText = \"Edit with Oxygen\";\n subMenuLink3.href = oxygenLink;\n subMenuItem3.appendChild(subMenuLink3);\n subMenuItems.appendChild(subMenuItem3);\n }\n\n const subMenuItem3 = document.createElement('li');\n const subMenuLink3 = document.createElement('a');\n subMenuLink3.innerText = \"Copy link\";\n // Because this is an href we're setting it gets URI encoded!\n subMenuLink3.href = itemUrl;\n subMenuLink3.setAttribute('data-action', 'clipboard');\n subMenuItem3.appendChild(subMenuLink3);\n subMenuItems.appendChild(subMenuItem3);\n\n\n li.classList.add('ta-has-child-menu');\n\n li.appendChild(a);\n li.appendChild(subMenu);\n\n a.href = itemUrl;\n a.innerHTML = title;\n this.addPaletteListItem(li);\n })\n }\n\n // Reset the search to work on the new items\n this.paletteFuse = new Fuse(this.paletteItems, this.paletteFuseOptions);\n this.paletteItems = this.paletteFuse.search(this.paletteInputElement.value).map(i => i.item);\n\n this.updatePaletteItems();\n }\n\n\t/**\n * Handle global keypresses (at document level). Note that other key presses\n * are handled by paletteActions()\n *\n * @param {KeyboardEvent} e\n */\n async handleGlobalKey(e) {\n\t\tif (this.shortcutKeysPressed(e)) {\n e.preventDefault();\n e.stopPropagation();\n\t\t\tif (this.paletteShown()) {\n\t\t\t\tthis.hidePalette();\n\t\t\t} else {\n\t\t\t\tthis.showPalette();\n\t\t\t}\n\t\t}\n\n\t\tif (e.code === 'Escape' && this.paletteShown()) {\n\t\t\tif (this.isSubMenuOpen()){\n this.closeSubMenu();\n } else {\n this.hidePalette();\n }\n\t\t}\n\n if (this.paletteShown()) {\n await this.paletteActions(e);\n\t\t}\n\t}\n\n\tshortcutKeysPressed(keyEvent) {\n // The reduce here works through all the different possible key combos\n // (more than one can be specified in options)\n\t\tconst keysPressed = this.options.shortcutKeys.reduce(\n\t\t\t(keyPressed, combo) => {\n\t\t\t\tif (keyPressed) {\n\t\t\t\t\treturn keyPressed;\n\t\t\t\t}\n return ((!navigator.platform.startsWith('Mac')) || (combo.meta === keyEvent.metaKey))\n && (combo.alt === keyEvent.altKey)\n && (combo.shift === keyEvent.shiftKey)\n && (combo.ctrl === keyEvent.ctrlKey)\n && (\n keyEvent.code === 'Key' + combo.key.toUpperCase()\n || ( combo.key === ' ' && keyEvent.code.toUpperCase() === 'SPACE' )\n );\n }, false);\n\t\treturn keysPressed;\n\t}\n\n async debouncedPaletteSearchAndUpdate() {\n // If search string is not long enough for content search, then\n // run without debounce.\n if (\n ( this.paletteInputElement.value !== '' && this.paletteInputElement.value.length <= 2)\n || this.postTypes === [] ) {\n this.debounceTimeout = null;\n await this.paletteSearchAndUpdate();\n return;\n }\n // If timer is null, reset it to 500ms and run your functions.\n // Otherwise, wait until timer is cleared\n if (!this.debounceTimeout) {\n this.debounceTimeout = setTimeout(async function () {\n // Reset timeout\n this.debounceTimeout = null;\n\n // Run the search function\n await this.paletteSearchAndUpdate();\n }.bind(this), 750);\n }\n }\n\n\t/**\n * Handle (non-global) keypresses on the palette\n *\n * @param {KeyboardEvent} e\n * @returns {Promise}\n */\n async paletteActions(e) {\n\t\tif (e.code === 'ArrowDown' && this.paletteShown()) {\n\t\t\te.preventDefault();\n\t\t\tthis.moveDown();\n\t\t\treturn;\n\t\t}\n\t\tif (e.code === 'ArrowUp' && this.paletteShown()) {\n\t\t\te.preventDefault();\n\t\t\tthis.moveUp();\n\t\t\treturn;\n\t\t}\n\t\tif (e.code === 'Enter' && this.paletteShown()) {\n this.doAction(this.metaPressed(e));\n return;\n\t\t}\n if (this.isSubMenuOpen()) {\n return;\n }\n\t\tawait this.debouncedPaletteSearchAndUpdate();\n\t}\n\n\tshowPalette() {\n\t\tthis.paletteInputElement.value = '';\n\t\tthis.paletteElement?.classList.add('active');\n\t\tthis.paletteInputElement?.focus();\n\t}\n\n\thidePalette() {\n this.navigating = false;\n\t\tthis.paletteElement?.classList.remove('active');\n if (this.isSubMenuOpen()) {\n this.closeSubMenu();\n }\n\t}\n\n\tpaletteShown() {\n\t\treturn this.paletteElement?.classList.contains('active');\n\t}\n\n checkForPaletteItemClick(e) {\n if (e.target.tagName === 'A') {\n e.preventDefault();\n if (this.isSubMenuOpen()) {\n this.selectedSubItem = e.target.closest('li');\n } else {\n this.selectedItem = e.target.closest('li');\n }\n this.setSelectedElement();\n\n this.doAction(this.metaPressed(e));\n }\n }\n\n\tcheckForClickToClose(e) {\n\t\tif (e.target.id === this.paletteElement.id) {\n\t\t\tthis.hidePalette();\n\t\t}\n\t}\n\n\tsetSelectedElement() {\n if (this.isSubMenuOpen()) {\n this.paletteItemsElement?.querySelectorAll('.ta-submenu.active li.selected')?.forEach(e => e.classList.remove('selected'));\n this.selectedSubItem.classList.add('selected');\n } else {\n this.paletteItemsElement?.querySelectorAll('li.selected')?.forEach(e => e.classList.remove('selected'));\n if (this.selectedItem) {\n this.selectedItem.classList.add('selected');\n this.scrollList();\n }\n }\n\t}\n\n\tscrollList() {\n\t\t// Scrolling up\n\t\tif (this.selectedItem.offsetTop < this.paletteItemsElement.scrollTop) {\n\t\t\tthis.paletteItemsElement.scrollTop = this.selectedItem.offsetTop;\n\t\t}\n\t\t// Scrolling down\n\t\tif (this.selectedItem.offsetTop + this.selectedItem.offsetHeight > this.paletteItemsElement.offsetHeight + this.paletteItemsElement.scrollTop) {\n\t\t\tthis.paletteItemsElement.scrollTop = this.selectedItem.offsetTop + this.selectedItem.offsetHeight - this.paletteItemsElement.offsetHeight;\n\t\t}\n\t}\n\n setHoveredItem(element) {\n // Only do this for li's\n if ('LI' === element.tagName) {\n this.navigating = true;\n if (this.isSubMenuOpen()) {\n this.selectedSubItem = element;\n } else {\n this.selectedItem = element;\n }\n this.setSelectedElement();\n }\n }\n\n\tmoveDown() {\n if (this.isSubMenuOpen()) {\n const nextItem = this.selectedSubItem.nextElementSibling;\n this.navigating = true;\n if (nextItem) {\n this.selectedSubItem = nextItem;\n this.setSelectedElement();\n }\n } else {\n const nextItem = this.selectedItem.nextElementSibling;\n this.navigating = true;\n if (nextItem) {\n this.selectedItem = nextItem;\n this.setSelectedElement();\n }\n }\n\t}\n\n\tmoveUp() {\n if (this.isSubMenuOpen()) {\n const prevItem = this.selectedSubItem.previousElementSibling;\n this.navigating = true;\n if (prevItem) {\n this.selectedSubItem = prevItem;\n this.setSelectedElement();\n }\n } else {\n const prevItem = this.selectedItem.previousElementSibling;\n this.navigating = true;\n if (prevItem) {\n this.selectedItem = prevItem;\n this.setSelectedElement();\n }\n }\n }\n\n isSubMenuOpen() {\n return null !== this.openedSubMenu;\n }\n\n openSubMenu(subMenuElement) {\n // Set height in case main menu is smaller than sub menu\n const subMenuHeight = subMenuElement.offsetHeight;\n this.paletteItemsElement.style.minHeight = subMenuHeight + \"px\";\n subMenuElement.classList.add('active');\n\n this.paletteInputElement.disabled = true;\n // Blur the input so that keys can continue to be captured\n this.paletteInputElement.blur();\n\n this.selectedSubItem = subMenuElement.querySelector('li');\n this.openedSubMenu = subMenuElement;\n this.setSelectedElement();\n }\n\n closeSubMenu(subMenuElement = null) {\n if (null === subMenuElement) {\n subMenuElement = document.querySelector('.ta-submenu.active');\n }\n subMenuElement.classList.remove('active');\n this.selectedSubItem.classList.remove('active');\n this.paletteItemsElement.style.minHeight = 'auto';\n this.selectedSubItem = null;\n this.openedSubMenu = null;\n this.paletteInputElement.disabled = false;\n this.paletteInputElement.focus();\n }\n\n\tdoAction(metaPressed = false) {\n if (this.isSubMenuOpen()) {\n this.actOnItem(this.selectedSubItem, metaPressed);\n return;\n }\n if (this.selectedItem.classList.contains('ta-has-child-menu')) {\n const subMenu = this.selectedItem.querySelector('.ta-submenu');\n this.openSubMenu(subMenu);\n return;\n }\n\n this.actOnItem(this.selectedItem, metaPressed);\n }\n\n actOnItem(item, metaPressed) {\n this.hidePalette();\n const link = item.querySelector('a');\n const url = link.href;\n\n if ('clipboard' === link.dataset.action) {\n navigator.clipboard.writeText(url);\n return;\n }\n\n if (metaPressed) {\n window.open(url, '_blank');\n } else {\n window.location = url;\n }\n }\n\n\tselectedItemDisplayed() {\n\t\treturn Array.from(this.paletteItemsElement.childNodes).includes(this.selectedItem);\n\t}\n\n\tasync paletteSearchAndUpdate() {\n\t\tawait this.paletteSearch();\n\t\tthis.updatePaletteItems();\n\t}\n\n\tasync paletteSearch() {\n // Get the value...\n // const response = await globalThis.contentApi.get('posts', { search: this.paletteInputElement.value, per_page: 100, status: ['publish', 'future', 'draft', 'pending', 'private'] });\n\n this.buildPaletteItems();\n\n if (this.paletteInputElement.value !== '') {\n // Reset the search to work on the new items\n this.paletteFuse = new Fuse(this.paletteItems, this.paletteFuseOptions);\n this.paletteItems = this.paletteFuse.search(this.paletteInputElement.value).map(i => i.item);\n }\n\n // Content search - don't search everything!\n if (globalThis.contentApi.active && this.postTypes !== [] && this.paletteInputElement.value.length > 2) {\n this.paletteInnerElement.classList.add('loading');\n\n globalThis.contentApi.getPosts(this.paletteInputElement.value)\n .then(\n results => {\n this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n )\n }\n\t}\n\n\tupdatePaletteItems() {\n\t\tconst newItems = document.createElement('ul');\n\t\tnewItems.id = 'ta-command-palette-items';\n\n\t\tthis.paletteItems.forEach(i => {\n\t\t\tnewItems.appendChild(i);\n\t\t})\n\n\t\tthis.paletteItemsElement.replaceChildren(...newItems.children);\n\n\t\tif (!this.navigating || !this.selectedItemDisplayed()) {\n\t\t\tthis.selectedItem = this.paletteItems[0];\n\t\t}\n\n\t\tthis.setSelectedElement();\n\t}\n\n}\n", "export default class TurboAdminMenuItem {\n\n\tconstructor(title, action, parentTitle, noCache = false) {\n\t\tthis.title = title;\n\t\tthis.action = action;\n\t\tthis.parentTitle = parentTitle;\n this.noCache = noCache;\n\t}\n\n sameAs(item) {\n return item.title === this.title &&\n item.action === this.action &&\n item.parentTitle === this.parentTitle;\n }\n}\n", "/**\n * This class is an abstraction of the browser extension storage API\n * (see https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage)\n * but that falls back to using regular localStorage if we're not in a\n * browser extension.\n *\n * This exists so that the same API can be used from both the browser\n * extension AND the plugin version of Turbo Admin.\n *\n * Note that for the extension, data saved is \"global\" to the extension\n * and is NOT site specific.\n */\nexport default class Storage {\n\n /**\n * Constructor - detects where code is running and sets the local\n * store appropriately.\n */\n constructor() {\n /** @type {null|storageStorageArea|WindowLocalStorage} */\n this.store = null;\n\n if ('undefined' === typeof (browser)) {\n this.store = window.localStorage;\n } else {\n this.store = browser.storage.local;\n }\n }\n\n /**\n * Set/save extension data. Must be passed an object with key/value\n * pairs.\n *\n * @param {Object} dataObject\n */\n async set(dataObject) {\n if ('undefined' === typeof (browser)) {\n const keys = Object.keys(dataObject);\n keys.forEach(key => this.store.setItem(key, JSON.stringify(dataObject[key])));\n } else {\n await this.store.set(dataObject);\n }\n }\n\n /**\n * Get data from the extension's storage.\n *\n * Note that fetched data will be a object with the key as a\n * property.\n *\n * @param {String} key\n * @returns {Promise}\n */\n async get(key) {\n if ('undefined' === typeof (browser)) {\n let returnObj = {};\n let item = this.store.getItem(key);\n if (! item) {\n return returnObj;\n }\n let itemObject = null;\n try {\n itemObject = JSON.parse(this.store.getItem(key));\n } catch (e) {\n itemObject = null;\n }\n returnObj[key] = itemObject;\n return returnObj;\n } else {\n return await this.store.get(key);\n }\n }\n\n}\n", "import Storage from './class-storage.js';\n\nexport default class ContentApi {\n\n constructor() {\n // this.discoverApiRoot().then(e => null);\n // console.log('Discovered API base: ', this.apiBase);\n this.active = false;\n this.store = new Storage();\n\n // This is used to \"cache\" duplicate requests.\n // It's an object because it will have search strings as keys\n this.cache = {};\n }\n\n async discoverApiRoot() {\n let wpApiSettings = null;\n this.storageKey = 'wpApiSettings.' + globalThis.taWp.home;\n\n // Could be in the wp-api-request-js-extra (on wp-admin side)\n const wpApiSettingsScript = document.getElementById('wp-api-request-js-extra');\n if (wpApiSettingsScript) {\n const wpApiSettingsString = wpApiSettingsScript.innerHTML.match(/var\\s+wpApiSettings\\s+=\\s+(.+);/)[1];\n const wpApiSettings = JSON.parse(wpApiSettingsString);\n const objectToSave = {};\n objectToSave[this.storageKey] = wpApiSettings;\n await this.store.set(objectToSave);\n this.apiRoot = wpApiSettings.root;\n this.apiBase = this.apiRoot + wpApiSettings.versionString;\n this.apiNonce = wpApiSettings.nonce;\n // Clear the nonce if one is set and we're not logged in\n this.maybeExpireNonce(wpApiSettings);\n this.active = true;\n return;\n }\n\n // Getting from extension storage returns a object with the key\n // as the key. Which is weird.\n wpApiSettings = await this.store.get(this.storageKey);\n if (wpApiSettings\n && Object.keys(wpApiSettings).length !== 0\n && wpApiSettings[this.storageKey]\n && 'object' === typeof(wpApiSettings[this.storageKey])) {\n // Get the key'ed item out of the object\n wpApiSettings = wpApiSettings[this.storageKey];\n this.apiRoot = wpApiSettings.root;\n this.apiBase = this.apiRoot + wpApiSettings.versionString;\n this.apiNonce = wpApiSettings.nonce;\n // Clear the nonce if one is set and we're not logged in\n this.maybeExpireNonce(wpApiSettings);\n this.active = true;\n return;\n }\n\n // Could be in \n if (globalThis.taWp.apiLinkUrl) {\n this.apiRoot = globalThis.taWp.apiLinkUrl;\n // Just guess this\n this.apiBase = this.apiRoot + 'wp/v2/';\n this.active = true;\n return;\n }\n }\n\n userLoggedIn() {\n return document.body.classList.contains('logged-in') ||\n document.body.classList.contains('wp-admin');\n }\n\n async maybeExpireNonce(wpApiSettings) {\n if (wpApiSettings?.nonce && ! this.userLoggedIn()) {\n // Clear apiSetting nonce\n this.apiNonce = null;\n wpApiSettings.nonce = null;\n const objectToSave = {};\n objectToSave[this.storageKey] = wpApiSettings;\n await this.store.set(objectToSave);\n }\n }\n\n makeParamString(data) {\n const params = new URLSearchParams();\n\n Object.keys(data).forEach(paramKey => {\n // Handle arrays\n if (Array.isArray(data[paramKey])) {\n const arrayParamKey = paramKey + '[]';\n data[paramKey].forEach( item => params.append(arrayParamKey, item));\n } else {\n params.append(paramKey, data[paramKey]);\n }\n });\n\n return params.toString();\n }\n\n statuses() {\n if (this.apiNonce) {\n return [\"publish\", \"future\", \"draft\", \"pending\", \"private\"];\n } else {\n return [\"publish\"];\n }\n }\n\n types() {\n return globalThis.turboAdmin.turboAdminPalette.postTypes;\n }\n\n async getPosts(searchString) {\n // Check the cache\n if (undefined !== this.cache[searchString]) {\n return this.cache[searchString];\n }\n\n // Fetch results\n const response = await this.get(\n // \"posts\",\n \"search\",\n {\n search: searchString,\n per_page: 100,\n // status: this.statuses(),\n type: 'post',\n subtype: 'any'\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache[searchString] = result;\n\n return result;\n }\n\n async get(path, data = {}) {\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n }\n\n // Add the nonce if there is one\n if (this.apiNonce) {\n data._wpnonce = this.apiNonce;\n }\n\n const params = this.makeParamString(data);\n\n const response = await fetch(`${this.apiBase}${path}/?${params}`);\n\n return response;\n }\n\n}\n", "/**\n * It's impossible to change the setting to off, because the\n * extension's content script runs in a sandbox and can't access\n * the wp object. But we can just toggle the class every time.\n */\nexport default class TurboAdminWpBlockEditorFullscreenKill {\n\n constructor() {\n\n const attrObserver = new MutationObserver((mutations) => {\n mutations.forEach(mu => {\n // Check if we already killed fullscreen\n // if (document.body.classList.contains('turbo-admin-killed-fullscreen')) {\n // return;\n // }\n\n if (mu.type !== \"attributes\" && mu.attributeName !== \"class\") {\n return;\n }\n\n if (mu.target.classList.contains('is-fullscreen-mode')) {\n this.killFullScreenEditor();\n }\n });\n });\n\n attrObserver.observe(document.body, { attributes: true });\n\n // Also attempt a kill now in case it's already appeared.\n this.killFullScreenEditor();\n }\n\n killFullScreenEditor() {\n if (! document.body.classList.contains('is-fullscreen-mode')) {\n return;\n }\n\n document.body.classList.remove('is-fullscreen-mode');\n document.body.classList.add('turbo-admin-killed-fullscreen');\n\n const newStyles = document.createElement('style');\n newStyles.innerHTML = \"body.turbo-admin-killed-fullscreen .edit-post-fullscreen-mode-close { display: none; }\";\n document.body.appendChild(newStyles);\n }\n}\n", "/**\n *\n */\nexport default class TurboAdminWpBlockEditorWelcomeGuideKill {\n\n constructor() {\n\n const attrObserver = new MutationObserver((mutations) => {\n mutations.forEach(mu => {\n // Check if we already killed the modal\n if (document.body.classList.contains('ta-killed-post-welcome-guide')) {\n return;\n }\n\n if (mu.type !== \"attributes\" && mu.attributeName !== \"class\") {\n return;\n }\n\n if (! mu.target.classList.contains('modal-open')) {\n return;\n }\n\n const welcomeGuide = document.querySelector('.edit-post-welcome-guide');\n if (welcomeGuide) {\n this.killWelcomeGuide();\n }\n });\n });\n\n attrObserver.observe(document.body, { attributes: true });\n\n // Also attempt a kill now in case it's already appeared.\n this.killWelcomeGuide();\n }\n\n killWelcomeGuide() {\n const welcomeGuide = document.querySelector('.edit-post-welcome-guide');\n if (welcomeGuide) {\n const closeButton = welcomeGuide.querySelector('.components-modal__header button');\n if (closeButton) {\n closeButton.click();\n /*\n * Also add a class to body so we don't do it again - subsequent modals\n * will need to be shown as they will have been user-initiated.\n */\n document.body.classList.add('ta-killed-post-welcome-guide');\n }\n }\n }\n}\n", "export default class TurboAdminWpNotices {\n\n // TODO: Handle empty IDS. Can we identify unique selectors?\n // See spinup!\n // Also need to only show move to panel if we can (i.e. if there's a way\n // to identify it))\n constructor(rememberedNoticeIds) {\n\n // Bail if we aren't in the admin\n if (! document.querySelector('body.wp-admin')) {\n return;\n }\n\n /*\n * These are the global notice selectors - these are always hidden\n */\n this.noticeSelectors = [\n '#wpbody-content > .notice',\n '#wpbody-content > .wrap > .notice',\n '#wpbody-content > .wrap > .updated',\n '#gf_dashboard_message', // Gravity forms\n '.jitm-banner', //\n '.fs-notice', // I get this in Replyable\n '#updraft-dashnotice', // Updraft backups\n '.woocommerce-message', // WooCommerce\n '#akismet_setup_prompt', // Akismet\n '#wf-onboarding-plugin-header', // WordFence onboard\n '.llar-notice-review' // Limit Login Attempts reloaded\n ];\n\n /*\n * These selectors are allowed (unless explicitly denied)\n */\n this.allowedClasses = [\n 'notice-success',\n 'notice-error',\n 'notice-failure',\n 'updated',\n ]\n\n if (rememberedNoticeIds) {\n this.rememberedNoticeIds = rememberedNoticeIds.length > 0 ? rememberedNoticeIds : [];\n } else {\n this.rememberedNoticeIds = [];\n }\n\n const toolbar = document.getElementById('wpadminbar');\n\n if (!toolbar) {\n return;\n }\n\n if (rememberedNoticeIds && rememberedNoticeIds.length > 0) {\n rememberedNoticeIds.forEach(id => {\n if ('string' === typeof(id) && id.length > 0) {\n this.noticeSelectors.push('#' + id);\n }\n });\n }\n\nconsole.log('Notice Selectors', this.noticeSelectors);\n const notices = document.querySelectorAll(this.noticeSelectors.join(','));\nconsole.log('Notices', notices);\n\n // Add buttons to notices that can be moved\n notices.forEach(notice => {\n this.maybeAddIdToNotice(notice)\n\n if (this.keepNotice(notice)) {\n const rememberButton = document.createElement('button');\n rememberButton.classList.add('ta-remember-notice-button');\n rememberButton.innerText = 'Move to panel';\n\n const forgetButton = document.createElement('button');\n forgetButton.classList.add('ta-forget-notice-button');\n forgetButton.innerText = 'Move to dashboard';\n\n notice.classList.add('ta-added-pos-relative');\n\n notice.appendChild(rememberButton);\n notice.appendChild(forgetButton);\n\n rememberButton.addEventListener('click', this.rememberNotice.bind(this), false, true);\n forgetButton.addEventListener('click', this.forgetNotice.bind(this), false, true);\n }\n });\n\n const noticesToHide = Array.from(notices).filter(notice => {\n if (this.rememberedNoticeIds.includes(notice.id)) {\n return true;\n }\n\n if (this.keepNotice(notice)) {\n return false;\n }\n\n // Invisible\n if (\n notice.offsetHeight === 0 ||\n notice.offsetWidth === 0\n ) {\n return false;\n }\n\n return true;\n })\n\n console.log('Notices to hide', noticesToHide)\n\n /**\n * Build the notices wrapper\n */\n /** @type {HTMLDivElement} */\n const noticesLinkWrapper = document.createElement('div');\n noticesLinkWrapper.id = 'ta-notices-link-wrap';\n noticesLinkWrapper.classList.add('hide-if-no-js', 'screen-meta-toggle');\n noticesLinkWrapper.style.margin='0 0 0 6px';\n noticesLinkWrapper.style.float='left';\n if (noticesToHide.length === 0) {\n noticesLinkWrapper.style.display='none';\n }\n\n /**\n * Add button.\n */\n /** @type {HTMLButtonElement} */\n const noticesButton = document.createElement('button');\n noticesButton.type='button';\n noticesButton.id='ta-notices-link';\n noticesButton.classList.add('button', 'show-settings');\n noticesButton.innerHTML='Notices ' + noticesToHide.length + '';\n noticesButton.setAttribute('aria-controls', 'ta-notices-wrap');\n\n // This should replicate the functionality from wp-admin/js/common.js\n // as closely as possible. But note that we can't access the common.js\n // functions.\n noticesButton.addEventListener('click', this.toggleNoticesPanel.bind(this), false);\n\n /**\n * Add button to the link wrapper\n */\n noticesLinkWrapper.appendChild(noticesButton);\n\n /**\n * Add the link wrapper to the screen-meta-links section\n */\n const screenMetaLinks = document.getElementById('screen-meta-links');\n screenMetaLinks.appendChild(noticesLinkWrapper);\n\n /**\n * Build the panel\n */\n const noticesPanel = document.createElement('div');\n\n noticesPanel.id='ta-notices-wrap';\n noticesPanel.style.display='none';\n noticesPanel.dataset.open='no';\n\n const noticesPanelInner = document.createElement('div');\n noticesPanelInner.id = 'ta-notices-panel-inner';\n\n noticesToHide.forEach(notice => {\n // Add 'inline' class otherwise WordPress might move them around!\n notice.classList.add('inline');\n // See Toolbelt's implementation: https://github.com/BinaryMoon/wp-toolbelt/blob/dev/modules/tidy-notifications/src/js/script.js\n noticesPanelInner.append(notice);\n });\n\n /**\n * Add wrap to the meta area\n */\n noticesPanel.appendChild(noticesPanelInner);\n const screenMeta = document.getElementById('screen-meta');\n screenMeta.appendChild(noticesPanel);\n\n // Set up events on the new screen-meta item\n // if (window.screenMeta) {\n // window.screenMeta.init();\n // }\n }\n\n // Does the allowedClasses list say that this notice should be shown?\n keepNotice(noticeElem) {\n return this.allowedClasses.reduce( (found, current) => {\n return found || noticeElem.classList.contains(current)\n }, false);\n }\n\n rememberNotice(ev) {\n const noticesLinkWrap = document.getElementById('ta-notices-link-wrap');\n const panel = document.getElementById('wp-admin-bar-ta-notices');\n const panelInner = document.getElementById('ta-notices-panel-inner');\n const countElem = document.getElementById('ta-notice-count');\n const count = parseInt(countElem.innerText, 10);\n const notice = ev.target.closest(this.noticeSelectors.join(','));\n const noticeId = notice.id;\n console.log(`Remembering ${noticeId}`);\n panelInner.appendChild(notice);\n if (count === 0) {\n noticesLinkWrap.style.display = 'block';\n }\n\n this.updateScreenMetaHeight();\n\n countElem.innerText = parseInt(countElem.innerText, 10) + 1;\n\n this.saveRememberedNotice(noticeId);\n }\n\n saveRememberedNotice(noticeId) {\n this.rememberedNoticeIds.push(noticeId);\n\n if ('object' === typeof(browser)) {\n browser.runtime.sendMessage({\n 'action': 'rememberNotice',\n 'noticeId': noticeId,\n });\n } else {\n window.localStorage.setItem('rememberedNoticeIds', JSON.stringify(this.rememberedNoticeIds));\n }\n }\n\n forgetNotice(ev) {\n const noticesLinkWrap = document.getElementById('ta-notices-link-wrap');\n const panelInner = document.getElementById('ta-notices-panel-inner');\n const countElem = document.getElementById('ta-notice-count');\n const count = parseInt(countElem.innerText, 10);\n const notice = ev.target.closest(this.noticeSelectors.join(','));\n const noticeId = notice.id;\n console.log(`Forgetting ${noticeId}`);\n\n notice.remove();\n\n const message = document.createElement('div');\n const p = document.createElement('p');\n message.classList.add('notice', 'ta-forget-notice-message');\n p.textContent = 'Notice will be back in dashboard on next page load';\n message.appendChild(p);\n panelInner.appendChild(message);\n\n this.updateScreenMetaHeight();\n\n // I was going to to this, but we need to keep the notice about\n // where the notice has gone.\n // if (count === 1) {\n // noticesLinkWrap.style.display = 'none';\n // }\n\n countElem.innerText = (count - 1).toString();\n this.saveForgottenNotice(noticeId);\n }\n\n saveForgottenNotice(noticeId) {\n this.rememberedNoticeIds.push(noticeId);\n\n if ('object' === typeof(browser)) {\n browser.runtime.sendMessage({\n 'action': 'rememberNotice',\n 'noticeId': noticeId,\n });\n } else {\n this.rememberedNoticeIds = this.rememberedNoticeIds.filter( id => id !== noticeId );\n window.localStorage.setItem('rememberedNoticeIds', JSON.stringify(this.rememberedNoticeIds));\n }\n }\n\n\n\n /*\n * For notices without IDs we'll see if we can add an ID that's a hash of their classlist\n */\n maybeAddIdToNotice(notice) {\n if (notice.id && notice.id !== '' && notice.id !=='message') {\n return;\n }\n\n const classes = notice.classList;\n notice.id = Array.from(notice.classList).join('-');\n }\n\n /**\n * Detect if WordPress has already applied event handlers to our new screen meta button.\n *\n * If it has then WordPress/backbone.js will handle the animation and we won't have to.\n *\n * @returns {boolean}\n */\n wordpressScreenMetaEventsExist() {\n return 'object' === typeof(window.screenMeta) && window.screenMeta.toggles.filter('#ta-notices-link').length > 0;\n }\n\n updateScreenMetaHeight() {\n // Don't do this if we're relying on backbone's animation\n if (this.wordpressScreenMetaEventsExist()) {\n return;\n }\n\n const screenMeta = document.getElementById('screen-meta');\n const noticesPanel = document.getElementById('ta-notices-wrap');\n const height = noticesPanel.offsetHeight;\n screenMeta.style.maxHeight = height.toString(10) + 'px';\n }\n\n toggleNoticesPanel(ev) {\n // We may be in the plugin in which case we don't want to run our handler if there's\n // a backbone handler on the button.\n if (this.wordpressScreenMetaEventsExist()) {\n return;\n }\n // Otherwise we mimic the swipe down animation.\n const animationSeconds = 0.3;\n const screenMeta = document.getElementById('screen-meta');\n const noticesPanel = document.getElementById('ta-notices-wrap');\n if (noticesPanel.dataset.open === 'no') {\n this.toggleOtherScreenMetaTabs();\n // Don't ask... just DON'T ask!\n noticesPanel.dataset.open = 'yes';\n screenMeta.style.transition = `max-height ${animationSeconds.toString(10)}s`;\n screenMeta.style.maxHeight = '0';\n screenMeta.style.overflow = 'hidden';\n screenMeta.style.display = 'block';\n noticesPanel.style.display = 'block';\n const height = noticesPanel.offsetHeight;\n screenMeta.style.maxHeight = height.toString(10) + 'px';\n // setTimeout(() => {\n // // Nothing to do here.\n // }, animationSeconds * 1000);\n } else {\n noticesPanel.dataset.open = 'no';\n const height = noticesPanel.offsetHeight;\n screenMeta.style.maxHeight = '0';\n setTimeout(() => {\n noticesPanel.style.display = '';\n screenMeta.style.display = '';\n screenMeta.style.transition = '';\n screenMeta.style.overflow = '';\n screenMeta.style.maxHeight = '';\n this.toggleOtherScreenMetaTabs();\n }, animationSeconds * 1000);\n }\n\n }\n\n toggleOtherScreenMetaTabs() {\n const otherTabs = document.querySelectorAll('#screen-meta-links .screen-meta-toggle:not(#ta-notices-link-wrap)');\n otherTabs.forEach( (tab) => {\n if (tab.style.visibility === 'hidden') {\n tab.style.visibility = '';\n } else {\n tab.style.visibility = 'hidden';\n }\n } );\n }\n}\n", "export default class ListTableShortcuts {\n\n constructor() {\n /**\n * @type {ListTableShortcuts}\n */\n const me = this;\n\n /**\n * @type {null|HTMLElement}\n */\n this.currentRow = null;\n\n /**\n * @type {number}\n */\n this.currentRowIndex = 0;\n\n /**\n * @type {HTMLTableElement}\n */\n this.listTable = document.querySelector('.wp-list-table');\n\n if (! this.listTable) {\n return;\n }\n\n /**\n * @type {NodeListOf}\n */\n this.tableRows = this.listTable.querySelectorAll('tbody#the-list > tr');\n\n document.addEventListener('keyup', e => this.handleKeyup(e));\n }\n\n /**\n *\n * @param {KeyboardEvent} ev\n */\n handleKeyup(ev) {\n if (document.activeElement.tagName !== 'BODY') {\n return;\n }\n\n if (ev.key === 'j') {\n this.tableMoveDown();\n } else if (ev.key === 'k') {\n this.tableMoveUp();\n } else if (ev.key.toLowerCase() === 'enter' && this.currentRow !== null) {\n this.openTableRowItem();\n }\n\n }\n\n tableMoveDown() {\n this.preTableChange();\n\n // Move down\n if (this.currentRow === null) {\n this.currentRowIndex = 0;\n } else {\n this.currentRowIndex++;\n }\n this.updateTable();\n }\n\n tableMoveUp() {\n this.preTableChange();\n\n if (this.currentRowIndex > 0) {\n this.currentRowIndex--;\n this.updateTable();\n }\n }\n\n preTableChange() {\n if (this.currentRow !== null) {\n this.tableRows[this.currentRowIndex].classList.remove('ta-active-table-row');\n }\n }\n\n updateTable() {\n this.currentRow = this.tableRows[this.currentRowIndex];\n\n if (! this.tableRows[this.currentRowIndex].classList.contains('ta-active-table-row')) {\n this.tableRows[this.currentRowIndex].classList.add('ta-active-table-row');\n }\n }\n\n openTableRowItem() {\n console.log(this);\n /** @type {HTMLAnchorElement} */\n const link = this.currentRow.querySelector('a.row-title');\n if (link) {\n link.click();\n }\n }\n}\n", "/*\n * This is the common Turbo Admin library.\n *\n * It's (currently) WordPress-specific, but can be loaded by\n * either the Extension OR the Plugin\n *\n * It takes an options object:\n *\n * options: {\n * shortcutKeys: [\n * // Array of shortcut key definitions, like:\n * {\n * {\n * meta: false,\n * alt: true,\n * ctrl: true,\n * shift: true,\n * key: 'p'\n * }\n * }\n * ],\n * appendToElement {\n * // Optional CSS selector to define what to append the palette to\n * 'body'\n * },\n * extraItems: [\n * // Optional array of extra item configs used to generate new item objects\n * {\n * 'detectType': 'url',\n * 'detectPattern': 'wp-login',\n * 'itemTitle': 'View/visit site',\n * 'itemUrlFunction': () => this.home\n * },\n * ],\n * extraItemsRaw: [\n * // Optional array of raw item objects to be added\n * {\n * 'title': ,\n * 'action': ,\n * 'parentTitle': ,\n * }\n * ]\n * }\n */\nimport TurboAdminPalette from './class-turbo-admin-palette.js';\nimport TurboAdminMenuItem from './class-turbo-admin-menu-item.js';\nimport Acf from './class-acf.js';\nimport TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js';\nimport TurboAdminWpBlockEditorWelcomeGuideKill from './class-turbo-admin-wp-block-editor-welcome-guide-kill.js';\nimport TurboAdminWpNotices from './class-turbo-admin-wp-notices.js';\nimport TurboAdminListTableShortcuts from './class-list-table-shortcuts.js';\n\nexport default class TurboAdmin {\n\n constructor(options) {\n if (document.getElementById('ta-command-palette-container')) {\n console.log('TurboAdmin already initialised - I won\\'t make a second copy!');\n return;\n }\n\n this.options = options;\n }\n\n async init() {\n // Grab the global Wp object instance\n this.wp = globalThis.taWp;\n\n this.menu = [];\n // Check for saved menu when on front-end\n if (! this.wp.isBackend) {\n // Only use the cached items if the current URL matches the last site URL\n // This handles changes of multi-site site!\n // We ONLY need to do this on the front-end as the back-end will always\n // refresh the menu.\n if (! this.wp.siteChanged) {\n // Get from localStorage\n const savedMenu = window.localStorage.getItem('ta-palette-data');\n\n if (null !== savedMenu) {\n // Check for .logged-in class on body\n if (document.body.classList.contains('logged-in')) {\n // If still logged in merge (?) the items\n this.menu = JSON.parse(savedMenu);\n }\n }\n }\n } else {\n // On the back end, get the WordPress dashboard menu items\n this.menu = this.getMenu();\n }\n\n // Add other additional items\n this.addAdditionalMenuItems();\n // Add items passed in using extraItemsRaw\n this.menu = this.menu.concat(this.options.extraItemsRaw ?? []);\n\n // Add ACF items?\n // TODO: Make this better. Possible ASYNC somehow?\n // this.acf = new Acf();\n // if (this.acf.isAcfInstalled()) {\n // const acfLinks = await this.acf.getFieldGroups()\n // // console.table(acfItems);\n // const acfMenuItems = acfLinks.map(\n // item => new TurboAdminMenuItem(\n // item.label + ' (ACF)',\n // item.link,\n // ''\n // )\n // );\n // this.menu = this.menu.concat(acfMenuItems);\n // }\n\n // Sort the menu\n this.menu.sort((a, b) => (a.parentTitle + a.title).localeCompare(b.parentTitle + b.title));\n\n // Filter out no-cache items and save to localStorage.\n const itemsToSave = this.menu.filter(item => (! item.noCache));\n window.localStorage.setItem('ta-palette-data', JSON.stringify(itemsToSave));\n\n // Add palette markup to the DOM\n this.addPalette();\n // Initialise controls on the palette\n this.turboAdminPalette = new TurboAdminPalette(this.menu, this.options);\n\n if (true === this.options['block-editor-fullscreen-disable']) {\n // Initialise fullscreen kill\n this.turboAdminFullscreenKill = new TurboAdminWpBlockEditorFullscreenKill();\n }\n\n if (true === this.options['block-editor-welcome-screen-kill']) {\n this.turboAdminWelcomeKill = new TurboAdminWpBlockEditorWelcomeGuideKill();\n }\n\n if (true === this.options['list-table-keyboard-shortcuts']) {\n this.turboAdminListTableShortcuts = new TurboAdminListTableShortcuts();\n }\n\n // Add other things if we're logged in and have an API nonce\n if (globalThis.contentApi.userLoggedIn()) {\n // What shall we do?\n }\n }\n\n getMenu() {\n const items = [];\n const menuTop = document.getElementById('adminmenu');\n if (menuTop) {\n const topDOMItems = menuTop.querySelectorAll('li.menu-top');\n topDOMItems.forEach(el => {\n const a = el.querySelector('a.menu-top');\n const title = a.querySelector('.wp-menu-name').innerHTML;\n const action = a.href;\n const parentTitle = '';\n const item = new TurboAdminMenuItem(title, action, parentTitle);\n items.push(item);\n\n const subMenu = el.querySelector('.wp-submenu');\n if (!subMenu) {\n return;\n }\n const subItems = subMenu.querySelectorAll('li a');\n if (!subItems) {\n return;\n }\n subItems.forEach(subEl => {\n const parentTitle = title;\n const childTitle = subEl.innerHTML;\n const childAction = subEl.href;\n const item = new TurboAdminMenuItem(childTitle, childAction, parentTitle);\n items.push(item);\n })\n });\n }\n return items;\n }\n\n addAdditionalMenuItems() {\n\n /*\n * I'd LOVE for this to be config driven\n *\n * [\n * {\n * 'detectType': 'url',\n * 'detectPattern': 'wp-login',\n * 'itemTitle': 'View/visit site',\n * 'itemUrlFunction': () => this.home\n * },\n * {\n * 'detectType': 'dom',\n * 'detectSelector': '#wpadminbar',\n * 'itemTitle': 'Logout',\n * 'itemUrlFunction': () => logoutUrl\n * }\n * Can we add actionTypes as well? To do clicks and navigates?\n * ]\n */\n\n // Get passed-in extraItems\n let extraItems = this.options.extraItems ?? [];\n\n // Merge in defaults\n extraItems = extraItems.concat(\n [\n {\n 'detectType': 'dom',\n 'detectSelector': 'body.wp-admin #wp-admin-bar-view-site a',\n 'itemTitleFunction': () => 'View/visit site',\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-dashboard a',\n 'itemTitleFunction': (element) => element.textContent,\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wpadminbar',\n 'itemTitleFunction': () => 'Logout',\n 'itemUrlFunction': () => document.getElementById('wp-admin-bar-logout')?.querySelector('a')?.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-edit a',\n 'itemTitleFunction': (item) => item.textContent,\n 'itemUrlFunction': (item) => item.href,\n 'noCache': true,\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-view a',\n 'itemTitleFunction': (item) => item.textContent,\n 'itemUrlFunction': (item) => item.href,\n 'noCache': true,\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-new-content .ab-submenu a',\n 'itemTitleFunction': (item) => 'New ' + item.textContent,\n 'itemUrlFunction': (item) => item.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-customize a',\n 'itemTitleFunction': (item) => item.textContent,\n 'itemUrlFunction': (item) => item.href\n },\n {\n 'detectType': 'dom',\n 'detectSelectorNone': '#wpadminbar, #loginform',\n 'itemTitleFunction': () => \"Log in\",\n 'itemUrlFunction': () => {\n if (globalThis.taWp.home) {\n return globalThis.taWp.siteUrl;\n }\n // Try getting wp-admin\n return 'javascript:alert(\\'Sorry, could not detect login URL.\\')';\n }\n },\n // This is on the login screen\n {\n 'detectType': 'dom',\n 'detectSelector': '#backtoblog a',\n 'itemTitleFunction': () => \"View/visit site\",\n 'itemUrlFunction': (element) => element.href\n },\n // Multisite items\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-my-sites #wp-admin-bar-network-admin > a',\n 'itemTitleFunction': () => \"Network Admin\",\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-my-sites #wp-admin-bar-network-admin .ab-submenu a',\n 'itemTitleFunction': (element) => 'Network Admin: ' + element.textContent,\n 'itemUrlFunction': (element) => element.href\n },\n {\n 'detectType': 'dom',\n 'detectSelector': '#wp-admin-bar-my-sites #wp-admin-bar-my-sites-list .ab-submenu a',\n 'itemTitleFunction': (element) => \"Sites: \" + element.closest('.menupop').querySelector('a').innerText + ' - ' + element.innerText,\n 'itemUrlFunction': (element) => element.href\n },\n // Oxygen builder items\n {\n 'detectType': 'dom',\n 'detectSelector': '#ct-edit-template-builder',\n 'itemTitleFunction': () => 'Edit with Oxygen',\n 'itemUrlFunction': (element) => element.href,\n 'noCache': true\n },\n // It's worth noting that the Oxygen Builder doesn't use a /wp-admin URL\n // and so kinda appears to Turbo Admin to be a \"front-end\" page and it\n // doesn't refresh the menu items.\n {\n 'detectType': 'dom',\n 'detectSelector': '.oxygen-back-to-wp-menu .oxygen-toolbar-button-dropdown a:not(:last-of-type)',\n 'itemTitleFunction': (element) => 'Back to WP: ' + element.textContent,\n 'itemUrlFunction': (element) => {\n if (element.href) {\n return element.href;\n } else {\n let url = new URL(window.location.href);\n return url.origin + url.pathname;\n }\n },\n 'noCache': true\n }\n ]\n );\n\n extraItems.forEach(item => {\n let detected = false;\n let elements = null;\n if (item.detectType === 'url') {\n detected = Boolean(window.location.href.includes(item.detectPattern));\n } else if (item.detectType === 'dom') {\n if (item.detectSelector) {\n elements = document.querySelectorAll(item.detectSelector);\n detected = Boolean(elements);\n } else if (item.detectSelectorNone) {\n elements = document.querySelectorAll(item.detectSelectorNone);\n detected = elements.length === 0;\n // Need to pass SOMETHING to the loop below\n elements = document.querySelectorAll('body');\n }\n }\n if (!detected) {\n return;\n }\n\n elements.forEach(element => {\n const newItem = new TurboAdminMenuItem(item.itemTitleFunction(element), item.itemUrlFunction(element), '', item?.noCache);\n // Might already have one so check.\n if (this.menu.some(menuItem => {\n // This must be newItem.sameAs, not menuItem.sameAs because the menuItem\n // may have been loaded from saved menu and may not actually be an instance\n // of a TurboAdminMenuItem.\n return newItem.sameAs(menuItem)\n } )) {\n return;\n }\n // We don't already have one. So add it.\n this.menu.push(newItem);\n });\n })\n }\n\n addPalette() {\n // Container\n const container = document.createElement('div');\n container.id = 'ta-command-palette-container';\n // Palette\n const palette = document.createElement('div');\n palette.id = 'ta-command-palette';\n // Input field\n const input = document.createElement('input');\n input.id = \"ta-command-palette-input\";\n input.name = \"ta-command-palette-input\";\n input.type = \"text\";\n // Set this to stop stuff trying to fill it.\n input.setAttribute('autocomplete', 'off');\n // List\n const list = document.createElement('ul');\n list.id = \"ta-command-palette-items\";\n // Join it all up\n container.appendChild(palette);\n palette.appendChild(input);\n palette.appendChild(list);\n\n document.querySelector(this.options.appendToElement ?? 'body').appendChild(container);\n }\n\n}\n", "export default class Wp {\n\n constructor() {\n\n // Set home and siteUrl\n this.siteUrl = '';\n this.home = '';\n this.loginUrl = '';\n this.apiLinkUrl = '';\n }\n\n async completeInit() {\n // Fetch previously loaded site URL\n this.previousUrl = window.localStorage.getItem('ta-palette-data-site');\n\n // Fetch previously-stored siteUrl and home\n this.siteUrl = window.localStorage.getItem('ta-palette-data-siteurl');\n this.home = window.localStorage.getItem('ta-palette-data-home');\n\n /**\n * Are we in the back-end?\n */\n this.isBackend = this.getIsBackend();\n\n /**\n * Figure out all the WP URLs\n */\n await this.getUrls();\n\n /**\n * Tells you if the best-guess site URL of the current page is different\n * to that of the previously saved site URL.\n */\n this.siteChanged = this.home !== this.previousUrl;\n\n // Save current site URL for next time\n window.localStorage.setItem('ta-palette-data-site', this.home);\n }\n\n getIsBackend() {\n return document.body.classList.contains('wp-admin');\n }\n\n /**\n * Return the URL with a trailing slash if it didn't already have one.\n *\n * @param {String} url The URL to check\n * @return {String} The resulting URL\n */\n ensureTrailingSlash( url ) {\n if (url.endsWith('/')) {\n return url;\n } else {\n return url + '/';\n }\n }\n\n /**\n * Tests if a URL works and, if redirected, that the final URL contains a given\n * string. Returns the final, redirected-to URL if the test passed, or false\n * otherwise.\n *\n * @param {String} url The URL to test.\n * @param {String} responseUrlMustContain The string to test against the final URL\n * @returns {Promise} The final URL or false.\n */\n async testUrl(url, responseUrlMustContain='') {\n\n /** @type {RequestInit} */\n const init = {\n method: 'HEAD',\n mode: 'cors',\n cache: 'no-cache',\n credentials: 'same-origin'\n }\n\n const response = await fetch(url, init);\n\n if (response.redirected && !response.url.includes(responseUrlMustContain)) {\n return false;\n }\n\n if ( ! response.ok ) {\n return false;\n }\n\n return response.url;\n }\n\n async findWhichUrlWorks(urls, responseUrlMustContain='') {\n let workingUrl = false;\n let result;\n // This has to be a for loop rather than reduce or forEach as separate\n // async callbacks would be launched asynchronously.\n for (let i=0; i {\n// \tturboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n// });\n\n globalThis.turboAdminOptions = settings[taStorageKey];\n\n // Get Wp stuff ready\n globalThis.taWp = new Wp();\n\n // Parts of this init are async.\n await globalThis.taWp.completeInit();\n\n console.log('Turbo Admin: WP is initialised');\n\n // Get/set api settings\n globalThis.contentApi = new ContentApi();\n await globalThis.contentApi.discoverApiRoot();\n\n console.log('Turbo Admin: Content API is initialised');\n\n globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n\n await globalThis.turboAdmin.init();\n\n if (settings[taStorageKey]['hide-notices']) {\n globalThis.turboAdminWpNotices = new TurboAdminWpNotices(settings[taStorageKey].rememberedNoticeIds);\n }\n}\n\n/**\n * This is plugin-specific. It should not be present in the extension code.\n */\ndocument.addEventListener('DOMContentLoaded', async e => {\n\tglobalThis.turboAdminOptions = {};\n\tglobalThis.turboAdminOptions[taStorageKey] = {\n\t\t// wpTurboAdmin is set using wp_localize_script\n\t\tshortcutKeys: globalThis.wpTurboAdmin.keys,\n // These don't apply to the plugin version\n 'block-editor-fullscreen-disable': false,\n 'block-editor-welcome-screen-kill': false,\n // I don't think we'll do this in the plugin as the code would be SO different.\n 'live-dev-notice': false,\n 'list-table-keyboard-shortcuts': globalThis.wpTurboAdmin['listTableShortcuts'] === '1',\n 'hide-notices': globalThis.wpTurboAdmin['hideNotices'] === '1',\n 'rememberedNoticeIds': JSON.parse(window.localStorage.getItem('rememberedNoticeIds')) ?? new Array()\n\t}\n\tawait taInit(globalThis.turboAdminOptions);\n});\n"], + "mappings": "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", "names": [] } diff --git a/package.json b/package.json index 5504a8a..5b82b89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turbo-admin", - "version": "1.5.3", + "version": "1.7.0", "main": "Gruntfile.js", "author": "Ross Wintle", "scripts": { diff --git a/readme.txt b/readme.txt index da98ba7..c024c74 100644 --- a/readme.txt +++ b/readme.txt @@ -3,84 +3,113 @@ Contributors: magicroundabout Donate link: https://ko-fi.com/magicroundabout Tags: menu, commands, shortcuts Requires at least: 4.9 -Tested up to: 5.8 +Tested up to: 5.9 Requires PHP: 7.2 -Stable tag: 1.5.3 +Stable tag: 1.7.0 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html -The command palette that gives super fast access to your WordPress Dashboard. +== Description == -If you love this plugin, you can get Turbo Admin on ALL your sites, without needing to install the plugin, with the browser extension version! +Ugh, this Dashboard menu is so cluttered? -[Check out the Browser Extension](https://turbo-admin.com/) +Where is everything? -== Description == +Is it in Tools? Or Settings? Or some menu of it's own? + +How am I supposed to work with this clutter? + +## If the WordPress Dashboard is slowing you down, Turbo Admin is here to speed you up. + +Work faster with WordPress using a quick-access command palette and a collection of Dashboard improvements. Simply install, activate and go! + +Turbo Admin's main features are: + +* A fast-action, keyboard driven command palette: Think Apple Spotlight, or Alfred, but in WordPress! +* (Experimental) Notice hiding: Tidy your dashboard by hiding admin notices in a separate, slide-out panel. +* (Experimental/Beta): List table keyboard shortcuts - use vim-like keys to navigate lsit tables. + +If you love this plugin, you can get Turbo Admin on ALL your sites without needing to install the plugin, with the browser extension version! + +PLUS the browser extension has features not present in the plugin because, well, they only make sense in the extension! + +* Full screen block editor killer +* Block editor welcome guide remover +* Live/dev site labels + +Remember, the browser extension it works everywhere that it can detect WordPress without needing a plugin. And it carries your preferences with you! It's WordPress, your way! + +[Check out the Browser Extension and try it for free](https://turbo-admin.com/) ## Usage -Install, activate and then: +Install, activate and go! + +## Using the Command Palette + +The command palette is a keyboard-driven, pop-up menu. + +The default keyboard shortcut to activate the command palette is: * Windows: Ctrl-Alt-Shift-P (Linux also?) * Mac: Cmd-Alt-Shift-P -You can customise the keyboard combination used in the settings in your user profile. Be careful not to choose a keyboard combination already used by your browser. +You can customise the keyboard combination used in the settings in your user profile. Be careful not to choose a keyboard combination already used by your browser! Close the palette with Escape, clicking outside of it, or pressing Ctrl/Cmd-Alt-Shift-P (or your custom key combination) again. Hover over the snail in the admin bar for a reminder of your shortcut at any time. -## Turbo Admin: The command palette that gives super fast access to your WordPress Dashboard. +You can: -Ugh, this Dashboard menu is so cluttered? +- type to filter the commands +- use up and down arrows to select an item +- press enter to select an item +- hit escape (not too hard) to close the palette -Where is everything? +You can also select items with your mouse/trackpad. -Is it in Tools? Or Settings? Or some menu of it's own? +If you hold Ctrl/Cmd when selecting an item it will open in a new tab/window (you may need to allow your browser to open popups). -How am I supposed to work with this clutter? +As well as commands, the plugin will also search content that is made available through the REST API (as long as the REST API can be discovered). -## If the WordPress Dashboard is slowing you down, Turbo Admin is here to speed you up. +## Using the (experimental) Notice Hiding feature -A customisable key-combination launches a command palette with all your menu items. +Notice hiding lets you move unwanted notices into a separate panel at the top-right of the dashboard. -Fuzzy search helps you find items even when you're not sure what they are called. +To turn on the Notice Hiding feature, visit your user profile, find the "Turbo Admin settings" section, and check the feature in the "Additional features" section. Be sure to click "Update Profile" to save the change. -If you've used Alfred App or Spotlight or the command palette in your text editor or IDE, you'll know the benefits of a tool like this and you'll quickly feel at home. +I have attempted to be somewhat "intelligent" in how I hide notices, automatically handling obvious cases, and giving you choice in other cases. -Install... activate... work faster! +This is why this feature is flagged as "Experimental" - I may not have the "intelligence" right just yet. -## How does it work? +[Read more about Turbo Admin's Notice Hiding](https://turbo-admin.com/hide-notices.html) -Install the plugin and activate it and then press Ctrl-Alt-Shift-P (or Cmd-Alt-Shift-P on a Mac) to open the palette. +The "Notices" tab in the top-right will show a red-circled number if there are notices to see. -The keyboard shortcut can be customised from settings in your user profile. Be careful not to choose a keyboard combination already used by your browser. +If Turbo Admin gives you the option of hiding a notice it will have a "Move to panel" button. Click this to move it to the panel. You can always move it back if you change your mind. -You can: - - type to filter the commands - - use up and down arrows to select an item - - press enter to select an item - - hit escape (not too hard) to close the palette +## Using the (experimental) List Table Keyboard Shortcuts feature -You can also select items with your mouse/trackpad. +This feature is documented on [the Turbo Admin website](https://turbo-admin.com/list-table-keys.html) -If you hold Ctrl/Cmd when selecting an item it will open in a new tab/window (you may need to allow your browser to open popups). +To turn on the List Table Keyboard Shortcuts feature, visit your user profile, find the "Turbo Admin settings" section, and check the feature in the "Additional features" section. Be sure to click "Update Profile" to save the change. -As well as commands, the plugin will also search content that is made available through the REST API (as long as the REST API can be discovered). +== Frequently Asked Questions == -## Commands aren't showing on the front end of the site. += Commands aren't showing on the front end of the site. = You need to be logged in for Turbo Admin to work. Commands are scraped from the menus on the WP Admin side and cached for use on the front end so if the palette is showing but with no commands you'll need to visit the Dashboard to get the menu cached. -## Content search isn't working. += Content search isn't working. = This could be for several reasons, but it's dependent on the REST API being discoverable and the content you want to search being available in the API. It's known to not work in ClassicPress, when some security plugins hide the API's discovery, or when the API routes have been changed from the defaults. -## Can I hide the icon in the admin bar? += Can I hide the icon in the admin bar? = Yes, as of v1.5.3 there is an option to do this in each user's profile. @@ -100,9 +129,9 @@ function ta_hide_icon($hide, $user_id) { } ` -## Do I really have to install this on EVERY site? += Do I really have to install this on EVERY site? = -It's funny you ask. There's also a (paid-for) [browser extension](https://turbo-admin.com) that will let you have Turbo Admin on every wp-admin without having to install anything! +It's funny you ask. There's also a [browser extension](https://turbo-admin.com) that will let you have Turbo Admin on every wp-admin without having to install anything! == Installation == @@ -121,6 +150,17 @@ If you're reading this then you've probably already done step 1. So what are you == Changelog == += 1.7.0 = +* [FEATURE] Re-designed notice hiding (still experimental) +* [FEATURE] List table keyboard shortcuts (experimental/alpha) +* [FEATURE] Oxygen builder support in the command palette +* [ENHANCEMENT] MUCH improved content search with better debouncing and caching +* [ENHANCEMENT] Improved palette startup time + += 1.6.0 = +* Note: The plugin version skipped this release +* [FEATURE] Notice hiding (experimental) + = 1.5.3 = * Allow icon in admin bar to be hidden diff --git a/src/class-acf.js b/src/class-acf.js new file mode 100644 index 0000000..74a8525 --- /dev/null +++ b/src/class-acf.js @@ -0,0 +1,65 @@ +export default class Acf { + + constructor() { + + } + + /** + * Returns true if the code detects that ACF is installed + * (only works back-end). + * + * @returns {boolean} + */ + isAcfInstalled() { + return null !== document.getElementById('toplevel_page_edit-post_type-acf-field-group') + } + + /** + * Returns the URL of the ACF screen in the backend. + * (TODO: Store this somewhere?) + * + * @returns {string} + */ + acfScreenUrl() { + const elem = /** @type {HTMLAnchorElement} */(document.getElementById('toplevel_page_edit-post_type-acf-field-group')?.querySelector('a.menu-top')); + return elem?.href; + } + + /** + * Gets the field groups from the ACF screen + * Returns a promise that resolves to an array of objects like: + * { + * label: