Changeset 2871191
- Timestamp:
- 02/26/2023 09:20:09 AM (3 years ago)
- Location:
- turbo-admin
- Files:
-
- 2 added
- 44 edited
- 1 copied
-
tags/1.13.2 (copied) (copied from turbo-admin/trunk)
-
tags/1.13.2/dist/main.min.js (modified) (44 diffs)
-
tags/1.13.2/dist/main.min.js.map (modified) (1 diff)
-
tags/1.13.2/readme.txt (modified) (3 diffs)
-
tags/1.13.2/src/apis/class-content-api.js (modified) (5 diffs)
-
tags/1.13.2/src/apis/class-gravity-forms-api.js (modified) (1 diff)
-
tags/1.13.2/src/apis/class-woocommerce-api.js (modified) (1 diff)
-
tags/1.13.2/src/class-list-table-shortcuts.js (modified) (3 diffs)
-
tags/1.13.2/src/class-storage.js (modified) (4 diffs)
-
tags/1.13.2/src/class-turbo-admin-palette.js (modified) (6 diffs)
-
tags/1.13.2/src/class-turbo-admin-wp-block-editor-fullscreen-kill.js (modified) (1 diff)
-
tags/1.13.2/src/class-turbo-admin-wp-notices.js (modified) (9 diffs)
-
tags/1.13.2/src/class-turbo-admin.js (modified) (9 diffs)
-
tags/1.13.2/src/class-wp.js (modified) (5 diffs)
-
tags/1.13.2/src/main.js (modified) (5 diffs)
-
tags/1.13.2/src/plugins/class-turbo-admin-barkeeper.js (modified) (3 diffs)
-
tags/1.13.2/src/plugins/class-turbo-admin-content-search.js (modified) (1 diff)
-
tags/1.13.2/src/plugins/class-turbo-admin-gravity-forms.js (modified) (1 diff)
-
tags/1.13.2/src/plugins/class-turbo-admin-oxygen-buillder.js (modified) (1 diff)
-
tags/1.13.2/src/types/class-item-definition.js (modified) (1 diff)
-
tags/1.13.2/src/types/class-turbo-admin-plugin.js (modified) (2 diffs)
-
tags/1.13.2/src/types/class-turbo-admin-widget.js (added)
-
tags/1.13.2/turbo-admin.css (modified) (1 diff)
-
tags/1.13.2/turbo-admin.php (modified) (7 diffs)
-
trunk/dist/main.min.js (modified) (44 diffs)
-
trunk/dist/main.min.js.map (modified) (1 diff)
-
trunk/readme.txt (modified) (3 diffs)
-
trunk/src/apis/class-content-api.js (modified) (5 diffs)
-
trunk/src/apis/class-gravity-forms-api.js (modified) (1 diff)
-
trunk/src/apis/class-woocommerce-api.js (modified) (1 diff)
-
trunk/src/class-list-table-shortcuts.js (modified) (3 diffs)
-
trunk/src/class-storage.js (modified) (4 diffs)
-
trunk/src/class-turbo-admin-palette.js (modified) (6 diffs)
-
trunk/src/class-turbo-admin-wp-block-editor-fullscreen-kill.js (modified) (1 diff)
-
trunk/src/class-turbo-admin-wp-notices.js (modified) (9 diffs)
-
trunk/src/class-turbo-admin.js (modified) (9 diffs)
-
trunk/src/class-wp.js (modified) (5 diffs)
-
trunk/src/main.js (modified) (5 diffs)
-
trunk/src/plugins/class-turbo-admin-barkeeper.js (modified) (3 diffs)
-
trunk/src/plugins/class-turbo-admin-content-search.js (modified) (1 diff)
-
trunk/src/plugins/class-turbo-admin-gravity-forms.js (modified) (1 diff)
-
trunk/src/plugins/class-turbo-admin-oxygen-buillder.js (modified) (1 diff)
-
trunk/src/types/class-item-definition.js (modified) (1 diff)
-
trunk/src/types/class-turbo-admin-plugin.js (modified) (2 diffs)
-
trunk/src/types/class-turbo-admin-widget.js (added)
-
trunk/turbo-admin.css (modified) (1 diff)
-
trunk/turbo-admin.php (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
turbo-admin/tags/1.13.2/dist/main.min.js
r2835882 r2871191 830 830 constructor() { 831 831 this.store = null; 832 if (typeof browser === "undefined") { 832 if (this.inExtension()) { 833 this.store = chrome.storage.local; 834 } else { 833 835 this.store = window.localStorage; 836 } 837 } 838 inExtension() { 839 return window.turboAdminIsExtension(); 840 } 841 async set(dataObject) { 842 if (this.inExtension()) { 843 await this.store.set(dataObject); 834 844 } else { 835 this.store = browser.storage.local;836 }837 }838 async set(dataObject) {839 if (typeof browser === "undefined") {840 845 const keys = Object.keys(dataObject); 841 846 keys.forEach((key) => this.store.setItem(key, JSON.stringify(dataObject[key]))); 847 } 848 } 849 async get(key) { 850 if (this.inExtension()) { 851 return await this.store.get(key); 842 852 } else { 843 await this.store.set(dataObject);844 }845 }846 async get(key) {847 if (typeof browser === "undefined") {848 853 let returnObj = {}; 849 854 let item = this.store.getItem(key); … … 859 864 returnObj[key] = itemObject; 860 865 return returnObj; 861 } else {862 return await this.store.get(key);863 866 } 864 867 } … … 875 878 } 876 879 async discoverApiRoot() { 877 console.log("Discovering API root");880 turboAdminLog("Discovering API root"); 878 881 let wpApiSettings = null; 879 882 this.storageKey = "wpApiSettings." + globalThis.taWp.home; … … 908 911 return; 909 912 } 910 console.log("API Route Discovery failed"); 913 turboAdminLog("API Route Discovery failed"); 914 this.apiBase = globalThis.taWp.home + "/wp-json/wp/v2/"; 911 915 } 912 916 async discoverPostTypes() { 913 console.log("Discovering post types");917 turboAdminLog("Discovering post types"); 914 918 if (!this.active) { 915 console.log("Not active");919 turboAdminLog("Not active"); 916 920 this.postTypes = []; 917 921 return; 918 922 } 923 const postTypes = await this.store.get("ta-post-types"); 924 if (postTypes && postTypes["ta-post-types"] && postTypes["ta-post-types"]["expiry"] > Date.now()) { 925 turboAdminLog("Using cached post types: ", postTypes["ta-post-types"]["data"]); 926 this.postTypes = postTypes["ta-post-types"]["data"]; 927 return; 928 } 919 929 this.postTypes = await this.getPostTypes(); 920 console.log("Discovered post types: ", this.postTypes); 930 turboAdminLog("Discovered post types: ", this.postTypes); 931 const expiry = Date.now() + 10 * 60 * 1e3; 932 this.store.set({ 933 "ta-post-types": { 934 expiry, 935 data: this.postTypes 936 } 937 }); 921 938 } 922 939 userLoggedIn() { … … 1030 1047 const response = await fetch(`${this.apiBase}${path}/?${params}`, init); 1031 1048 if (response.status < 200 || response.status >= 300) { 1032 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WordPress API Error. Try visiting the dashboard to refresh things."); 1049 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 1050 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WordPress API Error. Try visiting the dashboard to refresh things."); 1051 } else { 1052 turboAdminLog("TURBO ADMIN: WordPress API Error. Try visiting the WordPress Dashboard to refresh things."); 1053 } 1033 1054 } 1034 1055 return response; … … 1082 1103 var TurboAdminPalette = class { 1083 1104 constructor(paletteData, options) { 1084 console.log("Initialising TurboAdmin");1105 turboAdminLog("Initialising TurboAdmin"); 1085 1106 this.options = options; 1086 1107 this.paletteElement = document.getElementById("ta-command-palette-container"); … … 1179 1200 } 1180 1201 injectContentItems(contentItems, andRunSearch = true) { 1181 console.log("Injecting items");1202 turboAdminLog("Injecting items"); 1182 1203 if (contentItems.length > 0) { 1183 1204 contentItems.forEach(this.injectItem.bind(this)); … … 1194 1215 const itemUrl = item.url; 1195 1216 if (this.contentItemExists(itemUrl)) { 1196 console.log("Not adding duplicate");1217 turboAdminLog("Not adding duplicate"); 1197 1218 return; 1198 1219 } … … 1335 1356 this.maybeHighlightInputKeyword(e.key); 1336 1357 if (!this.inSearchMode() && (e.code === "Tab" || e.key === ":")) { 1337 console.log("Checking for search mode");1358 turboAdminLog("Checking for search mode"); 1338 1359 let inputValue = this.paletteInputElement.value; 1339 1360 if (this.isKeyword(inputValue)) { 1340 console.log("Found search mode " + inputValue);1361 turboAdminLog("Found search mode " + inputValue); 1341 1362 e.preventDefault(); 1342 1363 await this.enterSearchMode(globalThis.turboAdmin.searchModes[inputValue]); … … 1352 1373 } 1353 1374 async enterSearchMode(searchMode) { 1354 console.log("Entering search mode for keyword " + searchMode.keyword);1375 turboAdminLog("Entering search mode for keyword " + searchMode.keyword); 1355 1376 this.backupPaletteData(); 1356 1377 this.paletteData = []; … … 1611 1632 detectSelector = ""; 1612 1633 detectSelectorNone = ""; 1634 detectPattern = ""; 1613 1635 itemTitleFunction = null; 1614 1636 itemUrlFunction = null; … … 1627 1649 } 1628 1650 registerPlugin() { 1629 console.log("Inside plugin - requested registration of " + this.name);1651 turboAdminLog("Inside plugin - requested registration of " + this.name); 1630 1652 globalThis.turboAdmin.registerPlugin(this); 1631 1653 } … … 1640 1662 this.searchModes.forEach(globalThis.turboAdmin.registerSearchMode); 1641 1663 } 1642 getAdditionalItemDefinitions() {1664 async getAdditionalItemDefinitions() { 1643 1665 return []; 1644 1666 } … … 1647 1669 }; 1648 1670 var class_turbo_admin_plugin_default = TurboAdminPlugin; 1671 1672 // src/class-turbo-admin-wp-block-editor-fullscreen-kill.js 1673 var TurboAdminWpBlockEditorFullscreenKill = class { 1674 constructor() { 1675 if (document.body.classList.contains("site-editor-php")) { 1676 return; 1677 } 1678 const attrObserver = new MutationObserver((mutations) => { 1679 mutations.forEach((mu) => { 1680 if (mu.type !== "attributes" && mu.attributeName !== "class") { 1681 return; 1682 } 1683 if (mu.target.classList.contains("is-fullscreen-mode")) { 1684 this.killFullScreenEditor(); 1685 } 1686 }); 1687 }); 1688 attrObserver.observe(document.body, {attributes: true}); 1689 this.killFullScreenEditor(); 1690 } 1691 killFullScreenEditor() { 1692 if (!document.body.classList.contains("is-fullscreen-mode")) { 1693 return; 1694 } 1695 document.body.classList.remove("is-fullscreen-mode"); 1696 document.body.classList.add("turbo-admin-killed-fullscreen"); 1697 const newStyles = document.createElement("style"); 1698 newStyles.innerHTML = "body.turbo-admin-killed-fullscreen .edit-post-fullscreen-mode-close { display: none; }"; 1699 document.body.appendChild(newStyles); 1700 } 1701 }; 1702 var class_turbo_admin_wp_block_editor_fullscreen_kill_default = TurboAdminWpBlockEditorFullscreenKill; 1703 1704 // src/class-turbo-admin-wp-block-editor-welcome-guide-kill.js 1705 var TurboAdminWpBlockEditorWelcomeGuideKill = class { 1706 constructor() { 1707 const attrObserver = new MutationObserver((mutations) => { 1708 mutations.forEach((mu) => { 1709 if (document.body.classList.contains("ta-killed-post-welcome-guide")) { 1710 return; 1711 } 1712 if (mu.type !== "attributes" && mu.attributeName !== "class") { 1713 return; 1714 } 1715 if (!mu.target.classList.contains("modal-open")) { 1716 return; 1717 } 1718 const welcomeGuide = document.querySelector(".edit-post-welcome-guide"); 1719 if (welcomeGuide) { 1720 this.killWelcomeGuide(); 1721 } 1722 }); 1723 }); 1724 attrObserver.observe(document.body, {attributes: true}); 1725 this.killWelcomeGuide(); 1726 } 1727 killWelcomeGuide() { 1728 const welcomeGuide = document.querySelector(".edit-post-welcome-guide"); 1729 if (welcomeGuide) { 1730 const closeButton = welcomeGuide.querySelector(".components-modal__header button"); 1731 if (closeButton) { 1732 closeButton.click(); 1733 document.body.classList.add("ta-killed-post-welcome-guide"); 1734 } 1735 } 1736 } 1737 }; 1738 var class_turbo_admin_wp_block_editor_welcome_guide_kill_default = TurboAdminWpBlockEditorWelcomeGuideKill; 1649 1739 1650 1740 // src/class-turbo-admin-wp-notices.js … … 1668 1758 ]; 1669 1759 this.allowedClasses = [ 1670 " notice-success",1671 " notice-error",1672 " notice-failure",1673 " updated"1760 ".notice-success", 1761 ".notice-error", 1762 ".notice-failure", 1763 ".updated" 1674 1764 ]; 1765 this.noticesPanelInner = null; 1675 1766 if (rememberedNoticeIds) { 1676 1767 this.rememberedNoticeIds = rememberedNoticeIds.length > 0 ? rememberedNoticeIds : []; … … 1689 1780 }); 1690 1781 } 1691 console.log("Notice Selectors", this.noticeSelectors);1782 turboAdminLog("Notice Selectors", this.noticeSelectors); 1692 1783 const notices = document.querySelectorAll(this.noticeSelectors.join(",")); 1693 console.log("Notices", notices);1784 turboAdminLog("Notices", notices); 1694 1785 notices.forEach((notice) => { 1695 1786 this.maybeAddIdToNotice(notice); 1696 if (this.keepNotice(notice)) { 1697 const rememberButton = document.createElement("button"); 1698 rememberButton.classList.add("ta-remember-notice-button"); 1699 rememberButton.innerText = "Move to panel"; 1700 const forgetButton = document.createElement("button"); 1701 forgetButton.classList.add("ta-forget-notice-button"); 1702 forgetButton.innerText = "Move to dashboard"; 1703 notice.classList.add("ta-added-pos-relative"); 1704 notice.appendChild(rememberButton); 1705 notice.appendChild(forgetButton); 1706 rememberButton.addEventListener("click", this.rememberNotice.bind(this), false, true); 1707 forgetButton.addEventListener("click", this.forgetNotice.bind(this), false, true); 1708 } 1787 this.maybeAddMoveButtonToNotice.call(this, notice); 1709 1788 }); 1710 const noticesToHide = Array.from(notices).filter((notice) => { 1711 if (this.rememberedNoticeIds.includes(notice.id)) { 1712 return true; 1713 } 1714 if (this.keepNotice(notice)) { 1715 return false; 1716 } 1717 if (notice.offsetHeight === 0 || notice.offsetWidth === 0) { 1718 return false; 1719 } 1720 return true; 1721 }); 1722 console.log("Notices to hide", noticesToHide); 1789 const noticesToHide = Array.from(notices).filter(this.noticeShouldBeHidden.bind(this)); 1790 turboAdminLog("Notices to hide", noticesToHide); 1723 1791 const noticesLinkWrapper = document.createElement("div"); 1724 1792 noticesLinkWrapper.id = "ta-notices-link-wrap"; … … 1743 1811 noticesPanel.style.display = "none"; 1744 1812 noticesPanel.dataset.open = "no"; 1745 const noticesPanelInner = document.createElement("div"); 1746 noticesPanelInner.id = "ta-notices-panel-inner"; 1747 noticesToHide.forEach((notice) => { 1748 noticesPanelInner.append(notice); 1749 }); 1750 noticesPanel.appendChild(noticesPanelInner); 1813 this.noticesPanelInner = document.createElement("div"); 1814 this.noticesPanelInner.id = "ta-notices-panel-inner"; 1815 noticesToHide.forEach(this.hideNotice.bind(this)); 1816 noticesPanel.appendChild(this.noticesPanelInner); 1751 1817 const screenMeta = document.getElementById("screen-meta"); 1752 1818 screenMeta.appendChild(noticesPanel); 1753 1819 } 1820 addObserver() { 1821 const observer = new MutationObserver(this.handleMutations.bind(this)); 1822 observer.observe(document.getElementById("wpbody-content"), { 1823 childList: true, 1824 subtree: true 1825 }); 1826 } 1827 handleMutations(mutations, observer) { 1828 mutations.forEach((mutation) => { 1829 if (mutation.type === "childList") { 1830 mutation.addedNodes.forEach((node) => { 1831 if (node.nodeType === Node.ELEMENT_NODE) { 1832 console.log("MUTATING!!!" + node.id); 1833 } 1834 }); 1835 } 1836 }); 1837 } 1754 1838 keepNotice(noticeElem) { 1755 return this.allowedClasses.reduce((found, current) => { 1756 return found || noticeElem.classList.contains(current); 1757 }, false); 1839 return noticeElem.matches(this.allowedClasses.join(", ")); 1758 1840 } 1759 1841 rememberNotice(ev) { … … 1765 1847 const notice = ev.target.closest(this.noticeSelectors.join(",")); 1766 1848 const noticeId = notice.id; 1767 console.log(`Remembering ${noticeId}`);1849 turboAdminLog(`Remembering ${noticeId}`); 1768 1850 panelInner.appendChild(notice); 1769 1851 if (count === 0) { … … 1774 1856 this.saveRememberedNotice(noticeId); 1775 1857 } 1858 noticeShouldBeHidden(notice) { 1859 if (this.rememberedNoticeIds.includes(notice.id)) { 1860 return true; 1861 } 1862 if (this.keepNotice(notice)) { 1863 return false; 1864 } 1865 if (notice.offsetHeight === 0 || notice.offsetWidth === 0) { 1866 return false; 1867 } 1868 return true; 1869 } 1776 1870 saveRememberedNotice(noticeId) { 1777 1871 this.rememberedNoticeIds.push(noticeId); 1778 1872 if (typeof browser === "object") { 1779 browser.runtime.sendMessage({1873 chrome.runtime.sendMessage({ 1780 1874 action: "rememberNotice", 1781 1875 noticeId … … 1792 1886 const notice = ev.target.closest(this.noticeSelectors.join(",")); 1793 1887 const noticeId = notice.id; 1794 console.log(`Forgetting ${noticeId}`);1888 turboAdminLog(`Forgetting ${noticeId}`); 1795 1889 notice.remove(); 1796 1890 const message = document.createElement("div"); … … 1807 1901 this.rememberedNoticeIds.push(noticeId); 1808 1902 if (typeof browser === "object") { 1809 browser.runtime.sendMessage({1903 chrome.runtime.sendMessage({ 1810 1904 action: "rememberNotice", 1811 1905 noticeId … … 1816 1910 } 1817 1911 } 1818 maybeAddIdToNotice(notice) { 1819 if (notice.id && notice.id !== "" && notice.id !== "message") { 1820 return; 1821 } 1822 const classes = notice.classList; 1823 notice.id = Array.from(notice.classList).join("-"); 1912 maybeAddIdToNotice(noticeElem) { 1913 if (noticeElem.id && noticeElem.id !== "" && noticeElem.id !== "message") { 1914 return; 1915 } 1916 const classes = noticeElem.classList; 1917 noticeElem.id = Array.from(noticeElem.classList).join("-"); 1918 } 1919 maybeAddMoveButtonToNotice(noticeElem) { 1920 if (this.keepNotice(noticeElem)) { 1921 const rememberButton = document.createElement("button"); 1922 rememberButton.classList.add("ta-remember-notice-button"); 1923 rememberButton.innerText = "Move to panel"; 1924 const forgetButton = document.createElement("button"); 1925 forgetButton.classList.add("ta-forget-notice-button"); 1926 forgetButton.innerText = "Move to dashboard"; 1927 noticeElem.classList.add("ta-added-pos-relative"); 1928 noticeElem.appendChild(rememberButton); 1929 noticeElem.appendChild(forgetButton); 1930 rememberButton.addEventListener("click", this.rememberNotice.bind(this), false, true); 1931 forgetButton.addEventListener("click", this.forgetNotice.bind(this), false, true); 1932 } 1933 } 1934 maybeHideNotice(noticeElem) { 1935 if (this.noticeShouldBeHidden(noticeElem) && !noticeElem.classList.contains("ta-notice-hidden")) { 1936 this.hideNotice(noticeElem); 1937 } 1938 } 1939 hideNotice(noticeElem) { 1940 noticeElem.classList.add("ta-notice-hidden"); 1941 noticeElem.classList.add("inline"); 1942 this.noticesPanelInner.append(noticeElem); 1824 1943 } 1825 1944 wordpressScreenMetaEventsExist() { … … 1908 2027 if (this.currentRow === null) { 1909 2028 this.currentRowIndex = 0; 1910 } else {2029 } else if (this.currentRowIndex < this.tableRows.length - 1) { 1911 2030 this.currentRowIndex++; 1912 2031 } … … 1917 2036 if (this.currentRowIndex > 0) { 1918 2037 this.currentRowIndex--; 1919 this.updateTable();1920 }2038 } 2039 this.updateTable(); 1921 2040 } 1922 2041 preTableChange() { … … 1932 2051 } 1933 2052 openTableRowItem() { 1934 console.log(this);2053 turboAdminLog(this); 1935 2054 const link = this.currentRow.querySelector("a.row-title"); 1936 2055 if (link) { … … 1951 2070 } 1952 2071 if (!document.getElementById("wpadminbar")) { 2072 return false; 2073 } 2074 if (!document.getElementById("wp-admin-bar-root-default")) { 1953 2075 return false; 1954 2076 } … … 1963 2085 "wp-admin-bar-updates" 1964 2086 ]; 1965 this.barkeeperState = globalThis.turboAdmin.options["barkeeper-state"]; 2087 this.selectorsToHide = [ 2088 "#wp-admin-bar-root-default > li", 2089 ".monsterinsights-adminbar-menu-item" 2090 ]; 2091 this.barkeeperState = this.getBarkeeperState(); 1966 2092 this.root = document.getElementById("wp-admin-bar-root-default"); 1967 this.itemsToHide = document.querySelectorAll("#wp-admin-bar-root-default > li"); 2093 if (!this.root) { 2094 return; 2095 } 2096 this.itemsToHide = document.querySelectorAll(this.selectorsToHide.join(", ")); 1968 2097 Array.from(this.itemsToHide).forEach((element) => { 1969 2098 if (this.exclusionIds.includes(element.id)) { … … 1981 2110 this.root.classList.toggle("ta-barkeeper-closed"); 1982 2111 this.barkeeperState = this.barkeeperState === "open" ? "closed" : "open"; 1983 browser.runtime.sendMessage({ 2112 this.setBarkeeperState(this.barkeeperState); 2113 }); 2114 this.root.insertAdjacentElement("afterend", this.button); 2115 this.setupObserver(); 2116 } 2117 setupObserver() { 2118 this.observer = new MutationObserver((mutations) => { 2119 mutations.forEach((mutation) => { 2120 if (mutation.type === "childList") { 2121 mutation.addedNodes.forEach((node) => { 2122 if (node.classList && node.classList.contains("ta-barkeeper-collapsable")) { 2123 return; 2124 } 2125 if (node.id && this.exclusionIds.includes(node.id)) { 2126 return; 2127 } 2128 if (node.matches(this.selectorsToHide.join(", "))) { 2129 node.classList.add("ta-barkeeper-collapsable"); 2130 return; 2131 } 2132 }); 2133 } 2134 }); 2135 }); 2136 this.observer.observe(this.root, { 2137 childList: true, 2138 subtree: true 2139 }); 2140 } 2141 getBarkeeperState() { 2142 if (window.turboAdminIsExtension()) { 2143 return globalThis.turboAdmin.options["barkeeper-state"]; 2144 } else { 2145 return window.localStorage.getItem("turbo-admin-barkeeper-state"); 2146 } 2147 } 2148 setBarkeeperState(state) { 2149 if (window.turboAdminIsExtension()) { 2150 chrome.runtime.sendMessage({ 1984 2151 action: "barkeeperSetState", 1985 2152 barkeeperState: this.barkeeperState 1986 2153 }); 1987 }); 1988 this.root.insertAdjacentElement("afterend", this.button); 2154 } else { 2155 window.localStorage.setItem("turbo-admin-barkeeper-state", state); 2156 } 1989 2157 } 1990 2158 }; … … 2202 2370 super.activate(); 2203 2371 } 2204 getAdditionalItemDefinitions() {2372 async getAdditionalItemDefinitions() { 2205 2373 const editDefinition = new class_item_definition_default(); 2206 2374 editDefinition.detectType = "dom"; … … 2273 2441 this.menu = this.getMenu(); 2274 2442 } 2275 this.addAdditionalMenuItems();2443 await this.addAdditionalMenuItems(); 2276 2444 this.menu = this.menu.concat(this.options.extraItemsRaw ?? []); 2277 2445 this.menu.sort((a, b) => (a.parentTitle + a.title).localeCompare(b.parentTitle + b.title)); … … 2287 2455 } 2288 2456 }); 2457 if (this.options["block-editor-fullscreen-disable"] === true) { 2458 this.turboAdminFullscreenKill = new class_turbo_admin_wp_block_editor_fullscreen_kill_default(); 2459 } 2460 if (this.options["block-editor-welcome-screen-kill"] === true) { 2461 this.turboAdminWelcomeKill = new class_turbo_admin_wp_block_editor_welcome_guide_kill_default(); 2462 } 2289 2463 if (this.options["list-table-keyboard-shortcuts"] === true) { 2290 2464 this.turboAdminListTableShortcuts = new class_list_table_shortcuts_default(); … … 2327 2501 return items; 2328 2502 } 2329 a ddAdditionalMenuItems() {2503 async addAdditionalMenuItems() { 2330 2504 let extraItems = this.options.extraItems ?? []; 2331 2505 const pluginKeys = Object.keys(this.plugins); 2332 2506 for (let i = 0; i < pluginKeys.length; i++) { 2333 extraItems = extraItems.concat( this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());2507 extraItems = extraItems.concat(await this.plugins[pluginKeys[i]].getAdditionalItemDefinitions()); 2334 2508 } 2335 2509 extraItems = extraItems.concat([ … … 2413 2587 if (item.detectType === "url") { 2414 2588 detected = Boolean(window.location.href.includes(item.detectPattern)); 2589 elements = document.querySelectorAll("body"); 2415 2590 } else if (item.detectType === "dom") { 2416 2591 if (item.detectSelector) { … … 2490 2665 } 2491 2666 registerPlugin(plugin) { 2492 console.log("Registering plugin " + plugin.name);2667 turboAdminLog("Registering plugin " + plugin.name); 2493 2668 this.plugins[plugin.name] = plugin; 2494 2669 } 2495 2670 registerSearchMode(searchMode) { 2496 console.log("Registering search mode with keyword " + searchMode.keyword);2671 turboAdminLog("Registering search mode with keyword " + searchMode.keyword); 2497 2672 globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode; 2498 2673 } … … 2512 2687 keysString += "Shift-"; 2513 2688 } 2514 keysString += shortcut.key ;2689 keysString += shortcut.key.toUpperCase(); 2515 2690 return keysString; 2516 2691 } … … 2597 2772 window.localStorage.setItem("ta-palette-data-home", this.home); 2598 2773 } else if (!this.siteUrl || !this.home) { 2774 let urlsFound = false; 2599 2775 if (document.getElementById("wpadminbar")) { 2600 this.siteUrl = document.getElementById("wp-admin-bar-dashboard").querySelector("a").href; 2776 const dashboardLink = document.getElementById("wp-admin-bar-dashboard")?.querySelector("a"); 2777 if (dashboardLink) { 2778 this.siteUrl = dashboardLink.href; 2779 } 2601 2780 if (this.apiLinkUrl) { 2602 2781 if (this.apiLinkUrl.includes("/wp-json")) { … … 2606 2785 this.home = this.apiLinkUrl.replace(/index.php\?rest_route.*/, ""); 2607 2786 } 2787 urlsFound = true; 2608 2788 } else { 2609 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 2789 if (this.siteUrl) { 2790 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 2791 urlsFound = true; 2792 } 2610 2793 } 2611 } else { 2794 } 2795 if (!urlsFound) { 2612 2796 if (this.apiLinkUrl) { 2613 2797 if (this.apiLinkUrl.includes("/wp-json")) { … … 2622 2806 this.siteUrl = this.guessSiteUrl(); 2623 2807 } 2624 } else { 2625 this.home = await this.guessHome(); 2626 if (this.home) { 2627 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 2628 } 2808 urlsFound = true; 2809 } 2810 } 2811 if (!urlsFound) { 2812 this.home = await this.guessHome(); 2813 if (this.home) { 2814 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 2629 2815 } 2630 2816 } … … 2707 2893 } 2708 2894 if (response.status < 200 || response.status >= 300) { 2709 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WooCommerce API Error. Try visiting the dashboard to refresh things."); 2895 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 2896 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WooCommerce API Error. Try visiting the dashboard to refresh things."); 2897 } else { 2898 turboAdminLog("TURBO ADMIN: WooCommerce API Error. Try visiting the WordPress Dashboard to refresh things."); 2899 } 2710 2900 } 2711 2901 return response; … … 2751 2941 const response = await fetch(`${gfApiBase}${path}/?${params}`); 2752 2942 if (response.status < 200 || response.status >= 300) { 2753 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("Gravity Forms API Error. Try visiting the dashboard to refresh things."); 2943 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 2944 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("Gravity Forms API Error. Try visiting the dashboard to refresh things."); 2945 } else { 2946 turboAdminLog("TURBO ADMIN: Gravity Forms API Error. Try visiting the WordPress Dashboard to refresh things."); 2947 } 2754 2948 } 2755 2949 return response; … … 2760 2954 // src/main.js 2761 2955 var taStorageKey = "turbo-admin-settings"; 2956 var debugMode = false; 2957 window.turboAdminLog = function() { 2958 if (debugMode) { 2959 console.log(...arguments); 2960 } 2961 }; 2962 window.turboAdminIsExtension = function() { 2963 return typeof chrome.storage !== "undefined"; 2964 }; 2762 2965 async function taInit(settings) { 2763 2966 if (typeof globalThis.turboAdmin !== "undefined") { … … 2770 2973 } 2771 2974 globalThis.turboAdminOptions = settings[taStorageKey]; 2772 console.log("Preparing Turbo Admin"); 2975 debugMode = globalThis.turboAdminOptions["debug-mode"]; 2976 turboAdminLog("Preparing Turbo Admin"); 2773 2977 globalThis.taWp = new class_wp_default(); 2774 2978 await globalThis.taWp.completeInit(); 2775 console.log("Turbo Admin: WP is initialised");2979 turboAdminLog("Turbo Admin: WP is initialised"); 2776 2980 globalThis.contentApi = new class_content_api_default(); 2777 2981 await globalThis.contentApi.discoverApiRoot(); … … 2779 2983 globalThis.woocommerceApi = new class_woocommerce_api_default(); 2780 2984 globalThis.gravityFormsApi = new class_gravity_forms_api_default(); 2781 console.log("Turbo Admin: Content API is initialised");2985 turboAdminLog("Turbo Admin: Content API is initialised"); 2782 2986 globalThis.turboAdmin = new class_turbo_admin_default(globalThis.turboAdminOptions); 2783 2987 await globalThis.turboAdmin.init(); … … 2798 3002 rememberedNoticeIds: JSON.parse(window.localStorage.getItem("rememberedNoticeIds")) ?? new Array(), 2799 3003 barkeeper: globalThis.wpTurboAdmin["barkeeper"] === "1", 2800 "admin-bar-search": globalThis.wpTurboAdmin["adminBarSearch"] === "1" 3004 "admin-bar-search": globalThis.wpTurboAdmin["adminBarSearch"] === "1", 3005 "debug-mode": globalThis.wpTurboAdmin["debugMode"] === "1" 2801 3006 }; 2802 3007 await taInit(globalThis.turboAdminOptions); -
turbo-admin/tags/1.13.2/dist/main.min.js.map
r2835882 r2871191 1 1 { 2 2 "version": 3, 3 "sources": ["../src/fuse-6.4.6.js", "../src/class-turbo-admin-palette.js", "../src/types/class-turbo-admin-menu-item.js", "../src/class-storage.js", "../src/apis/class-content-api.js", "../src/types/class-submenu-item.js", "../src/types/class-content-item.js", "../src/types/class-search-mode.js", "../src/types/class-item-definition.js", "../src/types/class-turbo-admin-plugin.js", "../src/class-turbo-admin-wp- notices.js", "../src/class-list-table-shortcuts.js", "../src/plugins/class-turbo-admin-barkeeper.js", "../src/plugins/class-turbo-admin-content-search.js", "../src/plugins/class-turbo-admin-plugins.js", "../src/plugins/class-turbo-admin-users.js", "../src/plugins/class-turbo-admin-mu-sites.js", "../src/plugins/class-turbo-admin-oxygen-buillder.js", "../src/class-turbo-admin.js", "../src/class-wp.js", "../src/apis/class-woocommerce-api.js", "../src/apis/class-gravity-forms-api.js", "../src/main.js"],4 "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 './types/class-turbo-admin-menu-item';\nimport ContentApi from './apis/class-content-api.js';\nimport SearchMode from './types/class-search-mode.js';\nimport ContentItem from './types/class-content-item.js';\n\nexport default class TurboAdminPalette {\n\n\tconstructor(paletteData, options) {\n\n\t\t console.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 {HTMLDivElement} */\n this.paletteItemsContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-items-container'));\n\t\t/** @type {HTMLUListElement} */\n this.paletteItemsElement = /** @type {HTMLUListElement} */ (document.getElementById('ta-command-palette-items'));\n\t\t/** @type {HTMLDivElement} */\n this.paletteSubmenuContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-submenu-container'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTag = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-search-mode-tag'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTabNotice = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-tab-notice'));\n /** @type {HTMLSpanElement} */\n this.paletteSearchModeTabNoticeText = /** @type {HTMLSpanElement} */ (document.getElementById('ta-command-palette-tab-notice-text'));\n /** @type {HTMLDivElement} */\n this.paletteNoticeElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-notice'));\n\n\n // Add a class if the menu needs refreshing with a visit to the Dashboard\n if (globalThis.turboAdmin.menuNeedsRefresh) {\n this.showPaletteNotice('Menu needs refreshing. Visit the Dashboard to refresh.');\n }\n\n // We need this when injecting items. We use it to help generate edit URLs. Not the best way but\n // works for now.\n /** @type {HTMLUListElement} */\n this.profileLinkElem = document.getElementById('wp-admin-bar-edit-profile');\n /** @type {null|String} */\n this.profileLink = null;\n if (this.profileLinkElem) {\n this.profileLink = this.profileLinkElem.querySelector('a').href;\n }\n\n\t\t// Get palette data\n\t\tthis.paletteData = paletteData;\n\n // Backup of the palette data for use when we enter a different search mode\n\t\tthis.paletteDataBackup = null;\n\t\tthis.paletteItemsBackup = null;\n this.paletteItemIndexBackup = null;\n\n // Current search modes/keyword\n this.searchMode = null;\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 inSearchMode() {\n return this.searchMode !== null;\n }\n\n\t/**\n * This converts this.paletteData into a list of paletteListItems in this.paletteItems\n *\n * It also builds the itemIndex\n */\n buildPaletteItems() {\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 /**\n * Clears and sets the content items\n *\n * @param {ContentItem[]} contentItems\n */\n setContentItems(contentItems) {\n this.paletteItems = [];\n this.itemIndex = [];\n this.injectContentItems(contentItems, false);\n }\n\n /**\n * Content items have:\n * title\n * subtype\n * url\n * (we should also make the sub-menu definable, but that's not done yet)\n *\n * @param {ContentItem[]} contentItems\n */\n injectContentItems(contentItems, andRunSearch = true) {\n console.log('Injecting items');\n\n if (contentItems.length > 0) {\n contentItems.forEach(this.injectItem.bind(this));\n }\n\n if (andRunSearch) {\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 this.updatePaletteItems();\n }\n\n /**\n * Injects a single content item into the palette\n *\n * @param {ContentItem} item\n */\n injectItem(item) {\n const itemTitle = item.title;\n // const itemTitle = item.title.rendered;\n const itemType = item.subtype;\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 let title = itemTitle;\n\n if (itemType) {\n const itemTypeName = globalThis.contentApi.postTypes[itemType] ? globalThis.contentApi.postTypes[itemType].name : itemType;\n title += ` (${itemTypeName})`;\n }\n\n const li = document.createElement('li');\n const a = document.createElement('a');\n let subMenu = null;\n\n // Loop over submenu items OR add link.\n if (item.submenuItems.length > 0) {\n\n // Prepare the outer sub-menu elements\n 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\n for (let i = 0; i < item.submenuItems.length; i++) {\n const subMenuItem = item.submenuItems[i]\n // TODO: Abstract this so sub-menus can be defined by plugins?\n const subMenuListItem = document.createElement('li');\n const subMenuLink = document.createElement('a');\n subMenuLink.innerText = subMenuItem.title;\n subMenuLink.href = subMenuItem.url;\n for (let a = 0; a < subMenuItem.attributes.length; a++) {\n subMenuLink.setAttribute(\n subMenuItem.attributes[a].name,\n subMenuItem.attributes[a].value\n )\n }\n subMenuListItem.appendChild(subMenuLink);\n subMenuItems.appendChild(subMenuListItem);\n }\n\n // Add the sub-menu items UL to the sub-menu element.\n subMenu.appendChild(subMenuItems);\n\n li.classList.add('ta-has-child-menu');\n }\n\n a.href = itemUrl;\n a.innerHTML = title;\n\n li.appendChild(a);\n if (subMenu !== null) {\n li.appendChild(subMenu);\n }\n\n this.addPaletteListItem(li);\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 return;\n\t\t}\n\n\t\tif (e.code === 'Escape' && this.paletteShown()) {\n\t\t\tif (this.isSubMenuOpen()){\n this.closeSubMenu();\n } else if (this.inSearchMode()) {\n this.leaveSearchMode();\n } else {\n this.hidePalette();\n }\n return;\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 /*\n * Adds the tab hint for a keyword once it has been typed.\n */\n maybeHighlightInputKeyword(newKey) {\n // Do nothing if we are in a search-mode\n if (this.inSearchMode()) {\n return;\n }\n\n // This is fired on \"keyDown\", so the value isn't update with the new key yet.\n // But don't do this for special keys, and catch backspace too.\n let newInputValue = this.paletteInputElement.value;\n if (newKey.length === 1) {\n newInputValue += newKey;\n }\n if (newKey === 'Backspace') {\n newInputValue = newInputValue.slice(0, -1);\n }\n // console.log(`Checking palette input value ${newInputValue} for keyword`);\n if (this.isKeyword(newInputValue)) {\n this.paletteSearchModeTabNoticeText.innerText = `Search for ${newInputValue}`;\n this.paletteSearchModeTabNotice.classList.add('active');\n } else {\n this.unhighlightInputKeyword();\n }\n }\n\n unhighlightInputKeyword() {\n this.paletteSearchModeTabNotice.classList.remove('active');\n }\n\n async debouncedPaletteSearchAndUpdate() {\n // If we're not in a search mode then search immediately\n if (! this.inSearchMode()) {\n this.debounceTimeout = null;\n await this.paletteSearchAndUpdate();\n return;\n }\n\n // If timer is null, reset it to 500ms and run your functions.\n // Otherwise, wait until timer is cleared\n\n // Cancel the existing timeout\n clearTimeout(this.debounceTimeout)\n\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 * Check if a string is a search mode keyword\n *\n * @param {string} inputString\n * @returns {boolean}\n */\n isKeyword(inputString) {\n return Object.keys(globalThis.turboAdmin.searchModes).includes(inputString);\n }\n\n /**\n * Show the palette notice with the specified text\n *\n * @param {string} text\n */\n showPaletteNotice(text) {\n this.paletteNoticeElement.classList.add('active');\n this.paletteNoticeElement.innerText = text;\n }\n\n /**\n * Hide the palette notice\n */\n hidePaletteNotice() {\n this.paletteNoticeElement.classList.remove('active');\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 e.preventDefault();\n this.doAction(this.metaPressed(e));\n return;\n\t\t}\n\n /*\n * Only the actions above can be done in sub-menus.\n */\n if (this.isSubMenuOpen()) {\n return;\n }\n\n /*\n * Check for a keyword being typed and add a UI hint.\n */\n this.maybeHighlightInputKeyword(e.key);\n\n /*\n * Tabbing looks for a search mode keyword.\n */\n if (! this.inSearchMode() && (e.code === 'Tab' || e.key === ':')) {\n console.log('Checking for search mode');\n let inputValue = this.paletteInputElement.value;\n if (this.isKeyword(inputValue)) {\n console.log('Found search mode ' + inputValue)\n e.preventDefault();\n // TODO: Work on this.\n await this.enterSearchMode(\n globalThis.turboAdmin.searchModes[inputValue]);\n return;\n }\n }\n\n /*\n * Backspace may exit us from a search mode\n */\n if (this.inSearchMode() && e.code === 'Backspace' && this.paletteInputElement.value === '') {\n e.preventDefault();\n this.leaveSearchMode();\n return;\n }\n\n\t\tawait this.debouncedPaletteSearchAndUpdate();\n\t}\n\n /**\n * Puts the palette into a specific search mode - used when a keyword is selected\n *\n * @param {SearchMode} searchMode\n */\n async enterSearchMode(searchMode) {\n console.log('Entering search mode for keyword ' + searchMode.keyword);\n this.backupPaletteData();\n\n this.paletteData = [];\n this.paletteItems = [];\n this.itemIndex = [];\n\n // Remove the notice if it's there\n this.hidePaletteNotice();\n\n this.searchMode = searchMode;\n this.paletteInputElement.value = '';\n this.addSearchModeTag(searchMode.displayName);\n this.unhighlightInputKeyword();\n this.updatePaletteItems();\n // This is similar to code in paletteSearch - maybe we could extract/abstract it?\n if (searchMode.defaultItemsCallback !== null) {\n this.paletteInnerElement.classList.add('loading');\n const results = await searchMode.defaultItemsCallback();\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n }\n\n /**\n * Leaves the current search mode\n */\n leaveSearchMode() {\n const searchMode = this.searchMode;\n // It's important what we set this to - see inSearchMode()\n this.searchMode = null;\n this.removeSearchModeTag();\n this.restorePaletteData();\n this.paletteInputElement.value = searchMode.keyword;\n this.maybeHighlightInputKeyword('');\n this.paletteSearchAndUpdate();\n }\n\n /**\n * Backups up the palette data to a local variable so that it can be\n * restored later.\n */\n backupPaletteData() {\n this.paletteDataBackup = this.paletteData;\n this.paletteItemsBackup = this.paletteItems;\n this.paletteItemIndexBackup = this.itemIndex;\n }\n\n /**\n * Restores the save palette data - does not rebuild anything\n */\n restorePaletteData() {\n this.paletteData = this.paletteDataBackup;\n this.paletteItems = this.paletteItemsBackup;\n this.itemIndex = this.paletteItemIndexBackup;\n }\n\n /**\n * Adds the search mode tag with the specified title.\n *\n * @param {string} title\n */\n addSearchModeTag(title) {\n this.paletteSearchModeTag.classList.add('active');\n this.paletteSearchModeTag.innerText = title;\n }\n\n /**\n * Removes the search mode tag\n */\n removeSearchModeTag() {\n this.paletteSearchModeTag.classList.remove('active');\n }\n\n isPaletteOpen() {\n return this.paletteElement?.classList.contains('active');\n }\n\n\tshowPalette() {\n // Bail if already shown (this can be triggered by a focus event)\n if (this.isPaletteOpen()) {\n return;\n }\n\n this.paletteInputElement.value = '';\n\t\tthis.paletteInputElement?.focus();\n\t\tthis.paletteElement?.classList.add('active');\n // This is needed in admin-bar mode otherwise it gets a weird already-scrolled thing when\n // the palette opens.\n setTimeout(() => this.paletteItemsElement.scrollTop = 0, 100);\n\t}\n\n\thidePalette() {\n this.navigating = false;\n\t\tthis.paletteElement?.classList.remove('active');\n this.paletteInputElement.value = '';\n this.paletteInputElement.blur();\n if (this.isSubMenuOpen()) {\n this.closeSubMenu();\n }\n if (this.searchMode !== null) {\n this.leaveSearchMode();\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.paletteSubmenuContainerElement?.querySelectorAll('.ta-submenu 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 this.paletteSubmenuContainerElement.replaceChildren(subMenuElement);\n // Set height in case main menu is smaller than sub menu\n const subMenuHeight = this.paletteSubmenuContainerElement.offsetHeight;\n this.paletteItemsContainerElement.style.minHeight = subMenuHeight + \"px\";\n this.paletteSubmenuContainerElement.classList.add('active');\n\n this.selectedSubItem = subMenuElement.querySelector('li');\n this.openedSubMenu = subMenuElement;\n this.setSelectedElement();\n\n this.paletteInputElement.disabled = true;\n // Blur the input so that keys can continue to be captured\n this.paletteInputElement.blur();\n }\n\n closeSubMenu(subMenuElement = null) {\n if (null === subMenuElement) {\n subMenuElement = document.querySelector('.ta-submenu.active');\n }\n this.paletteSubmenuContainerElement.classList.remove('active');\n this.selectedSubItem.classList.remove('active');\n this.paletteItemsContainerElement.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 // link.href will be interpolated by the browser, so if it's empty it will be the current page\n // use getAttribute instead to work out if its empty\n if (link.getAttribute('href') === '') {\n return;\n }\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 if (! this.searchMode) {\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 return;\n }\n\n if (this.paletteInputElement.value.length === 0) {\n this.paletteInnerElement.classList.add('loading');\n let results = [];\n if (this.searchMode.defaultItemsCallback !== null) {\n results = await this.searchMode.defaultItemsCallback();\n }\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n } else {\n // This is copied to enterSearchMode. Should probably be extracted.\n this.paletteInnerElement.classList.add('loading');\n const results = await this.searchMode.searchCallback(this.paletteInputElement.value);\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n\n /**\n * OLD CODE BELOW\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", "/**\n * Menu items are the items ready to appear in the palette.\n *\n * These are standard items, not content items. Though this should probably be standardised.\n */\nexport default class TurboAdminMenuItem {\n\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The action of the item is the URL to visit when the item is clicked\n *\n * @type {string}\n */\n action = '';\n\n /**\n * The parent title is the title of the parent item under which the current item\n * was found in the WordPress menu.\n *\n * e.g. in Posts -> Add Post, \"Posts\" is the parent item.\n *\n * @type {string}\n */\n parentTitle = '';\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\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<Object>}\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 this.postTypes = [];\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 console.log('Discovering API root');\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 <link rel=\"https://api.w.org/\" href=\"https://something/wp-json/\">\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 // This should be very rare. I should only really see it in development.\n console.log('API Route Discovery failed');\n // TODO: This can't display as the palette isn't created yet.\n // globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Can\\'t find the WP API. Try visiting the dashboard to refresh things.');\n }\n\n async discoverPostTypes() {\n console.log('Discovering post types');\n if (! this.active) {\n console.log('Not active');\n this.postTypes = [];\n return;\n }\n\n this.postTypes = await this.getPostTypes();\n console.log('Discovered post types: ', this.postTypes);\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 async getPostTypes() {\n // Check the cache\n if (undefined !== this.cache['postsTypes']) {\n return this.cache['postTypes'];\n }\n\n // Fetch results\n const response = await this.get('types');\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['postTypes'] = result;\n\n return result;\n }\n\n async getPosts(searchString, postType = 'any') {\n // Check the cache\n const cacheKey = `posts-${postType}-${searchString}`;\n if (undefined !== this.cache[cacheKey]) {\n return this.cache[cacheKey];\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: postType\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache[cacheKey] = result;\n\n return result;\n }\n\n /**\n * We can't use the API to get a post of any post type. So we hack this a bit.\n *\n * @param {number} postId\n * @returns {Promise<any>}\n */\n async doesPostExist(postId) {\n // Check the cache\n if (undefined !== this.cache['post-' + postId]) {\n return this.cache['post-' + postId];\n }\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n const response = await fetch(`${globalThis.taWp.siteUrl}/post.php?post=${postId}&action=edit`, init);\n\n this.cache['post-' + postId] = response;\n\n return response?.status === 200;\n }\n\n async getPlugins(searchString) {\n // Check the cache\n if (undefined !== this.cache['plugins-' + searchString]) {\n return this.cache['plugins-' + searchString];\n }\n\n let requestOptions = {};\n\n if (searchString) {\n requestOptions.search = searchString;\n }\n\n // Fetch results\n const response = await this.get(\n \"plugins\",\n requestOptions\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['plugins-' + searchString] = result;\n\n return result;\n }\n\n async getUsers(searchString) {\n // Check the cache\n if (undefined !== this.cache['users-' + searchString]) {\n return this.cache['users-' + searchString];\n }\n\n // Fetch results\n const response = await this.get(\n \"users\",\n {\n search: searchString,\n per_page: 100,\n context: 'edit' // view / embed / edit\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['users-' + 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 credentials: 'include'\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}`, init);\n\n if (response.status < 200 || response.status >= 300) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.');\n }\n\n return response;\n }\n\n}\n", "export default class SubmenuItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title;\n\n /**\n * The URL of the item\n * @type {string}\n */\n url;\n\n /**\n * A list of attributes to go on the A tag (not the LI tag)\n *\n * @type {array}\n */\n attributes = [];\n\n /**\n * Create a submenu item\n *\n * @param {string} title The title of the item\n * @param {string} url The URL of the item\n */\n constructor(title, url) {\n this.title = title;\n this.url = url;\n }\n\n /**\n * Add an attribute\n *\n * @param {string} name The attribute name\n * @param {string} value The attribute value\n */\n addAttribute(name, value) {\n this.attributes.push({\n name: name,\n value: value\n });\n }\n}\n", "import SubmenuItem from \"./class-submenu-item\";\n\nexport default class ContentItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The subtype of the item. e.g. for posts, this will be the post type.\n * Used to display extra information about the item.\n *\n * @type {string}\n */\n subtype = '';\n\n /**\n * The URL of the item. Leave empty if there is a sub-menu.\n *\n * @type {string}\n */\n url = '';\n\n /**\n * The sub-menu items, if any.\n *\n * This should be an empty array if the item itself has a URL\n *\n * @type {SubmenuItem[]}\n */\n submenuItems = [];\n}\n", "import ContentItem from \"./class-content-item\";\n\nexport default class SearchMode {\n /**\n * The keyword string used to initiate the search\n *\n * @type {string}\n */\n keyword = '';\n\n /**\n * The dispay name used for the search\n *\n * @type {string}\n */\n displayName = '';\n\n /**\n * jsDoc defintion for a `searchCallback`\n *\n * @callback SearchCallback\n * @param {string} [searchString]\n * @returns {Promise<ContentItem[]>}\n */\n\n /**\n * Callback to get search items\n *\n * @type {SearchCallback}\n */\n searchCallback;\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @type {SearchCallback|null}\n */\n defaultItemsCallback = null;\n\n /**\n * Constructs a new search mode\n *\n * @param {string} keyword\n * @param {string} displayName\n * @param {SearchCallback} searchCallback\n * @param {SearchCallback} defaultItemsCallback\n */\n constructor(keyword, displayName, searchCallback, defaultItemsCallback = null) {\n this.keyword = keyword;\n this.displayName = displayName;\n this.searchCallback = searchCallback;\n this.defaultItemsCallback = defaultItemsCallback;\n }\n}\n", "/**\n * An item definition specifies how to detect a palette item from the Dashboard's Dom\n *\n * These are all processed on initialisation to generate menu items.\n *\n * Note that a single definition may generate multiple menu items if the selectors used\n * discover multiple items.\n */\nexport default class ItemDefinition {\n /**\n * This callback is displayed as part of the Requester class.\n * @callback menuItemCallback\n * @param {HTMLElement} element\n * @returns {string}\n */\n\n /**\n * The method of detecting items. Can be:\n * - 'dom' for checking if a DOM element exists (requires detectSelector or detectSelectorNone)\n * - 'url' if the current URL is being checked (requires detectPattern)\n *\n * @type {string}\n */\n detectType = 'dom';\n\n /**\n * [OPTIONAL] A CSS selector used to find items in the DOM\n *\n * @type {string}\n */\n detectSelector = '';\n\n /**\n * [OPTIONAL] A CSS selector used to check for an absence of items in the DOM\n *\n * @type {string}\n */\n detectSelectorNone = '';\n\n /**\n * A callback used to generate a menu item title from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemTitleFunction = null;\n\n /**\n * A callback used to generate a menu item link URL from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemUrlFunction = null;\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\n}\n", "import SearchMode from \"./class-search-mode\";\nimport ItemDefinition from \"./class-item-definition\";\n\n/**\n * This is an abstract class that should be extended by plugins\n * @module TurboAdminPlugin\n */\nexport default class TurboAdminPlugin {\n /** @type {string} */\n name = '';\n\n /** @type {SearchMode[]} */\n searchModes = [];\n\n /** @type {boolean} */\n activated = false;\n\n constructor(pluginName) {\n this.name = pluginName;\n this.registerPlugin();\n }\n\n /**\n * Register the plugin with Turbo Admin\n */\n registerPlugin() {\n console.log('Inside plugin - requested registration of ' + this.name);\n globalThis.turboAdmin.registerPlugin(this);\n }\n\n /**\n * Returns true if the plugin should activate\n * @returns {boolean}\n */\n shouldActivate() {\n return false;\n }\n\n /**\n * Activates the plugin\n * @return {void}\n */\n activate() {\n this.activated = true;\n this.registerSearchModes();\n }\n\n /**\n * Register the search keywords with Turbo Admin - each will be registered\n * with the whole plugin object.\n */\n registerSearchModes() {\n this.searchModes.forEach(globalThis.turboAdmin.registerSearchMode);\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {ItemDefinition[]}\n */\n getAdditionalItemDefinitions() {\n return [];\n }\n\n /**\n * Save plugin setting to persistent storage\n */\n saveSetting(key, value) {\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\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 <span id=\"ta-notice-count\">' + noticesToHide.length + '</span>';\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 // 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 * 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<HTMLTableRowElement>}\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", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\n\nexport default class TurboAdminBarkeeper extends TurboAdminPlugin {\n constructor() {\n super('Barkeeper');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n if (true !== globalThis.turboAdmin.options['barkeeper']) {\n return false;\n }\n // Bail if we aren't in the admin\n if (! document.getElementById('wpadminbar')) {\n return false;\n }\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n\n this.exclusionIds = [\n 'wp-admin-bar-menu-toggle',\n 'wp-admin-bar-wp-logo',\n 'wp-admin-bar-site-name',\n 'wp-admin-bar-updates',\n ];\n\n this.barkeeperState = globalThis.turboAdmin.options['barkeeper-state'];\n\n this.root = document.getElementById('wp-admin-bar-root-default');\n this.itemsToHide = document.querySelectorAll( '#wp-admin-bar-root-default > li');\n\n Array.from(this.itemsToHide).forEach( element => {\n if (this.exclusionIds.includes(element.id)) {\n return;\n }\n element.classList.add('ta-barkeeper-collapsable');\n });\n\n if (this.barkeeperState === 'closed') {\n this.root.classList.toggle('ta-barkeeper-closed');\n }\n\n // Add toggle\n this.button = document.createElement('button');\n this.button.id = 'ta-barkeeper-toggle';\n this.button.innerText = '<';\n\n this.button.addEventListener('click', e => {\n this.root.classList.toggle('ta-barkeeper-closed');\n\n this.barkeeperState = this.barkeeperState === 'open' ? 'closed' : 'open';\n\n browser.runtime.sendMessage({\n 'action': 'barkeeperSetState',\n 'barkeeperState': this.barkeeperState,\n });\n });\n\n this.root.insertAdjacentElement('afterend', this.button);\n }\n\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminContentSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Content');\n\n // Register a search mode for each post type\n const postTypeKeys = Object.keys(globalThis.contentApi.postTypes);\n for (let i = 0; i < postTypeKeys.length; i++) {\n const thisPostTypeKey = postTypeKeys[i];\n const thisPostType = globalThis.contentApi.postTypes[thisPostTypeKey];\n // console.log('Adding search mode for post type', thisPostType);\n this.searchModes.push( this.makePostTypeSearchMode(thisPostType) );\n }\n\n // Register ID search mode\n this.searchModes.push( new SearchMode('id', 'Post ID', this.postById.bind(this)) );\n\n // Register search all post types mode\n this.searchModes.push( new SearchMode('search', 'All post types', this.contentSearch.bind(this)) );\n this.searchModes.push( new SearchMode('find', 'All post types', this.contentSearch.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * This is a generator for a post-type specific SearchMode object\n *\n * @param {Object} postType\n */\n makePostTypeSearchMode(postType) {\n // TODO: interpret the post type name\n return new SearchMode(postType.slug, postType.name, (searchString) => this.contentSearch(searchString, postType.slug));\n }\n\n /**\n * @param {string} searchString\n * @param {string} postType This is passed to the API as a subtype. 'any' by default.\n * @returns {Promise<ContentItem[]>}\n */\n async contentSearch(searchString, postType = 'any') {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPosts(searchString, postType);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n item.title = result.title;\n item.subtype = result.subtype;\n item.url = result.url;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(result.id, item))\n\n return item;\n });\n }\n\n /**\n * @param {string} postId\n * @returns {Promise<ContentItem[]>}\n */\n async postById(postId) {\n if (! postId.trim().match(/^\\d+$/)) {\n return [];\n }\n const postExists = await globalThis.contentApi.doesPostExist(postId);\n\n const resultAsContentItem = new ContentItem;\n\n if (! postExists) {\n resultAsContentItem.title = 'Post does not exist or is not visible';\n return [ resultAsContentItem ];\n }\n\n resultAsContentItem.title = `Post ID: ${postId}`;\n resultAsContentItem.url = globalThis.taWp.home + `/?p=${postId}`;\n\n resultAsContentItem.submenuItems = resultAsContentItem.submenuItems.concat(this.makeSubmenuItems(postId, resultAsContentItem));\n\n return [ resultAsContentItem ];\n }\n\n /**\n * Makes an array of submenu items from a content item\n *\n * @param {number} postId\n * @param {ContentItem} contentItem\n * @returns {SubmenuItem[]}\n */\n makeSubmenuItems(postId, contentItem) {\n const itemsToReturn = [];\n itemsToReturn.push(\n new SubmenuItem(\n 'View',\n contentItem.url\n )\n );\n\n // TODO: Make a better way to detect if we are logged in.\n if (globalThis.turboAdmin.turboAdminPalette.profileLink) {\n // Need to get edit URL. This seems like the best way for now.\n const editLink = globalThis.taWp.siteUrl + `/post.php?post=${postId}&action=edit`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit',\n editLink\n )\n )\n\n // Add oxygen link if needed.\n if (globalThis.turboAdmin.hasActivatedPlugin('OxygenBuilder')) {\n const oxygenLink = globalThis.taWp.home + `?page_id=${postId}&ct_builder=true&ct_inner=true`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit with Oxygen',\n oxygenLink\n )\n );\n }\n }\n\n const copyLinkItem = new SubmenuItem( 'Copy link', contentItem.url);\n copyLinkItem.addAttribute('data-action', 'clipboard')\n itemsToReturn.push(copyLinkItem);\n\n return itemsToReturn;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminPluginSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Plugins');\n\n this.searchModes.push( new SearchMode('plugin', 'Plugins', this.pluginSearch, this.defaultPluginItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultPluginItems() {\n return await this.pluginSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async pluginSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPlugins(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n // siteUrl is at globalThis.turboAdmin.wp.siteUrl\n const item = new ContentItem;\n item.title = result.name;\n item.subtype = 'Plugin';\n // TODO: Maybe set this to be a search on the plugin screen?\n // Plugin \"slug\" is in result.name\n\n const itemViewUrlParams = new URLSearchParams();\n itemViewUrlParams.set('plugin_status', 'all');\n itemViewUrlParams.set('s', result.name);\n item.submenuItems.push(\n new SubmenuItem(\n 'View',\n globalThis.taWp.siteUrl + '/plugins.php?' + itemViewUrlParams.toString()\n )\n );\n // Activate: /wp-admin/plugins.php?action=activate&plugin=order-simulator-woocommerce%2Fwoocommerce-order-simulator.php&plugin_status=all&paged=1&s&_wpnonce=3714a01759\n\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\n\nexport default class TurboAdminUserSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Users');\n\n this.searchModes.push( new SearchMode('user', 'Users', this.userSearch, this.defaultUserItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultUserItems() {\n return await this.userSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async userSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getUsers(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n if (result.first_name && result.last_name) {\n item.title = `${result.first_name} ${result.last_name} - `;\n }\n item.title += result.email;\n item.subtype = result.roles[0];\n item.url = globalThis.taWp.siteUrl + `/user-edit.php?user_id=${result.id}`;\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminMUSites extends TurboAdminPlugin {\n constructor() {\n super('WP Multisite Sites');\n\n this.searchModes.push( new SearchMode('site', 'Sites', this.siteSearch.bind(this), this.defaultSiteItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n return Boolean(document.querySelector('#wp-admin-bar-my-sites'));\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultSiteItems() {\n return await this.siteSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async siteSearch(searchString) {\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 const sites = document.querySelectorAll('#wp-admin-bar-my-sites #wp-admin-bar-my-sites-list > li');\n\n if (sites.length === 0) {\n return [];\n }\n\n const sitesArray = Array.from(sites);\n const sitesLinks = sitesArray.map(site => site.querySelector('a'));\n const filteredSites = sitesLinks.filter(site => site.innerText.toLowerCase().includes(searchString.toLowerCase()));\n\n return filteredSites.map(site => {\n const item = new ContentItem;\n item.title = site.innerText;\n item.subtype = 'Site';\n item.url = site.href;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(site));\n\n return item;\n });\n }\n\n makeSubmenuItems(siteElement) {\n const submenuItems = [];\n\n const submenu = siteElement.nextElementSibling.querySelector(`.ab-submenu`);\n if (! submenu) {\n return [];\n }\n\n const submenuLinks = submenu.querySelectorAll('a');\n if (submenuLinks.length === 0) {\n return [];\n }\n\n const submenuLinksArray = Array.from(submenuLinks);\n submenuLinksArray.forEach(link => {\n const submenuItem = new SubmenuItem(link.innerText, link.href);\n submenuItems.push(submenuItem);\n });\n\n return submenuItems;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\nimport ItemDefinition from '../types/class-item-definition.js';\n\nexport default class TurboAdminOxygenBuilder extends TurboAdminPlugin {\n constructor() {\n super('OxygenBuilder');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\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\n const hasOxygenBuilder = Boolean(oxygenLinkElem);\n\n // Save Oxygen builder status\n window.localStorage.setItem('ta-has-oxygen-builder', hasOxygenBuilder ? '1' : '0' );\n\n return hasOxygenBuilder;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {ItemDefinition[]}\n */\n getAdditionalItemDefinitions() {\n const editDefinition = new ItemDefinition();\n editDefinition.detectType = 'dom';\n editDefinition.detectSelector = '#ct-edit-template-builder';\n editDefinition.itemTitleFunction = () => 'Edit with Oxygen';\n editDefinition.itemUrlFunction = (element) => element.href;\n editDefinition.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 const backToWpDefinition = new ItemDefinition();\n backToWpDefinition.detectType = 'dom';\n backToWpDefinition.detectSelector = '.oxygen-back-to-wp-menu .oxygen-toolbar-button-dropdown a:not(:last-of-type)';\n backToWpDefinition.itemTitleFunction = (element) => 'Back to WP: ' + element.textContent;\n backToWpDefinition.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 backToWpDefinition.noCache = true;\n\n return [\n editDefinition,\n backToWpDefinition,\n ];\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 */\n\nimport TurboAdminPalette from './class-turbo-admin-palette.js';\nimport TurboAdminMenuItem from './types/class-turbo-admin-menu-item.js';\nimport SearchMode from './types/class-search-mode.js';\nimport TurboAdminPlugin from './types/class-turbo-admin-plugin.js';\nimport Acf from './plugins/class-acf.js';\n// import TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js';\n// import 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';\nimport TurboAdminBarkeeper from './plugins/class-turbo-admin-barkeeper.js';\nimport TurboAdminContentSearch from './plugins/class-turbo-admin-content-search.js';\nimport TurboAdminPluginSearch from './plugins/class-turbo-admin-plugins.js';\nimport TurboAdminUserSearch from './plugins/class-turbo-admin-users.js';\n// import TurboAdminWoocommerce from './plugins/class-turbo-admin-woocommerce.js';\n// import TurboAdminGravityForms from './plugins/class-turbo-admin-gravity-forms.js';\nimport TurboAdminMUSites from './plugins/class-turbo-admin-mu-sites.js';\nimport TurboAdminOxygenBuilder from './plugins/class-turbo-admin-oxygen-buillder.js';\n\nexport default class TurboAdmin {\n\n /**\n * @param {*} options\n * @returns {TurboAdmin}\n */\n constructor(options) {\n // Sometimes we get a second copy of TA running, like if the plugin is running too.\n // Is this case we want to skip the initialisation.\n this.doInit = true;\n\n if (document.getElementById('ta-command-palette-container')) {\n console.log('TurboAdmin already initialised - I won\\'t make a second copy!');\n this.doInit = false;\n return globalThis.turboAdmin;\n }\n\n this.options = options;\n this.plugins = {};\n\n // TODO: Something? What should this type be?\n this.searchModes = {};\n\n // On the front end we set this if there is no saved menu.\n this.menuNeedsRefresh = false;\n }\n\n /**\n * Perform initialization - this is all the things that do not need APIs to\n * get set up.\n */\n async init() {\n if (! this.doInit) {\n return;\n }\n\n // Register all the plugins\n new TurboAdminBarkeeper();\n new TurboAdminContentSearch();\n new TurboAdminPluginSearch();\n new TurboAdminUserSearch();\n // new TurboAdminWoocommerce();\n // new TurboAdminGravityForms();\n new TurboAdminMUSites();\n new TurboAdminOxygenBuilder();\n\n // Grab the global Wp object instance\n this.wp = globalThis.taWp;\n\n this.menu = [];\n\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 // Check for .logged-in class on body - if logged in, we can use the saved menu,\n // if it exists.\n if (document.body.classList.contains('logged-in')) {\n // Get from localStorage\n const savedMenu = window.localStorage.getItem('ta-palette-data');\n\n // This attempts to see if we have cached items from the back-en\n if (null === savedMenu) {\n this.menuNeedsRefresh = true;\n } else {\n this.menu = JSON.parse(savedMenu);\n // Check if there is no \"Media\" item - this should ONLY be in the back-end\n if (! this.menu.some(item => item.action.endsWith('upload.php'))) {\n this.menuNeedsRefresh = true;\n }\n // Merge (?) the items?\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\n /**\n * These are initialization steps that DO needs APIs to be set up.\n */\n activatePlugins() {\n // Initialize all plugins\n Object.keys(this.plugins).forEach( plugin => {\n if (this.plugins[plugin].shouldActivate()) {\n this.plugins[plugin].activate();\n }\n })\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 /**\n * True if the plugin has been activated\n *\n * @param {string} name Name of the plugin to check for\n * @returns {boolean}\n */\n hasActivatedPlugin(name) {\n return Object.keys(this.plugins).includes(name) &&\n this.plugins[name].activated;\n }\n\n /**\n * Gather the WordPress dashboard admin (sidebar) menu items\n *\n * @returns { TurboAdminMenuItem[] }\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 /**\n * Adds additional menu items passed in by configuration to the\n * menu items list.\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 // Technically this is an array of {ItemDefintion} but more work needed to make that happen.\n let extraItems = this.options.extraItems ?? [];\n\n // Get any extra items defined by plugins\n const pluginKeys = Object.keys(this.plugins);\n\n for (let i=0; i < pluginKeys.length; i++) {\n extraItems = extraItems.concat(this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());\n }\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 );\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 /**\n * Builds the palette HTML and adds it to the DOM.\n */\n addPalette() {\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 // Palette notice\n const paletteNotice = document.createElement('div');\n paletteNotice.id = 'ta-command-palette-notice';\n // Tab notice\n const tabNotice = document.createElement('div');\n tabNotice.id = 'ta-command-palette-tab-notice';\n // Tab notice text\n const tabNoticeText = document.createElement('span');\n tabNoticeText.id = 'ta-command-palette-tab-notice-text';\n // Tab notice \"button\"\n const tabNoticeButton = document.createElement('span');\n tabNoticeButton.id = 'ta-command-palette-tab-notice-button';\n tabNoticeButton.innerText = 'Tab';\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 // Search mode tag\n const searchModeTag = document.createElement('div');\n searchModeTag.id = 'ta-command-palette-search-mode-tag';\n // List container (needed to contain the main list and the submenu list)\n const listContainer = document.createElement('div');\n listContainer.id = \"ta-command-palette-items-container\";\n // List\n const list = document.createElement('ul');\n list.id = \"ta-command-palette-items\";\n // Sub-menu list\n const submenuContainer = document.createElement('div');\n submenuContainer.id = \"ta-command-palette-submenu-container\";\n // Join it all up\n container.appendChild(palette);\n palette.appendChild(searchModeTag);\n palette.appendChild(paletteNotice);\n tabNotice.appendChild(tabNoticeText);\n tabNotice.appendChild(tabNoticeButton);\n palette.appendChild(tabNotice);\n palette.appendChild(input);\n listContainer.appendChild(list);\n listContainer.appendChild(submenuContainer);\n palette.appendChild(listContainer);\n\n if (document.getElementById('wpadminbar') && this.options['admin-bar-search'] === true) {\n const paletteLi = document.createElement('li');\n paletteLi.appendChild(container);\n const adminBar = document.getElementById('wp-admin-bar-top-secondary');\n adminBar.appendChild(paletteLi);\n\n // Add focus handler\n input.addEventListener('focus', e => this.turboAdminPalette.showPalette());\n\n // Add placeholder\n const placeholder = document.createElement('div');\n placeholder.id = 'ta-shortcut-key-placeholder';\n placeholder.innerText = this.buildShortcutKeysString();\n placeholder.addEventListener('click', e => input.focus());\n\n palette.insertBefore( placeholder, listContainer );\n } else {\n // Container\n document.querySelector(this.options.appendToElement ?? 'body').appendChild(container);\n }\n }\n\n /**\n * Register a plugin with Turbo Admin\n *\n * @param {TurboAdminPlugin} plugin\n */\n registerPlugin(plugin) {\n console.log('Registering plugin ' + plugin.name);\n this.plugins[plugin.name] = plugin;\n }\n\n /**\n * Register a palette search mode and its associated plugin\n *\n * this is usually bound to the searchMode, so\n *\n * @param {SearchMode} searchMode\n */\n registerSearchMode(searchMode) {\n console.log('Registering search mode with keyword ' + searchMode.keyword);\n // Don't use `this` as we are bound!\n globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode;\n }\n\n /**\n * Returns a string representation of the palette's keyboard shortcut\n *\n * @returns { String }\n */\n buildShortcutKeysString () {\n let keysString = '';\n let shortcut = this.options.shortcutKeys[0];\n\n if ( shortcut.meta ) {\n keysString += 'Cmd-';\n }\n if ( shortcut.ctrl ) {\n keysString += 'Ctrl-';\n }\n if ( shortcut.alt ) {\n keysString += 'Alt-';\n }\n if ( shortcut.shift ) {\n keysString += 'Shift-';\n }\n keysString += shortcut.key;\n return keysString;\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<String|Boolean>} 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<urls.length; i++) {\n if (workingUrl) continue;\n result = await this.testUrl(urls[i], responseUrlMustContain);\n if (result !== false) {\n workingUrl = result;\n }\n }\n return workingUrl;\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessSiteUrlFromHome( homeUrl ) {\n const homeWithSlash = this.ensureTrailingSlash(homeUrl);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // homeWithSlash + 'wp-admin/',\n // homeWithSlash + 'wp/wp-admin'\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return homeWithSlash + 'wp-admin/';\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessHome() {\n const currentUrl = new URL(window.location);\n const origin = this.ensureTrailingSlash(currentUrl.origin);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // origin\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return origin;\n }\n\n /**\n *\n * @param {String} siteUrl\n * @returns {String}\n */\n guessHomeFromSiteUrl(siteUrl) {\n // Not much we can do here.\n return siteUrl.replace(/wp-admin\\/?/, '');\n }\n\n async getUrls() {\n // See if we can actually find the URL for the API\n /** @type {HTMLLinkElement|null} */\n const apiLink = document.querySelector('link[rel=\"https://api.w.org/\"]');\n\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 is easy in the back end/Dashboard!\n this.siteUrl = window.location.href.match(/(^.*wp-admin)/)[1];\n this.home = document.getElementById('wp-admin-bar-site-name').querySelector('a').href;\n\n // Always set the siteUrl and home as this is definitive\n window.localStorage.setItem('ta-palette-data-siteurl', this.siteUrl);\n window.localStorage.setItem('ta-palette-data-home', this.home);\n } else if (! this.siteUrl || ! this.home) {\n\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 // We know what the siteUrl is, so guess the home from the siteUrl\n this.home = this.guessHomeFromSiteUrl(this.siteUrl);\n }\n\n } else {\n // Try for the API link\n // TODO: This needs to be async so it doesn't hold things up.\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 // We (probably) know what the home link is now, so guess the wp-admin\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome( this.home );\n } else {\n this.siteUrl = this.guessSiteUrl();\n }\n } else {\n // We got nothing.\n this.home = await this.guessHome();\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome(this.home);\n }\n }\n }\n }\n\n // Always trim the / for comparisons\n if (this.siteUrl) {\n this.siteUrl = this.siteUrl.replace(/(.+)\\/$/, '$1');\n }\n if (this.home) {\n this.home = this.home.replace(/(.+)\\/$/, '$1');\n }\n\n // console.log('siteUrl: ', this.siteUrl);\n // console.log('home: ', this.home);\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class WoocommerceApi {\n\n constructor() {\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 getOrders(searchString) {\n // Check the cache\n if (undefined !== this.cache['orders-' + searchString]) {\n return this.cache['orders-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"orders\",\n {\n search: searchString,\n per_page: 100,\n }\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['orders-' + searchString] = result;\n\n return result;\n }\n\n async getOrder(orderId) {\n // Check the cache\n if (undefined !== this.cache['order-' + orderId]) {\n return this.cache['order-' + orderId];\n }\n\n // Fetch results\n const response = await this.wooGet(\n `orders/${orderId}`\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n let resultAsArray = [ result ];\n\n // Store in the cache\n this.cache['order-' + orderId] = resultAsArray;\n\n return resultAsArray;\n }\n\n async getCustomers(searchString) {\n // Check the cache\n if (undefined !== this.cache['customers-' + searchString]) {\n return this.cache['customers-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"customers\",\n {\n search: searchString,\n per_page: 100,\n role: 'all',\n }\n );\n\n if (response === false) {\n return false;\n }\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['customers-' + searchString] = result;\n\n return result;\n }\n\n // TODO: Add docblock and types\n async wooGet(path, data = {}) {\n const wooApiBase = globalThis.contentApi.apiRoot + 'wc/v3/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${wooApiBase}${path}/?${params}`, init);\n\n if ( response.status === 404 ) {\n return false;\n }\n if ( (response.status < 200 || response.status >= 300) ) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.');\n }\n\n return response;\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class GravityFormsApi {\n\n constructor() {\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 getForms(searchString) {\n // Check the cache\n if (undefined !== this.cache['gf-forms-' + searchString]) {\n return this.cache['gf-forms-' + searchString];\n }\n\n // Fetch results\n const response = await this.gfGet(\n \"forms\",\n {}\n );\n\n // Decode JSON\n const result = await response.json();\n\n // TODO: Trap for errors\n\n // Filter by search string - the API doesn't do this for us\n const searchStringLowerCase = searchString.toLowerCase();\n const formIds = Object.keys(result);\n for (let k = 0; k < formIds.length; k++) {\n const thisId = formIds[k];\n if (! result[thisId].title.toLowerCase().includes(searchStringLowerCase)) {\n delete result[thisId];\n }\n }\n\n // Store in the cache\n this.cache['gf-forms-' + searchString] = result;\n\n return result;\n }\n\n async gfGet(path, data = {}) {\n const gfApiBase = globalThis.contentApi.apiRoot + 'gf/v2/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${gfApiBase}${path}/?${params}`);\n\n if (response.status < 200 || response.status >= 300) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.');\n }\n\n return response;\n }\n\n}\n", "import TurboAdmin from './class-turbo-admin.js';\nimport ContentApi from './apis/class-content-api.js';\nimport Wp from './class-wp.js';\nimport TurboAdminWpNotices from './class-turbo-admin-wp-notices.js';\nimport WoocommerceApi from './apis/class-woocommerce-api.js';\nimport GravityFormsApi from './apis/class-gravity-forms-api.js';\n\nconst taStorageKey = 'turbo-admin-settings';\n\n// Use this to clear storage\n// browser.storage.local.remove(taStorageKey).then();\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 if (typeof(globalThis.turboAdmin) !== 'undefined') {\n // Already initialised for some reason\n return;\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 }\n\n globalThis.turboAdminOptions = settings[taStorageKey];\n\n console.log('Preparing Turbo Admin');\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 await globalThis.contentApi.discoverPostTypes();\n globalThis.woocommerceApi = new WoocommerceApi();\n globalThis.gravityFormsApi = new GravityFormsApi();\n\n console.log('Turbo Admin: Content API is initialised');\n\n globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n await globalThis.turboAdmin.init();\n\n\n\n // This needs all the APIs to be ready\n await globalThis.turboAdmin.activatePlugins();\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 'barkeeper': globalThis.wpTurboAdmin['barkeeper'] === '1',\n 'admin-bar-search': globalThis.wpTurboAdmin['adminBarSearch'] === '1',\n\t}\n\tawait taInit(globalThis.turboAdminOptions);\n});\n"],5 "mappings": "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",3 "sources": ["../src/fuse-6.4.6.js", "../src/class-turbo-admin-palette.js", "../src/types/class-turbo-admin-menu-item.js", "../src/class-storage.js", "../src/apis/class-content-api.js", "../src/types/class-submenu-item.js", "../src/types/class-content-item.js", "../src/types/class-search-mode.js", "../src/types/class-item-definition.js", "../src/types/class-turbo-admin-plugin.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/plugins/class-turbo-admin-barkeeper.js", "../src/plugins/class-turbo-admin-content-search.js", "../src/plugins/class-turbo-admin-plugins.js", "../src/plugins/class-turbo-admin-users.js", "../src/plugins/class-turbo-admin-mu-sites.js", "../src/plugins/class-turbo-admin-oxygen-buillder.js", "../src/class-turbo-admin.js", "../src/class-wp.js", "../src/apis/class-woocommerce-api.js", "../src/apis/class-gravity-forms-api.js", "../src/main.js"], 4 "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 './types/class-turbo-admin-menu-item';\nimport ContentApi from './apis/class-content-api.js';\nimport SearchMode from './types/class-search-mode.js';\nimport ContentItem from './types/class-content-item.js';\n\nexport default class TurboAdminPalette {\n\n\tconstructor(paletteData, options) {\n\n\t\tturboAdminLog('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 {HTMLDivElement} */\n this.paletteItemsContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-items-container'));\n\t\t/** @type {HTMLUListElement} */\n this.paletteItemsElement = /** @type {HTMLUListElement} */ (document.getElementById('ta-command-palette-items'));\n\t\t/** @type {HTMLDivElement} */\n this.paletteSubmenuContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-submenu-container'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTag = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-search-mode-tag'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTabNotice = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-tab-notice'));\n /** @type {HTMLSpanElement} */\n this.paletteSearchModeTabNoticeText = /** @type {HTMLSpanElement} */ (document.getElementById('ta-command-palette-tab-notice-text'));\n /** @type {HTMLDivElement} */\n this.paletteNoticeElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-notice'));\n\n\n // Add a class if the menu needs refreshing with a visit to the Dashboard\n if (globalThis.turboAdmin.menuNeedsRefresh) {\n this.showPaletteNotice('Menu needs refreshing. Visit the Dashboard to refresh.');\n }\n\n // We need this when injecting items. We use it to help generate edit URLs. Not the best way but\n // works for now.\n /** @type {HTMLUListElement} */\n this.profileLinkElem = document.getElementById('wp-admin-bar-edit-profile');\n /** @type {null|String} */\n this.profileLink = null;\n if (this.profileLinkElem) {\n this.profileLink = this.profileLinkElem.querySelector('a').href;\n }\n\n\t\t// Get palette data\n\t\tthis.paletteData = paletteData;\n\n // Backup of the palette data for use when we enter a different search mode\n\t\tthis.paletteDataBackup = null;\n\t\tthis.paletteItemsBackup = null;\n this.paletteItemIndexBackup = null;\n\n // Current search modes/keyword\n this.searchMode = null;\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 inSearchMode() {\n return this.searchMode !== null;\n }\n\n\t/**\n * This converts this.paletteData into a list of paletteListItems in this.paletteItems\n *\n * It also builds the itemIndex\n */\n buildPaletteItems() {\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 /**\n * Clears and sets the content items\n *\n * @param {ContentItem[]} contentItems\n */\n setContentItems(contentItems) {\n this.paletteItems = [];\n this.itemIndex = [];\n this.injectContentItems(contentItems, false);\n }\n\n /**\n * Content items have:\n * title\n * subtype\n * url\n * (we should also make the sub-menu definable, but that's not done yet)\n *\n * @param {ContentItem[]} contentItems\n */\n injectContentItems(contentItems, andRunSearch = true) {\n turboAdminLog('Injecting items');\n\n if (contentItems.length > 0) {\n contentItems.forEach(this.injectItem.bind(this));\n }\n\n if (andRunSearch) {\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 this.updatePaletteItems();\n }\n\n /**\n * Injects a single content item into the palette\n *\n * @param {ContentItem} item\n */\n injectItem(item) {\n const itemTitle = item.title;\n // const itemTitle = item.title.rendered;\n const itemType = item.subtype;\n const itemUrl = item.url;\n\n // turboAdminLog('Adding item: ' + itemTitle);\n\n // // Check if item already exists\n if (this.contentItemExists(itemUrl)) {\n turboAdminLog('Not adding duplicate');\n return;\n }\n\n let title = itemTitle;\n\n if (itemType) {\n const itemTypeName = globalThis.contentApi.postTypes[itemType] ? globalThis.contentApi.postTypes[itemType].name : itemType;\n title += ` (${itemTypeName})`;\n }\n\n const li = document.createElement('li');\n const a = document.createElement('a');\n let subMenu = null;\n\n // Loop over submenu items OR add link.\n if (item.submenuItems.length > 0) {\n\n // Prepare the outer sub-menu elements\n 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\n for (let i = 0; i < item.submenuItems.length; i++) {\n const subMenuItem = item.submenuItems[i]\n // TODO: Abstract this so sub-menus can be defined by plugins?\n const subMenuListItem = document.createElement('li');\n const subMenuLink = document.createElement('a');\n subMenuLink.innerText = subMenuItem.title;\n subMenuLink.href = subMenuItem.url;\n for (let a = 0; a < subMenuItem.attributes.length; a++) {\n subMenuLink.setAttribute(\n subMenuItem.attributes[a].name,\n subMenuItem.attributes[a].value\n )\n }\n subMenuListItem.appendChild(subMenuLink);\n subMenuItems.appendChild(subMenuListItem);\n }\n\n // Add the sub-menu items UL to the sub-menu element.\n subMenu.appendChild(subMenuItems);\n\n li.classList.add('ta-has-child-menu');\n }\n\n a.href = itemUrl;\n a.innerHTML = title;\n\n li.appendChild(a);\n if (subMenu !== null) {\n li.appendChild(subMenu);\n }\n\n this.addPaletteListItem(li);\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 return;\n\t\t}\n\n\t\tif (e.code === 'Escape' && this.paletteShown()) {\n\t\t\tif (this.isSubMenuOpen()){\n this.closeSubMenu();\n } else if (this.inSearchMode()) {\n this.leaveSearchMode();\n } else {\n this.hidePalette();\n }\n return;\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 /*\n * Adds the tab hint for a keyword once it has been typed.\n */\n maybeHighlightInputKeyword(newKey) {\n // Do nothing if we are in a search-mode\n if (this.inSearchMode()) {\n return;\n }\n\n // This is fired on \"keyDown\", so the value isn't update with the new key yet.\n // But don't do this for special keys, and catch backspace too.\n let newInputValue = this.paletteInputElement.value;\n if (newKey.length === 1) {\n newInputValue += newKey;\n }\n if (newKey === 'Backspace') {\n newInputValue = newInputValue.slice(0, -1);\n }\n // turboAdminLog(`Checking palette input value ${newInputValue} for keyword`);\n if (this.isKeyword(newInputValue)) {\n this.paletteSearchModeTabNoticeText.innerText = `Search for ${newInputValue}`;\n this.paletteSearchModeTabNotice.classList.add('active');\n } else {\n this.unhighlightInputKeyword();\n }\n }\n\n unhighlightInputKeyword() {\n this.paletteSearchModeTabNotice.classList.remove('active');\n }\n\n async debouncedPaletteSearchAndUpdate() {\n // If we're not in a search mode then search immediately\n if (! this.inSearchMode()) {\n this.debounceTimeout = null;\n await this.paletteSearchAndUpdate();\n return;\n }\n\n // If timer is null, reset it to 500ms and run your functions.\n // Otherwise, wait until timer is cleared\n\n // Cancel the existing timeout\n clearTimeout(this.debounceTimeout)\n\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 * Check if a string is a search mode keyword\n *\n * @param {string} inputString\n * @returns {boolean}\n */\n isKeyword(inputString) {\n return Object.keys(globalThis.turboAdmin.searchModes).includes(inputString);\n }\n\n /**\n * Show the palette notice with the specified text\n *\n * @param {string} text\n */\n showPaletteNotice(text) {\n this.paletteNoticeElement.classList.add('active');\n this.paletteNoticeElement.innerText = text;\n }\n\n /**\n * Hide the palette notice\n */\n hidePaletteNotice() {\n this.paletteNoticeElement.classList.remove('active');\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 e.preventDefault();\n this.doAction(this.metaPressed(e));\n return;\n\t\t}\n\n /*\n * Only the actions above can be done in sub-menus.\n */\n if (this.isSubMenuOpen()) {\n return;\n }\n\n /*\n * Check for a keyword being typed and add a UI hint.\n */\n this.maybeHighlightInputKeyword(e.key);\n\n /*\n * Tabbing looks for a search mode keyword.\n */\n if (! this.inSearchMode() && (e.code === 'Tab' || e.key === ':')) {\n turboAdminLog('Checking for search mode');\n let inputValue = this.paletteInputElement.value;\n if (this.isKeyword(inputValue)) {\n turboAdminLog('Found search mode ' + inputValue)\n e.preventDefault();\n // TODO: Work on this.\n await this.enterSearchMode(\n globalThis.turboAdmin.searchModes[inputValue]);\n return;\n }\n }\n\n /*\n * Backspace may exit us from a search mode\n */\n if (this.inSearchMode() && e.code === 'Backspace' && this.paletteInputElement.value === '') {\n e.preventDefault();\n this.leaveSearchMode();\n return;\n }\n\n\t\tawait this.debouncedPaletteSearchAndUpdate();\n\t}\n\n /**\n * Puts the palette into a specific search mode - used when a keyword is selected\n *\n * @param {SearchMode} searchMode\n */\n async enterSearchMode(searchMode) {\n turboAdminLog('Entering search mode for keyword ' + searchMode.keyword);\n this.backupPaletteData();\n\n this.paletteData = [];\n this.paletteItems = [];\n this.itemIndex = [];\n\n // Remove the notice if it's there\n this.hidePaletteNotice();\n\n this.searchMode = searchMode;\n this.paletteInputElement.value = '';\n this.addSearchModeTag(searchMode.displayName);\n this.unhighlightInputKeyword();\n this.updatePaletteItems();\n // This is similar to code in paletteSearch - maybe we could extract/abstract it?\n if (searchMode.defaultItemsCallback !== null) {\n this.paletteInnerElement.classList.add('loading');\n const results = await searchMode.defaultItemsCallback();\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n }\n\n /**\n * Leaves the current search mode\n */\n leaveSearchMode() {\n const searchMode = this.searchMode;\n // It's important what we set this to - see inSearchMode()\n this.searchMode = null;\n this.removeSearchModeTag();\n this.restorePaletteData();\n this.paletteInputElement.value = searchMode.keyword;\n this.maybeHighlightInputKeyword('');\n this.paletteSearchAndUpdate();\n }\n\n /**\n * Backups up the palette data to a local variable so that it can be\n * restored later.\n */\n backupPaletteData() {\n this.paletteDataBackup = this.paletteData;\n this.paletteItemsBackup = this.paletteItems;\n this.paletteItemIndexBackup = this.itemIndex;\n }\n\n /**\n * Restores the save palette data - does not rebuild anything\n */\n restorePaletteData() {\n this.paletteData = this.paletteDataBackup;\n this.paletteItems = this.paletteItemsBackup;\n this.itemIndex = this.paletteItemIndexBackup;\n }\n\n /**\n * Adds the search mode tag with the specified title.\n *\n * @param {string} title\n */\n addSearchModeTag(title) {\n this.paletteSearchModeTag.classList.add('active');\n this.paletteSearchModeTag.innerText = title;\n }\n\n /**\n * Removes the search mode tag\n */\n removeSearchModeTag() {\n this.paletteSearchModeTag.classList.remove('active');\n }\n\n isPaletteOpen() {\n return this.paletteElement?.classList.contains('active');\n }\n\n\tshowPalette() {\n // Bail if already shown (this can be triggered by a focus event)\n if (this.isPaletteOpen()) {\n return;\n }\n\n this.paletteInputElement.value = '';\n\t\tthis.paletteInputElement?.focus();\n\t\tthis.paletteElement?.classList.add('active');\n // This is needed in admin-bar mode otherwise it gets a weird already-scrolled thing when\n // the palette opens.\n setTimeout(() => this.paletteItemsElement.scrollTop = 0, 100);\n\t}\n\n\thidePalette() {\n this.navigating = false;\n\t\tthis.paletteElement?.classList.remove('active');\n this.paletteInputElement.value = '';\n this.paletteInputElement.blur();\n if (this.isSubMenuOpen()) {\n this.closeSubMenu();\n }\n if (this.searchMode !== null) {\n this.leaveSearchMode();\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.paletteSubmenuContainerElement?.querySelectorAll('.ta-submenu 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 this.paletteSubmenuContainerElement.replaceChildren(subMenuElement);\n // Set height in case main menu is smaller than sub menu\n const subMenuHeight = this.paletteSubmenuContainerElement.offsetHeight;\n this.paletteItemsContainerElement.style.minHeight = subMenuHeight + \"px\";\n this.paletteSubmenuContainerElement.classList.add('active');\n\n this.selectedSubItem = subMenuElement.querySelector('li');\n this.openedSubMenu = subMenuElement;\n this.setSelectedElement();\n\n this.paletteInputElement.disabled = true;\n // Blur the input so that keys can continue to be captured\n this.paletteInputElement.blur();\n }\n\n closeSubMenu(subMenuElement = null) {\n if (null === subMenuElement) {\n subMenuElement = document.querySelector('.ta-submenu.active');\n }\n this.paletteSubmenuContainerElement.classList.remove('active');\n this.selectedSubItem.classList.remove('active');\n this.paletteItemsContainerElement.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 // link.href will be interpolated by the browser, so if it's empty it will be the current page\n // use getAttribute instead to work out if its empty\n if (link.getAttribute('href') === '') {\n return;\n }\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 if (! this.searchMode) {\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 return;\n }\n\n if (this.paletteInputElement.value.length === 0) {\n this.paletteInnerElement.classList.add('loading');\n let results = [];\n if (this.searchMode.defaultItemsCallback !== null) {\n results = await this.searchMode.defaultItemsCallback();\n }\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n } else {\n // This is copied to enterSearchMode. Should probably be extracted.\n this.paletteInnerElement.classList.add('loading');\n const results = await this.searchMode.searchCallback(this.paletteInputElement.value);\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n\n /**\n * OLD CODE BELOW\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", "/**\n * Menu items are the items ready to appear in the palette.\n *\n * These are standard items, not content items. Though this should probably be standardised.\n */\nexport default class TurboAdminMenuItem {\n\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The action of the item is the URL to visit when the item is clicked\n *\n * @type {string}\n */\n action = '';\n\n /**\n * The parent title is the title of the parent item under which the current item\n * was found in the WordPress menu.\n *\n * e.g. in Posts -> Add Post, \"Posts\" is the parent item.\n *\n * @type {string}\n */\n parentTitle = '';\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\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 (this.inExtension()) {\n this.store = chrome.storage.local;\n } else {\n this.store = window.localStorage;\n }\n }\n\n /**\n * Returns true if we are in the extension.\n */\n inExtension() {\n return window.turboAdminIsExtension();\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 (this.inExtension()) {\n await this.store.set(dataObject);\n } else {\n const keys = Object.keys(dataObject);\n keys.forEach(key => this.store.setItem(key, JSON.stringify(dataObject[key])));\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<Object>}\n */\n async get(key) {\n if (this.inExtension()) {\n return await this.store.get(key);\n } else {\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 }\n }\n}\n", "import Storage from '../class-storage.js';\n\nexport default class ContentApi {\n\n constructor() {\n // this.discoverApiRoot().then(e => null);\n // turboAdminLog('Discovered API base: ', this.apiBase);\n this.active = false;\n this.store = new Storage();\n this.postTypes = [];\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 turboAdminLog('Discovering API root');\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 <link rel=\"https://api.w.org/\" href=\"https://something/wp-json/\">\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 // This should be very rare. I should only really see it in development.\n turboAdminLog('API Route Discovery failed');\n // Making best guess\n this.apiBase = globalThis.taWp.home + '/wp-json/wp/v2/';\n // TODO: This can't display as the palette isn't created yet.\n // globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Can\\'t find the WP API. Try visiting the dashboard to refresh things.');\n }\n\n async discoverPostTypes() {\n turboAdminLog('Discovering post types');\n if (! this.active) {\n turboAdminLog('Not active');\n this.postTypes = [];\n return;\n }\n\n const postTypes = await this.store.get('ta-post-types');\n\n // Check local storage cache\n if (postTypes && postTypes['ta-post-types'] && postTypes['ta-post-types']['expiry'] > Date.now()) {\n turboAdminLog('Using cached post types: ', postTypes['ta-post-types']['data']);\n this.postTypes = postTypes['ta-post-types']['data'];\n return;\n }\n\n this.postTypes = await this.getPostTypes();\n turboAdminLog('Discovered post types: ', this.postTypes);\n\n // Cache for 10 minutes\n const expiry = Date.now() + (10 * 60 * 1000);\n this.store.set({\n 'ta-post-types': {\n expiry: expiry,\n data: this.postTypes\n }\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 async getPostTypes() {\n // Check the cache\n if (undefined !== this.cache['postsTypes']) {\n return this.cache['postTypes'];\n }\n\n // Fetch results\n const response = await this.get('types');\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['postTypes'] = result;\n\n return result;\n }\n\n async getPosts(searchString, postType = 'any') {\n // Check the cache\n const cacheKey = `posts-${postType}-${searchString}`;\n if (undefined !== this.cache[cacheKey]) {\n return this.cache[cacheKey];\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: postType\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache[cacheKey] = result;\n\n return result;\n }\n\n /**\n * We can't use the API to get a post of any post type. So we hack this a bit.\n *\n * @param {number} postId\n * @returns {Promise<any>}\n */\n async doesPostExist(postId) {\n // Check the cache\n if (undefined !== this.cache['post-' + postId]) {\n return this.cache['post-' + postId];\n }\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n const response = await fetch(`${globalThis.taWp.siteUrl}/post.php?post=${postId}&action=edit`, init);\n\n this.cache['post-' + postId] = response;\n\n return response?.status === 200;\n }\n\n async getPlugins(searchString) {\n // Check the cache\n if (undefined !== this.cache['plugins-' + searchString]) {\n return this.cache['plugins-' + searchString];\n }\n\n let requestOptions = {};\n\n if (searchString) {\n requestOptions.search = searchString;\n }\n\n // Fetch results\n const response = await this.get(\n \"plugins\",\n requestOptions\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['plugins-' + searchString] = result;\n\n return result;\n }\n\n async getUsers(searchString) {\n // Check the cache\n if (undefined !== this.cache['users-' + searchString]) {\n return this.cache['users-' + searchString];\n }\n\n // Fetch results\n const response = await this.get(\n \"users\",\n {\n search: searchString,\n per_page: 100,\n context: 'edit' // view / embed / edit\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['users-' + 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 credentials: 'include'\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}`, init);\n\n if (response.status < 200 || response.status >= 300) {\n // TODO: Set a \"deferred\" notice to show when the palette is created?\n if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.');\n } else {\n // Always log this as people may look\n turboAdminLog( 'TURBO ADMIN: WordPress API Error. Try visiting the WordPress Dashboard to refresh things.' );\n }\n }\n\n return response;\n }\n\n}\n", "export default class SubmenuItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title;\n\n /**\n * The URL of the item\n * @type {string}\n */\n url;\n\n /**\n * A list of attributes to go on the A tag (not the LI tag)\n *\n * @type {array}\n */\n attributes = [];\n\n /**\n * Create a submenu item\n *\n * @param {string} title The title of the item\n * @param {string} url The URL of the item\n */\n constructor(title, url) {\n this.title = title;\n this.url = url;\n }\n\n /**\n * Add an attribute\n *\n * @param {string} name The attribute name\n * @param {string} value The attribute value\n */\n addAttribute(name, value) {\n this.attributes.push({\n name: name,\n value: value\n });\n }\n}\n", "import SubmenuItem from \"./class-submenu-item\";\n\nexport default class ContentItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The subtype of the item. e.g. for posts, this will be the post type.\n * Used to display extra information about the item.\n *\n * @type {string}\n */\n subtype = '';\n\n /**\n * The URL of the item. Leave empty if there is a sub-menu.\n *\n * @type {string}\n */\n url = '';\n\n /**\n * The sub-menu items, if any.\n *\n * This should be an empty array if the item itself has a URL\n *\n * @type {SubmenuItem[]}\n */\n submenuItems = [];\n}\n", "import ContentItem from \"./class-content-item\";\n\nexport default class SearchMode {\n /**\n * The keyword string used to initiate the search\n *\n * @type {string}\n */\n keyword = '';\n\n /**\n * The dispay name used for the search\n *\n * @type {string}\n */\n displayName = '';\n\n /**\n * jsDoc defintion for a `searchCallback`\n *\n * @callback SearchCallback\n * @param {string} [searchString]\n * @returns {Promise<ContentItem[]>}\n */\n\n /**\n * Callback to get search items\n *\n * @type {SearchCallback}\n */\n searchCallback;\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @type {SearchCallback|null}\n */\n defaultItemsCallback = null;\n\n /**\n * Constructs a new search mode\n *\n * @param {string} keyword\n * @param {string} displayName\n * @param {SearchCallback} searchCallback\n * @param {SearchCallback} defaultItemsCallback\n */\n constructor(keyword, displayName, searchCallback, defaultItemsCallback = null) {\n this.keyword = keyword;\n this.displayName = displayName;\n this.searchCallback = searchCallback;\n this.defaultItemsCallback = defaultItemsCallback;\n }\n}\n", "/**\n * An item definition specifies how to detect a palette item from the Dashboard's Dom\n *\n * These are all processed on initialisation to generate menu items.\n *\n * Note that a single definition may generate multiple menu items if the selectors used\n * discover multiple items.\n */\nexport default class ItemDefinition {\n /**\n * This callback is displayed as part of the Requester class.\n * @callback menuItemCallback\n * @param {HTMLElement} element\n * @returns {string}\n */\n\n /**\n * The method of detecting items. Can be:\n * - 'dom' for checking if a DOM element exists (requires detectSelector or detectSelectorNone)\n * - 'url' if the current URL is being checked (requires detectPattern)\n *\n * @type {string}\n */\n detectType = 'dom';\n\n /**\n * [OPTIONAL] A CSS selector used to find items in the DOM\n *\n * @type {string}\n */\n detectSelector = '';\n\n /**\n * [OPTIONAL] A CSS selector used to check for an absence of items in the DOM\n *\n * @type {string}\n */\n detectSelectorNone = '';\n\n /**\n * [OPTIONAL] A string to find in the current URL to detect the item\n *\n * @type {string}\n */\n detectPattern = '';\n\n /**\n * A callback used to generate a menu item title from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemTitleFunction = null;\n\n /**\n * A callback used to generate a menu item link URL from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemUrlFunction = null;\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\n}\n", "import SearchMode from \"./class-search-mode\";\nimport ItemDefinition from \"./class-item-definition\";\n\n/**\n * This is an abstract class that should be extended by plugins\n * @module TurboAdminPlugin\n */\nexport default class TurboAdminPlugin {\n /** @type {string} */\n name = '';\n\n /** @type {SearchMode[]} */\n searchModes = [];\n\n /** @type {boolean} */\n activated = false;\n\n constructor(pluginName) {\n this.name = pluginName;\n this.registerPlugin();\n }\n\n /**\n * Register the plugin with Turbo Admin\n */\n registerPlugin() {\n turboAdminLog('Inside plugin - requested registration of ' + this.name);\n globalThis.turboAdmin.registerPlugin(this);\n }\n\n /**\n * Returns true if the plugin should activate\n * @returns {boolean}\n */\n shouldActivate() {\n return false;\n }\n\n /**\n * Activates the plugin\n * @return {void}\n */\n activate() {\n this.activated = true;\n this.registerSearchModes();\n }\n\n /**\n * Register the search keywords with Turbo Admin - each will be registered\n * with the whole plugin object.\n */\n registerSearchModes() {\n this.searchModes.forEach(globalThis.turboAdmin.registerSearchMode);\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {Promise<ItemDefinition[]>}\n */\n async getAdditionalItemDefinitions() {\n return [];\n }\n\n /**\n * Save plugin setting to persistent storage\n */\n saveSetting(key, value) {\n\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 // Don't run on the site editor screen\n if (document.body.classList.contains( 'site-editor-php' )) {\n return;\n }\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\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 this.noticesPanelInner = null;\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\nturboAdminLog('Notice Selectors', this.noticeSelectors);\n const notices = document.querySelectorAll(this.noticeSelectors.join(','));\nturboAdminLog('Notices', notices);\n\n // Add buttons to notices that can be moved\n notices.forEach(notice => {\n this.maybeAddIdToNotice(notice);\n this.maybeAddMoveButtonToNotice.call(this, notice);\n });\n\n const noticesToHide = Array.from(notices).filter( this.noticeShouldBeHidden.bind(this) );\n\n turboAdminLog('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 <span id=\"ta-notice-count\">' + noticesToHide.length + '</span>';\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 this.noticesPanelInner = document.createElement('div');\n this.noticesPanelInner.id = 'ta-notices-panel-inner';\n\n noticesToHide.forEach(this.hideNotice.bind(this));\n\n /**\n * Add wrap to the meta area\n */\n noticesPanel.appendChild(this.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 // Add a mutation observer to check for notices added by JavaScript\n // this.addObserver();\n }\n\n addObserver() {\n const observer = new MutationObserver( this.handleMutations.bind(this) );\n observer.observe(document.getElementById('wpbody-content'), {\n childList: true,\n subtree: true\n });\n }\n\n handleMutations(mutations, observer) {\n mutations.forEach( mutation => {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach( node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n console.log('MUTATING!!!' + node.id);\n // this.maybeAddIdToNotice(node);\n // this.maybeAddMoveButtonToNotice(node);\n // this.maybeHideNotice(node);\n }\n });\n }\n });\n }\n\n // Does the allowedClasses list say that this notice should be shown?\n keepNotice(noticeElem) {\n return noticeElem.matches(this.allowedClasses.join(', '));\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 turboAdminLog(`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 noticeShouldBeHidden(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 saveRememberedNotice(noticeId) {\n this.rememberedNoticeIds.push(noticeId);\n\n if ('object' === typeof(browser)) {\n chrome.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 turboAdminLog(`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 chrome.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 * For notices without IDs we'll see if we can add an ID that's a hash of their classlist\n */\n maybeAddIdToNotice(noticeElem) {\n if (noticeElem.id && noticeElem.id !== '' && noticeElem.id !=='message') {\n return;\n }\n\n const classes = noticeElem.classList;\n noticeElem.id = Array.from(noticeElem.classList).join('-');\n }\n\n /**\n * Add buttons to notices that we want to be able to move to the panel\n */\n maybeAddMoveButtonToNotice(noticeElem) {\n if (this.keepNotice(noticeElem)) {\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 noticeElem.classList.add('ta-added-pos-relative');\n\n noticeElem.appendChild(rememberButton);\n noticeElem.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 maybeHideNotice(noticeElem) {\n if (this.noticeShouldBeHidden(noticeElem) && !noticeElem.classList.contains('ta-notice-hidden')) {\n this.hideNotice(noticeElem);\n }\n }\n\n hideNotice(noticeElem) {\n noticeElem.classList.add('ta-notice-hidden');\n // WPCore's common.js will re-add the notice below the dashboard header unless it has a .inline class.\n // It does: $( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd );\n noticeElem.classList.add('inline');\n // See Toolbelt's implementation: https://github.com/BinaryMoon/wp-toolbelt/blob/dev/modules/tidy-notifications/src/js/script.js\n this.noticesPanelInner.append(noticeElem);\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<HTMLTableRowElement>}\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 if (this.currentRowIndex < this.tableRows.length - 1) {\n this.currentRowIndex++;\n }\n this.updateTable();\n }\n\n tableMoveUp() {\n this.preTableChange();\n\n if (this.currentRowIndex > 0) {\n this.currentRowIndex--;\n }\n\n this.updateTable();\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 turboAdminLog(this);\n /** @type {HTMLAnchorElement} */\n const link = this.currentRow.querySelector('a.row-title');\n if (link) {\n link.click();\n }\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\n\nexport default class TurboAdminBarkeeper extends TurboAdminPlugin {\n constructor() {\n super('Barkeeper');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n if (true !== globalThis.turboAdmin.options['barkeeper']) {\n return false;\n }\n // Bail if we aren't in the admin\n if (! document.getElementById('wpadminbar')) {\n return false;\n }\n // Bail if we don't have the left-hand admin bar (some users only have right-hand side)\n if (! document.getElementById('wp-admin-bar-root-default')) {\n return false;\n }\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n\n this.exclusionIds = [\n 'wp-admin-bar-menu-toggle',\n 'wp-admin-bar-wp-logo',\n 'wp-admin-bar-site-name',\n 'wp-admin-bar-updates',\n ];\n\n this.selectorsToHide = [\n '#wp-admin-bar-root-default > li',\n '.monsterinsights-adminbar-menu-item',\n ];\n\n this.barkeeperState = this.getBarkeeperState();\n\n this.root = document.getElementById('wp-admin-bar-root-default');\n if (! this.root) {\n return;\n }\n this.itemsToHide = document.querySelectorAll( this.selectorsToHide.join(', ') );\n\n Array.from(this.itemsToHide).forEach( element => {\n if (this.exclusionIds.includes(element.id)) {\n return;\n }\n element.classList.add('ta-barkeeper-collapsable');\n });\n\n if (this.barkeeperState === 'closed') {\n this.root.classList.toggle('ta-barkeeper-closed');\n }\n\n // Add toggle\n this.button = document.createElement('button');\n this.button.id = 'ta-barkeeper-toggle';\n this.button.innerText = '<';\n\n this.button.addEventListener('click', e => {\n this.root.classList.toggle('ta-barkeeper-closed');\n\n this.barkeeperState = this.barkeeperState === 'open' ? 'closed' : 'open';\n\n this.setBarkeeperState(this.barkeeperState);\n });\n\n this.root.insertAdjacentElement('afterend', this.button);\n\n this.setupObserver();\n }\n\n /**\n * Some awkward plugins add themselves into the bar using JS\n */\n setupObserver() {\n this.observer = new MutationObserver( mutations => {\n mutations.forEach( mutation => {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach( node => {\n if (node.classList && node.classList.contains('ta-barkeeper-collapsable')) {\n return;\n }\n if (node.id && this.exclusionIds.includes(node.id)) {\n return;\n }\n // Check is the node matches any of the selectors\n if (node.matches(this.selectorsToHide.join(', '))) {\n node.classList.add('ta-barkeeper-collapsable');\n return;\n }\n });\n }\n });\n });\n\n this.observer.observe(this.root, {\n childList: true,\n subtree: true,\n });\n }\n\n getBarkeeperState() {\n if (window.turboAdminIsExtension()) {\n return globalThis.turboAdmin.options['barkeeper-state'];\n } else {\n return window.localStorage.getItem('turbo-admin-barkeeper-state');\n }\n }\n\n setBarkeeperState(state) {\n if (window.turboAdminIsExtension()) {\n chrome.runtime.sendMessage({\n 'action': 'barkeeperSetState',\n 'barkeeperState': this.barkeeperState,\n });\n } else {\n window.localStorage.setItem('turbo-admin-barkeeper-state', state);\n }\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminContentSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Content');\n\n // Register a search mode for each post type\n const postTypeKeys = Object.keys(globalThis.contentApi.postTypes);\n for (let i = 0; i < postTypeKeys.length; i++) {\n const thisPostTypeKey = postTypeKeys[i];\n const thisPostType = globalThis.contentApi.postTypes[thisPostTypeKey];\n // turboAdminLog('Adding search mode for post type', thisPostType);\n this.searchModes.push( this.makePostTypeSearchMode(thisPostType) );\n }\n\n // Register ID search mode\n this.searchModes.push( new SearchMode('id', 'Post ID', this.postById.bind(this)) );\n\n // Register search all post types mode\n this.searchModes.push( new SearchMode('search', 'All post types', this.contentSearch.bind(this)) );\n this.searchModes.push( new SearchMode('find', 'All post types', this.contentSearch.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * This is a generator for a post-type specific SearchMode object\n *\n * @param {Object} postType\n */\n makePostTypeSearchMode(postType) {\n // TODO: interpret the post type name\n return new SearchMode(postType.slug, postType.name, (searchString) => this.contentSearch(searchString, postType.slug));\n }\n\n /**\n * @param {string} searchString\n * @param {string} postType This is passed to the API as a subtype. 'any' by default.\n * @returns {Promise<ContentItem[]>}\n */\n async contentSearch(searchString, postType = 'any') {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPosts(searchString, postType);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n item.title = result.title;\n item.subtype = result.subtype;\n item.url = result.url;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(result.id, item))\n\n return item;\n });\n }\n\n /**\n * @param {string} postId\n * @returns {Promise<ContentItem[]>}\n */\n async postById(postId) {\n if (! postId.trim().match(/^\\d+$/)) {\n return [];\n }\n const postExists = await globalThis.contentApi.doesPostExist(postId);\n\n const resultAsContentItem = new ContentItem;\n\n if (! postExists) {\n resultAsContentItem.title = 'Post does not exist or is not visible';\n return [ resultAsContentItem ];\n }\n\n resultAsContentItem.title = `Post ID: ${postId}`;\n resultAsContentItem.url = globalThis.taWp.home + `/?p=${postId}`;\n\n resultAsContentItem.submenuItems = resultAsContentItem.submenuItems.concat(this.makeSubmenuItems(postId, resultAsContentItem));\n\n return [ resultAsContentItem ];\n }\n\n /**\n * Makes an array of submenu items from a content item\n *\n * @param {number} postId\n * @param {ContentItem} contentItem\n * @returns {SubmenuItem[]}\n */\n makeSubmenuItems(postId, contentItem) {\n const itemsToReturn = [];\n itemsToReturn.push(\n new SubmenuItem(\n 'View',\n contentItem.url\n )\n );\n\n // TODO: Make a better way to detect if we are logged in.\n if (globalThis.turboAdmin.turboAdminPalette.profileLink) {\n // Need to get edit URL. This seems like the best way for now.\n const editLink = globalThis.taWp.siteUrl + `/post.php?post=${postId}&action=edit`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit',\n editLink\n )\n )\n\n // Add oxygen link if needed.\n if (globalThis.turboAdmin.hasActivatedPlugin('OxygenBuilder')) {\n const oxygenLink = globalThis.taWp.home + `?page_id=${postId}&ct_builder=true&ct_inner=true`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit with Oxygen',\n oxygenLink\n )\n );\n }\n }\n\n const copyLinkItem = new SubmenuItem( 'Copy link', contentItem.url);\n copyLinkItem.addAttribute('data-action', 'clipboard')\n itemsToReturn.push(copyLinkItem);\n\n return itemsToReturn;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminPluginSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Plugins');\n\n this.searchModes.push( new SearchMode('plugin', 'Plugins', this.pluginSearch, this.defaultPluginItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultPluginItems() {\n return await this.pluginSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async pluginSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPlugins(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n // siteUrl is at globalThis.turboAdmin.wp.siteUrl\n const item = new ContentItem;\n item.title = result.name;\n item.subtype = 'Plugin';\n // TODO: Maybe set this to be a search on the plugin screen?\n // Plugin \"slug\" is in result.name\n\n const itemViewUrlParams = new URLSearchParams();\n itemViewUrlParams.set('plugin_status', 'all');\n itemViewUrlParams.set('s', result.name);\n item.submenuItems.push(\n new SubmenuItem(\n 'View',\n globalThis.taWp.siteUrl + '/plugins.php?' + itemViewUrlParams.toString()\n )\n );\n // Activate: /wp-admin/plugins.php?action=activate&plugin=order-simulator-woocommerce%2Fwoocommerce-order-simulator.php&plugin_status=all&paged=1&s&_wpnonce=3714a01759\n\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\n\nexport default class TurboAdminUserSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Users');\n\n this.searchModes.push( new SearchMode('user', 'Users', this.userSearch, this.defaultUserItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultUserItems() {\n return await this.userSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async userSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getUsers(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n if (result.first_name && result.last_name) {\n item.title = `${result.first_name} ${result.last_name} - `;\n }\n item.title += result.email;\n item.subtype = result.roles[0];\n item.url = globalThis.taWp.siteUrl + `/user-edit.php?user_id=${result.id}`;\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminMUSites extends TurboAdminPlugin {\n constructor() {\n super('WP Multisite Sites');\n\n this.searchModes.push( new SearchMode('site', 'Sites', this.siteSearch.bind(this), this.defaultSiteItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n return Boolean(document.querySelector('#wp-admin-bar-my-sites'));\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultSiteItems() {\n return await this.siteSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async siteSearch(searchString) {\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 const sites = document.querySelectorAll('#wp-admin-bar-my-sites #wp-admin-bar-my-sites-list > li');\n\n if (sites.length === 0) {\n return [];\n }\n\n const sitesArray = Array.from(sites);\n const sitesLinks = sitesArray.map(site => site.querySelector('a'));\n const filteredSites = sitesLinks.filter(site => site.innerText.toLowerCase().includes(searchString.toLowerCase()));\n\n return filteredSites.map(site => {\n const item = new ContentItem;\n item.title = site.innerText;\n item.subtype = 'Site';\n item.url = site.href;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(site));\n\n return item;\n });\n }\n\n makeSubmenuItems(siteElement) {\n const submenuItems = [];\n\n const submenu = siteElement.nextElementSibling.querySelector(`.ab-submenu`);\n if (! submenu) {\n return [];\n }\n\n const submenuLinks = submenu.querySelectorAll('a');\n if (submenuLinks.length === 0) {\n return [];\n }\n\n const submenuLinksArray = Array.from(submenuLinks);\n submenuLinksArray.forEach(link => {\n const submenuItem = new SubmenuItem(link.innerText, link.href);\n submenuItems.push(submenuItem);\n });\n\n return submenuItems;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\nimport ItemDefinition from '../types/class-item-definition.js';\n\nexport default class TurboAdminOxygenBuilder extends TurboAdminPlugin {\n constructor() {\n super('OxygenBuilder');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\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\n const hasOxygenBuilder = Boolean(oxygenLinkElem);\n\n // Save Oxygen builder status\n window.localStorage.setItem('ta-has-oxygen-builder', hasOxygenBuilder ? '1' : '0' );\n\n return hasOxygenBuilder;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {Promise<ItemDefinition[]>}\n */\n async getAdditionalItemDefinitions() {\n const editDefinition = new ItemDefinition();\n editDefinition.detectType = 'dom';\n editDefinition.detectSelector = '#ct-edit-template-builder';\n editDefinition.itemTitleFunction = () => 'Edit with Oxygen';\n editDefinition.itemUrlFunction = (element) => element.href;\n editDefinition.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 const backToWpDefinition = new ItemDefinition();\n backToWpDefinition.detectType = 'dom';\n backToWpDefinition.detectSelector = '.oxygen-back-to-wp-menu .oxygen-toolbar-button-dropdown a:not(:last-of-type)';\n backToWpDefinition.itemTitleFunction = (element) => 'Back to WP: ' + element.textContent;\n backToWpDefinition.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 backToWpDefinition.noCache = true;\n\n return [\n editDefinition,\n backToWpDefinition,\n ];\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 */\n\nimport TurboAdminPalette from './class-turbo-admin-palette.js';\nimport TurboAdminMenuItem from './types/class-turbo-admin-menu-item.js';\nimport SearchMode from './types/class-search-mode.js';\nimport TurboAdminPlugin from './types/class-turbo-admin-plugin.js';\nimport Acf from './plugins/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';\nimport TurboAdminBarkeeper from './plugins/class-turbo-admin-barkeeper.js';\nimport TurboAdminContentSearch from './plugins/class-turbo-admin-content-search.js';\nimport TurboAdminPluginSearch from './plugins/class-turbo-admin-plugins.js';\nimport TurboAdminUserSearch from './plugins/class-turbo-admin-users.js';\n// import TurboAdminWoocommerce from './plugins/class-turbo-admin-woocommerce.js';\n// import TurboAdminGravityForms from './plugins/class-turbo-admin-gravity-forms.js';\nimport TurboAdminMUSites from './plugins/class-turbo-admin-mu-sites.js';\nimport TurboAdminOxygenBuilder from './plugins/class-turbo-admin-oxygen-buillder.js';\n\nexport default class TurboAdmin {\n\n /**\n * @param {*} options\n * @returns {TurboAdmin}\n */\n constructor(options) {\n // Sometimes we get a second copy of TA running, like if the plugin is running too.\n // Is this case we want to skip the initialisation.\n this.doInit = true;\n\n if (document.getElementById('ta-command-palette-container')) {\n console.log('TurboAdmin already initialised - I won\\'t make a second copy!');\n this.doInit = false;\n return globalThis.turboAdmin;\n }\n\n this.options = options;\n this.plugins = {};\n\n // TODO: Something? What should this type be?\n this.searchModes = {};\n\n // On the front end we set this if there is no saved menu.\n this.menuNeedsRefresh = false;\n }\n\n /**\n * Perform initialization - this is all the things that do not need APIs to\n * get set up.\n */\n async init() {\n if (! this.doInit) {\n return;\n }\n\n // Register all the plugins\n new TurboAdminBarkeeper();\n new TurboAdminContentSearch();\n new TurboAdminPluginSearch();\n new TurboAdminUserSearch();\n // new TurboAdminWoocommerce();\n // new TurboAdminGravityForms();\n new TurboAdminMUSites();\n new TurboAdminOxygenBuilder();\n\n // Grab the global Wp object instance\n this.wp = globalThis.taWp;\n\n this.menu = [];\n\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 // Check for .logged-in class on body - if logged in, we can use the saved menu,\n // if it exists.\n if (document.body.classList.contains('logged-in')) {\n // Get from localStorage\n const savedMenu = window.localStorage.getItem('ta-palette-data');\n\n // This attempts to see if we have cached items from the back-en\n if (null === savedMenu) {\n this.menuNeedsRefresh = true;\n } else {\n this.menu = JSON.parse(savedMenu);\n // Check if there is no \"Media\" item - this should ONLY be in the back-end\n if (! this.menu.some(item => item.action.endsWith('upload.php'))) {\n this.menuNeedsRefresh = true;\n }\n // Merge (?) the items?\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 await 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\n /**\n * These are initialization steps that DO needs APIs to be set up.\n */\n activatePlugins() {\n // Initialize all plugins\n Object.keys(this.plugins).forEach( plugin => {\n if (this.plugins[plugin].shouldActivate()) {\n this.plugins[plugin].activate();\n }\n })\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 /**\n * True if the plugin has been activated\n *\n * @param {string} name Name of the plugin to check for\n * @returns {boolean}\n */\n hasActivatedPlugin(name) {\n return Object.keys(this.plugins).includes(name) &&\n this.plugins[name].activated;\n }\n\n /**\n * Gather the WordPress dashboard admin (sidebar) menu items\n *\n * @returns { TurboAdminMenuItem[] }\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 /**\n * Adds additional menu items passed in by configuration to the\n * menu items list.\n */\n async 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 // Technically this is an array of {ItemDefintion} but more work needed to make that happen.\n let extraItems = this.options.extraItems ?? [];\n\n // Get any extra items defined by plugins\n const pluginKeys = Object.keys(this.plugins);\n\n for (let i=0; i < pluginKeys.length; i++) {\n extraItems = extraItems.concat(await this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());\n }\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 );\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 // Just grab any old element. We shouldn't need it.\n elements = document.querySelectorAll('body');\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 /**\n * Builds the palette HTML and adds it to the DOM.\n */\n addPalette() {\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 // Palette notice\n const paletteNotice = document.createElement('div');\n paletteNotice.id = 'ta-command-palette-notice';\n // Tab notice\n const tabNotice = document.createElement('div');\n tabNotice.id = 'ta-command-palette-tab-notice';\n // Tab notice text\n const tabNoticeText = document.createElement('span');\n tabNoticeText.id = 'ta-command-palette-tab-notice-text';\n // Tab notice \"button\"\n const tabNoticeButton = document.createElement('span');\n tabNoticeButton.id = 'ta-command-palette-tab-notice-button';\n tabNoticeButton.innerText = 'Tab';\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 // Search mode tag\n const searchModeTag = document.createElement('div');\n searchModeTag.id = 'ta-command-palette-search-mode-tag';\n // List container (needed to contain the main list and the submenu list)\n const listContainer = document.createElement('div');\n listContainer.id = \"ta-command-palette-items-container\";\n // List\n const list = document.createElement('ul');\n list.id = \"ta-command-palette-items\";\n // Sub-menu list\n const submenuContainer = document.createElement('div');\n submenuContainer.id = \"ta-command-palette-submenu-container\";\n // Join it all up\n container.appendChild(palette);\n palette.appendChild(searchModeTag);\n palette.appendChild(paletteNotice);\n tabNotice.appendChild(tabNoticeText);\n tabNotice.appendChild(tabNoticeButton);\n palette.appendChild(tabNotice);\n palette.appendChild(input);\n listContainer.appendChild(list);\n listContainer.appendChild(submenuContainer);\n palette.appendChild(listContainer);\n\n if (document.getElementById('wpadminbar') && this.options['admin-bar-search'] === true) {\n const paletteLi = document.createElement('li');\n paletteLi.appendChild(container);\n const adminBar = document.getElementById('wp-admin-bar-top-secondary');\n adminBar.appendChild(paletteLi);\n\n // Add focus handler\n input.addEventListener('focus', e => this.turboAdminPalette.showPalette());\n\n // Add placeholder\n const placeholder = document.createElement('div');\n placeholder.id = 'ta-shortcut-key-placeholder';\n placeholder.innerText = this.buildShortcutKeysString();\n placeholder.addEventListener('click', e => input.focus());\n\n palette.insertBefore( placeholder, listContainer );\n } else {\n // Container\n document.querySelector(this.options.appendToElement ?? 'body').appendChild(container);\n }\n }\n\n /**\n * Register a plugin with Turbo Admin\n *\n * @param {TurboAdminPlugin} plugin\n */\n registerPlugin(plugin) {\n turboAdminLog('Registering plugin ' + plugin.name);\n this.plugins[plugin.name] = plugin;\n }\n\n /**\n * Register a palette search mode and its associated plugin\n *\n * this is usually bound to the searchMode, so\n *\n * @param {SearchMode} searchMode\n */\n registerSearchMode(searchMode) {\n turboAdminLog('Registering search mode with keyword ' + searchMode.keyword);\n // Don't use `this` as we are bound!\n globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode;\n }\n\n /**\n * Returns a string representation of the palette's keyboard shortcut\n *\n * @returns { String }\n */\n buildShortcutKeysString () {\n let keysString = '';\n let shortcut = this.options.shortcutKeys[0];\n\n if ( shortcut.meta ) {\n keysString += 'Cmd-';\n }\n if ( shortcut.ctrl ) {\n keysString += 'Ctrl-';\n }\n if ( shortcut.alt ) {\n keysString += 'Alt-';\n }\n if ( shortcut.shift ) {\n keysString += 'Shift-';\n }\n keysString += shortcut.key.toUpperCase();\n return keysString;\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<String|Boolean>} 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<urls.length; i++) {\n if (workingUrl) continue;\n result = await this.testUrl(urls[i], responseUrlMustContain);\n if (result !== false) {\n workingUrl = result;\n }\n }\n return workingUrl;\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessSiteUrlFromHome( homeUrl ) {\n const homeWithSlash = this.ensureTrailingSlash(homeUrl);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // homeWithSlash + 'wp-admin/',\n // homeWithSlash + 'wp/wp-admin'\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return homeWithSlash + 'wp-admin/';\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessHome() {\n const currentUrl = new URL(window.location);\n const origin = this.ensureTrailingSlash(currentUrl.origin);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // origin\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return origin;\n }\n\n /**\n *\n * @param {String} siteUrl\n * @returns {String}\n */\n guessHomeFromSiteUrl(siteUrl) {\n // Not much we can do here.\n return siteUrl.replace(/wp-admin\\/?/, '');\n }\n\n async getUrls() {\n // See if we can actually find the URL for the API\n /** @type {HTMLLinkElement|null} */\n const apiLink = document.querySelector('link[rel=\"https://api.w.org/\"]');\n\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 is easy in the back end/Dashboard!\n this.siteUrl = window.location.href.match(/(^.*wp-admin)/)[1];\n this.home = document.getElementById('wp-admin-bar-site-name').querySelector('a').href;\n\n // Always set the siteUrl and home as this is definitive\n window.localStorage.setItem('ta-palette-data-siteurl', this.siteUrl);\n window.localStorage.setItem('ta-palette-data-home', this.home);\n } else if (! this.siteUrl || ! this.home) {\n let urlsFound = false;\n\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 const dashboardLink = document.getElementById('wp-admin-bar-dashboard')?.querySelector('a');\n if (dashboardLink) {\n this.siteUrl = dashboardLink.href;\n }\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 urlsFound = true;\n } else {\n // We might know what the siteUrl is, so guess the home from the siteUrl\n if (this.siteUrl) {\n this.home = this.guessHomeFromSiteUrl(this.siteUrl);\n urlsFound = true;\n }\n }\n }\n if (! urlsFound) {\n // Try for the API link\n // TODO: This needs to be async so it doesn't hold things up.\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 // We (probably) know what the home link is now, so guess the wp-admin\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome( this.home );\n } else {\n this.siteUrl = this.guessSiteUrl();\n }\n urlsFound = true;\n }\n }\n if (! urlsFound) {\n // We got nothing.\n this.home = await this.guessHome();\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome(this.home);\n }\n }\n }\n\n // Always trim the / for comparisons\n if (this.siteUrl) {\n this.siteUrl = this.siteUrl.replace(/(.+)\\/$/, '$1');\n }\n if (this.home) {\n this.home = this.home.replace(/(.+)\\/$/, '$1');\n }\n\n // turboAdminLog('siteUrl: ', this.siteUrl);\n // turboAdminLog('home: ', this.home);\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class WoocommerceApi {\n\n constructor() {\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 getOrders(searchString) {\n // Check the cache\n if (undefined !== this.cache['orders-' + searchString]) {\n return this.cache['orders-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"orders\",\n {\n search: searchString,\n per_page: 100,\n }\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['orders-' + searchString] = result;\n\n return result;\n }\n\n async getOrder(orderId) {\n // Check the cache\n if (undefined !== this.cache['order-' + orderId]) {\n return this.cache['order-' + orderId];\n }\n\n // Fetch results\n const response = await this.wooGet(\n `orders/${orderId}`\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n let resultAsArray = [ result ];\n\n // Store in the cache\n this.cache['order-' + orderId] = resultAsArray;\n\n return resultAsArray;\n }\n\n async getCustomers(searchString) {\n // Check the cache\n if (undefined !== this.cache['customers-' + searchString]) {\n return this.cache['customers-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"customers\",\n {\n search: searchString,\n per_page: 100,\n role: 'all',\n }\n );\n\n if (response === false) {\n return false;\n }\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['customers-' + searchString] = result;\n\n return result;\n }\n\n // TODO: Add docblock and types\n async wooGet(path, data = {}) {\n const wooApiBase = globalThis.contentApi.apiRoot + 'wc/v3/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${wooApiBase}${path}/?${params}`, init);\n\n if ( response.status === 404 ) {\n return false;\n }\n if ( (response.status < 200 || response.status >= 300) ) {\n // TODO: Set a \"deferred\" notice to show when the palette is created?\n if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.');\n } else {\n // Always log this as people may look\n turboAdminLog('TURBO ADMIN: WooCommerce API Error. Try visiting the WordPress Dashboard to refresh things.');\n }\n }\n\n return response;\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class GravityFormsApi {\n\n constructor() {\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 getForms(searchString) {\n // Check the cache\n if (undefined !== this.cache['gf-forms-' + searchString]) {\n return this.cache['gf-forms-' + searchString];\n }\n\n // Fetch results\n const response = await this.gfGet(\n \"forms\",\n {}\n );\n\n // Decode JSON\n const result = await response.json();\n\n // TODO: Trap for errors\n\n // Filter by search string - the API doesn't do this for us\n const searchStringLowerCase = searchString.toLowerCase();\n const formIds = Object.keys(result);\n for (let k = 0; k < formIds.length; k++) {\n const thisId = formIds[k];\n if (! result[thisId].title.toLowerCase().includes(searchStringLowerCase)) {\n delete result[thisId];\n }\n }\n\n // Store in the cache\n this.cache['gf-forms-' + searchString] = result;\n\n return result;\n }\n\n async gfGet(path, data = {}) {\n const gfApiBase = globalThis.contentApi.apiRoot + 'gf/v2/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${gfApiBase}${path}/?${params}`);\n\n if (response.status < 200 || response.status >= 300) {\n // TODO: Set a \"deferred\" notice to show when the palette is created?\n if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.');\n } else {\n // Always log this as people may look\n turboAdminLog('TURBO ADMIN: Gravity Forms API Error. Try visiting the WordPress Dashboard to refresh things.');\n }\n }\n\n return response;\n }\n\n}\n", "import TurboAdmin from './class-turbo-admin.js';\nimport ContentApi from './apis/class-content-api.js';\nimport Wp from './class-wp.js';\nimport TurboAdminWpNotices from './class-turbo-admin-wp-notices.js';\nimport WoocommerceApi from './apis/class-woocommerce-api.js';\nimport GravityFormsApi from './apis/class-gravity-forms-api.js';\n\nconst taStorageKey = 'turbo-admin-settings';\n\nlet debugMode = false;\n\nwindow.turboAdminLog = function() {\n if (debugMode) {\n console.log(...arguments);\n }\n}\n\nwindow.turboAdminIsExtension = function() {\n return 'undefined' !== typeof (chrome.storage);\n}\n\n// Use this to clear storage\n// chrome.storage.local.remove(taStorageKey).then();\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 if (typeof(globalThis.turboAdmin) !== 'undefined') {\n // Already initialised for some reason\n return;\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 }\n\n globalThis.turboAdminOptions = settings[taStorageKey];\n\n // Set debug mode\n debugMode = globalThis.turboAdminOptions['debug-mode'];\n\n turboAdminLog('Preparing Turbo Admin');\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 turboAdminLog('Turbo Admin: WP is initialised');\n\n // Get/set api settings\n globalThis.contentApi = new ContentApi();\n await globalThis.contentApi.discoverApiRoot();\n await globalThis.contentApi.discoverPostTypes();\n globalThis.woocommerceApi = new WoocommerceApi();\n globalThis.gravityFormsApi = new GravityFormsApi();\n\n turboAdminLog('Turbo Admin: Content API is initialised');\n\n globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n await globalThis.turboAdmin.init();\n\n\n\n // This needs all the APIs to be ready\n await globalThis.turboAdmin.activatePlugins();\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 'barkeeper': globalThis.wpTurboAdmin['barkeeper'] === '1',\n 'admin-bar-search': globalThis.wpTurboAdmin['adminBarSearch'] === '1',\n 'debug-mode': globalThis.wpTurboAdmin['debugMode'] === '1',\n\t}\n\tawait taInit(globalThis.turboAdminOptions);\n});\n"], 5 "mappings": "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", 6 6 "names": [] 7 7 } -
turbo-admin/tags/1.13.2/readme.txt
r2835889 r2871191 4 4 Tags: menu, commands, shortcuts 5 5 Requires at least: 4.9 6 Tested up to: 6. 17 Requires PHP: 7. 28 Stable tag: 1.1 2.16 Tested up to: 6.2 7 Requires PHP: 7.4 8 Stable tag: 1.13.2 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 42 42 * Live/dev site labels 43 43 44 Remember, the browser extension itworks everywhere that it can detect WordPress, without needing a plugin. And it carries your preferences with you! It's WordPress, your way!44 Remember, the browser extension works everywhere that it can detect WordPress, without needing a plugin. And it carries your preferences with you! It's WordPress, your way! 45 45 46 46 [Check out the Browser Extension and try it for free](https://turbo-admin.com/) … … 185 185 == Changelog == 186 186 187 = 1.13.2 = 188 189 * [ENHANCEMENT] Storage abstraction enhancements 190 * [ENHANCEMENT] Improved notice handling (again!) 191 * [FIX] Save Barkeeper state properly 192 * [FIX] Content API now uses the storage abstraction to work on both plugin and extension. 193 194 = 1.13.1 = 195 196 This version was skipped in the plugin. 197 198 * Version bump for publishing the Firefox extension 199 200 = 1.13.0 = 201 202 This version was skipped in the plugin. 203 204 * [ENHANCEMENT] Some code rewrites because the extension now uses "Manifest v3" which is a new extension format. Hopefully nothing is broken but PLEASE report any issues. 205 * [ENHANCEMENT] Speed improvements in some situations (cache post types collected from the API). 206 * [ENHANCEMENT] Improvements to list-table keys (more list-table key nav improvements coming). 207 * [ENHANCEMENT] Other behind-the-scenes improvements and preparations for other new features. 208 * [ENHANCEMENT] Add debug mode and suppress most errors if it's turned off. 209 * [FIX] Fix for WP 6.2 site editor interface (props Courtney Robertson) 210 211 187 212 = 1.12.1 = 188 213 * Version bump for publishing -
turbo-admin/tags/1.13.2/src/apis/class-content-api.js
r2835882 r2871191 5 5 constructor() { 6 6 // this.discoverApiRoot().then(e => null); 7 // console.log('Discovered API base: ', this.apiBase);7 // turboAdminLog('Discovered API base: ', this.apiBase); 8 8 this.active = false; 9 9 this.store = new Storage(); … … 16 16 17 17 async discoverApiRoot() { 18 console.log('Discovering API root');18 turboAdminLog('Discovering API root'); 19 19 let wpApiSettings = null; 20 20 this.storageKey = 'wpApiSettings.' + globalThis.taWp.home; … … 64 64 } 65 65 // This should be very rare. I should only really see it in development. 66 console.log('API Route Discovery failed'); 66 turboAdminLog('API Route Discovery failed'); 67 // Making best guess 68 this.apiBase = globalThis.taWp.home + '/wp-json/wp/v2/'; 67 69 // TODO: This can't display as the palette isn't created yet. 68 70 // globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Can\'t find the WP API. Try visiting the dashboard to refresh things.'); … … 70 72 71 73 async discoverPostTypes() { 72 console.log('Discovering post types');74 turboAdminLog('Discovering post types'); 73 75 if (! this.active) { 74 console.log('Not active');76 turboAdminLog('Not active'); 75 77 this.postTypes = []; 76 78 return; 77 79 } 78 80 81 const postTypes = await this.store.get('ta-post-types'); 82 83 // Check local storage cache 84 if (postTypes && postTypes['ta-post-types'] && postTypes['ta-post-types']['expiry'] > Date.now()) { 85 turboAdminLog('Using cached post types: ', postTypes['ta-post-types']['data']); 86 this.postTypes = postTypes['ta-post-types']['data']; 87 return; 88 } 89 79 90 this.postTypes = await this.getPostTypes(); 80 console.log('Discovered post types: ', this.postTypes); 91 turboAdminLog('Discovered post types: ', this.postTypes); 92 93 // Cache for 10 minutes 94 const expiry = Date.now() + (10 * 60 * 1000); 95 this.store.set({ 96 'ta-post-types': { 97 expiry: expiry, 98 data: this.postTypes 99 } 100 }); 81 101 } 82 102 … … 266 286 267 287 if (response.status < 200 || response.status >= 300) { 268 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.'); 288 // TODO: Set a "deferred" notice to show when the palette is created? 289 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 290 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.'); 291 } else { 292 // Always log this as people may look 293 turboAdminLog( 'TURBO ADMIN: WordPress API Error. Try visiting the WordPress Dashboard to refresh things.' ); 294 } 269 295 } 270 296 -
turbo-admin/tags/1.13.2/src/apis/class-gravity-forms-api.js
r2835882 r2871191 64 64 65 65 if (response.status < 200 || response.status >= 300) { 66 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.'); 66 // TODO: Set a "deferred" notice to show when the palette is created? 67 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 68 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.'); 69 } else { 70 // Always log this as people may look 71 turboAdminLog('TURBO ADMIN: Gravity Forms API Error. Try visiting the WordPress Dashboard to refresh things.'); 72 } 67 73 } 68 74 -
turbo-admin/tags/1.13.2/src/apis/class-woocommerce-api.js
r2835882 r2871191 117 117 } 118 118 if ( (response.status < 200 || response.status >= 300) ) { 119 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.'); 119 // TODO: Set a "deferred" notice to show when the palette is created? 120 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 121 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.'); 122 } else { 123 // Always log this as people may look 124 turboAdminLog('TURBO ADMIN: WooCommerce API Error. Try visiting the WordPress Dashboard to refresh things.'); 125 } 120 126 } 121 127 -
turbo-admin/tags/1.13.2/src/class-list-table-shortcuts.js
r2702218 r2871191 59 59 if (this.currentRow === null) { 60 60 this.currentRowIndex = 0; 61 } else {61 } else if (this.currentRowIndex < this.tableRows.length - 1) { 62 62 this.currentRowIndex++; 63 63 } … … 70 70 if (this.currentRowIndex > 0) { 71 71 this.currentRowIndex--; 72 this.updateTable();73 72 } 73 74 this.updateTable(); 74 75 } 75 76 … … 89 90 90 91 openTableRowItem() { 91 console.log(this);92 turboAdminLog(this); 92 93 /** @type {HTMLAnchorElement} */ 93 94 const link = this.currentRow.querySelector('a.row-title'); -
turbo-admin/tags/1.13.2/src/class-storage.js
r2702218 r2871191 21 21 this.store = null; 22 22 23 if ('undefined' === typeof (browser)) { 23 if (this.inExtension()) { 24 this.store = chrome.storage.local; 25 } else { 24 26 this.store = window.localStorage; 25 } else {26 this.store = browser.storage.local;27 27 } 28 } 29 30 /** 31 * Returns true if we are in the extension. 32 */ 33 inExtension() { 34 return window.turboAdminIsExtension(); 28 35 } 29 36 … … 35 42 */ 36 43 async set(dataObject) { 37 if ('undefined' === typeof (browser)) { 44 if (this.inExtension()) { 45 await this.store.set(dataObject); 46 } else { 38 47 const keys = Object.keys(dataObject); 39 48 keys.forEach(key => this.store.setItem(key, JSON.stringify(dataObject[key]))); 40 } else {41 await this.store.set(dataObject);42 49 } 43 50 } … … 53 60 */ 54 61 async get(key) { 55 if ('undefined' === typeof (browser)) { 62 if (this.inExtension()) { 63 return await this.store.get(key); 64 } else { 56 65 let returnObj = {}; 57 66 let item = this.store.getItem(key); … … 67 76 returnObj[key] = itemObject; 68 77 return returnObj; 69 } else {70 return await this.store.get(key);71 78 } 72 79 } 73 74 80 } -
turbo-admin/tags/1.13.2/src/class-turbo-admin-palette.js
r2835882 r2871191 27 27 constructor(paletteData, options) { 28 28 29 console.log('Initialising TurboAdmin');29 turboAdminLog('Initialising TurboAdmin'); 30 30 31 31 this.options = options; … … 202 202 */ 203 203 injectContentItems(contentItems, andRunSearch = true) { 204 console.log('Injecting items');204 turboAdminLog('Injecting items'); 205 205 206 206 if (contentItems.length > 0) { … … 228 228 const itemUrl = item.url; 229 229 230 // console.log('Adding item: ' + itemTitle);230 // turboAdminLog('Adding item: ' + itemTitle); 231 231 232 232 // // Check if item already exists 233 233 if (this.contentItemExists(itemUrl)) { 234 console.log('Not adding duplicate');234 turboAdminLog('Not adding duplicate'); 235 235 return; 236 236 } … … 367 367 newInputValue = newInputValue.slice(0, -1); 368 368 } 369 // console.log(`Checking palette input value ${newInputValue} for keyword`);369 // turboAdminLog(`Checking palette input value ${newInputValue} for keyword`); 370 370 if (this.isKeyword(newInputValue)) { 371 371 this.paletteSearchModeTabNoticeText.innerText = `Search for ${newInputValue}`; … … 469 469 */ 470 470 if (! this.inSearchMode() && (e.code === 'Tab' || e.key === ':')) { 471 console.log('Checking for search mode');471 turboAdminLog('Checking for search mode'); 472 472 let inputValue = this.paletteInputElement.value; 473 473 if (this.isKeyword(inputValue)) { 474 console.log('Found search mode ' + inputValue)474 turboAdminLog('Found search mode ' + inputValue) 475 475 e.preventDefault(); 476 476 // TODO: Work on this. … … 499 499 */ 500 500 async enterSearchMode(searchMode) { 501 console.log('Entering search mode for keyword ' + searchMode.keyword);501 turboAdminLog('Entering search mode for keyword ' + searchMode.keyword); 502 502 this.backupPaletteData(); 503 503 -
turbo-admin/tags/1.13.2/src/class-turbo-admin-wp-block-editor-fullscreen-kill.js
r2702218 r2871191 7 7 8 8 constructor() { 9 10 // Don't run on the site editor screen 11 if (document.body.classList.contains( 'site-editor-php' )) { 12 return; 13 } 9 14 10 15 const attrObserver = new MutationObserver((mutations) => { -
turbo-admin/tags/1.13.2/src/class-turbo-admin-wp-notices.js
r2835882 r2871191 33 33 */ 34 34 this.allowedClasses = [ 35 ' notice-success',36 ' notice-error',37 ' notice-failure',38 ' updated',35 '.notice-success', 36 '.notice-error', 37 '.notice-failure', 38 '.updated', 39 39 ] 40 41 this.noticesPanelInner = null; 40 42 41 43 if (rememberedNoticeIds) { … … 59 61 } 60 62 61 console.log('Notice Selectors', this.noticeSelectors);63 turboAdminLog('Notice Selectors', this.noticeSelectors); 62 64 const notices = document.querySelectorAll(this.noticeSelectors.join(',')); 63 console.log('Notices', notices);65 turboAdminLog('Notices', notices); 64 66 65 67 // Add buttons to notices that can be moved 66 68 notices.forEach(notice => { 67 this.maybeAddIdToNotice(notice) 68 69 if (this.keepNotice(notice)) { 70 const rememberButton = document.createElement('button'); 71 rememberButton.classList.add('ta-remember-notice-button'); 72 rememberButton.innerText = 'Move to panel'; 73 74 const forgetButton = document.createElement('button'); 75 forgetButton.classList.add('ta-forget-notice-button'); 76 forgetButton.innerText = 'Move to dashboard'; 77 78 notice.classList.add('ta-added-pos-relative'); 79 80 notice.appendChild(rememberButton); 81 notice.appendChild(forgetButton); 82 83 rememberButton.addEventListener('click', this.rememberNotice.bind(this), false, true); 84 forgetButton.addEventListener('click', this.forgetNotice.bind(this), false, true); 85 } 69 this.maybeAddIdToNotice(notice); 70 this.maybeAddMoveButtonToNotice.call(this, notice); 86 71 }); 87 72 88 const noticesToHide = Array.from(notices).filter(notice => { 89 if (this.rememberedNoticeIds.includes(notice.id)) { 90 return true; 91 } 92 93 if (this.keepNotice(notice)) { 94 return false; 95 } 96 97 // Invisible 98 if ( 99 notice.offsetHeight === 0 || 100 notice.offsetWidth === 0 101 ) { 102 return false; 103 } 104 105 return true; 106 }) 107 108 console.log('Notices to hide', noticesToHide) 73 const noticesToHide = Array.from(notices).filter( this.noticeShouldBeHidden.bind(this) ); 74 75 turboAdminLog('Notices to hide', noticesToHide) 109 76 110 77 /** … … 157 124 noticesPanel.dataset.open='no'; 158 125 159 const noticesPanelInner = document.createElement('div'); 160 noticesPanelInner.id = 'ta-notices-panel-inner'; 161 162 noticesToHide.forEach(notice => { 163 // See Toolbelt's implementation: https://github.com/BinaryMoon/wp-toolbelt/blob/dev/modules/tidy-notifications/src/js/script.js 164 noticesPanelInner.append(notice); 165 }); 126 this.noticesPanelInner = document.createElement('div'); 127 this.noticesPanelInner.id = 'ta-notices-panel-inner'; 128 129 noticesToHide.forEach(this.hideNotice.bind(this)); 166 130 167 131 /** 168 132 * Add wrap to the meta area 169 133 */ 170 noticesPanel.appendChild( noticesPanelInner);134 noticesPanel.appendChild(this.noticesPanelInner); 171 135 const screenMeta = document.getElementById('screen-meta'); 172 136 screenMeta.appendChild(noticesPanel); … … 176 140 // window.screenMeta.init(); 177 141 // } 142 143 // Add a mutation observer to check for notices added by JavaScript 144 // this.addObserver(); 145 } 146 147 addObserver() { 148 const observer = new MutationObserver( this.handleMutations.bind(this) ); 149 observer.observe(document.getElementById('wpbody-content'), { 150 childList: true, 151 subtree: true 152 }); 153 } 154 155 handleMutations(mutations, observer) { 156 mutations.forEach( mutation => { 157 if (mutation.type === 'childList') { 158 mutation.addedNodes.forEach( node => { 159 if (node.nodeType === Node.ELEMENT_NODE) { 160 console.log('MUTATING!!!' + node.id); 161 // this.maybeAddIdToNotice(node); 162 // this.maybeAddMoveButtonToNotice(node); 163 // this.maybeHideNotice(node); 164 } 165 }); 166 } 167 }); 178 168 } 179 169 180 170 // Does the allowedClasses list say that this notice should be shown? 181 171 keepNotice(noticeElem) { 182 return this.allowedClasses.reduce( (found, current) => { 183 return found || noticeElem.classList.contains(current) 184 }, false); 172 return noticeElem.matches(this.allowedClasses.join(', ')); 185 173 } 186 174 … … 193 181 const notice = ev.target.closest(this.noticeSelectors.join(',')); 194 182 const noticeId = notice.id; 195 console.log(`Remembering ${noticeId}`);183 turboAdminLog(`Remembering ${noticeId}`); 196 184 panelInner.appendChild(notice); 197 185 if (count === 0) { … … 206 194 } 207 195 196 noticeShouldBeHidden(notice) { 197 if (this.rememberedNoticeIds.includes(notice.id)) { 198 return true; 199 } 200 201 if (this.keepNotice(notice)) { 202 return false; 203 } 204 205 // Invisible 206 if ( 207 notice.offsetHeight === 0 || 208 notice.offsetWidth === 0 209 ) { 210 return false; 211 } 212 213 return true; 214 } 215 208 216 saveRememberedNotice(noticeId) { 209 217 this.rememberedNoticeIds.push(noticeId); 210 218 211 219 if ('object' === typeof(browser)) { 212 browser.runtime.sendMessage({220 chrome.runtime.sendMessage({ 213 221 'action': 'rememberNotice', 214 222 'noticeId': noticeId, … … 226 234 const notice = ev.target.closest(this.noticeSelectors.join(',')); 227 235 const noticeId = notice.id; 228 console.log(`Forgetting ${noticeId}`);236 turboAdminLog(`Forgetting ${noticeId}`); 229 237 230 238 notice.remove(); … … 253 261 254 262 if ('object' === typeof(browser)) { 255 browser.runtime.sendMessage({263 chrome.runtime.sendMessage({ 256 264 'action': 'rememberNotice', 257 265 'noticeId': noticeId, … … 266 274 * For notices without IDs we'll see if we can add an ID that's a hash of their classlist 267 275 */ 268 maybeAddIdToNotice(notice) { 269 if (notice.id && notice.id !== '' && notice.id !=='message') { 270 return; 271 } 272 273 const classes = notice.classList; 274 notice.id = Array.from(notice.classList).join('-'); 276 maybeAddIdToNotice(noticeElem) { 277 if (noticeElem.id && noticeElem.id !== '' && noticeElem.id !=='message') { 278 return; 279 } 280 281 const classes = noticeElem.classList; 282 noticeElem.id = Array.from(noticeElem.classList).join('-'); 283 } 284 285 /** 286 * Add buttons to notices that we want to be able to move to the panel 287 */ 288 maybeAddMoveButtonToNotice(noticeElem) { 289 if (this.keepNotice(noticeElem)) { 290 const rememberButton = document.createElement('button'); 291 rememberButton.classList.add('ta-remember-notice-button'); 292 rememberButton.innerText = 'Move to panel'; 293 294 const forgetButton = document.createElement('button'); 295 forgetButton.classList.add('ta-forget-notice-button'); 296 forgetButton.innerText = 'Move to dashboard'; 297 298 noticeElem.classList.add('ta-added-pos-relative'); 299 300 noticeElem.appendChild(rememberButton); 301 noticeElem.appendChild(forgetButton); 302 303 rememberButton.addEventListener('click', this.rememberNotice.bind(this), false, true); 304 forgetButton.addEventListener('click', this.forgetNotice.bind(this), false, true); 305 } 306 } 307 308 maybeHideNotice(noticeElem) { 309 if (this.noticeShouldBeHidden(noticeElem) && !noticeElem.classList.contains('ta-notice-hidden')) { 310 this.hideNotice(noticeElem); 311 } 312 } 313 314 hideNotice(noticeElem) { 315 noticeElem.classList.add('ta-notice-hidden'); 316 // WPCore's common.js will re-add the notice below the dashboard header unless it has a .inline class. 317 // It does: $( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd ); 318 noticeElem.classList.add('inline'); 319 // See Toolbelt's implementation: https://github.com/BinaryMoon/wp-toolbelt/blob/dev/modules/tidy-notifications/src/js/script.js 320 this.noticesPanelInner.append(noticeElem); 275 321 } 276 322 -
turbo-admin/tags/1.13.2/src/class-turbo-admin.js
r2835882 r2871191 49 49 import TurboAdminPlugin from './types/class-turbo-admin-plugin.js'; 50 50 import Acf from './plugins/class-acf.js'; 51 //import TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js';52 //import TurboAdminWpBlockEditorWelcomeGuideKill from './class-turbo-admin-wp-block-editor-welcome-guide-kill.js';51 import TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js'; 52 import TurboAdminWpBlockEditorWelcomeGuideKill from './class-turbo-admin-wp-block-editor-welcome-guide-kill.js'; 53 53 import TurboAdminWpNotices from './class-turbo-admin-wp-notices.js'; 54 54 import TurboAdminListTableShortcuts from './class-list-table-shortcuts.js'; … … 145 145 146 146 // Add other additional items 147 this.addAdditionalMenuItems();147 await this.addAdditionalMenuItems(); 148 148 // Add items passed in using extraItemsRaw 149 149 this.menu = this.menu.concat(this.options.extraItemsRaw ?? []); … … 189 189 }) 190 190 191 //if (true === this.options['block-editor-fullscreen-disable']) {192 //// Initialise fullscreen kill193 //this.turboAdminFullscreenKill = new TurboAdminWpBlockEditorFullscreenKill();194 //}195 196 //if (true === this.options['block-editor-welcome-screen-kill']) {197 //this.turboAdminWelcomeKill = new TurboAdminWpBlockEditorWelcomeGuideKill();198 //}191 if (true === this.options['block-editor-fullscreen-disable']) { 192 // Initialise fullscreen kill 193 this.turboAdminFullscreenKill = new TurboAdminWpBlockEditorFullscreenKill(); 194 } 195 196 if (true === this.options['block-editor-welcome-screen-kill']) { 197 this.turboAdminWelcomeKill = new TurboAdminWpBlockEditorWelcomeGuideKill(); 198 } 199 199 200 200 if (true === this.options['list-table-keyboard-shortcuts']) { … … 261 261 * menu items list. 262 262 */ 263 a ddAdditionalMenuItems() {263 async addAdditionalMenuItems() { 264 264 265 265 /* … … 291 291 292 292 for (let i=0; i < pluginKeys.length; i++) { 293 extraItems = extraItems.concat( this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());293 extraItems = extraItems.concat(await this.plugins[pluginKeys[i]].getAdditionalItemDefinitions()); 294 294 } 295 295 … … 381 381 if (item.detectType === 'url') { 382 382 detected = Boolean(window.location.href.includes(item.detectPattern)); 383 // Just grab any old element. We shouldn't need it. 384 elements = document.querySelectorAll('body'); 383 385 } else if (item.detectType === 'dom') { 384 386 if (item.detectSelector) { … … 494 496 */ 495 497 registerPlugin(plugin) { 496 console.log('Registering plugin ' + plugin.name);498 turboAdminLog('Registering plugin ' + plugin.name); 497 499 this.plugins[plugin.name] = plugin; 498 500 } … … 506 508 */ 507 509 registerSearchMode(searchMode) { 508 console.log('Registering search mode with keyword ' + searchMode.keyword);510 turboAdminLog('Registering search mode with keyword ' + searchMode.keyword); 509 511 // Don't use `this` as we are bound! 510 512 globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode; … … 532 534 keysString += 'Shift-'; 533 535 } 534 keysString += shortcut.key ;536 keysString += shortcut.key.toUpperCase(); 535 537 return keysString; 536 538 } -
turbo-admin/tags/1.13.2/src/class-wp.js
r2702218 r2871191 167 167 window.localStorage.setItem('ta-palette-data-home', this.home); 168 168 } else if (! this.siteUrl || ! this.home) { 169 let urlsFound = false; 169 170 170 171 // If we're not in the backend then (in the extension at least) we … … 172 173 // admin bar and grab from that if there is one. 173 174 if (document.getElementById('wpadminbar')) { 174 this.siteUrl = document.getElementById('wp-admin-bar-dashboard').querySelector('a').href; 175 const dashboardLink = document.getElementById('wp-admin-bar-dashboard')?.querySelector('a'); 176 if (dashboardLink) { 177 this.siteUrl = dashboardLink.href; 178 } 175 179 // Try for the API link 176 180 if (this.apiLinkUrl) { … … 181 185 this.home = this.apiLinkUrl.replace(/index.php\?rest_route.*/, ''); 182 186 } 187 urlsFound = true; 183 188 } else { 184 // We know what the siteUrl is, so guess the home from the siteUrl 185 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 186 } 187 188 } else { 189 // We might know what the siteUrl is, so guess the home from the siteUrl 190 if (this.siteUrl) { 191 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 192 urlsFound = true; 193 } 194 } 195 } 196 if (! urlsFound) { 189 197 // Try for the API link 190 198 // TODO: This needs to be async so it doesn't hold things up. … … 202 210 this.siteUrl = this.guessSiteUrl(); 203 211 } 204 } else { 205 // We got nothing. 206 this.home = await this.guessHome(); 207 if (this.home) { 208 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 209 } 212 urlsFound = true; 213 } 214 } 215 if (! urlsFound) { 216 // We got nothing. 217 this.home = await this.guessHome(); 218 if (this.home) { 219 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 210 220 } 211 221 } … … 220 230 } 221 231 222 // console.log('siteUrl: ', this.siteUrl);223 // console.log('home: ', this.home);232 // turboAdminLog('siteUrl: ', this.siteUrl); 233 // turboAdminLog('home: ', this.home); 224 234 } 225 235 -
turbo-admin/tags/1.13.2/src/main.js
r2835882 r2871191 8 8 const taStorageKey = 'turbo-admin-settings'; 9 9 10 let debugMode = false; 11 12 window.turboAdminLog = function() { 13 if (debugMode) { 14 console.log(...arguments); 15 } 16 } 17 18 window.turboAdminIsExtension = function() { 19 return 'undefined' !== typeof (chrome.storage); 20 } 21 10 22 // Use this to clear storage 11 // browser.storage.local.remove(taStorageKey).then();23 // chrome.storage.local.remove(taStorageKey).then(); 12 24 13 25 // Note that in the extension, the globalThis is not the browser's global scope, … … 29 41 globalThis.turboAdminOptions = settings[taStorageKey]; 30 42 31 console.log('Preparing Turbo Admin'); 43 // Set debug mode 44 debugMode = globalThis.turboAdminOptions['debug-mode']; 45 46 turboAdminLog('Preparing Turbo Admin'); 32 47 33 48 // Get Wp stuff ready … … 37 52 await globalThis.taWp.completeInit(); 38 53 39 console.log('Turbo Admin: WP is initialised');54 turboAdminLog('Turbo Admin: WP is initialised'); 40 55 41 56 // Get/set api settings … … 46 61 globalThis.gravityFormsApi = new GravityFormsApi(); 47 62 48 console.log('Turbo Admin: Content API is initialised');63 turboAdminLog('Turbo Admin: Content API is initialised'); 49 64 50 65 globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions); … … 79 94 'barkeeper': globalThis.wpTurboAdmin['barkeeper'] === '1', 80 95 'admin-bar-search': globalThis.wpTurboAdmin['adminBarSearch'] === '1', 96 'debug-mode': globalThis.wpTurboAdmin['debugMode'] === '1', 81 97 } 82 98 await taInit(globalThis.turboAdminOptions); -
turbo-admin/tags/1.13.2/src/plugins/class-turbo-admin-barkeeper.js
r2835882 r2871191 19 19 return false; 20 20 } 21 // Bail if we don't have the left-hand admin bar (some users only have right-hand side) 22 if (! document.getElementById('wp-admin-bar-root-default')) { 23 return false; 24 } 21 25 return true; 22 26 } … … 35 39 ]; 36 40 37 this.barkeeperState = globalThis.turboAdmin.options['barkeeper-state']; 41 this.selectorsToHide = [ 42 '#wp-admin-bar-root-default > li', 43 '.monsterinsights-adminbar-menu-item', 44 ]; 45 46 this.barkeeperState = this.getBarkeeperState(); 38 47 39 48 this.root = document.getElementById('wp-admin-bar-root-default'); 40 this.itemsToHide = document.querySelectorAll( '#wp-admin-bar-root-default > li'); 49 if (! this.root) { 50 return; 51 } 52 this.itemsToHide = document.querySelectorAll( this.selectorsToHide.join(', ') ); 41 53 42 54 Array.from(this.itemsToHide).forEach( element => { … … 61 73 this.barkeeperState = this.barkeeperState === 'open' ? 'closed' : 'open'; 62 74 63 browser.runtime.sendMessage({ 75 this.setBarkeeperState(this.barkeeperState); 76 }); 77 78 this.root.insertAdjacentElement('afterend', this.button); 79 80 this.setupObserver(); 81 } 82 83 /** 84 * Some awkward plugins add themselves into the bar using JS 85 */ 86 setupObserver() { 87 this.observer = new MutationObserver( mutations => { 88 mutations.forEach( mutation => { 89 if (mutation.type === 'childList') { 90 mutation.addedNodes.forEach( node => { 91 if (node.classList && node.classList.contains('ta-barkeeper-collapsable')) { 92 return; 93 } 94 if (node.id && this.exclusionIds.includes(node.id)) { 95 return; 96 } 97 // Check is the node matches any of the selectors 98 if (node.matches(this.selectorsToHide.join(', '))) { 99 node.classList.add('ta-barkeeper-collapsable'); 100 return; 101 } 102 }); 103 } 104 }); 105 }); 106 107 this.observer.observe(this.root, { 108 childList: true, 109 subtree: true, 110 }); 111 } 112 113 getBarkeeperState() { 114 if (window.turboAdminIsExtension()) { 115 return globalThis.turboAdmin.options['barkeeper-state']; 116 } else { 117 return window.localStorage.getItem('turbo-admin-barkeeper-state'); 118 } 119 } 120 121 setBarkeeperState(state) { 122 if (window.turboAdminIsExtension()) { 123 chrome.runtime.sendMessage({ 64 124 'action': 'barkeeperSetState', 65 125 'barkeeperState': this.barkeeperState, 66 126 }); 67 } );68 69 this.root.insertAdjacentElement('afterend', this.button);127 } else { 128 window.localStorage.setItem('turbo-admin-barkeeper-state', state); 129 } 70 130 } 71 72 131 } -
turbo-admin/tags/1.13.2/src/plugins/class-turbo-admin-content-search.js
r2835882 r2871191 13 13 const thisPostTypeKey = postTypeKeys[i]; 14 14 const thisPostType = globalThis.contentApi.postTypes[thisPostTypeKey]; 15 // console.log('Adding search mode for post type', thisPostType);15 // turboAdminLog('Adding search mode for post type', thisPostType); 16 16 this.searchModes.push( this.makePostTypeSearchMode(thisPostType) ); 17 17 } -
turbo-admin/tags/1.13.2/src/plugins/class-turbo-admin-gravity-forms.js
r2835882 r2871191 86 86 ) 87 87 88 console.log(item);88 turboAdminLog(item); 89 89 90 90 resultsArray.push(item); -
turbo-admin/tags/1.13.2/src/plugins/class-turbo-admin-oxygen-buillder.js
r2835882 r2871191 46 46 * Get additional menu items to be added to the main menu 47 47 * 48 * @return { ItemDefinition[]}48 * @return {Promise<ItemDefinition[]>} 49 49 */ 50 getAdditionalItemDefinitions() {50 async getAdditionalItemDefinitions() { 51 51 const editDefinition = new ItemDefinition(); 52 52 editDefinition.detectType = 'dom'; -
turbo-admin/tags/1.13.2/src/types/class-item-definition.js
r2835882 r2871191 39 39 40 40 /** 41 * [OPTIONAL] A string to find in the current URL to detect the item 42 * 43 * @type {string} 44 */ 45 detectPattern = ''; 46 47 /** 41 48 * A callback used to generate a menu item title from a detected element. Should be passed an 42 49 * HTML element and should return a string -
turbo-admin/tags/1.13.2/src/types/class-turbo-admin-plugin.js
r2835882 r2871191 25 25 */ 26 26 registerPlugin() { 27 console.log('Inside plugin - requested registration of ' + this.name);27 turboAdminLog('Inside plugin - requested registration of ' + this.name); 28 28 globalThis.turboAdmin.registerPlugin(this); 29 29 } … … 57 57 * Get additional menu items to be added to the main menu 58 58 * 59 * @return { ItemDefinition[]}59 * @return {Promise<ItemDefinition[]>} 60 60 */ 61 getAdditionalItemDefinitions() {61 async getAdditionalItemDefinitions() { 62 62 return []; 63 63 } -
turbo-admin/tags/1.13.2/turbo-admin.css
r2835882 r2871191 578 578 * List tables 579 579 */ 580 .ta-active-table-row { 580 .ta-active-table-row, 581 .ta-active-table-row th, 582 .ta-active-table-row td { 581 583 background-color: #ddd !important; 582 584 } -
turbo-admin/tags/1.13.2/turbo-admin.php
r2835889 r2871191 9 9 * Text Domain: turbo-admin 10 10 * Domain Path: /languages 11 * Version: 1.1 2.111 * Version: 1.13.2 12 12 * 13 13 * @package Turbo_Admin … … 37 37 define('TURBO_ADMIN_BARKEEPER_META_NAME', 'turbo-admin-barkeeper'); 38 38 define('TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME', 'turbo-admin-list-table-shortcuts'); 39 define('TURBO_ADMIN_DEBUG_MODE_NAME', 'turbo-admin-debug-mode'); 39 40 40 41 function add_admin_scripts() … … 46 47 $barkeeper = get_user_meta( get_current_user_id(), TURBO_ADMIN_BARKEEPER_META_NAME, true ); 47 48 $listTableShortcuts = get_user_meta( get_current_user_id(), TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME, true ); 49 $debugMode = get_user_meta( get_current_user_id(), TURBO_ADMIN_DEBUG_MODE_NAME, true ); 48 50 49 51 // We will pass an array of shortcut key objects into the JS … … 61 63 'barkeeper' => intval( $barkeeper ) === 1, 62 64 'listTableShortcuts' => intval( $listTableShortcuts ) === 1, 65 'debugMode' => intval( $debugMode ) === 1, 63 66 ] ); 64 67 } … … 128 131 $barkeeper = get_user_meta( get_current_user_id(), TURBO_ADMIN_BARKEEPER_META_NAME, true ); 129 132 $listTableShortcuts = get_user_meta( get_current_user_id(), TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME, true ); 133 $debugMode = get_user_meta( get_current_user_id(), TURBO_ADMIN_DEBUG_MODE_NAME, true ); 130 134 ?> 131 135 <h3><?php _e('Turbo Admin settings', 'turbo_admin') ?></h3> … … 192 196 List table shortcuts (experimental) 193 197 </label> 198 <br> 199 <label for="turbo-admin-debug-mode"> 200 <input name="turbo-admin-debug-mode" type="checkbox" id="turbo-admin-debug-mode" value="1" <?php checked($debugMode) ?>> 201 Debug mode (lots of console.log!) 202 </label> 194 203 </td> 195 204 </tr> … … 241 250 } else { 242 251 update_user_meta($user_id, TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME, 0); 252 } 253 if (isset($_POST['turbo-admin-debug-mode']) && in_array(intval($_POST['turbo-admin-debug-mode']), [0, 1], true) ) { 254 update_user_meta($user_id, TURBO_ADMIN_DEBUG_MODE_NAME, $_POST['turbo-admin-debug-mode']); 255 } else { 256 update_user_meta($user_id, TURBO_ADMIN_DEBUG_MODE_NAME, 0); 243 257 } 244 258 } -
turbo-admin/trunk/dist/main.min.js
r2835882 r2871191 830 830 constructor() { 831 831 this.store = null; 832 if (typeof browser === "undefined") { 832 if (this.inExtension()) { 833 this.store = chrome.storage.local; 834 } else { 833 835 this.store = window.localStorage; 836 } 837 } 838 inExtension() { 839 return window.turboAdminIsExtension(); 840 } 841 async set(dataObject) { 842 if (this.inExtension()) { 843 await this.store.set(dataObject); 834 844 } else { 835 this.store = browser.storage.local;836 }837 }838 async set(dataObject) {839 if (typeof browser === "undefined") {840 845 const keys = Object.keys(dataObject); 841 846 keys.forEach((key) => this.store.setItem(key, JSON.stringify(dataObject[key]))); 847 } 848 } 849 async get(key) { 850 if (this.inExtension()) { 851 return await this.store.get(key); 842 852 } else { 843 await this.store.set(dataObject);844 }845 }846 async get(key) {847 if (typeof browser === "undefined") {848 853 let returnObj = {}; 849 854 let item = this.store.getItem(key); … … 859 864 returnObj[key] = itemObject; 860 865 return returnObj; 861 } else {862 return await this.store.get(key);863 866 } 864 867 } … … 875 878 } 876 879 async discoverApiRoot() { 877 console.log("Discovering API root");880 turboAdminLog("Discovering API root"); 878 881 let wpApiSettings = null; 879 882 this.storageKey = "wpApiSettings." + globalThis.taWp.home; … … 908 911 return; 909 912 } 910 console.log("API Route Discovery failed"); 913 turboAdminLog("API Route Discovery failed"); 914 this.apiBase = globalThis.taWp.home + "/wp-json/wp/v2/"; 911 915 } 912 916 async discoverPostTypes() { 913 console.log("Discovering post types");917 turboAdminLog("Discovering post types"); 914 918 if (!this.active) { 915 console.log("Not active");919 turboAdminLog("Not active"); 916 920 this.postTypes = []; 917 921 return; 918 922 } 923 const postTypes = await this.store.get("ta-post-types"); 924 if (postTypes && postTypes["ta-post-types"] && postTypes["ta-post-types"]["expiry"] > Date.now()) { 925 turboAdminLog("Using cached post types: ", postTypes["ta-post-types"]["data"]); 926 this.postTypes = postTypes["ta-post-types"]["data"]; 927 return; 928 } 919 929 this.postTypes = await this.getPostTypes(); 920 console.log("Discovered post types: ", this.postTypes); 930 turboAdminLog("Discovered post types: ", this.postTypes); 931 const expiry = Date.now() + 10 * 60 * 1e3; 932 this.store.set({ 933 "ta-post-types": { 934 expiry, 935 data: this.postTypes 936 } 937 }); 921 938 } 922 939 userLoggedIn() { … … 1030 1047 const response = await fetch(`${this.apiBase}${path}/?${params}`, init); 1031 1048 if (response.status < 200 || response.status >= 300) { 1032 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WordPress API Error. Try visiting the dashboard to refresh things."); 1049 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 1050 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WordPress API Error. Try visiting the dashboard to refresh things."); 1051 } else { 1052 turboAdminLog("TURBO ADMIN: WordPress API Error. Try visiting the WordPress Dashboard to refresh things."); 1053 } 1033 1054 } 1034 1055 return response; … … 1082 1103 var TurboAdminPalette = class { 1083 1104 constructor(paletteData, options) { 1084 console.log("Initialising TurboAdmin");1105 turboAdminLog("Initialising TurboAdmin"); 1085 1106 this.options = options; 1086 1107 this.paletteElement = document.getElementById("ta-command-palette-container"); … … 1179 1200 } 1180 1201 injectContentItems(contentItems, andRunSearch = true) { 1181 console.log("Injecting items");1202 turboAdminLog("Injecting items"); 1182 1203 if (contentItems.length > 0) { 1183 1204 contentItems.forEach(this.injectItem.bind(this)); … … 1194 1215 const itemUrl = item.url; 1195 1216 if (this.contentItemExists(itemUrl)) { 1196 console.log("Not adding duplicate");1217 turboAdminLog("Not adding duplicate"); 1197 1218 return; 1198 1219 } … … 1335 1356 this.maybeHighlightInputKeyword(e.key); 1336 1357 if (!this.inSearchMode() && (e.code === "Tab" || e.key === ":")) { 1337 console.log("Checking for search mode");1358 turboAdminLog("Checking for search mode"); 1338 1359 let inputValue = this.paletteInputElement.value; 1339 1360 if (this.isKeyword(inputValue)) { 1340 console.log("Found search mode " + inputValue);1361 turboAdminLog("Found search mode " + inputValue); 1341 1362 e.preventDefault(); 1342 1363 await this.enterSearchMode(globalThis.turboAdmin.searchModes[inputValue]); … … 1352 1373 } 1353 1374 async enterSearchMode(searchMode) { 1354 console.log("Entering search mode for keyword " + searchMode.keyword);1375 turboAdminLog("Entering search mode for keyword " + searchMode.keyword); 1355 1376 this.backupPaletteData(); 1356 1377 this.paletteData = []; … … 1611 1632 detectSelector = ""; 1612 1633 detectSelectorNone = ""; 1634 detectPattern = ""; 1613 1635 itemTitleFunction = null; 1614 1636 itemUrlFunction = null; … … 1627 1649 } 1628 1650 registerPlugin() { 1629 console.log("Inside plugin - requested registration of " + this.name);1651 turboAdminLog("Inside plugin - requested registration of " + this.name); 1630 1652 globalThis.turboAdmin.registerPlugin(this); 1631 1653 } … … 1640 1662 this.searchModes.forEach(globalThis.turboAdmin.registerSearchMode); 1641 1663 } 1642 getAdditionalItemDefinitions() {1664 async getAdditionalItemDefinitions() { 1643 1665 return []; 1644 1666 } … … 1647 1669 }; 1648 1670 var class_turbo_admin_plugin_default = TurboAdminPlugin; 1671 1672 // src/class-turbo-admin-wp-block-editor-fullscreen-kill.js 1673 var TurboAdminWpBlockEditorFullscreenKill = class { 1674 constructor() { 1675 if (document.body.classList.contains("site-editor-php")) { 1676 return; 1677 } 1678 const attrObserver = new MutationObserver((mutations) => { 1679 mutations.forEach((mu) => { 1680 if (mu.type !== "attributes" && mu.attributeName !== "class") { 1681 return; 1682 } 1683 if (mu.target.classList.contains("is-fullscreen-mode")) { 1684 this.killFullScreenEditor(); 1685 } 1686 }); 1687 }); 1688 attrObserver.observe(document.body, {attributes: true}); 1689 this.killFullScreenEditor(); 1690 } 1691 killFullScreenEditor() { 1692 if (!document.body.classList.contains("is-fullscreen-mode")) { 1693 return; 1694 } 1695 document.body.classList.remove("is-fullscreen-mode"); 1696 document.body.classList.add("turbo-admin-killed-fullscreen"); 1697 const newStyles = document.createElement("style"); 1698 newStyles.innerHTML = "body.turbo-admin-killed-fullscreen .edit-post-fullscreen-mode-close { display: none; }"; 1699 document.body.appendChild(newStyles); 1700 } 1701 }; 1702 var class_turbo_admin_wp_block_editor_fullscreen_kill_default = TurboAdminWpBlockEditorFullscreenKill; 1703 1704 // src/class-turbo-admin-wp-block-editor-welcome-guide-kill.js 1705 var TurboAdminWpBlockEditorWelcomeGuideKill = class { 1706 constructor() { 1707 const attrObserver = new MutationObserver((mutations) => { 1708 mutations.forEach((mu) => { 1709 if (document.body.classList.contains("ta-killed-post-welcome-guide")) { 1710 return; 1711 } 1712 if (mu.type !== "attributes" && mu.attributeName !== "class") { 1713 return; 1714 } 1715 if (!mu.target.classList.contains("modal-open")) { 1716 return; 1717 } 1718 const welcomeGuide = document.querySelector(".edit-post-welcome-guide"); 1719 if (welcomeGuide) { 1720 this.killWelcomeGuide(); 1721 } 1722 }); 1723 }); 1724 attrObserver.observe(document.body, {attributes: true}); 1725 this.killWelcomeGuide(); 1726 } 1727 killWelcomeGuide() { 1728 const welcomeGuide = document.querySelector(".edit-post-welcome-guide"); 1729 if (welcomeGuide) { 1730 const closeButton = welcomeGuide.querySelector(".components-modal__header button"); 1731 if (closeButton) { 1732 closeButton.click(); 1733 document.body.classList.add("ta-killed-post-welcome-guide"); 1734 } 1735 } 1736 } 1737 }; 1738 var class_turbo_admin_wp_block_editor_welcome_guide_kill_default = TurboAdminWpBlockEditorWelcomeGuideKill; 1649 1739 1650 1740 // src/class-turbo-admin-wp-notices.js … … 1668 1758 ]; 1669 1759 this.allowedClasses = [ 1670 " notice-success",1671 " notice-error",1672 " notice-failure",1673 " updated"1760 ".notice-success", 1761 ".notice-error", 1762 ".notice-failure", 1763 ".updated" 1674 1764 ]; 1765 this.noticesPanelInner = null; 1675 1766 if (rememberedNoticeIds) { 1676 1767 this.rememberedNoticeIds = rememberedNoticeIds.length > 0 ? rememberedNoticeIds : []; … … 1689 1780 }); 1690 1781 } 1691 console.log("Notice Selectors", this.noticeSelectors);1782 turboAdminLog("Notice Selectors", this.noticeSelectors); 1692 1783 const notices = document.querySelectorAll(this.noticeSelectors.join(",")); 1693 console.log("Notices", notices);1784 turboAdminLog("Notices", notices); 1694 1785 notices.forEach((notice) => { 1695 1786 this.maybeAddIdToNotice(notice); 1696 if (this.keepNotice(notice)) { 1697 const rememberButton = document.createElement("button"); 1698 rememberButton.classList.add("ta-remember-notice-button"); 1699 rememberButton.innerText = "Move to panel"; 1700 const forgetButton = document.createElement("button"); 1701 forgetButton.classList.add("ta-forget-notice-button"); 1702 forgetButton.innerText = "Move to dashboard"; 1703 notice.classList.add("ta-added-pos-relative"); 1704 notice.appendChild(rememberButton); 1705 notice.appendChild(forgetButton); 1706 rememberButton.addEventListener("click", this.rememberNotice.bind(this), false, true); 1707 forgetButton.addEventListener("click", this.forgetNotice.bind(this), false, true); 1708 } 1787 this.maybeAddMoveButtonToNotice.call(this, notice); 1709 1788 }); 1710 const noticesToHide = Array.from(notices).filter((notice) => { 1711 if (this.rememberedNoticeIds.includes(notice.id)) { 1712 return true; 1713 } 1714 if (this.keepNotice(notice)) { 1715 return false; 1716 } 1717 if (notice.offsetHeight === 0 || notice.offsetWidth === 0) { 1718 return false; 1719 } 1720 return true; 1721 }); 1722 console.log("Notices to hide", noticesToHide); 1789 const noticesToHide = Array.from(notices).filter(this.noticeShouldBeHidden.bind(this)); 1790 turboAdminLog("Notices to hide", noticesToHide); 1723 1791 const noticesLinkWrapper = document.createElement("div"); 1724 1792 noticesLinkWrapper.id = "ta-notices-link-wrap"; … … 1743 1811 noticesPanel.style.display = "none"; 1744 1812 noticesPanel.dataset.open = "no"; 1745 const noticesPanelInner = document.createElement("div"); 1746 noticesPanelInner.id = "ta-notices-panel-inner"; 1747 noticesToHide.forEach((notice) => { 1748 noticesPanelInner.append(notice); 1749 }); 1750 noticesPanel.appendChild(noticesPanelInner); 1813 this.noticesPanelInner = document.createElement("div"); 1814 this.noticesPanelInner.id = "ta-notices-panel-inner"; 1815 noticesToHide.forEach(this.hideNotice.bind(this)); 1816 noticesPanel.appendChild(this.noticesPanelInner); 1751 1817 const screenMeta = document.getElementById("screen-meta"); 1752 1818 screenMeta.appendChild(noticesPanel); 1753 1819 } 1820 addObserver() { 1821 const observer = new MutationObserver(this.handleMutations.bind(this)); 1822 observer.observe(document.getElementById("wpbody-content"), { 1823 childList: true, 1824 subtree: true 1825 }); 1826 } 1827 handleMutations(mutations, observer) { 1828 mutations.forEach((mutation) => { 1829 if (mutation.type === "childList") { 1830 mutation.addedNodes.forEach((node) => { 1831 if (node.nodeType === Node.ELEMENT_NODE) { 1832 console.log("MUTATING!!!" + node.id); 1833 } 1834 }); 1835 } 1836 }); 1837 } 1754 1838 keepNotice(noticeElem) { 1755 return this.allowedClasses.reduce((found, current) => { 1756 return found || noticeElem.classList.contains(current); 1757 }, false); 1839 return noticeElem.matches(this.allowedClasses.join(", ")); 1758 1840 } 1759 1841 rememberNotice(ev) { … … 1765 1847 const notice = ev.target.closest(this.noticeSelectors.join(",")); 1766 1848 const noticeId = notice.id; 1767 console.log(`Remembering ${noticeId}`);1849 turboAdminLog(`Remembering ${noticeId}`); 1768 1850 panelInner.appendChild(notice); 1769 1851 if (count === 0) { … … 1774 1856 this.saveRememberedNotice(noticeId); 1775 1857 } 1858 noticeShouldBeHidden(notice) { 1859 if (this.rememberedNoticeIds.includes(notice.id)) { 1860 return true; 1861 } 1862 if (this.keepNotice(notice)) { 1863 return false; 1864 } 1865 if (notice.offsetHeight === 0 || notice.offsetWidth === 0) { 1866 return false; 1867 } 1868 return true; 1869 } 1776 1870 saveRememberedNotice(noticeId) { 1777 1871 this.rememberedNoticeIds.push(noticeId); 1778 1872 if (typeof browser === "object") { 1779 browser.runtime.sendMessage({1873 chrome.runtime.sendMessage({ 1780 1874 action: "rememberNotice", 1781 1875 noticeId … … 1792 1886 const notice = ev.target.closest(this.noticeSelectors.join(",")); 1793 1887 const noticeId = notice.id; 1794 console.log(`Forgetting ${noticeId}`);1888 turboAdminLog(`Forgetting ${noticeId}`); 1795 1889 notice.remove(); 1796 1890 const message = document.createElement("div"); … … 1807 1901 this.rememberedNoticeIds.push(noticeId); 1808 1902 if (typeof browser === "object") { 1809 browser.runtime.sendMessage({1903 chrome.runtime.sendMessage({ 1810 1904 action: "rememberNotice", 1811 1905 noticeId … … 1816 1910 } 1817 1911 } 1818 maybeAddIdToNotice(notice) { 1819 if (notice.id && notice.id !== "" && notice.id !== "message") { 1820 return; 1821 } 1822 const classes = notice.classList; 1823 notice.id = Array.from(notice.classList).join("-"); 1912 maybeAddIdToNotice(noticeElem) { 1913 if (noticeElem.id && noticeElem.id !== "" && noticeElem.id !== "message") { 1914 return; 1915 } 1916 const classes = noticeElem.classList; 1917 noticeElem.id = Array.from(noticeElem.classList).join("-"); 1918 } 1919 maybeAddMoveButtonToNotice(noticeElem) { 1920 if (this.keepNotice(noticeElem)) { 1921 const rememberButton = document.createElement("button"); 1922 rememberButton.classList.add("ta-remember-notice-button"); 1923 rememberButton.innerText = "Move to panel"; 1924 const forgetButton = document.createElement("button"); 1925 forgetButton.classList.add("ta-forget-notice-button"); 1926 forgetButton.innerText = "Move to dashboard"; 1927 noticeElem.classList.add("ta-added-pos-relative"); 1928 noticeElem.appendChild(rememberButton); 1929 noticeElem.appendChild(forgetButton); 1930 rememberButton.addEventListener("click", this.rememberNotice.bind(this), false, true); 1931 forgetButton.addEventListener("click", this.forgetNotice.bind(this), false, true); 1932 } 1933 } 1934 maybeHideNotice(noticeElem) { 1935 if (this.noticeShouldBeHidden(noticeElem) && !noticeElem.classList.contains("ta-notice-hidden")) { 1936 this.hideNotice(noticeElem); 1937 } 1938 } 1939 hideNotice(noticeElem) { 1940 noticeElem.classList.add("ta-notice-hidden"); 1941 noticeElem.classList.add("inline"); 1942 this.noticesPanelInner.append(noticeElem); 1824 1943 } 1825 1944 wordpressScreenMetaEventsExist() { … … 1908 2027 if (this.currentRow === null) { 1909 2028 this.currentRowIndex = 0; 1910 } else {2029 } else if (this.currentRowIndex < this.tableRows.length - 1) { 1911 2030 this.currentRowIndex++; 1912 2031 } … … 1917 2036 if (this.currentRowIndex > 0) { 1918 2037 this.currentRowIndex--; 1919 this.updateTable();1920 }2038 } 2039 this.updateTable(); 1921 2040 } 1922 2041 preTableChange() { … … 1932 2051 } 1933 2052 openTableRowItem() { 1934 console.log(this);2053 turboAdminLog(this); 1935 2054 const link = this.currentRow.querySelector("a.row-title"); 1936 2055 if (link) { … … 1951 2070 } 1952 2071 if (!document.getElementById("wpadminbar")) { 2072 return false; 2073 } 2074 if (!document.getElementById("wp-admin-bar-root-default")) { 1953 2075 return false; 1954 2076 } … … 1963 2085 "wp-admin-bar-updates" 1964 2086 ]; 1965 this.barkeeperState = globalThis.turboAdmin.options["barkeeper-state"]; 2087 this.selectorsToHide = [ 2088 "#wp-admin-bar-root-default > li", 2089 ".monsterinsights-adminbar-menu-item" 2090 ]; 2091 this.barkeeperState = this.getBarkeeperState(); 1966 2092 this.root = document.getElementById("wp-admin-bar-root-default"); 1967 this.itemsToHide = document.querySelectorAll("#wp-admin-bar-root-default > li"); 2093 if (!this.root) { 2094 return; 2095 } 2096 this.itemsToHide = document.querySelectorAll(this.selectorsToHide.join(", ")); 1968 2097 Array.from(this.itemsToHide).forEach((element) => { 1969 2098 if (this.exclusionIds.includes(element.id)) { … … 1981 2110 this.root.classList.toggle("ta-barkeeper-closed"); 1982 2111 this.barkeeperState = this.barkeeperState === "open" ? "closed" : "open"; 1983 browser.runtime.sendMessage({ 2112 this.setBarkeeperState(this.barkeeperState); 2113 }); 2114 this.root.insertAdjacentElement("afterend", this.button); 2115 this.setupObserver(); 2116 } 2117 setupObserver() { 2118 this.observer = new MutationObserver((mutations) => { 2119 mutations.forEach((mutation) => { 2120 if (mutation.type === "childList") { 2121 mutation.addedNodes.forEach((node) => { 2122 if (node.classList && node.classList.contains("ta-barkeeper-collapsable")) { 2123 return; 2124 } 2125 if (node.id && this.exclusionIds.includes(node.id)) { 2126 return; 2127 } 2128 if (node.matches(this.selectorsToHide.join(", "))) { 2129 node.classList.add("ta-barkeeper-collapsable"); 2130 return; 2131 } 2132 }); 2133 } 2134 }); 2135 }); 2136 this.observer.observe(this.root, { 2137 childList: true, 2138 subtree: true 2139 }); 2140 } 2141 getBarkeeperState() { 2142 if (window.turboAdminIsExtension()) { 2143 return globalThis.turboAdmin.options["barkeeper-state"]; 2144 } else { 2145 return window.localStorage.getItem("turbo-admin-barkeeper-state"); 2146 } 2147 } 2148 setBarkeeperState(state) { 2149 if (window.turboAdminIsExtension()) { 2150 chrome.runtime.sendMessage({ 1984 2151 action: "barkeeperSetState", 1985 2152 barkeeperState: this.barkeeperState 1986 2153 }); 1987 }); 1988 this.root.insertAdjacentElement("afterend", this.button); 2154 } else { 2155 window.localStorage.setItem("turbo-admin-barkeeper-state", state); 2156 } 1989 2157 } 1990 2158 }; … … 2202 2370 super.activate(); 2203 2371 } 2204 getAdditionalItemDefinitions() {2372 async getAdditionalItemDefinitions() { 2205 2373 const editDefinition = new class_item_definition_default(); 2206 2374 editDefinition.detectType = "dom"; … … 2273 2441 this.menu = this.getMenu(); 2274 2442 } 2275 this.addAdditionalMenuItems();2443 await this.addAdditionalMenuItems(); 2276 2444 this.menu = this.menu.concat(this.options.extraItemsRaw ?? []); 2277 2445 this.menu.sort((a, b) => (a.parentTitle + a.title).localeCompare(b.parentTitle + b.title)); … … 2287 2455 } 2288 2456 }); 2457 if (this.options["block-editor-fullscreen-disable"] === true) { 2458 this.turboAdminFullscreenKill = new class_turbo_admin_wp_block_editor_fullscreen_kill_default(); 2459 } 2460 if (this.options["block-editor-welcome-screen-kill"] === true) { 2461 this.turboAdminWelcomeKill = new class_turbo_admin_wp_block_editor_welcome_guide_kill_default(); 2462 } 2289 2463 if (this.options["list-table-keyboard-shortcuts"] === true) { 2290 2464 this.turboAdminListTableShortcuts = new class_list_table_shortcuts_default(); … … 2327 2501 return items; 2328 2502 } 2329 a ddAdditionalMenuItems() {2503 async addAdditionalMenuItems() { 2330 2504 let extraItems = this.options.extraItems ?? []; 2331 2505 const pluginKeys = Object.keys(this.plugins); 2332 2506 for (let i = 0; i < pluginKeys.length; i++) { 2333 extraItems = extraItems.concat( this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());2507 extraItems = extraItems.concat(await this.plugins[pluginKeys[i]].getAdditionalItemDefinitions()); 2334 2508 } 2335 2509 extraItems = extraItems.concat([ … … 2413 2587 if (item.detectType === "url") { 2414 2588 detected = Boolean(window.location.href.includes(item.detectPattern)); 2589 elements = document.querySelectorAll("body"); 2415 2590 } else if (item.detectType === "dom") { 2416 2591 if (item.detectSelector) { … … 2490 2665 } 2491 2666 registerPlugin(plugin) { 2492 console.log("Registering plugin " + plugin.name);2667 turboAdminLog("Registering plugin " + plugin.name); 2493 2668 this.plugins[plugin.name] = plugin; 2494 2669 } 2495 2670 registerSearchMode(searchMode) { 2496 console.log("Registering search mode with keyword " + searchMode.keyword);2671 turboAdminLog("Registering search mode with keyword " + searchMode.keyword); 2497 2672 globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode; 2498 2673 } … … 2512 2687 keysString += "Shift-"; 2513 2688 } 2514 keysString += shortcut.key ;2689 keysString += shortcut.key.toUpperCase(); 2515 2690 return keysString; 2516 2691 } … … 2597 2772 window.localStorage.setItem("ta-palette-data-home", this.home); 2598 2773 } else if (!this.siteUrl || !this.home) { 2774 let urlsFound = false; 2599 2775 if (document.getElementById("wpadminbar")) { 2600 this.siteUrl = document.getElementById("wp-admin-bar-dashboard").querySelector("a").href; 2776 const dashboardLink = document.getElementById("wp-admin-bar-dashboard")?.querySelector("a"); 2777 if (dashboardLink) { 2778 this.siteUrl = dashboardLink.href; 2779 } 2601 2780 if (this.apiLinkUrl) { 2602 2781 if (this.apiLinkUrl.includes("/wp-json")) { … … 2606 2785 this.home = this.apiLinkUrl.replace(/index.php\?rest_route.*/, ""); 2607 2786 } 2787 urlsFound = true; 2608 2788 } else { 2609 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 2789 if (this.siteUrl) { 2790 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 2791 urlsFound = true; 2792 } 2610 2793 } 2611 } else { 2794 } 2795 if (!urlsFound) { 2612 2796 if (this.apiLinkUrl) { 2613 2797 if (this.apiLinkUrl.includes("/wp-json")) { … … 2622 2806 this.siteUrl = this.guessSiteUrl(); 2623 2807 } 2624 } else { 2625 this.home = await this.guessHome(); 2626 if (this.home) { 2627 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 2628 } 2808 urlsFound = true; 2809 } 2810 } 2811 if (!urlsFound) { 2812 this.home = await this.guessHome(); 2813 if (this.home) { 2814 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 2629 2815 } 2630 2816 } … … 2707 2893 } 2708 2894 if (response.status < 200 || response.status >= 300) { 2709 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WooCommerce API Error. Try visiting the dashboard to refresh things."); 2895 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 2896 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("WooCommerce API Error. Try visiting the dashboard to refresh things."); 2897 } else { 2898 turboAdminLog("TURBO ADMIN: WooCommerce API Error. Try visiting the WordPress Dashboard to refresh things."); 2899 } 2710 2900 } 2711 2901 return response; … … 2751 2941 const response = await fetch(`${gfApiBase}${path}/?${params}`); 2752 2942 if (response.status < 200 || response.status >= 300) { 2753 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("Gravity Forms API Error. Try visiting the dashboard to refresh things."); 2943 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 2944 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice("Gravity Forms API Error. Try visiting the dashboard to refresh things."); 2945 } else { 2946 turboAdminLog("TURBO ADMIN: Gravity Forms API Error. Try visiting the WordPress Dashboard to refresh things."); 2947 } 2754 2948 } 2755 2949 return response; … … 2760 2954 // src/main.js 2761 2955 var taStorageKey = "turbo-admin-settings"; 2956 var debugMode = false; 2957 window.turboAdminLog = function() { 2958 if (debugMode) { 2959 console.log(...arguments); 2960 } 2961 }; 2962 window.turboAdminIsExtension = function() { 2963 return typeof chrome.storage !== "undefined"; 2964 }; 2762 2965 async function taInit(settings) { 2763 2966 if (typeof globalThis.turboAdmin !== "undefined") { … … 2770 2973 } 2771 2974 globalThis.turboAdminOptions = settings[taStorageKey]; 2772 console.log("Preparing Turbo Admin"); 2975 debugMode = globalThis.turboAdminOptions["debug-mode"]; 2976 turboAdminLog("Preparing Turbo Admin"); 2773 2977 globalThis.taWp = new class_wp_default(); 2774 2978 await globalThis.taWp.completeInit(); 2775 console.log("Turbo Admin: WP is initialised");2979 turboAdminLog("Turbo Admin: WP is initialised"); 2776 2980 globalThis.contentApi = new class_content_api_default(); 2777 2981 await globalThis.contentApi.discoverApiRoot(); … … 2779 2983 globalThis.woocommerceApi = new class_woocommerce_api_default(); 2780 2984 globalThis.gravityFormsApi = new class_gravity_forms_api_default(); 2781 console.log("Turbo Admin: Content API is initialised");2985 turboAdminLog("Turbo Admin: Content API is initialised"); 2782 2986 globalThis.turboAdmin = new class_turbo_admin_default(globalThis.turboAdminOptions); 2783 2987 await globalThis.turboAdmin.init(); … … 2798 3002 rememberedNoticeIds: JSON.parse(window.localStorage.getItem("rememberedNoticeIds")) ?? new Array(), 2799 3003 barkeeper: globalThis.wpTurboAdmin["barkeeper"] === "1", 2800 "admin-bar-search": globalThis.wpTurboAdmin["adminBarSearch"] === "1" 3004 "admin-bar-search": globalThis.wpTurboAdmin["adminBarSearch"] === "1", 3005 "debug-mode": globalThis.wpTurboAdmin["debugMode"] === "1" 2801 3006 }; 2802 3007 await taInit(globalThis.turboAdminOptions); -
turbo-admin/trunk/dist/main.min.js.map
r2835882 r2871191 1 1 { 2 2 "version": 3, 3 "sources": ["../src/fuse-6.4.6.js", "../src/class-turbo-admin-palette.js", "../src/types/class-turbo-admin-menu-item.js", "../src/class-storage.js", "../src/apis/class-content-api.js", "../src/types/class-submenu-item.js", "../src/types/class-content-item.js", "../src/types/class-search-mode.js", "../src/types/class-item-definition.js", "../src/types/class-turbo-admin-plugin.js", "../src/class-turbo-admin-wp- notices.js", "../src/class-list-table-shortcuts.js", "../src/plugins/class-turbo-admin-barkeeper.js", "../src/plugins/class-turbo-admin-content-search.js", "../src/plugins/class-turbo-admin-plugins.js", "../src/plugins/class-turbo-admin-users.js", "../src/plugins/class-turbo-admin-mu-sites.js", "../src/plugins/class-turbo-admin-oxygen-buillder.js", "../src/class-turbo-admin.js", "../src/class-wp.js", "../src/apis/class-woocommerce-api.js", "../src/apis/class-gravity-forms-api.js", "../src/main.js"],4 "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 './types/class-turbo-admin-menu-item';\nimport ContentApi from './apis/class-content-api.js';\nimport SearchMode from './types/class-search-mode.js';\nimport ContentItem from './types/class-content-item.js';\n\nexport default class TurboAdminPalette {\n\n\tconstructor(paletteData, options) {\n\n\t\t console.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 {HTMLDivElement} */\n this.paletteItemsContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-items-container'));\n\t\t/** @type {HTMLUListElement} */\n this.paletteItemsElement = /** @type {HTMLUListElement} */ (document.getElementById('ta-command-palette-items'));\n\t\t/** @type {HTMLDivElement} */\n this.paletteSubmenuContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-submenu-container'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTag = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-search-mode-tag'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTabNotice = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-tab-notice'));\n /** @type {HTMLSpanElement} */\n this.paletteSearchModeTabNoticeText = /** @type {HTMLSpanElement} */ (document.getElementById('ta-command-palette-tab-notice-text'));\n /** @type {HTMLDivElement} */\n this.paletteNoticeElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-notice'));\n\n\n // Add a class if the menu needs refreshing with a visit to the Dashboard\n if (globalThis.turboAdmin.menuNeedsRefresh) {\n this.showPaletteNotice('Menu needs refreshing. Visit the Dashboard to refresh.');\n }\n\n // We need this when injecting items. We use it to help generate edit URLs. Not the best way but\n // works for now.\n /** @type {HTMLUListElement} */\n this.profileLinkElem = document.getElementById('wp-admin-bar-edit-profile');\n /** @type {null|String} */\n this.profileLink = null;\n if (this.profileLinkElem) {\n this.profileLink = this.profileLinkElem.querySelector('a').href;\n }\n\n\t\t// Get palette data\n\t\tthis.paletteData = paletteData;\n\n // Backup of the palette data for use when we enter a different search mode\n\t\tthis.paletteDataBackup = null;\n\t\tthis.paletteItemsBackup = null;\n this.paletteItemIndexBackup = null;\n\n // Current search modes/keyword\n this.searchMode = null;\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 inSearchMode() {\n return this.searchMode !== null;\n }\n\n\t/**\n * This converts this.paletteData into a list of paletteListItems in this.paletteItems\n *\n * It also builds the itemIndex\n */\n buildPaletteItems() {\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 /**\n * Clears and sets the content items\n *\n * @param {ContentItem[]} contentItems\n */\n setContentItems(contentItems) {\n this.paletteItems = [];\n this.itemIndex = [];\n this.injectContentItems(contentItems, false);\n }\n\n /**\n * Content items have:\n * title\n * subtype\n * url\n * (we should also make the sub-menu definable, but that's not done yet)\n *\n * @param {ContentItem[]} contentItems\n */\n injectContentItems(contentItems, andRunSearch = true) {\n console.log('Injecting items');\n\n if (contentItems.length > 0) {\n contentItems.forEach(this.injectItem.bind(this));\n }\n\n if (andRunSearch) {\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 this.updatePaletteItems();\n }\n\n /**\n * Injects a single content item into the palette\n *\n * @param {ContentItem} item\n */\n injectItem(item) {\n const itemTitle = item.title;\n // const itemTitle = item.title.rendered;\n const itemType = item.subtype;\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 let title = itemTitle;\n\n if (itemType) {\n const itemTypeName = globalThis.contentApi.postTypes[itemType] ? globalThis.contentApi.postTypes[itemType].name : itemType;\n title += ` (${itemTypeName})`;\n }\n\n const li = document.createElement('li');\n const a = document.createElement('a');\n let subMenu = null;\n\n // Loop over submenu items OR add link.\n if (item.submenuItems.length > 0) {\n\n // Prepare the outer sub-menu elements\n 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\n for (let i = 0; i < item.submenuItems.length; i++) {\n const subMenuItem = item.submenuItems[i]\n // TODO: Abstract this so sub-menus can be defined by plugins?\n const subMenuListItem = document.createElement('li');\n const subMenuLink = document.createElement('a');\n subMenuLink.innerText = subMenuItem.title;\n subMenuLink.href = subMenuItem.url;\n for (let a = 0; a < subMenuItem.attributes.length; a++) {\n subMenuLink.setAttribute(\n subMenuItem.attributes[a].name,\n subMenuItem.attributes[a].value\n )\n }\n subMenuListItem.appendChild(subMenuLink);\n subMenuItems.appendChild(subMenuListItem);\n }\n\n // Add the sub-menu items UL to the sub-menu element.\n subMenu.appendChild(subMenuItems);\n\n li.classList.add('ta-has-child-menu');\n }\n\n a.href = itemUrl;\n a.innerHTML = title;\n\n li.appendChild(a);\n if (subMenu !== null) {\n li.appendChild(subMenu);\n }\n\n this.addPaletteListItem(li);\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 return;\n\t\t}\n\n\t\tif (e.code === 'Escape' && this.paletteShown()) {\n\t\t\tif (this.isSubMenuOpen()){\n this.closeSubMenu();\n } else if (this.inSearchMode()) {\n this.leaveSearchMode();\n } else {\n this.hidePalette();\n }\n return;\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 /*\n * Adds the tab hint for a keyword once it has been typed.\n */\n maybeHighlightInputKeyword(newKey) {\n // Do nothing if we are in a search-mode\n if (this.inSearchMode()) {\n return;\n }\n\n // This is fired on \"keyDown\", so the value isn't update with the new key yet.\n // But don't do this for special keys, and catch backspace too.\n let newInputValue = this.paletteInputElement.value;\n if (newKey.length === 1) {\n newInputValue += newKey;\n }\n if (newKey === 'Backspace') {\n newInputValue = newInputValue.slice(0, -1);\n }\n // console.log(`Checking palette input value ${newInputValue} for keyword`);\n if (this.isKeyword(newInputValue)) {\n this.paletteSearchModeTabNoticeText.innerText = `Search for ${newInputValue}`;\n this.paletteSearchModeTabNotice.classList.add('active');\n } else {\n this.unhighlightInputKeyword();\n }\n }\n\n unhighlightInputKeyword() {\n this.paletteSearchModeTabNotice.classList.remove('active');\n }\n\n async debouncedPaletteSearchAndUpdate() {\n // If we're not in a search mode then search immediately\n if (! this.inSearchMode()) {\n this.debounceTimeout = null;\n await this.paletteSearchAndUpdate();\n return;\n }\n\n // If timer is null, reset it to 500ms and run your functions.\n // Otherwise, wait until timer is cleared\n\n // Cancel the existing timeout\n clearTimeout(this.debounceTimeout)\n\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 * Check if a string is a search mode keyword\n *\n * @param {string} inputString\n * @returns {boolean}\n */\n isKeyword(inputString) {\n return Object.keys(globalThis.turboAdmin.searchModes).includes(inputString);\n }\n\n /**\n * Show the palette notice with the specified text\n *\n * @param {string} text\n */\n showPaletteNotice(text) {\n this.paletteNoticeElement.classList.add('active');\n this.paletteNoticeElement.innerText = text;\n }\n\n /**\n * Hide the palette notice\n */\n hidePaletteNotice() {\n this.paletteNoticeElement.classList.remove('active');\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 e.preventDefault();\n this.doAction(this.metaPressed(e));\n return;\n\t\t}\n\n /*\n * Only the actions above can be done in sub-menus.\n */\n if (this.isSubMenuOpen()) {\n return;\n }\n\n /*\n * Check for a keyword being typed and add a UI hint.\n */\n this.maybeHighlightInputKeyword(e.key);\n\n /*\n * Tabbing looks for a search mode keyword.\n */\n if (! this.inSearchMode() && (e.code === 'Tab' || e.key === ':')) {\n console.log('Checking for search mode');\n let inputValue = this.paletteInputElement.value;\n if (this.isKeyword(inputValue)) {\n console.log('Found search mode ' + inputValue)\n e.preventDefault();\n // TODO: Work on this.\n await this.enterSearchMode(\n globalThis.turboAdmin.searchModes[inputValue]);\n return;\n }\n }\n\n /*\n * Backspace may exit us from a search mode\n */\n if (this.inSearchMode() && e.code === 'Backspace' && this.paletteInputElement.value === '') {\n e.preventDefault();\n this.leaveSearchMode();\n return;\n }\n\n\t\tawait this.debouncedPaletteSearchAndUpdate();\n\t}\n\n /**\n * Puts the palette into a specific search mode - used when a keyword is selected\n *\n * @param {SearchMode} searchMode\n */\n async enterSearchMode(searchMode) {\n console.log('Entering search mode for keyword ' + searchMode.keyword);\n this.backupPaletteData();\n\n this.paletteData = [];\n this.paletteItems = [];\n this.itemIndex = [];\n\n // Remove the notice if it's there\n this.hidePaletteNotice();\n\n this.searchMode = searchMode;\n this.paletteInputElement.value = '';\n this.addSearchModeTag(searchMode.displayName);\n this.unhighlightInputKeyword();\n this.updatePaletteItems();\n // This is similar to code in paletteSearch - maybe we could extract/abstract it?\n if (searchMode.defaultItemsCallback !== null) {\n this.paletteInnerElement.classList.add('loading');\n const results = await searchMode.defaultItemsCallback();\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n }\n\n /**\n * Leaves the current search mode\n */\n leaveSearchMode() {\n const searchMode = this.searchMode;\n // It's important what we set this to - see inSearchMode()\n this.searchMode = null;\n this.removeSearchModeTag();\n this.restorePaletteData();\n this.paletteInputElement.value = searchMode.keyword;\n this.maybeHighlightInputKeyword('');\n this.paletteSearchAndUpdate();\n }\n\n /**\n * Backups up the palette data to a local variable so that it can be\n * restored later.\n */\n backupPaletteData() {\n this.paletteDataBackup = this.paletteData;\n this.paletteItemsBackup = this.paletteItems;\n this.paletteItemIndexBackup = this.itemIndex;\n }\n\n /**\n * Restores the save palette data - does not rebuild anything\n */\n restorePaletteData() {\n this.paletteData = this.paletteDataBackup;\n this.paletteItems = this.paletteItemsBackup;\n this.itemIndex = this.paletteItemIndexBackup;\n }\n\n /**\n * Adds the search mode tag with the specified title.\n *\n * @param {string} title\n */\n addSearchModeTag(title) {\n this.paletteSearchModeTag.classList.add('active');\n this.paletteSearchModeTag.innerText = title;\n }\n\n /**\n * Removes the search mode tag\n */\n removeSearchModeTag() {\n this.paletteSearchModeTag.classList.remove('active');\n }\n\n isPaletteOpen() {\n return this.paletteElement?.classList.contains('active');\n }\n\n\tshowPalette() {\n // Bail if already shown (this can be triggered by a focus event)\n if (this.isPaletteOpen()) {\n return;\n }\n\n this.paletteInputElement.value = '';\n\t\tthis.paletteInputElement?.focus();\n\t\tthis.paletteElement?.classList.add('active');\n // This is needed in admin-bar mode otherwise it gets a weird already-scrolled thing when\n // the palette opens.\n setTimeout(() => this.paletteItemsElement.scrollTop = 0, 100);\n\t}\n\n\thidePalette() {\n this.navigating = false;\n\t\tthis.paletteElement?.classList.remove('active');\n this.paletteInputElement.value = '';\n this.paletteInputElement.blur();\n if (this.isSubMenuOpen()) {\n this.closeSubMenu();\n }\n if (this.searchMode !== null) {\n this.leaveSearchMode();\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.paletteSubmenuContainerElement?.querySelectorAll('.ta-submenu 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 this.paletteSubmenuContainerElement.replaceChildren(subMenuElement);\n // Set height in case main menu is smaller than sub menu\n const subMenuHeight = this.paletteSubmenuContainerElement.offsetHeight;\n this.paletteItemsContainerElement.style.minHeight = subMenuHeight + \"px\";\n this.paletteSubmenuContainerElement.classList.add('active');\n\n this.selectedSubItem = subMenuElement.querySelector('li');\n this.openedSubMenu = subMenuElement;\n this.setSelectedElement();\n\n this.paletteInputElement.disabled = true;\n // Blur the input so that keys can continue to be captured\n this.paletteInputElement.blur();\n }\n\n closeSubMenu(subMenuElement = null) {\n if (null === subMenuElement) {\n subMenuElement = document.querySelector('.ta-submenu.active');\n }\n this.paletteSubmenuContainerElement.classList.remove('active');\n this.selectedSubItem.classList.remove('active');\n this.paletteItemsContainerElement.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 // link.href will be interpolated by the browser, so if it's empty it will be the current page\n // use getAttribute instead to work out if its empty\n if (link.getAttribute('href') === '') {\n return;\n }\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 if (! this.searchMode) {\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 return;\n }\n\n if (this.paletteInputElement.value.length === 0) {\n this.paletteInnerElement.classList.add('loading');\n let results = [];\n if (this.searchMode.defaultItemsCallback !== null) {\n results = await this.searchMode.defaultItemsCallback();\n }\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n } else {\n // This is copied to enterSearchMode. Should probably be extracted.\n this.paletteInnerElement.classList.add('loading');\n const results = await this.searchMode.searchCallback(this.paletteInputElement.value);\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n\n /**\n * OLD CODE BELOW\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", "/**\n * Menu items are the items ready to appear in the palette.\n *\n * These are standard items, not content items. Though this should probably be standardised.\n */\nexport default class TurboAdminMenuItem {\n\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The action of the item is the URL to visit when the item is clicked\n *\n * @type {string}\n */\n action = '';\n\n /**\n * The parent title is the title of the parent item under which the current item\n * was found in the WordPress menu.\n *\n * e.g. in Posts -> Add Post, \"Posts\" is the parent item.\n *\n * @type {string}\n */\n parentTitle = '';\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\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<Object>}\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 this.postTypes = [];\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 console.log('Discovering API root');\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 <link rel=\"https://api.w.org/\" href=\"https://something/wp-json/\">\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 // This should be very rare. I should only really see it in development.\n console.log('API Route Discovery failed');\n // TODO: This can't display as the palette isn't created yet.\n // globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Can\\'t find the WP API. Try visiting the dashboard to refresh things.');\n }\n\n async discoverPostTypes() {\n console.log('Discovering post types');\n if (! this.active) {\n console.log('Not active');\n this.postTypes = [];\n return;\n }\n\n this.postTypes = await this.getPostTypes();\n console.log('Discovered post types: ', this.postTypes);\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 async getPostTypes() {\n // Check the cache\n if (undefined !== this.cache['postsTypes']) {\n return this.cache['postTypes'];\n }\n\n // Fetch results\n const response = await this.get('types');\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['postTypes'] = result;\n\n return result;\n }\n\n async getPosts(searchString, postType = 'any') {\n // Check the cache\n const cacheKey = `posts-${postType}-${searchString}`;\n if (undefined !== this.cache[cacheKey]) {\n return this.cache[cacheKey];\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: postType\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache[cacheKey] = result;\n\n return result;\n }\n\n /**\n * We can't use the API to get a post of any post type. So we hack this a bit.\n *\n * @param {number} postId\n * @returns {Promise<any>}\n */\n async doesPostExist(postId) {\n // Check the cache\n if (undefined !== this.cache['post-' + postId]) {\n return this.cache['post-' + postId];\n }\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n const response = await fetch(`${globalThis.taWp.siteUrl}/post.php?post=${postId}&action=edit`, init);\n\n this.cache['post-' + postId] = response;\n\n return response?.status === 200;\n }\n\n async getPlugins(searchString) {\n // Check the cache\n if (undefined !== this.cache['plugins-' + searchString]) {\n return this.cache['plugins-' + searchString];\n }\n\n let requestOptions = {};\n\n if (searchString) {\n requestOptions.search = searchString;\n }\n\n // Fetch results\n const response = await this.get(\n \"plugins\",\n requestOptions\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['plugins-' + searchString] = result;\n\n return result;\n }\n\n async getUsers(searchString) {\n // Check the cache\n if (undefined !== this.cache['users-' + searchString]) {\n return this.cache['users-' + searchString];\n }\n\n // Fetch results\n const response = await this.get(\n \"users\",\n {\n search: searchString,\n per_page: 100,\n context: 'edit' // view / embed / edit\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['users-' + 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 credentials: 'include'\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}`, init);\n\n if (response.status < 200 || response.status >= 300) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.');\n }\n\n return response;\n }\n\n}\n", "export default class SubmenuItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title;\n\n /**\n * The URL of the item\n * @type {string}\n */\n url;\n\n /**\n * A list of attributes to go on the A tag (not the LI tag)\n *\n * @type {array}\n */\n attributes = [];\n\n /**\n * Create a submenu item\n *\n * @param {string} title The title of the item\n * @param {string} url The URL of the item\n */\n constructor(title, url) {\n this.title = title;\n this.url = url;\n }\n\n /**\n * Add an attribute\n *\n * @param {string} name The attribute name\n * @param {string} value The attribute value\n */\n addAttribute(name, value) {\n this.attributes.push({\n name: name,\n value: value\n });\n }\n}\n", "import SubmenuItem from \"./class-submenu-item\";\n\nexport default class ContentItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The subtype of the item. e.g. for posts, this will be the post type.\n * Used to display extra information about the item.\n *\n * @type {string}\n */\n subtype = '';\n\n /**\n * The URL of the item. Leave empty if there is a sub-menu.\n *\n * @type {string}\n */\n url = '';\n\n /**\n * The sub-menu items, if any.\n *\n * This should be an empty array if the item itself has a URL\n *\n * @type {SubmenuItem[]}\n */\n submenuItems = [];\n}\n", "import ContentItem from \"./class-content-item\";\n\nexport default class SearchMode {\n /**\n * The keyword string used to initiate the search\n *\n * @type {string}\n */\n keyword = '';\n\n /**\n * The dispay name used for the search\n *\n * @type {string}\n */\n displayName = '';\n\n /**\n * jsDoc defintion for a `searchCallback`\n *\n * @callback SearchCallback\n * @param {string} [searchString]\n * @returns {Promise<ContentItem[]>}\n */\n\n /**\n * Callback to get search items\n *\n * @type {SearchCallback}\n */\n searchCallback;\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @type {SearchCallback|null}\n */\n defaultItemsCallback = null;\n\n /**\n * Constructs a new search mode\n *\n * @param {string} keyword\n * @param {string} displayName\n * @param {SearchCallback} searchCallback\n * @param {SearchCallback} defaultItemsCallback\n */\n constructor(keyword, displayName, searchCallback, defaultItemsCallback = null) {\n this.keyword = keyword;\n this.displayName = displayName;\n this.searchCallback = searchCallback;\n this.defaultItemsCallback = defaultItemsCallback;\n }\n}\n", "/**\n * An item definition specifies how to detect a palette item from the Dashboard's Dom\n *\n * These are all processed on initialisation to generate menu items.\n *\n * Note that a single definition may generate multiple menu items if the selectors used\n * discover multiple items.\n */\nexport default class ItemDefinition {\n /**\n * This callback is displayed as part of the Requester class.\n * @callback menuItemCallback\n * @param {HTMLElement} element\n * @returns {string}\n */\n\n /**\n * The method of detecting items. Can be:\n * - 'dom' for checking if a DOM element exists (requires detectSelector or detectSelectorNone)\n * - 'url' if the current URL is being checked (requires detectPattern)\n *\n * @type {string}\n */\n detectType = 'dom';\n\n /**\n * [OPTIONAL] A CSS selector used to find items in the DOM\n *\n * @type {string}\n */\n detectSelector = '';\n\n /**\n * [OPTIONAL] A CSS selector used to check for an absence of items in the DOM\n *\n * @type {string}\n */\n detectSelectorNone = '';\n\n /**\n * A callback used to generate a menu item title from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemTitleFunction = null;\n\n /**\n * A callback used to generate a menu item link URL from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemUrlFunction = null;\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\n}\n", "import SearchMode from \"./class-search-mode\";\nimport ItemDefinition from \"./class-item-definition\";\n\n/**\n * This is an abstract class that should be extended by plugins\n * @module TurboAdminPlugin\n */\nexport default class TurboAdminPlugin {\n /** @type {string} */\n name = '';\n\n /** @type {SearchMode[]} */\n searchModes = [];\n\n /** @type {boolean} */\n activated = false;\n\n constructor(pluginName) {\n this.name = pluginName;\n this.registerPlugin();\n }\n\n /**\n * Register the plugin with Turbo Admin\n */\n registerPlugin() {\n console.log('Inside plugin - requested registration of ' + this.name);\n globalThis.turboAdmin.registerPlugin(this);\n }\n\n /**\n * Returns true if the plugin should activate\n * @returns {boolean}\n */\n shouldActivate() {\n return false;\n }\n\n /**\n * Activates the plugin\n * @return {void}\n */\n activate() {\n this.activated = true;\n this.registerSearchModes();\n }\n\n /**\n * Register the search keywords with Turbo Admin - each will be registered\n * with the whole plugin object.\n */\n registerSearchModes() {\n this.searchModes.forEach(globalThis.turboAdmin.registerSearchMode);\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {ItemDefinition[]}\n */\n getAdditionalItemDefinitions() {\n return [];\n }\n\n /**\n * Save plugin setting to persistent storage\n */\n saveSetting(key, value) {\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\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 <span id=\"ta-notice-count\">' + noticesToHide.length + '</span>';\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 // 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 * 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<HTMLTableRowElement>}\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", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\n\nexport default class TurboAdminBarkeeper extends TurboAdminPlugin {\n constructor() {\n super('Barkeeper');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n if (true !== globalThis.turboAdmin.options['barkeeper']) {\n return false;\n }\n // Bail if we aren't in the admin\n if (! document.getElementById('wpadminbar')) {\n return false;\n }\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n\n this.exclusionIds = [\n 'wp-admin-bar-menu-toggle',\n 'wp-admin-bar-wp-logo',\n 'wp-admin-bar-site-name',\n 'wp-admin-bar-updates',\n ];\n\n this.barkeeperState = globalThis.turboAdmin.options['barkeeper-state'];\n\n this.root = document.getElementById('wp-admin-bar-root-default');\n this.itemsToHide = document.querySelectorAll( '#wp-admin-bar-root-default > li');\n\n Array.from(this.itemsToHide).forEach( element => {\n if (this.exclusionIds.includes(element.id)) {\n return;\n }\n element.classList.add('ta-barkeeper-collapsable');\n });\n\n if (this.barkeeperState === 'closed') {\n this.root.classList.toggle('ta-barkeeper-closed');\n }\n\n // Add toggle\n this.button = document.createElement('button');\n this.button.id = 'ta-barkeeper-toggle';\n this.button.innerText = '<';\n\n this.button.addEventListener('click', e => {\n this.root.classList.toggle('ta-barkeeper-closed');\n\n this.barkeeperState = this.barkeeperState === 'open' ? 'closed' : 'open';\n\n browser.runtime.sendMessage({\n 'action': 'barkeeperSetState',\n 'barkeeperState': this.barkeeperState,\n });\n });\n\n this.root.insertAdjacentElement('afterend', this.button);\n }\n\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminContentSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Content');\n\n // Register a search mode for each post type\n const postTypeKeys = Object.keys(globalThis.contentApi.postTypes);\n for (let i = 0; i < postTypeKeys.length; i++) {\n const thisPostTypeKey = postTypeKeys[i];\n const thisPostType = globalThis.contentApi.postTypes[thisPostTypeKey];\n // console.log('Adding search mode for post type', thisPostType);\n this.searchModes.push( this.makePostTypeSearchMode(thisPostType) );\n }\n\n // Register ID search mode\n this.searchModes.push( new SearchMode('id', 'Post ID', this.postById.bind(this)) );\n\n // Register search all post types mode\n this.searchModes.push( new SearchMode('search', 'All post types', this.contentSearch.bind(this)) );\n this.searchModes.push( new SearchMode('find', 'All post types', this.contentSearch.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * This is a generator for a post-type specific SearchMode object\n *\n * @param {Object} postType\n */\n makePostTypeSearchMode(postType) {\n // TODO: interpret the post type name\n return new SearchMode(postType.slug, postType.name, (searchString) => this.contentSearch(searchString, postType.slug));\n }\n\n /**\n * @param {string} searchString\n * @param {string} postType This is passed to the API as a subtype. 'any' by default.\n * @returns {Promise<ContentItem[]>}\n */\n async contentSearch(searchString, postType = 'any') {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPosts(searchString, postType);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n item.title = result.title;\n item.subtype = result.subtype;\n item.url = result.url;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(result.id, item))\n\n return item;\n });\n }\n\n /**\n * @param {string} postId\n * @returns {Promise<ContentItem[]>}\n */\n async postById(postId) {\n if (! postId.trim().match(/^\\d+$/)) {\n return [];\n }\n const postExists = await globalThis.contentApi.doesPostExist(postId);\n\n const resultAsContentItem = new ContentItem;\n\n if (! postExists) {\n resultAsContentItem.title = 'Post does not exist or is not visible';\n return [ resultAsContentItem ];\n }\n\n resultAsContentItem.title = `Post ID: ${postId}`;\n resultAsContentItem.url = globalThis.taWp.home + `/?p=${postId}`;\n\n resultAsContentItem.submenuItems = resultAsContentItem.submenuItems.concat(this.makeSubmenuItems(postId, resultAsContentItem));\n\n return [ resultAsContentItem ];\n }\n\n /**\n * Makes an array of submenu items from a content item\n *\n * @param {number} postId\n * @param {ContentItem} contentItem\n * @returns {SubmenuItem[]}\n */\n makeSubmenuItems(postId, contentItem) {\n const itemsToReturn = [];\n itemsToReturn.push(\n new SubmenuItem(\n 'View',\n contentItem.url\n )\n );\n\n // TODO: Make a better way to detect if we are logged in.\n if (globalThis.turboAdmin.turboAdminPalette.profileLink) {\n // Need to get edit URL. This seems like the best way for now.\n const editLink = globalThis.taWp.siteUrl + `/post.php?post=${postId}&action=edit`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit',\n editLink\n )\n )\n\n // Add oxygen link if needed.\n if (globalThis.turboAdmin.hasActivatedPlugin('OxygenBuilder')) {\n const oxygenLink = globalThis.taWp.home + `?page_id=${postId}&ct_builder=true&ct_inner=true`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit with Oxygen',\n oxygenLink\n )\n );\n }\n }\n\n const copyLinkItem = new SubmenuItem( 'Copy link', contentItem.url);\n copyLinkItem.addAttribute('data-action', 'clipboard')\n itemsToReturn.push(copyLinkItem);\n\n return itemsToReturn;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminPluginSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Plugins');\n\n this.searchModes.push( new SearchMode('plugin', 'Plugins', this.pluginSearch, this.defaultPluginItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultPluginItems() {\n return await this.pluginSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async pluginSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPlugins(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n // siteUrl is at globalThis.turboAdmin.wp.siteUrl\n const item = new ContentItem;\n item.title = result.name;\n item.subtype = 'Plugin';\n // TODO: Maybe set this to be a search on the plugin screen?\n // Plugin \"slug\" is in result.name\n\n const itemViewUrlParams = new URLSearchParams();\n itemViewUrlParams.set('plugin_status', 'all');\n itemViewUrlParams.set('s', result.name);\n item.submenuItems.push(\n new SubmenuItem(\n 'View',\n globalThis.taWp.siteUrl + '/plugins.php?' + itemViewUrlParams.toString()\n )\n );\n // Activate: /wp-admin/plugins.php?action=activate&plugin=order-simulator-woocommerce%2Fwoocommerce-order-simulator.php&plugin_status=all&paged=1&s&_wpnonce=3714a01759\n\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\n\nexport default class TurboAdminUserSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Users');\n\n this.searchModes.push( new SearchMode('user', 'Users', this.userSearch, this.defaultUserItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultUserItems() {\n return await this.userSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async userSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getUsers(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n if (result.first_name && result.last_name) {\n item.title = `${result.first_name} ${result.last_name} - `;\n }\n item.title += result.email;\n item.subtype = result.roles[0];\n item.url = globalThis.taWp.siteUrl + `/user-edit.php?user_id=${result.id}`;\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminMUSites extends TurboAdminPlugin {\n constructor() {\n super('WP Multisite Sites');\n\n this.searchModes.push( new SearchMode('site', 'Sites', this.siteSearch.bind(this), this.defaultSiteItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n return Boolean(document.querySelector('#wp-admin-bar-my-sites'));\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultSiteItems() {\n return await this.siteSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async siteSearch(searchString) {\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 const sites = document.querySelectorAll('#wp-admin-bar-my-sites #wp-admin-bar-my-sites-list > li');\n\n if (sites.length === 0) {\n return [];\n }\n\n const sitesArray = Array.from(sites);\n const sitesLinks = sitesArray.map(site => site.querySelector('a'));\n const filteredSites = sitesLinks.filter(site => site.innerText.toLowerCase().includes(searchString.toLowerCase()));\n\n return filteredSites.map(site => {\n const item = new ContentItem;\n item.title = site.innerText;\n item.subtype = 'Site';\n item.url = site.href;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(site));\n\n return item;\n });\n }\n\n makeSubmenuItems(siteElement) {\n const submenuItems = [];\n\n const submenu = siteElement.nextElementSibling.querySelector(`.ab-submenu`);\n if (! submenu) {\n return [];\n }\n\n const submenuLinks = submenu.querySelectorAll('a');\n if (submenuLinks.length === 0) {\n return [];\n }\n\n const submenuLinksArray = Array.from(submenuLinks);\n submenuLinksArray.forEach(link => {\n const submenuItem = new SubmenuItem(link.innerText, link.href);\n submenuItems.push(submenuItem);\n });\n\n return submenuItems;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\nimport ItemDefinition from '../types/class-item-definition.js';\n\nexport default class TurboAdminOxygenBuilder extends TurboAdminPlugin {\n constructor() {\n super('OxygenBuilder');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\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\n const hasOxygenBuilder = Boolean(oxygenLinkElem);\n\n // Save Oxygen builder status\n window.localStorage.setItem('ta-has-oxygen-builder', hasOxygenBuilder ? '1' : '0' );\n\n return hasOxygenBuilder;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {ItemDefinition[]}\n */\n getAdditionalItemDefinitions() {\n const editDefinition = new ItemDefinition();\n editDefinition.detectType = 'dom';\n editDefinition.detectSelector = '#ct-edit-template-builder';\n editDefinition.itemTitleFunction = () => 'Edit with Oxygen';\n editDefinition.itemUrlFunction = (element) => element.href;\n editDefinition.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 const backToWpDefinition = new ItemDefinition();\n backToWpDefinition.detectType = 'dom';\n backToWpDefinition.detectSelector = '.oxygen-back-to-wp-menu .oxygen-toolbar-button-dropdown a:not(:last-of-type)';\n backToWpDefinition.itemTitleFunction = (element) => 'Back to WP: ' + element.textContent;\n backToWpDefinition.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 backToWpDefinition.noCache = true;\n\n return [\n editDefinition,\n backToWpDefinition,\n ];\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 */\n\nimport TurboAdminPalette from './class-turbo-admin-palette.js';\nimport TurboAdminMenuItem from './types/class-turbo-admin-menu-item.js';\nimport SearchMode from './types/class-search-mode.js';\nimport TurboAdminPlugin from './types/class-turbo-admin-plugin.js';\nimport Acf from './plugins/class-acf.js';\n// import TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js';\n// import 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';\nimport TurboAdminBarkeeper from './plugins/class-turbo-admin-barkeeper.js';\nimport TurboAdminContentSearch from './plugins/class-turbo-admin-content-search.js';\nimport TurboAdminPluginSearch from './plugins/class-turbo-admin-plugins.js';\nimport TurboAdminUserSearch from './plugins/class-turbo-admin-users.js';\n// import TurboAdminWoocommerce from './plugins/class-turbo-admin-woocommerce.js';\n// import TurboAdminGravityForms from './plugins/class-turbo-admin-gravity-forms.js';\nimport TurboAdminMUSites from './plugins/class-turbo-admin-mu-sites.js';\nimport TurboAdminOxygenBuilder from './plugins/class-turbo-admin-oxygen-buillder.js';\n\nexport default class TurboAdmin {\n\n /**\n * @param {*} options\n * @returns {TurboAdmin}\n */\n constructor(options) {\n // Sometimes we get a second copy of TA running, like if the plugin is running too.\n // Is this case we want to skip the initialisation.\n this.doInit = true;\n\n if (document.getElementById('ta-command-palette-container')) {\n console.log('TurboAdmin already initialised - I won\\'t make a second copy!');\n this.doInit = false;\n return globalThis.turboAdmin;\n }\n\n this.options = options;\n this.plugins = {};\n\n // TODO: Something? What should this type be?\n this.searchModes = {};\n\n // On the front end we set this if there is no saved menu.\n this.menuNeedsRefresh = false;\n }\n\n /**\n * Perform initialization - this is all the things that do not need APIs to\n * get set up.\n */\n async init() {\n if (! this.doInit) {\n return;\n }\n\n // Register all the plugins\n new TurboAdminBarkeeper();\n new TurboAdminContentSearch();\n new TurboAdminPluginSearch();\n new TurboAdminUserSearch();\n // new TurboAdminWoocommerce();\n // new TurboAdminGravityForms();\n new TurboAdminMUSites();\n new TurboAdminOxygenBuilder();\n\n // Grab the global Wp object instance\n this.wp = globalThis.taWp;\n\n this.menu = [];\n\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 // Check for .logged-in class on body - if logged in, we can use the saved menu,\n // if it exists.\n if (document.body.classList.contains('logged-in')) {\n // Get from localStorage\n const savedMenu = window.localStorage.getItem('ta-palette-data');\n\n // This attempts to see if we have cached items from the back-en\n if (null === savedMenu) {\n this.menuNeedsRefresh = true;\n } else {\n this.menu = JSON.parse(savedMenu);\n // Check if there is no \"Media\" item - this should ONLY be in the back-end\n if (! this.menu.some(item => item.action.endsWith('upload.php'))) {\n this.menuNeedsRefresh = true;\n }\n // Merge (?) the items?\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\n /**\n * These are initialization steps that DO needs APIs to be set up.\n */\n activatePlugins() {\n // Initialize all plugins\n Object.keys(this.plugins).forEach( plugin => {\n if (this.plugins[plugin].shouldActivate()) {\n this.plugins[plugin].activate();\n }\n })\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 /**\n * True if the plugin has been activated\n *\n * @param {string} name Name of the plugin to check for\n * @returns {boolean}\n */\n hasActivatedPlugin(name) {\n return Object.keys(this.plugins).includes(name) &&\n this.plugins[name].activated;\n }\n\n /**\n * Gather the WordPress dashboard admin (sidebar) menu items\n *\n * @returns { TurboAdminMenuItem[] }\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 /**\n * Adds additional menu items passed in by configuration to the\n * menu items list.\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 // Technically this is an array of {ItemDefintion} but more work needed to make that happen.\n let extraItems = this.options.extraItems ?? [];\n\n // Get any extra items defined by plugins\n const pluginKeys = Object.keys(this.plugins);\n\n for (let i=0; i < pluginKeys.length; i++) {\n extraItems = extraItems.concat(this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());\n }\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 );\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 /**\n * Builds the palette HTML and adds it to the DOM.\n */\n addPalette() {\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 // Palette notice\n const paletteNotice = document.createElement('div');\n paletteNotice.id = 'ta-command-palette-notice';\n // Tab notice\n const tabNotice = document.createElement('div');\n tabNotice.id = 'ta-command-palette-tab-notice';\n // Tab notice text\n const tabNoticeText = document.createElement('span');\n tabNoticeText.id = 'ta-command-palette-tab-notice-text';\n // Tab notice \"button\"\n const tabNoticeButton = document.createElement('span');\n tabNoticeButton.id = 'ta-command-palette-tab-notice-button';\n tabNoticeButton.innerText = 'Tab';\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 // Search mode tag\n const searchModeTag = document.createElement('div');\n searchModeTag.id = 'ta-command-palette-search-mode-tag';\n // List container (needed to contain the main list and the submenu list)\n const listContainer = document.createElement('div');\n listContainer.id = \"ta-command-palette-items-container\";\n // List\n const list = document.createElement('ul');\n list.id = \"ta-command-palette-items\";\n // Sub-menu list\n const submenuContainer = document.createElement('div');\n submenuContainer.id = \"ta-command-palette-submenu-container\";\n // Join it all up\n container.appendChild(palette);\n palette.appendChild(searchModeTag);\n palette.appendChild(paletteNotice);\n tabNotice.appendChild(tabNoticeText);\n tabNotice.appendChild(tabNoticeButton);\n palette.appendChild(tabNotice);\n palette.appendChild(input);\n listContainer.appendChild(list);\n listContainer.appendChild(submenuContainer);\n palette.appendChild(listContainer);\n\n if (document.getElementById('wpadminbar') && this.options['admin-bar-search'] === true) {\n const paletteLi = document.createElement('li');\n paletteLi.appendChild(container);\n const adminBar = document.getElementById('wp-admin-bar-top-secondary');\n adminBar.appendChild(paletteLi);\n\n // Add focus handler\n input.addEventListener('focus', e => this.turboAdminPalette.showPalette());\n\n // Add placeholder\n const placeholder = document.createElement('div');\n placeholder.id = 'ta-shortcut-key-placeholder';\n placeholder.innerText = this.buildShortcutKeysString();\n placeholder.addEventListener('click', e => input.focus());\n\n palette.insertBefore( placeholder, listContainer );\n } else {\n // Container\n document.querySelector(this.options.appendToElement ?? 'body').appendChild(container);\n }\n }\n\n /**\n * Register a plugin with Turbo Admin\n *\n * @param {TurboAdminPlugin} plugin\n */\n registerPlugin(plugin) {\n console.log('Registering plugin ' + plugin.name);\n this.plugins[plugin.name] = plugin;\n }\n\n /**\n * Register a palette search mode and its associated plugin\n *\n * this is usually bound to the searchMode, so\n *\n * @param {SearchMode} searchMode\n */\n registerSearchMode(searchMode) {\n console.log('Registering search mode with keyword ' + searchMode.keyword);\n // Don't use `this` as we are bound!\n globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode;\n }\n\n /**\n * Returns a string representation of the palette's keyboard shortcut\n *\n * @returns { String }\n */\n buildShortcutKeysString () {\n let keysString = '';\n let shortcut = this.options.shortcutKeys[0];\n\n if ( shortcut.meta ) {\n keysString += 'Cmd-';\n }\n if ( shortcut.ctrl ) {\n keysString += 'Ctrl-';\n }\n if ( shortcut.alt ) {\n keysString += 'Alt-';\n }\n if ( shortcut.shift ) {\n keysString += 'Shift-';\n }\n keysString += shortcut.key;\n return keysString;\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<String|Boolean>} 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<urls.length; i++) {\n if (workingUrl) continue;\n result = await this.testUrl(urls[i], responseUrlMustContain);\n if (result !== false) {\n workingUrl = result;\n }\n }\n return workingUrl;\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessSiteUrlFromHome( homeUrl ) {\n const homeWithSlash = this.ensureTrailingSlash(homeUrl);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // homeWithSlash + 'wp-admin/',\n // homeWithSlash + 'wp/wp-admin'\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return homeWithSlash + 'wp-admin/';\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessHome() {\n const currentUrl = new URL(window.location);\n const origin = this.ensureTrailingSlash(currentUrl.origin);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // origin\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return origin;\n }\n\n /**\n *\n * @param {String} siteUrl\n * @returns {String}\n */\n guessHomeFromSiteUrl(siteUrl) {\n // Not much we can do here.\n return siteUrl.replace(/wp-admin\\/?/, '');\n }\n\n async getUrls() {\n // See if we can actually find the URL for the API\n /** @type {HTMLLinkElement|null} */\n const apiLink = document.querySelector('link[rel=\"https://api.w.org/\"]');\n\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 is easy in the back end/Dashboard!\n this.siteUrl = window.location.href.match(/(^.*wp-admin)/)[1];\n this.home = document.getElementById('wp-admin-bar-site-name').querySelector('a').href;\n\n // Always set the siteUrl and home as this is definitive\n window.localStorage.setItem('ta-palette-data-siteurl', this.siteUrl);\n window.localStorage.setItem('ta-palette-data-home', this.home);\n } else if (! this.siteUrl || ! this.home) {\n\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 // We know what the siteUrl is, so guess the home from the siteUrl\n this.home = this.guessHomeFromSiteUrl(this.siteUrl);\n }\n\n } else {\n // Try for the API link\n // TODO: This needs to be async so it doesn't hold things up.\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 // We (probably) know what the home link is now, so guess the wp-admin\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome( this.home );\n } else {\n this.siteUrl = this.guessSiteUrl();\n }\n } else {\n // We got nothing.\n this.home = await this.guessHome();\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome(this.home);\n }\n }\n }\n }\n\n // Always trim the / for comparisons\n if (this.siteUrl) {\n this.siteUrl = this.siteUrl.replace(/(.+)\\/$/, '$1');\n }\n if (this.home) {\n this.home = this.home.replace(/(.+)\\/$/, '$1');\n }\n\n // console.log('siteUrl: ', this.siteUrl);\n // console.log('home: ', this.home);\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class WoocommerceApi {\n\n constructor() {\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 getOrders(searchString) {\n // Check the cache\n if (undefined !== this.cache['orders-' + searchString]) {\n return this.cache['orders-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"orders\",\n {\n search: searchString,\n per_page: 100,\n }\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['orders-' + searchString] = result;\n\n return result;\n }\n\n async getOrder(orderId) {\n // Check the cache\n if (undefined !== this.cache['order-' + orderId]) {\n return this.cache['order-' + orderId];\n }\n\n // Fetch results\n const response = await this.wooGet(\n `orders/${orderId}`\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n let resultAsArray = [ result ];\n\n // Store in the cache\n this.cache['order-' + orderId] = resultAsArray;\n\n return resultAsArray;\n }\n\n async getCustomers(searchString) {\n // Check the cache\n if (undefined !== this.cache['customers-' + searchString]) {\n return this.cache['customers-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"customers\",\n {\n search: searchString,\n per_page: 100,\n role: 'all',\n }\n );\n\n if (response === false) {\n return false;\n }\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['customers-' + searchString] = result;\n\n return result;\n }\n\n // TODO: Add docblock and types\n async wooGet(path, data = {}) {\n const wooApiBase = globalThis.contentApi.apiRoot + 'wc/v3/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${wooApiBase}${path}/?${params}`, init);\n\n if ( response.status === 404 ) {\n return false;\n }\n if ( (response.status < 200 || response.status >= 300) ) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.');\n }\n\n return response;\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class GravityFormsApi {\n\n constructor() {\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 getForms(searchString) {\n // Check the cache\n if (undefined !== this.cache['gf-forms-' + searchString]) {\n return this.cache['gf-forms-' + searchString];\n }\n\n // Fetch results\n const response = await this.gfGet(\n \"forms\",\n {}\n );\n\n // Decode JSON\n const result = await response.json();\n\n // TODO: Trap for errors\n\n // Filter by search string - the API doesn't do this for us\n const searchStringLowerCase = searchString.toLowerCase();\n const formIds = Object.keys(result);\n for (let k = 0; k < formIds.length; k++) {\n const thisId = formIds[k];\n if (! result[thisId].title.toLowerCase().includes(searchStringLowerCase)) {\n delete result[thisId];\n }\n }\n\n // Store in the cache\n this.cache['gf-forms-' + searchString] = result;\n\n return result;\n }\n\n async gfGet(path, data = {}) {\n const gfApiBase = globalThis.contentApi.apiRoot + 'gf/v2/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${gfApiBase}${path}/?${params}`);\n\n if (response.status < 200 || response.status >= 300) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.');\n }\n\n return response;\n }\n\n}\n", "import TurboAdmin from './class-turbo-admin.js';\nimport ContentApi from './apis/class-content-api.js';\nimport Wp from './class-wp.js';\nimport TurboAdminWpNotices from './class-turbo-admin-wp-notices.js';\nimport WoocommerceApi from './apis/class-woocommerce-api.js';\nimport GravityFormsApi from './apis/class-gravity-forms-api.js';\n\nconst taStorageKey = 'turbo-admin-settings';\n\n// Use this to clear storage\n// browser.storage.local.remove(taStorageKey).then();\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 if (typeof(globalThis.turboAdmin) !== 'undefined') {\n // Already initialised for some reason\n return;\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 }\n\n globalThis.turboAdminOptions = settings[taStorageKey];\n\n console.log('Preparing Turbo Admin');\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 await globalThis.contentApi.discoverPostTypes();\n globalThis.woocommerceApi = new WoocommerceApi();\n globalThis.gravityFormsApi = new GravityFormsApi();\n\n console.log('Turbo Admin: Content API is initialised');\n\n globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n await globalThis.turboAdmin.init();\n\n\n\n // This needs all the APIs to be ready\n await globalThis.turboAdmin.activatePlugins();\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 'barkeeper': globalThis.wpTurboAdmin['barkeeper'] === '1',\n 'admin-bar-search': globalThis.wpTurboAdmin['adminBarSearch'] === '1',\n\t}\n\tawait taInit(globalThis.turboAdminOptions);\n});\n"],5 "mappings": "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",3 "sources": ["../src/fuse-6.4.6.js", "../src/class-turbo-admin-palette.js", "../src/types/class-turbo-admin-menu-item.js", "../src/class-storage.js", "../src/apis/class-content-api.js", "../src/types/class-submenu-item.js", "../src/types/class-content-item.js", "../src/types/class-search-mode.js", "../src/types/class-item-definition.js", "../src/types/class-turbo-admin-plugin.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/plugins/class-turbo-admin-barkeeper.js", "../src/plugins/class-turbo-admin-content-search.js", "../src/plugins/class-turbo-admin-plugins.js", "../src/plugins/class-turbo-admin-users.js", "../src/plugins/class-turbo-admin-mu-sites.js", "../src/plugins/class-turbo-admin-oxygen-buillder.js", "../src/class-turbo-admin.js", "../src/class-wp.js", "../src/apis/class-woocommerce-api.js", "../src/apis/class-gravity-forms-api.js", "../src/main.js"], 4 "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 './types/class-turbo-admin-menu-item';\nimport ContentApi from './apis/class-content-api.js';\nimport SearchMode from './types/class-search-mode.js';\nimport ContentItem from './types/class-content-item.js';\n\nexport default class TurboAdminPalette {\n\n\tconstructor(paletteData, options) {\n\n\t\tturboAdminLog('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 {HTMLDivElement} */\n this.paletteItemsContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-items-container'));\n\t\t/** @type {HTMLUListElement} */\n this.paletteItemsElement = /** @type {HTMLUListElement} */ (document.getElementById('ta-command-palette-items'));\n\t\t/** @type {HTMLDivElement} */\n this.paletteSubmenuContainerElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-submenu-container'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTag = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-search-mode-tag'));\n /** @type {HTMLDivElement} */\n this.paletteSearchModeTabNotice = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-tab-notice'));\n /** @type {HTMLSpanElement} */\n this.paletteSearchModeTabNoticeText = /** @type {HTMLSpanElement} */ (document.getElementById('ta-command-palette-tab-notice-text'));\n /** @type {HTMLDivElement} */\n this.paletteNoticeElement = /** @type {HTMLDivElement} */ (document.getElementById('ta-command-palette-notice'));\n\n\n // Add a class if the menu needs refreshing with a visit to the Dashboard\n if (globalThis.turboAdmin.menuNeedsRefresh) {\n this.showPaletteNotice('Menu needs refreshing. Visit the Dashboard to refresh.');\n }\n\n // We need this when injecting items. We use it to help generate edit URLs. Not the best way but\n // works for now.\n /** @type {HTMLUListElement} */\n this.profileLinkElem = document.getElementById('wp-admin-bar-edit-profile');\n /** @type {null|String} */\n this.profileLink = null;\n if (this.profileLinkElem) {\n this.profileLink = this.profileLinkElem.querySelector('a').href;\n }\n\n\t\t// Get palette data\n\t\tthis.paletteData = paletteData;\n\n // Backup of the palette data for use when we enter a different search mode\n\t\tthis.paletteDataBackup = null;\n\t\tthis.paletteItemsBackup = null;\n this.paletteItemIndexBackup = null;\n\n // Current search modes/keyword\n this.searchMode = null;\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 inSearchMode() {\n return this.searchMode !== null;\n }\n\n\t/**\n * This converts this.paletteData into a list of paletteListItems in this.paletteItems\n *\n * It also builds the itemIndex\n */\n buildPaletteItems() {\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 /**\n * Clears and sets the content items\n *\n * @param {ContentItem[]} contentItems\n */\n setContentItems(contentItems) {\n this.paletteItems = [];\n this.itemIndex = [];\n this.injectContentItems(contentItems, false);\n }\n\n /**\n * Content items have:\n * title\n * subtype\n * url\n * (we should also make the sub-menu definable, but that's not done yet)\n *\n * @param {ContentItem[]} contentItems\n */\n injectContentItems(contentItems, andRunSearch = true) {\n turboAdminLog('Injecting items');\n\n if (contentItems.length > 0) {\n contentItems.forEach(this.injectItem.bind(this));\n }\n\n if (andRunSearch) {\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 this.updatePaletteItems();\n }\n\n /**\n * Injects a single content item into the palette\n *\n * @param {ContentItem} item\n */\n injectItem(item) {\n const itemTitle = item.title;\n // const itemTitle = item.title.rendered;\n const itemType = item.subtype;\n const itemUrl = item.url;\n\n // turboAdminLog('Adding item: ' + itemTitle);\n\n // // Check if item already exists\n if (this.contentItemExists(itemUrl)) {\n turboAdminLog('Not adding duplicate');\n return;\n }\n\n let title = itemTitle;\n\n if (itemType) {\n const itemTypeName = globalThis.contentApi.postTypes[itemType] ? globalThis.contentApi.postTypes[itemType].name : itemType;\n title += ` (${itemTypeName})`;\n }\n\n const li = document.createElement('li');\n const a = document.createElement('a');\n let subMenu = null;\n\n // Loop over submenu items OR add link.\n if (item.submenuItems.length > 0) {\n\n // Prepare the outer sub-menu elements\n 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\n for (let i = 0; i < item.submenuItems.length; i++) {\n const subMenuItem = item.submenuItems[i]\n // TODO: Abstract this so sub-menus can be defined by plugins?\n const subMenuListItem = document.createElement('li');\n const subMenuLink = document.createElement('a');\n subMenuLink.innerText = subMenuItem.title;\n subMenuLink.href = subMenuItem.url;\n for (let a = 0; a < subMenuItem.attributes.length; a++) {\n subMenuLink.setAttribute(\n subMenuItem.attributes[a].name,\n subMenuItem.attributes[a].value\n )\n }\n subMenuListItem.appendChild(subMenuLink);\n subMenuItems.appendChild(subMenuListItem);\n }\n\n // Add the sub-menu items UL to the sub-menu element.\n subMenu.appendChild(subMenuItems);\n\n li.classList.add('ta-has-child-menu');\n }\n\n a.href = itemUrl;\n a.innerHTML = title;\n\n li.appendChild(a);\n if (subMenu !== null) {\n li.appendChild(subMenu);\n }\n\n this.addPaletteListItem(li);\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 return;\n\t\t}\n\n\t\tif (e.code === 'Escape' && this.paletteShown()) {\n\t\t\tif (this.isSubMenuOpen()){\n this.closeSubMenu();\n } else if (this.inSearchMode()) {\n this.leaveSearchMode();\n } else {\n this.hidePalette();\n }\n return;\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 /*\n * Adds the tab hint for a keyword once it has been typed.\n */\n maybeHighlightInputKeyword(newKey) {\n // Do nothing if we are in a search-mode\n if (this.inSearchMode()) {\n return;\n }\n\n // This is fired on \"keyDown\", so the value isn't update with the new key yet.\n // But don't do this for special keys, and catch backspace too.\n let newInputValue = this.paletteInputElement.value;\n if (newKey.length === 1) {\n newInputValue += newKey;\n }\n if (newKey === 'Backspace') {\n newInputValue = newInputValue.slice(0, -1);\n }\n // turboAdminLog(`Checking palette input value ${newInputValue} for keyword`);\n if (this.isKeyword(newInputValue)) {\n this.paletteSearchModeTabNoticeText.innerText = `Search for ${newInputValue}`;\n this.paletteSearchModeTabNotice.classList.add('active');\n } else {\n this.unhighlightInputKeyword();\n }\n }\n\n unhighlightInputKeyword() {\n this.paletteSearchModeTabNotice.classList.remove('active');\n }\n\n async debouncedPaletteSearchAndUpdate() {\n // If we're not in a search mode then search immediately\n if (! this.inSearchMode()) {\n this.debounceTimeout = null;\n await this.paletteSearchAndUpdate();\n return;\n }\n\n // If timer is null, reset it to 500ms and run your functions.\n // Otherwise, wait until timer is cleared\n\n // Cancel the existing timeout\n clearTimeout(this.debounceTimeout)\n\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 * Check if a string is a search mode keyword\n *\n * @param {string} inputString\n * @returns {boolean}\n */\n isKeyword(inputString) {\n return Object.keys(globalThis.turboAdmin.searchModes).includes(inputString);\n }\n\n /**\n * Show the palette notice with the specified text\n *\n * @param {string} text\n */\n showPaletteNotice(text) {\n this.paletteNoticeElement.classList.add('active');\n this.paletteNoticeElement.innerText = text;\n }\n\n /**\n * Hide the palette notice\n */\n hidePaletteNotice() {\n this.paletteNoticeElement.classList.remove('active');\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 e.preventDefault();\n this.doAction(this.metaPressed(e));\n return;\n\t\t}\n\n /*\n * Only the actions above can be done in sub-menus.\n */\n if (this.isSubMenuOpen()) {\n return;\n }\n\n /*\n * Check for a keyword being typed and add a UI hint.\n */\n this.maybeHighlightInputKeyword(e.key);\n\n /*\n * Tabbing looks for a search mode keyword.\n */\n if (! this.inSearchMode() && (e.code === 'Tab' || e.key === ':')) {\n turboAdminLog('Checking for search mode');\n let inputValue = this.paletteInputElement.value;\n if (this.isKeyword(inputValue)) {\n turboAdminLog('Found search mode ' + inputValue)\n e.preventDefault();\n // TODO: Work on this.\n await this.enterSearchMode(\n globalThis.turboAdmin.searchModes[inputValue]);\n return;\n }\n }\n\n /*\n * Backspace may exit us from a search mode\n */\n if (this.inSearchMode() && e.code === 'Backspace' && this.paletteInputElement.value === '') {\n e.preventDefault();\n this.leaveSearchMode();\n return;\n }\n\n\t\tawait this.debouncedPaletteSearchAndUpdate();\n\t}\n\n /**\n * Puts the palette into a specific search mode - used when a keyword is selected\n *\n * @param {SearchMode} searchMode\n */\n async enterSearchMode(searchMode) {\n turboAdminLog('Entering search mode for keyword ' + searchMode.keyword);\n this.backupPaletteData();\n\n this.paletteData = [];\n this.paletteItems = [];\n this.itemIndex = [];\n\n // Remove the notice if it's there\n this.hidePaletteNotice();\n\n this.searchMode = searchMode;\n this.paletteInputElement.value = '';\n this.addSearchModeTag(searchMode.displayName);\n this.unhighlightInputKeyword();\n this.updatePaletteItems();\n // This is similar to code in paletteSearch - maybe we could extract/abstract it?\n if (searchMode.defaultItemsCallback !== null) {\n this.paletteInnerElement.classList.add('loading');\n const results = await searchMode.defaultItemsCallback();\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n }\n\n /**\n * Leaves the current search mode\n */\n leaveSearchMode() {\n const searchMode = this.searchMode;\n // It's important what we set this to - see inSearchMode()\n this.searchMode = null;\n this.removeSearchModeTag();\n this.restorePaletteData();\n this.paletteInputElement.value = searchMode.keyword;\n this.maybeHighlightInputKeyword('');\n this.paletteSearchAndUpdate();\n }\n\n /**\n * Backups up the palette data to a local variable so that it can be\n * restored later.\n */\n backupPaletteData() {\n this.paletteDataBackup = this.paletteData;\n this.paletteItemsBackup = this.paletteItems;\n this.paletteItemIndexBackup = this.itemIndex;\n }\n\n /**\n * Restores the save palette data - does not rebuild anything\n */\n restorePaletteData() {\n this.paletteData = this.paletteDataBackup;\n this.paletteItems = this.paletteItemsBackup;\n this.itemIndex = this.paletteItemIndexBackup;\n }\n\n /**\n * Adds the search mode tag with the specified title.\n *\n * @param {string} title\n */\n addSearchModeTag(title) {\n this.paletteSearchModeTag.classList.add('active');\n this.paletteSearchModeTag.innerText = title;\n }\n\n /**\n * Removes the search mode tag\n */\n removeSearchModeTag() {\n this.paletteSearchModeTag.classList.remove('active');\n }\n\n isPaletteOpen() {\n return this.paletteElement?.classList.contains('active');\n }\n\n\tshowPalette() {\n // Bail if already shown (this can be triggered by a focus event)\n if (this.isPaletteOpen()) {\n return;\n }\n\n this.paletteInputElement.value = '';\n\t\tthis.paletteInputElement?.focus();\n\t\tthis.paletteElement?.classList.add('active');\n // This is needed in admin-bar mode otherwise it gets a weird already-scrolled thing when\n // the palette opens.\n setTimeout(() => this.paletteItemsElement.scrollTop = 0, 100);\n\t}\n\n\thidePalette() {\n this.navigating = false;\n\t\tthis.paletteElement?.classList.remove('active');\n this.paletteInputElement.value = '';\n this.paletteInputElement.blur();\n if (this.isSubMenuOpen()) {\n this.closeSubMenu();\n }\n if (this.searchMode !== null) {\n this.leaveSearchMode();\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.paletteSubmenuContainerElement?.querySelectorAll('.ta-submenu 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 this.paletteSubmenuContainerElement.replaceChildren(subMenuElement);\n // Set height in case main menu is smaller than sub menu\n const subMenuHeight = this.paletteSubmenuContainerElement.offsetHeight;\n this.paletteItemsContainerElement.style.minHeight = subMenuHeight + \"px\";\n this.paletteSubmenuContainerElement.classList.add('active');\n\n this.selectedSubItem = subMenuElement.querySelector('li');\n this.openedSubMenu = subMenuElement;\n this.setSelectedElement();\n\n this.paletteInputElement.disabled = true;\n // Blur the input so that keys can continue to be captured\n this.paletteInputElement.blur();\n }\n\n closeSubMenu(subMenuElement = null) {\n if (null === subMenuElement) {\n subMenuElement = document.querySelector('.ta-submenu.active');\n }\n this.paletteSubmenuContainerElement.classList.remove('active');\n this.selectedSubItem.classList.remove('active');\n this.paletteItemsContainerElement.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 // link.href will be interpolated by the browser, so if it's empty it will be the current page\n // use getAttribute instead to work out if its empty\n if (link.getAttribute('href') === '') {\n return;\n }\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 if (! this.searchMode) {\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 return;\n }\n\n if (this.paletteInputElement.value.length === 0) {\n this.paletteInnerElement.classList.add('loading');\n let results = [];\n if (this.searchMode.defaultItemsCallback !== null) {\n results = await this.searchMode.defaultItemsCallback();\n }\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n } else {\n // This is copied to enterSearchMode. Should probably be extracted.\n this.paletteInnerElement.classList.add('loading');\n const results = await this.searchMode.searchCallback(this.paletteInputElement.value);\n this.setContentItems(results);\n // this.injectContentItems(results);\n this.paletteInnerElement.classList.remove('loading');\n }\n\n /**\n * OLD CODE BELOW\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", "/**\n * Menu items are the items ready to appear in the palette.\n *\n * These are standard items, not content items. Though this should probably be standardised.\n */\nexport default class TurboAdminMenuItem {\n\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The action of the item is the URL to visit when the item is clicked\n *\n * @type {string}\n */\n action = '';\n\n /**\n * The parent title is the title of the parent item under which the current item\n * was found in the WordPress menu.\n *\n * e.g. in Posts -> Add Post, \"Posts\" is the parent item.\n *\n * @type {string}\n */\n parentTitle = '';\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\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 (this.inExtension()) {\n this.store = chrome.storage.local;\n } else {\n this.store = window.localStorage;\n }\n }\n\n /**\n * Returns true if we are in the extension.\n */\n inExtension() {\n return window.turboAdminIsExtension();\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 (this.inExtension()) {\n await this.store.set(dataObject);\n } else {\n const keys = Object.keys(dataObject);\n keys.forEach(key => this.store.setItem(key, JSON.stringify(dataObject[key])));\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<Object>}\n */\n async get(key) {\n if (this.inExtension()) {\n return await this.store.get(key);\n } else {\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 }\n }\n}\n", "import Storage from '../class-storage.js';\n\nexport default class ContentApi {\n\n constructor() {\n // this.discoverApiRoot().then(e => null);\n // turboAdminLog('Discovered API base: ', this.apiBase);\n this.active = false;\n this.store = new Storage();\n this.postTypes = [];\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 turboAdminLog('Discovering API root');\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 <link rel=\"https://api.w.org/\" href=\"https://something/wp-json/\">\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 // This should be very rare. I should only really see it in development.\n turboAdminLog('API Route Discovery failed');\n // Making best guess\n this.apiBase = globalThis.taWp.home + '/wp-json/wp/v2/';\n // TODO: This can't display as the palette isn't created yet.\n // globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Can\\'t find the WP API. Try visiting the dashboard to refresh things.');\n }\n\n async discoverPostTypes() {\n turboAdminLog('Discovering post types');\n if (! this.active) {\n turboAdminLog('Not active');\n this.postTypes = [];\n return;\n }\n\n const postTypes = await this.store.get('ta-post-types');\n\n // Check local storage cache\n if (postTypes && postTypes['ta-post-types'] && postTypes['ta-post-types']['expiry'] > Date.now()) {\n turboAdminLog('Using cached post types: ', postTypes['ta-post-types']['data']);\n this.postTypes = postTypes['ta-post-types']['data'];\n return;\n }\n\n this.postTypes = await this.getPostTypes();\n turboAdminLog('Discovered post types: ', this.postTypes);\n\n // Cache for 10 minutes\n const expiry = Date.now() + (10 * 60 * 1000);\n this.store.set({\n 'ta-post-types': {\n expiry: expiry,\n data: this.postTypes\n }\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 async getPostTypes() {\n // Check the cache\n if (undefined !== this.cache['postsTypes']) {\n return this.cache['postTypes'];\n }\n\n // Fetch results\n const response = await this.get('types');\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['postTypes'] = result;\n\n return result;\n }\n\n async getPosts(searchString, postType = 'any') {\n // Check the cache\n const cacheKey = `posts-${postType}-${searchString}`;\n if (undefined !== this.cache[cacheKey]) {\n return this.cache[cacheKey];\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: postType\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache[cacheKey] = result;\n\n return result;\n }\n\n /**\n * We can't use the API to get a post of any post type. So we hack this a bit.\n *\n * @param {number} postId\n * @returns {Promise<any>}\n */\n async doesPostExist(postId) {\n // Check the cache\n if (undefined !== this.cache['post-' + postId]) {\n return this.cache['post-' + postId];\n }\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n const response = await fetch(`${globalThis.taWp.siteUrl}/post.php?post=${postId}&action=edit`, init);\n\n this.cache['post-' + postId] = response;\n\n return response?.status === 200;\n }\n\n async getPlugins(searchString) {\n // Check the cache\n if (undefined !== this.cache['plugins-' + searchString]) {\n return this.cache['plugins-' + searchString];\n }\n\n let requestOptions = {};\n\n if (searchString) {\n requestOptions.search = searchString;\n }\n\n // Fetch results\n const response = await this.get(\n \"plugins\",\n requestOptions\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['plugins-' + searchString] = result;\n\n return result;\n }\n\n async getUsers(searchString) {\n // Check the cache\n if (undefined !== this.cache['users-' + searchString]) {\n return this.cache['users-' + searchString];\n }\n\n // Fetch results\n const response = await this.get(\n \"users\",\n {\n search: searchString,\n per_page: 100,\n context: 'edit' // view / embed / edit\n }\n );\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['users-' + 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 credentials: 'include'\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}`, init);\n\n if (response.status < 200 || response.status >= 300) {\n // TODO: Set a \"deferred\" notice to show when the palette is created?\n if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.');\n } else {\n // Always log this as people may look\n turboAdminLog( 'TURBO ADMIN: WordPress API Error. Try visiting the WordPress Dashboard to refresh things.' );\n }\n }\n\n return response;\n }\n\n}\n", "export default class SubmenuItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title;\n\n /**\n * The URL of the item\n * @type {string}\n */\n url;\n\n /**\n * A list of attributes to go on the A tag (not the LI tag)\n *\n * @type {array}\n */\n attributes = [];\n\n /**\n * Create a submenu item\n *\n * @param {string} title The title of the item\n * @param {string} url The URL of the item\n */\n constructor(title, url) {\n this.title = title;\n this.url = url;\n }\n\n /**\n * Add an attribute\n *\n * @param {string} name The attribute name\n * @param {string} value The attribute value\n */\n addAttribute(name, value) {\n this.attributes.push({\n name: name,\n value: value\n });\n }\n}\n", "import SubmenuItem from \"./class-submenu-item\";\n\nexport default class ContentItem {\n /**\n * The title of the item\n *\n * @type {string}\n */\n title = '';\n\n /**\n * The subtype of the item. e.g. for posts, this will be the post type.\n * Used to display extra information about the item.\n *\n * @type {string}\n */\n subtype = '';\n\n /**\n * The URL of the item. Leave empty if there is a sub-menu.\n *\n * @type {string}\n */\n url = '';\n\n /**\n * The sub-menu items, if any.\n *\n * This should be an empty array if the item itself has a URL\n *\n * @type {SubmenuItem[]}\n */\n submenuItems = [];\n}\n", "import ContentItem from \"./class-content-item\";\n\nexport default class SearchMode {\n /**\n * The keyword string used to initiate the search\n *\n * @type {string}\n */\n keyword = '';\n\n /**\n * The dispay name used for the search\n *\n * @type {string}\n */\n displayName = '';\n\n /**\n * jsDoc defintion for a `searchCallback`\n *\n * @callback SearchCallback\n * @param {string} [searchString]\n * @returns {Promise<ContentItem[]>}\n */\n\n /**\n * Callback to get search items\n *\n * @type {SearchCallback}\n */\n searchCallback;\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @type {SearchCallback|null}\n */\n defaultItemsCallback = null;\n\n /**\n * Constructs a new search mode\n *\n * @param {string} keyword\n * @param {string} displayName\n * @param {SearchCallback} searchCallback\n * @param {SearchCallback} defaultItemsCallback\n */\n constructor(keyword, displayName, searchCallback, defaultItemsCallback = null) {\n this.keyword = keyword;\n this.displayName = displayName;\n this.searchCallback = searchCallback;\n this.defaultItemsCallback = defaultItemsCallback;\n }\n}\n", "/**\n * An item definition specifies how to detect a palette item from the Dashboard's Dom\n *\n * These are all processed on initialisation to generate menu items.\n *\n * Note that a single definition may generate multiple menu items if the selectors used\n * discover multiple items.\n */\nexport default class ItemDefinition {\n /**\n * This callback is displayed as part of the Requester class.\n * @callback menuItemCallback\n * @param {HTMLElement} element\n * @returns {string}\n */\n\n /**\n * The method of detecting items. Can be:\n * - 'dom' for checking if a DOM element exists (requires detectSelector or detectSelectorNone)\n * - 'url' if the current URL is being checked (requires detectPattern)\n *\n * @type {string}\n */\n detectType = 'dom';\n\n /**\n * [OPTIONAL] A CSS selector used to find items in the DOM\n *\n * @type {string}\n */\n detectSelector = '';\n\n /**\n * [OPTIONAL] A CSS selector used to check for an absence of items in the DOM\n *\n * @type {string}\n */\n detectSelectorNone = '';\n\n /**\n * [OPTIONAL] A string to find in the current URL to detect the item\n *\n * @type {string}\n */\n detectPattern = '';\n\n /**\n * A callback used to generate a menu item title from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemTitleFunction = null;\n\n /**\n * A callback used to generate a menu item link URL from a detected element. Should be passed an\n * HTML element and should return a string\n *\n * @type {menuItemCallback|null}\n */\n itemUrlFunction = null;\n\n /**\n * True if the item is not to be cached. Used for things like post-specific links like \"Edit post\"\n *\n * @type {boolean}\n */\n noCache = false;\n}\n", "import SearchMode from \"./class-search-mode\";\nimport ItemDefinition from \"./class-item-definition\";\n\n/**\n * This is an abstract class that should be extended by plugins\n * @module TurboAdminPlugin\n */\nexport default class TurboAdminPlugin {\n /** @type {string} */\n name = '';\n\n /** @type {SearchMode[]} */\n searchModes = [];\n\n /** @type {boolean} */\n activated = false;\n\n constructor(pluginName) {\n this.name = pluginName;\n this.registerPlugin();\n }\n\n /**\n * Register the plugin with Turbo Admin\n */\n registerPlugin() {\n turboAdminLog('Inside plugin - requested registration of ' + this.name);\n globalThis.turboAdmin.registerPlugin(this);\n }\n\n /**\n * Returns true if the plugin should activate\n * @returns {boolean}\n */\n shouldActivate() {\n return false;\n }\n\n /**\n * Activates the plugin\n * @return {void}\n */\n activate() {\n this.activated = true;\n this.registerSearchModes();\n }\n\n /**\n * Register the search keywords with Turbo Admin - each will be registered\n * with the whole plugin object.\n */\n registerSearchModes() {\n this.searchModes.forEach(globalThis.turboAdmin.registerSearchMode);\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {Promise<ItemDefinition[]>}\n */\n async getAdditionalItemDefinitions() {\n return [];\n }\n\n /**\n * Save plugin setting to persistent storage\n */\n saveSetting(key, value) {\n\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 // Don't run on the site editor screen\n if (document.body.classList.contains( 'site-editor-php' )) {\n return;\n }\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\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 this.noticesPanelInner = null;\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\nturboAdminLog('Notice Selectors', this.noticeSelectors);\n const notices = document.querySelectorAll(this.noticeSelectors.join(','));\nturboAdminLog('Notices', notices);\n\n // Add buttons to notices that can be moved\n notices.forEach(notice => {\n this.maybeAddIdToNotice(notice);\n this.maybeAddMoveButtonToNotice.call(this, notice);\n });\n\n const noticesToHide = Array.from(notices).filter( this.noticeShouldBeHidden.bind(this) );\n\n turboAdminLog('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 <span id=\"ta-notice-count\">' + noticesToHide.length + '</span>';\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 this.noticesPanelInner = document.createElement('div');\n this.noticesPanelInner.id = 'ta-notices-panel-inner';\n\n noticesToHide.forEach(this.hideNotice.bind(this));\n\n /**\n * Add wrap to the meta area\n */\n noticesPanel.appendChild(this.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 // Add a mutation observer to check for notices added by JavaScript\n // this.addObserver();\n }\n\n addObserver() {\n const observer = new MutationObserver( this.handleMutations.bind(this) );\n observer.observe(document.getElementById('wpbody-content'), {\n childList: true,\n subtree: true\n });\n }\n\n handleMutations(mutations, observer) {\n mutations.forEach( mutation => {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach( node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n console.log('MUTATING!!!' + node.id);\n // this.maybeAddIdToNotice(node);\n // this.maybeAddMoveButtonToNotice(node);\n // this.maybeHideNotice(node);\n }\n });\n }\n });\n }\n\n // Does the allowedClasses list say that this notice should be shown?\n keepNotice(noticeElem) {\n return noticeElem.matches(this.allowedClasses.join(', '));\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 turboAdminLog(`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 noticeShouldBeHidden(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 saveRememberedNotice(noticeId) {\n this.rememberedNoticeIds.push(noticeId);\n\n if ('object' === typeof(browser)) {\n chrome.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 turboAdminLog(`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 chrome.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 * For notices without IDs we'll see if we can add an ID that's a hash of their classlist\n */\n maybeAddIdToNotice(noticeElem) {\n if (noticeElem.id && noticeElem.id !== '' && noticeElem.id !=='message') {\n return;\n }\n\n const classes = noticeElem.classList;\n noticeElem.id = Array.from(noticeElem.classList).join('-');\n }\n\n /**\n * Add buttons to notices that we want to be able to move to the panel\n */\n maybeAddMoveButtonToNotice(noticeElem) {\n if (this.keepNotice(noticeElem)) {\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 noticeElem.classList.add('ta-added-pos-relative');\n\n noticeElem.appendChild(rememberButton);\n noticeElem.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 maybeHideNotice(noticeElem) {\n if (this.noticeShouldBeHidden(noticeElem) && !noticeElem.classList.contains('ta-notice-hidden')) {\n this.hideNotice(noticeElem);\n }\n }\n\n hideNotice(noticeElem) {\n noticeElem.classList.add('ta-notice-hidden');\n // WPCore's common.js will re-add the notice below the dashboard header unless it has a .inline class.\n // It does: $( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd );\n noticeElem.classList.add('inline');\n // See Toolbelt's implementation: https://github.com/BinaryMoon/wp-toolbelt/blob/dev/modules/tidy-notifications/src/js/script.js\n this.noticesPanelInner.append(noticeElem);\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<HTMLTableRowElement>}\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 if (this.currentRowIndex < this.tableRows.length - 1) {\n this.currentRowIndex++;\n }\n this.updateTable();\n }\n\n tableMoveUp() {\n this.preTableChange();\n\n if (this.currentRowIndex > 0) {\n this.currentRowIndex--;\n }\n\n this.updateTable();\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 turboAdminLog(this);\n /** @type {HTMLAnchorElement} */\n const link = this.currentRow.querySelector('a.row-title');\n if (link) {\n link.click();\n }\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\n\nexport default class TurboAdminBarkeeper extends TurboAdminPlugin {\n constructor() {\n super('Barkeeper');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n if (true !== globalThis.turboAdmin.options['barkeeper']) {\n return false;\n }\n // Bail if we aren't in the admin\n if (! document.getElementById('wpadminbar')) {\n return false;\n }\n // Bail if we don't have the left-hand admin bar (some users only have right-hand side)\n if (! document.getElementById('wp-admin-bar-root-default')) {\n return false;\n }\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n\n this.exclusionIds = [\n 'wp-admin-bar-menu-toggle',\n 'wp-admin-bar-wp-logo',\n 'wp-admin-bar-site-name',\n 'wp-admin-bar-updates',\n ];\n\n this.selectorsToHide = [\n '#wp-admin-bar-root-default > li',\n '.monsterinsights-adminbar-menu-item',\n ];\n\n this.barkeeperState = this.getBarkeeperState();\n\n this.root = document.getElementById('wp-admin-bar-root-default');\n if (! this.root) {\n return;\n }\n this.itemsToHide = document.querySelectorAll( this.selectorsToHide.join(', ') );\n\n Array.from(this.itemsToHide).forEach( element => {\n if (this.exclusionIds.includes(element.id)) {\n return;\n }\n element.classList.add('ta-barkeeper-collapsable');\n });\n\n if (this.barkeeperState === 'closed') {\n this.root.classList.toggle('ta-barkeeper-closed');\n }\n\n // Add toggle\n this.button = document.createElement('button');\n this.button.id = 'ta-barkeeper-toggle';\n this.button.innerText = '<';\n\n this.button.addEventListener('click', e => {\n this.root.classList.toggle('ta-barkeeper-closed');\n\n this.barkeeperState = this.barkeeperState === 'open' ? 'closed' : 'open';\n\n this.setBarkeeperState(this.barkeeperState);\n });\n\n this.root.insertAdjacentElement('afterend', this.button);\n\n this.setupObserver();\n }\n\n /**\n * Some awkward plugins add themselves into the bar using JS\n */\n setupObserver() {\n this.observer = new MutationObserver( mutations => {\n mutations.forEach( mutation => {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach( node => {\n if (node.classList && node.classList.contains('ta-barkeeper-collapsable')) {\n return;\n }\n if (node.id && this.exclusionIds.includes(node.id)) {\n return;\n }\n // Check is the node matches any of the selectors\n if (node.matches(this.selectorsToHide.join(', '))) {\n node.classList.add('ta-barkeeper-collapsable');\n return;\n }\n });\n }\n });\n });\n\n this.observer.observe(this.root, {\n childList: true,\n subtree: true,\n });\n }\n\n getBarkeeperState() {\n if (window.turboAdminIsExtension()) {\n return globalThis.turboAdmin.options['barkeeper-state'];\n } else {\n return window.localStorage.getItem('turbo-admin-barkeeper-state');\n }\n }\n\n setBarkeeperState(state) {\n if (window.turboAdminIsExtension()) {\n chrome.runtime.sendMessage({\n 'action': 'barkeeperSetState',\n 'barkeeperState': this.barkeeperState,\n });\n } else {\n window.localStorage.setItem('turbo-admin-barkeeper-state', state);\n }\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminContentSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Content');\n\n // Register a search mode for each post type\n const postTypeKeys = Object.keys(globalThis.contentApi.postTypes);\n for (let i = 0; i < postTypeKeys.length; i++) {\n const thisPostTypeKey = postTypeKeys[i];\n const thisPostType = globalThis.contentApi.postTypes[thisPostTypeKey];\n // turboAdminLog('Adding search mode for post type', thisPostType);\n this.searchModes.push( this.makePostTypeSearchMode(thisPostType) );\n }\n\n // Register ID search mode\n this.searchModes.push( new SearchMode('id', 'Post ID', this.postById.bind(this)) );\n\n // Register search all post types mode\n this.searchModes.push( new SearchMode('search', 'All post types', this.contentSearch.bind(this)) );\n this.searchModes.push( new SearchMode('find', 'All post types', this.contentSearch.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * This is a generator for a post-type specific SearchMode object\n *\n * @param {Object} postType\n */\n makePostTypeSearchMode(postType) {\n // TODO: interpret the post type name\n return new SearchMode(postType.slug, postType.name, (searchString) => this.contentSearch(searchString, postType.slug));\n }\n\n /**\n * @param {string} searchString\n * @param {string} postType This is passed to the API as a subtype. 'any' by default.\n * @returns {Promise<ContentItem[]>}\n */\n async contentSearch(searchString, postType = 'any') {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPosts(searchString, postType);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n item.title = result.title;\n item.subtype = result.subtype;\n item.url = result.url;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(result.id, item))\n\n return item;\n });\n }\n\n /**\n * @param {string} postId\n * @returns {Promise<ContentItem[]>}\n */\n async postById(postId) {\n if (! postId.trim().match(/^\\d+$/)) {\n return [];\n }\n const postExists = await globalThis.contentApi.doesPostExist(postId);\n\n const resultAsContentItem = new ContentItem;\n\n if (! postExists) {\n resultAsContentItem.title = 'Post does not exist or is not visible';\n return [ resultAsContentItem ];\n }\n\n resultAsContentItem.title = `Post ID: ${postId}`;\n resultAsContentItem.url = globalThis.taWp.home + `/?p=${postId}`;\n\n resultAsContentItem.submenuItems = resultAsContentItem.submenuItems.concat(this.makeSubmenuItems(postId, resultAsContentItem));\n\n return [ resultAsContentItem ];\n }\n\n /**\n * Makes an array of submenu items from a content item\n *\n * @param {number} postId\n * @param {ContentItem} contentItem\n * @returns {SubmenuItem[]}\n */\n makeSubmenuItems(postId, contentItem) {\n const itemsToReturn = [];\n itemsToReturn.push(\n new SubmenuItem(\n 'View',\n contentItem.url\n )\n );\n\n // TODO: Make a better way to detect if we are logged in.\n if (globalThis.turboAdmin.turboAdminPalette.profileLink) {\n // Need to get edit URL. This seems like the best way for now.\n const editLink = globalThis.taWp.siteUrl + `/post.php?post=${postId}&action=edit`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit',\n editLink\n )\n )\n\n // Add oxygen link if needed.\n if (globalThis.turboAdmin.hasActivatedPlugin('OxygenBuilder')) {\n const oxygenLink = globalThis.taWp.home + `?page_id=${postId}&ct_builder=true&ct_inner=true`;\n itemsToReturn.push(\n new SubmenuItem(\n 'Edit with Oxygen',\n oxygenLink\n )\n );\n }\n }\n\n const copyLinkItem = new SubmenuItem( 'Copy link', contentItem.url);\n copyLinkItem.addAttribute('data-action', 'clipboard')\n itemsToReturn.push(copyLinkItem);\n\n return itemsToReturn;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminPluginSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Plugins');\n\n this.searchModes.push( new SearchMode('plugin', 'Plugins', this.pluginSearch, this.defaultPluginItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultPluginItems() {\n return await this.pluginSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async pluginSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getPlugins(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n // siteUrl is at globalThis.turboAdmin.wp.siteUrl\n const item = new ContentItem;\n item.title = result.name;\n item.subtype = 'Plugin';\n // TODO: Maybe set this to be a search on the plugin screen?\n // Plugin \"slug\" is in result.name\n\n const itemViewUrlParams = new URLSearchParams();\n itemViewUrlParams.set('plugin_status', 'all');\n itemViewUrlParams.set('s', result.name);\n item.submenuItems.push(\n new SubmenuItem(\n 'View',\n globalThis.taWp.siteUrl + '/plugins.php?' + itemViewUrlParams.toString()\n )\n );\n // Activate: /wp-admin/plugins.php?action=activate&plugin=order-simulator-woocommerce%2Fwoocommerce-order-simulator.php&plugin_status=all&paged=1&s&_wpnonce=3714a01759\n\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\n\nexport default class TurboAdminUserSearch extends TurboAdminPlugin {\n constructor() {\n super('WP Users');\n\n this.searchModes.push( new SearchMode('user', 'Users', this.userSearch, this.defaultUserItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n // TODO: Is this right? Should we check for API access?\n return true;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultUserItems() {\n return await this.userSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async userSearch(searchString) {\n /**\n * Possible actual code\n */\n const results = await globalThis.contentApi.getUsers(searchString);\n\n if (! Array.isArray(results)) {\n return [];\n }\n\n return results.map(result => {\n const item = new ContentItem;\n if (result.first_name && result.last_name) {\n item.title = `${result.first_name} ${result.last_name} - `;\n }\n item.title += result.email;\n item.subtype = result.roles[0];\n item.url = globalThis.taWp.siteUrl + `/user-edit.php?user_id=${result.id}`;\n return item;\n });\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\n\nexport default class TurboAdminMUSites extends TurboAdminPlugin {\n constructor() {\n super('WP Multisite Sites');\n\n this.searchModes.push( new SearchMode('site', 'Sites', this.siteSearch.bind(this), this.defaultSiteItems.bind(this)) );\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\n return Boolean(document.querySelector('#wp-admin-bar-my-sites'));\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Callback to get default items when entering a search mode\n *\n * @returns {Promise<ContentItem[]>}\n */\n async defaultSiteItems() {\n return await this.siteSearch('');\n }\n\n /**\n * @param {string} searchString\n * @returns {Promise<ContentItem[]>}\n */\n async siteSearch(searchString) {\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 const sites = document.querySelectorAll('#wp-admin-bar-my-sites #wp-admin-bar-my-sites-list > li');\n\n if (sites.length === 0) {\n return [];\n }\n\n const sitesArray = Array.from(sites);\n const sitesLinks = sitesArray.map(site => site.querySelector('a'));\n const filteredSites = sitesLinks.filter(site => site.innerText.toLowerCase().includes(searchString.toLowerCase()));\n\n return filteredSites.map(site => {\n const item = new ContentItem;\n item.title = site.innerText;\n item.subtype = 'Site';\n item.url = site.href;\n\n item.submenuItems = item.submenuItems.concat(this.makeSubmenuItems(site));\n\n return item;\n });\n }\n\n makeSubmenuItems(siteElement) {\n const submenuItems = [];\n\n const submenu = siteElement.nextElementSibling.querySelector(`.ab-submenu`);\n if (! submenu) {\n return [];\n }\n\n const submenuLinks = submenu.querySelectorAll('a');\n if (submenuLinks.length === 0) {\n return [];\n }\n\n const submenuLinksArray = Array.from(submenuLinks);\n submenuLinksArray.forEach(link => {\n const submenuItem = new SubmenuItem(link.innerText, link.href);\n submenuItems.push(submenuItem);\n });\n\n return submenuItems;\n }\n}\n", "import TurboAdminPlugin from '../types/class-turbo-admin-plugin.js';\nimport SearchMode from '../types/class-search-mode.js';\nimport ContentItem from '../types/class-content-item.js';\nimport SubmenuItem from '../types/class-submenu-item.js';\nimport ItemDefinition from '../types/class-item-definition.js';\n\nexport default class TurboAdminOxygenBuilder extends TurboAdminPlugin {\n constructor() {\n super('OxygenBuilder');\n }\n\n /**\n * Should the plugin activate\n *\n * @returns {boolean}\n */\n shouldActivate() {\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\n const hasOxygenBuilder = Boolean(oxygenLinkElem);\n\n // Save Oxygen builder status\n window.localStorage.setItem('ta-has-oxygen-builder', hasOxygenBuilder ? '1' : '0' );\n\n return hasOxygenBuilder;\n }\n\n /**\n * Activate and initialise the plugin\n */\n activate() {\n super.activate();\n }\n\n /**\n * Get additional menu items to be added to the main menu\n *\n * @return {Promise<ItemDefinition[]>}\n */\n async getAdditionalItemDefinitions() {\n const editDefinition = new ItemDefinition();\n editDefinition.detectType = 'dom';\n editDefinition.detectSelector = '#ct-edit-template-builder';\n editDefinition.itemTitleFunction = () => 'Edit with Oxygen';\n editDefinition.itemUrlFunction = (element) => element.href;\n editDefinition.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 const backToWpDefinition = new ItemDefinition();\n backToWpDefinition.detectType = 'dom';\n backToWpDefinition.detectSelector = '.oxygen-back-to-wp-menu .oxygen-toolbar-button-dropdown a:not(:last-of-type)';\n backToWpDefinition.itemTitleFunction = (element) => 'Back to WP: ' + element.textContent;\n backToWpDefinition.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 backToWpDefinition.noCache = true;\n\n return [\n editDefinition,\n backToWpDefinition,\n ];\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 */\n\nimport TurboAdminPalette from './class-turbo-admin-palette.js';\nimport TurboAdminMenuItem from './types/class-turbo-admin-menu-item.js';\nimport SearchMode from './types/class-search-mode.js';\nimport TurboAdminPlugin from './types/class-turbo-admin-plugin.js';\nimport Acf from './plugins/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';\nimport TurboAdminBarkeeper from './plugins/class-turbo-admin-barkeeper.js';\nimport TurboAdminContentSearch from './plugins/class-turbo-admin-content-search.js';\nimport TurboAdminPluginSearch from './plugins/class-turbo-admin-plugins.js';\nimport TurboAdminUserSearch from './plugins/class-turbo-admin-users.js';\n// import TurboAdminWoocommerce from './plugins/class-turbo-admin-woocommerce.js';\n// import TurboAdminGravityForms from './plugins/class-turbo-admin-gravity-forms.js';\nimport TurboAdminMUSites from './plugins/class-turbo-admin-mu-sites.js';\nimport TurboAdminOxygenBuilder from './plugins/class-turbo-admin-oxygen-buillder.js';\n\nexport default class TurboAdmin {\n\n /**\n * @param {*} options\n * @returns {TurboAdmin}\n */\n constructor(options) {\n // Sometimes we get a second copy of TA running, like if the plugin is running too.\n // Is this case we want to skip the initialisation.\n this.doInit = true;\n\n if (document.getElementById('ta-command-palette-container')) {\n console.log('TurboAdmin already initialised - I won\\'t make a second copy!');\n this.doInit = false;\n return globalThis.turboAdmin;\n }\n\n this.options = options;\n this.plugins = {};\n\n // TODO: Something? What should this type be?\n this.searchModes = {};\n\n // On the front end we set this if there is no saved menu.\n this.menuNeedsRefresh = false;\n }\n\n /**\n * Perform initialization - this is all the things that do not need APIs to\n * get set up.\n */\n async init() {\n if (! this.doInit) {\n return;\n }\n\n // Register all the plugins\n new TurboAdminBarkeeper();\n new TurboAdminContentSearch();\n new TurboAdminPluginSearch();\n new TurboAdminUserSearch();\n // new TurboAdminWoocommerce();\n // new TurboAdminGravityForms();\n new TurboAdminMUSites();\n new TurboAdminOxygenBuilder();\n\n // Grab the global Wp object instance\n this.wp = globalThis.taWp;\n\n this.menu = [];\n\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 // Check for .logged-in class on body - if logged in, we can use the saved menu,\n // if it exists.\n if (document.body.classList.contains('logged-in')) {\n // Get from localStorage\n const savedMenu = window.localStorage.getItem('ta-palette-data');\n\n // This attempts to see if we have cached items from the back-en\n if (null === savedMenu) {\n this.menuNeedsRefresh = true;\n } else {\n this.menu = JSON.parse(savedMenu);\n // Check if there is no \"Media\" item - this should ONLY be in the back-end\n if (! this.menu.some(item => item.action.endsWith('upload.php'))) {\n this.menuNeedsRefresh = true;\n }\n // Merge (?) the items?\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 await 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\n /**\n * These are initialization steps that DO needs APIs to be set up.\n */\n activatePlugins() {\n // Initialize all plugins\n Object.keys(this.plugins).forEach( plugin => {\n if (this.plugins[plugin].shouldActivate()) {\n this.plugins[plugin].activate();\n }\n })\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 /**\n * True if the plugin has been activated\n *\n * @param {string} name Name of the plugin to check for\n * @returns {boolean}\n */\n hasActivatedPlugin(name) {\n return Object.keys(this.plugins).includes(name) &&\n this.plugins[name].activated;\n }\n\n /**\n * Gather the WordPress dashboard admin (sidebar) menu items\n *\n * @returns { TurboAdminMenuItem[] }\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 /**\n * Adds additional menu items passed in by configuration to the\n * menu items list.\n */\n async 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 // Technically this is an array of {ItemDefintion} but more work needed to make that happen.\n let extraItems = this.options.extraItems ?? [];\n\n // Get any extra items defined by plugins\n const pluginKeys = Object.keys(this.plugins);\n\n for (let i=0; i < pluginKeys.length; i++) {\n extraItems = extraItems.concat(await this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());\n }\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 );\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 // Just grab any old element. We shouldn't need it.\n elements = document.querySelectorAll('body');\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 /**\n * Builds the palette HTML and adds it to the DOM.\n */\n addPalette() {\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 // Palette notice\n const paletteNotice = document.createElement('div');\n paletteNotice.id = 'ta-command-palette-notice';\n // Tab notice\n const tabNotice = document.createElement('div');\n tabNotice.id = 'ta-command-palette-tab-notice';\n // Tab notice text\n const tabNoticeText = document.createElement('span');\n tabNoticeText.id = 'ta-command-palette-tab-notice-text';\n // Tab notice \"button\"\n const tabNoticeButton = document.createElement('span');\n tabNoticeButton.id = 'ta-command-palette-tab-notice-button';\n tabNoticeButton.innerText = 'Tab';\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 // Search mode tag\n const searchModeTag = document.createElement('div');\n searchModeTag.id = 'ta-command-palette-search-mode-tag';\n // List container (needed to contain the main list and the submenu list)\n const listContainer = document.createElement('div');\n listContainer.id = \"ta-command-palette-items-container\";\n // List\n const list = document.createElement('ul');\n list.id = \"ta-command-palette-items\";\n // Sub-menu list\n const submenuContainer = document.createElement('div');\n submenuContainer.id = \"ta-command-palette-submenu-container\";\n // Join it all up\n container.appendChild(palette);\n palette.appendChild(searchModeTag);\n palette.appendChild(paletteNotice);\n tabNotice.appendChild(tabNoticeText);\n tabNotice.appendChild(tabNoticeButton);\n palette.appendChild(tabNotice);\n palette.appendChild(input);\n listContainer.appendChild(list);\n listContainer.appendChild(submenuContainer);\n palette.appendChild(listContainer);\n\n if (document.getElementById('wpadminbar') && this.options['admin-bar-search'] === true) {\n const paletteLi = document.createElement('li');\n paletteLi.appendChild(container);\n const adminBar = document.getElementById('wp-admin-bar-top-secondary');\n adminBar.appendChild(paletteLi);\n\n // Add focus handler\n input.addEventListener('focus', e => this.turboAdminPalette.showPalette());\n\n // Add placeholder\n const placeholder = document.createElement('div');\n placeholder.id = 'ta-shortcut-key-placeholder';\n placeholder.innerText = this.buildShortcutKeysString();\n placeholder.addEventListener('click', e => input.focus());\n\n palette.insertBefore( placeholder, listContainer );\n } else {\n // Container\n document.querySelector(this.options.appendToElement ?? 'body').appendChild(container);\n }\n }\n\n /**\n * Register a plugin with Turbo Admin\n *\n * @param {TurboAdminPlugin} plugin\n */\n registerPlugin(plugin) {\n turboAdminLog('Registering plugin ' + plugin.name);\n this.plugins[plugin.name] = plugin;\n }\n\n /**\n * Register a palette search mode and its associated plugin\n *\n * this is usually bound to the searchMode, so\n *\n * @param {SearchMode} searchMode\n */\n registerSearchMode(searchMode) {\n turboAdminLog('Registering search mode with keyword ' + searchMode.keyword);\n // Don't use `this` as we are bound!\n globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode;\n }\n\n /**\n * Returns a string representation of the palette's keyboard shortcut\n *\n * @returns { String }\n */\n buildShortcutKeysString () {\n let keysString = '';\n let shortcut = this.options.shortcutKeys[0];\n\n if ( shortcut.meta ) {\n keysString += 'Cmd-';\n }\n if ( shortcut.ctrl ) {\n keysString += 'Ctrl-';\n }\n if ( shortcut.alt ) {\n keysString += 'Alt-';\n }\n if ( shortcut.shift ) {\n keysString += 'Shift-';\n }\n keysString += shortcut.key.toUpperCase();\n return keysString;\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<String|Boolean>} 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<urls.length; i++) {\n if (workingUrl) continue;\n result = await this.testUrl(urls[i], responseUrlMustContain);\n if (result !== false) {\n workingUrl = result;\n }\n }\n return workingUrl;\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessSiteUrlFromHome( homeUrl ) {\n const homeWithSlash = this.ensureTrailingSlash(homeUrl);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // homeWithSlash + 'wp-admin/',\n // homeWithSlash + 'wp/wp-admin'\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return homeWithSlash + 'wp-admin/';\n }\n\n /**\n *\n * @param {String} homeUrl\n */\n async guessHome() {\n const currentUrl = new URL(window.location);\n const origin = this.ensureTrailingSlash(currentUrl.origin);\n\n // NOTE: Backed out of this until I can make it work async.\n // Might not even be a good idea anyway.\n\n // const possibleUrls = [\n // origin\n // ];\n // return this.findWhichUrlWorks(possibleUrls, 'wp-admin');\n return origin;\n }\n\n /**\n *\n * @param {String} siteUrl\n * @returns {String}\n */\n guessHomeFromSiteUrl(siteUrl) {\n // Not much we can do here.\n return siteUrl.replace(/wp-admin\\/?/, '');\n }\n\n async getUrls() {\n // See if we can actually find the URL for the API\n /** @type {HTMLLinkElement|null} */\n const apiLink = document.querySelector('link[rel=\"https://api.w.org/\"]');\n\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 is easy in the back end/Dashboard!\n this.siteUrl = window.location.href.match(/(^.*wp-admin)/)[1];\n this.home = document.getElementById('wp-admin-bar-site-name').querySelector('a').href;\n\n // Always set the siteUrl and home as this is definitive\n window.localStorage.setItem('ta-palette-data-siteurl', this.siteUrl);\n window.localStorage.setItem('ta-palette-data-home', this.home);\n } else if (! this.siteUrl || ! this.home) {\n let urlsFound = false;\n\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 const dashboardLink = document.getElementById('wp-admin-bar-dashboard')?.querySelector('a');\n if (dashboardLink) {\n this.siteUrl = dashboardLink.href;\n }\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 urlsFound = true;\n } else {\n // We might know what the siteUrl is, so guess the home from the siteUrl\n if (this.siteUrl) {\n this.home = this.guessHomeFromSiteUrl(this.siteUrl);\n urlsFound = true;\n }\n }\n }\n if (! urlsFound) {\n // Try for the API link\n // TODO: This needs to be async so it doesn't hold things up.\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 // We (probably) know what the home link is now, so guess the wp-admin\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome( this.home );\n } else {\n this.siteUrl = this.guessSiteUrl();\n }\n urlsFound = true;\n }\n }\n if (! urlsFound) {\n // We got nothing.\n this.home = await this.guessHome();\n if (this.home) {\n this.siteUrl = await this.guessSiteUrlFromHome(this.home);\n }\n }\n }\n\n // Always trim the / for comparisons\n if (this.siteUrl) {\n this.siteUrl = this.siteUrl.replace(/(.+)\\/$/, '$1');\n }\n if (this.home) {\n this.home = this.home.replace(/(.+)\\/$/, '$1');\n }\n\n // turboAdminLog('siteUrl: ', this.siteUrl);\n // turboAdminLog('home: ', this.home);\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class WoocommerceApi {\n\n constructor() {\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 getOrders(searchString) {\n // Check the cache\n if (undefined !== this.cache['orders-' + searchString]) {\n return this.cache['orders-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"orders\",\n {\n search: searchString,\n per_page: 100,\n }\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['orders-' + searchString] = result;\n\n return result;\n }\n\n async getOrder(orderId) {\n // Check the cache\n if (undefined !== this.cache['order-' + orderId]) {\n return this.cache['order-' + orderId];\n }\n\n // Fetch results\n const response = await this.wooGet(\n `orders/${orderId}`\n );\n\n if (response === false) {\n return false;\n }\n\n // Decode JSON\n const result = await response.json();\n\n let resultAsArray = [ result ];\n\n // Store in the cache\n this.cache['order-' + orderId] = resultAsArray;\n\n return resultAsArray;\n }\n\n async getCustomers(searchString) {\n // Check the cache\n if (undefined !== this.cache['customers-' + searchString]) {\n return this.cache['customers-' + searchString];\n }\n\n // Fetch results\n const response = await this.wooGet(\n \"customers\",\n {\n search: searchString,\n per_page: 100,\n role: 'all',\n }\n );\n\n if (response === false) {\n return false;\n }\n // Decode JSON\n const result = await response.json();\n\n // Store in the cache\n this.cache['customers-' + searchString] = result;\n\n return result;\n }\n\n // TODO: Add docblock and types\n async wooGet(path, data = {}) {\n const wooApiBase = globalThis.contentApi.apiRoot + 'wc/v3/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${wooApiBase}${path}/?${params}`, init);\n\n if ( response.status === 404 ) {\n return false;\n }\n if ( (response.status < 200 || response.status >= 300) ) {\n // TODO: Set a \"deferred\" notice to show when the palette is created?\n if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.');\n } else {\n // Always log this as people may look\n turboAdminLog('TURBO ADMIN: WooCommerce API Error. Try visiting the WordPress Dashboard to refresh things.');\n }\n }\n\n return response;\n }\n\n}\n", "import Storage from '../class-storage.js';\n// import ContentApi from './class-content-api.js';\n\nexport default class GravityFormsApi {\n\n constructor() {\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 getForms(searchString) {\n // Check the cache\n if (undefined !== this.cache['gf-forms-' + searchString]) {\n return this.cache['gf-forms-' + searchString];\n }\n\n // Fetch results\n const response = await this.gfGet(\n \"forms\",\n {}\n );\n\n // Decode JSON\n const result = await response.json();\n\n // TODO: Trap for errors\n\n // Filter by search string - the API doesn't do this for us\n const searchStringLowerCase = searchString.toLowerCase();\n const formIds = Object.keys(result);\n for (let k = 0; k < formIds.length; k++) {\n const thisId = formIds[k];\n if (! result[thisId].title.toLowerCase().includes(searchStringLowerCase)) {\n delete result[thisId];\n }\n }\n\n // Store in the cache\n this.cache['gf-forms-' + searchString] = result;\n\n return result;\n }\n\n async gfGet(path, data = {}) {\n const gfApiBase = globalThis.contentApi.apiRoot + 'gf/v2/';\n\n const init = {\n method: 'GET',\n headers: {},\n mode: 'cors',\n cache: 'no-store',\n credentials: 'include'\n }\n\n // Add the nonce if there is one\n if (globalThis.contentApi.apiNonce) {\n data._wpnonce = globalThis.contentApi.apiNonce;\n }\n\n const params = globalThis.contentApi.makeParamString(data);\n\n const response = await fetch(`${gfApiBase}${path}/?${params}`);\n\n if (response.status < 200 || response.status >= 300) {\n // TODO: Set a \"deferred\" notice to show when the palette is created?\n if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) {\n globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.');\n } else {\n // Always log this as people may look\n turboAdminLog('TURBO ADMIN: Gravity Forms API Error. Try visiting the WordPress Dashboard to refresh things.');\n }\n }\n\n return response;\n }\n\n}\n", "import TurboAdmin from './class-turbo-admin.js';\nimport ContentApi from './apis/class-content-api.js';\nimport Wp from './class-wp.js';\nimport TurboAdminWpNotices from './class-turbo-admin-wp-notices.js';\nimport WoocommerceApi from './apis/class-woocommerce-api.js';\nimport GravityFormsApi from './apis/class-gravity-forms-api.js';\n\nconst taStorageKey = 'turbo-admin-settings';\n\nlet debugMode = false;\n\nwindow.turboAdminLog = function() {\n if (debugMode) {\n console.log(...arguments);\n }\n}\n\nwindow.turboAdminIsExtension = function() {\n return 'undefined' !== typeof (chrome.storage);\n}\n\n// Use this to clear storage\n// chrome.storage.local.remove(taStorageKey).then();\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 if (typeof(globalThis.turboAdmin) !== 'undefined') {\n // Already initialised for some reason\n return;\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 }\n\n globalThis.turboAdminOptions = settings[taStorageKey];\n\n // Set debug mode\n debugMode = globalThis.turboAdminOptions['debug-mode'];\n\n turboAdminLog('Preparing Turbo Admin');\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 turboAdminLog('Turbo Admin: WP is initialised');\n\n // Get/set api settings\n globalThis.contentApi = new ContentApi();\n await globalThis.contentApi.discoverApiRoot();\n await globalThis.contentApi.discoverPostTypes();\n globalThis.woocommerceApi = new WoocommerceApi();\n globalThis.gravityFormsApi = new GravityFormsApi();\n\n turboAdminLog('Turbo Admin: Content API is initialised');\n\n globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions);\n await globalThis.turboAdmin.init();\n\n\n\n // This needs all the APIs to be ready\n await globalThis.turboAdmin.activatePlugins();\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 'barkeeper': globalThis.wpTurboAdmin['barkeeper'] === '1',\n 'admin-bar-search': globalThis.wpTurboAdmin['adminBarSearch'] === '1',\n 'debug-mode': globalThis.wpTurboAdmin['debugMode'] === '1',\n\t}\n\tawait taInit(globalThis.turboAdminOptions);\n});\n"], 5 "mappings": "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", 6 6 "names": [] 7 7 } -
turbo-admin/trunk/readme.txt
r2835889 r2871191 4 4 Tags: menu, commands, shortcuts 5 5 Requires at least: 4.9 6 Tested up to: 6. 17 Requires PHP: 7. 28 Stable tag: 1.1 2.16 Tested up to: 6.2 7 Requires PHP: 7.4 8 Stable tag: 1.13.2 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 42 42 * Live/dev site labels 43 43 44 Remember, the browser extension itworks everywhere that it can detect WordPress, without needing a plugin. And it carries your preferences with you! It's WordPress, your way!44 Remember, the browser extension works everywhere that it can detect WordPress, without needing a plugin. And it carries your preferences with you! It's WordPress, your way! 45 45 46 46 [Check out the Browser Extension and try it for free](https://turbo-admin.com/) … … 185 185 == Changelog == 186 186 187 = 1.13.2 = 188 189 * [ENHANCEMENT] Storage abstraction enhancements 190 * [ENHANCEMENT] Improved notice handling (again!) 191 * [FIX] Save Barkeeper state properly 192 * [FIX] Content API now uses the storage abstraction to work on both plugin and extension. 193 194 = 1.13.1 = 195 196 This version was skipped in the plugin. 197 198 * Version bump for publishing the Firefox extension 199 200 = 1.13.0 = 201 202 This version was skipped in the plugin. 203 204 * [ENHANCEMENT] Some code rewrites because the extension now uses "Manifest v3" which is a new extension format. Hopefully nothing is broken but PLEASE report any issues. 205 * [ENHANCEMENT] Speed improvements in some situations (cache post types collected from the API). 206 * [ENHANCEMENT] Improvements to list-table keys (more list-table key nav improvements coming). 207 * [ENHANCEMENT] Other behind-the-scenes improvements and preparations for other new features. 208 * [ENHANCEMENT] Add debug mode and suppress most errors if it's turned off. 209 * [FIX] Fix for WP 6.2 site editor interface (props Courtney Robertson) 210 211 187 212 = 1.12.1 = 188 213 * Version bump for publishing -
turbo-admin/trunk/src/apis/class-content-api.js
r2835882 r2871191 5 5 constructor() { 6 6 // this.discoverApiRoot().then(e => null); 7 // console.log('Discovered API base: ', this.apiBase);7 // turboAdminLog('Discovered API base: ', this.apiBase); 8 8 this.active = false; 9 9 this.store = new Storage(); … … 16 16 17 17 async discoverApiRoot() { 18 console.log('Discovering API root');18 turboAdminLog('Discovering API root'); 19 19 let wpApiSettings = null; 20 20 this.storageKey = 'wpApiSettings.' + globalThis.taWp.home; … … 64 64 } 65 65 // This should be very rare. I should only really see it in development. 66 console.log('API Route Discovery failed'); 66 turboAdminLog('API Route Discovery failed'); 67 // Making best guess 68 this.apiBase = globalThis.taWp.home + '/wp-json/wp/v2/'; 67 69 // TODO: This can't display as the palette isn't created yet. 68 70 // globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Can\'t find the WP API. Try visiting the dashboard to refresh things.'); … … 70 72 71 73 async discoverPostTypes() { 72 console.log('Discovering post types');74 turboAdminLog('Discovering post types'); 73 75 if (! this.active) { 74 console.log('Not active');76 turboAdminLog('Not active'); 75 77 this.postTypes = []; 76 78 return; 77 79 } 78 80 81 const postTypes = await this.store.get('ta-post-types'); 82 83 // Check local storage cache 84 if (postTypes && postTypes['ta-post-types'] && postTypes['ta-post-types']['expiry'] > Date.now()) { 85 turboAdminLog('Using cached post types: ', postTypes['ta-post-types']['data']); 86 this.postTypes = postTypes['ta-post-types']['data']; 87 return; 88 } 89 79 90 this.postTypes = await this.getPostTypes(); 80 console.log('Discovered post types: ', this.postTypes); 91 turboAdminLog('Discovered post types: ', this.postTypes); 92 93 // Cache for 10 minutes 94 const expiry = Date.now() + (10 * 60 * 1000); 95 this.store.set({ 96 'ta-post-types': { 97 expiry: expiry, 98 data: this.postTypes 99 } 100 }); 81 101 } 82 102 … … 266 286 267 287 if (response.status < 200 || response.status >= 300) { 268 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.'); 288 // TODO: Set a "deferred" notice to show when the palette is created? 289 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 290 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WordPress API Error. Try visiting the dashboard to refresh things.'); 291 } else { 292 // Always log this as people may look 293 turboAdminLog( 'TURBO ADMIN: WordPress API Error. Try visiting the WordPress Dashboard to refresh things.' ); 294 } 269 295 } 270 296 -
turbo-admin/trunk/src/apis/class-gravity-forms-api.js
r2835882 r2871191 64 64 65 65 if (response.status < 200 || response.status >= 300) { 66 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.'); 66 // TODO: Set a "deferred" notice to show when the palette is created? 67 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 68 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('Gravity Forms API Error. Try visiting the dashboard to refresh things.'); 69 } else { 70 // Always log this as people may look 71 turboAdminLog('TURBO ADMIN: Gravity Forms API Error. Try visiting the WordPress Dashboard to refresh things.'); 72 } 67 73 } 68 74 -
turbo-admin/trunk/src/apis/class-woocommerce-api.js
r2835882 r2871191 117 117 } 118 118 if ( (response.status < 200 || response.status >= 300) ) { 119 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.'); 119 // TODO: Set a "deferred" notice to show when the palette is created? 120 if (globalThis.turboAdmin && globalThis.turboAdmin.turboAdminPalette) { 121 globalThis.turboAdmin.turboAdminPalette.showPaletteNotice('WooCommerce API Error. Try visiting the dashboard to refresh things.'); 122 } else { 123 // Always log this as people may look 124 turboAdminLog('TURBO ADMIN: WooCommerce API Error. Try visiting the WordPress Dashboard to refresh things.'); 125 } 120 126 } 121 127 -
turbo-admin/trunk/src/class-list-table-shortcuts.js
r2702218 r2871191 59 59 if (this.currentRow === null) { 60 60 this.currentRowIndex = 0; 61 } else {61 } else if (this.currentRowIndex < this.tableRows.length - 1) { 62 62 this.currentRowIndex++; 63 63 } … … 70 70 if (this.currentRowIndex > 0) { 71 71 this.currentRowIndex--; 72 this.updateTable();73 72 } 73 74 this.updateTable(); 74 75 } 75 76 … … 89 90 90 91 openTableRowItem() { 91 console.log(this);92 turboAdminLog(this); 92 93 /** @type {HTMLAnchorElement} */ 93 94 const link = this.currentRow.querySelector('a.row-title'); -
turbo-admin/trunk/src/class-storage.js
r2702218 r2871191 21 21 this.store = null; 22 22 23 if ('undefined' === typeof (browser)) { 23 if (this.inExtension()) { 24 this.store = chrome.storage.local; 25 } else { 24 26 this.store = window.localStorage; 25 } else {26 this.store = browser.storage.local;27 27 } 28 } 29 30 /** 31 * Returns true if we are in the extension. 32 */ 33 inExtension() { 34 return window.turboAdminIsExtension(); 28 35 } 29 36 … … 35 42 */ 36 43 async set(dataObject) { 37 if ('undefined' === typeof (browser)) { 44 if (this.inExtension()) { 45 await this.store.set(dataObject); 46 } else { 38 47 const keys = Object.keys(dataObject); 39 48 keys.forEach(key => this.store.setItem(key, JSON.stringify(dataObject[key]))); 40 } else {41 await this.store.set(dataObject);42 49 } 43 50 } … … 53 60 */ 54 61 async get(key) { 55 if ('undefined' === typeof (browser)) { 62 if (this.inExtension()) { 63 return await this.store.get(key); 64 } else { 56 65 let returnObj = {}; 57 66 let item = this.store.getItem(key); … … 67 76 returnObj[key] = itemObject; 68 77 return returnObj; 69 } else {70 return await this.store.get(key);71 78 } 72 79 } 73 74 80 } -
turbo-admin/trunk/src/class-turbo-admin-palette.js
r2835882 r2871191 27 27 constructor(paletteData, options) { 28 28 29 console.log('Initialising TurboAdmin');29 turboAdminLog('Initialising TurboAdmin'); 30 30 31 31 this.options = options; … … 202 202 */ 203 203 injectContentItems(contentItems, andRunSearch = true) { 204 console.log('Injecting items');204 turboAdminLog('Injecting items'); 205 205 206 206 if (contentItems.length > 0) { … … 228 228 const itemUrl = item.url; 229 229 230 // console.log('Adding item: ' + itemTitle);230 // turboAdminLog('Adding item: ' + itemTitle); 231 231 232 232 // // Check if item already exists 233 233 if (this.contentItemExists(itemUrl)) { 234 console.log('Not adding duplicate');234 turboAdminLog('Not adding duplicate'); 235 235 return; 236 236 } … … 367 367 newInputValue = newInputValue.slice(0, -1); 368 368 } 369 // console.log(`Checking palette input value ${newInputValue} for keyword`);369 // turboAdminLog(`Checking palette input value ${newInputValue} for keyword`); 370 370 if (this.isKeyword(newInputValue)) { 371 371 this.paletteSearchModeTabNoticeText.innerText = `Search for ${newInputValue}`; … … 469 469 */ 470 470 if (! this.inSearchMode() && (e.code === 'Tab' || e.key === ':')) { 471 console.log('Checking for search mode');471 turboAdminLog('Checking for search mode'); 472 472 let inputValue = this.paletteInputElement.value; 473 473 if (this.isKeyword(inputValue)) { 474 console.log('Found search mode ' + inputValue)474 turboAdminLog('Found search mode ' + inputValue) 475 475 e.preventDefault(); 476 476 // TODO: Work on this. … … 499 499 */ 500 500 async enterSearchMode(searchMode) { 501 console.log('Entering search mode for keyword ' + searchMode.keyword);501 turboAdminLog('Entering search mode for keyword ' + searchMode.keyword); 502 502 this.backupPaletteData(); 503 503 -
turbo-admin/trunk/src/class-turbo-admin-wp-block-editor-fullscreen-kill.js
r2702218 r2871191 7 7 8 8 constructor() { 9 10 // Don't run on the site editor screen 11 if (document.body.classList.contains( 'site-editor-php' )) { 12 return; 13 } 9 14 10 15 const attrObserver = new MutationObserver((mutations) => { -
turbo-admin/trunk/src/class-turbo-admin-wp-notices.js
r2835882 r2871191 33 33 */ 34 34 this.allowedClasses = [ 35 ' notice-success',36 ' notice-error',37 ' notice-failure',38 ' updated',35 '.notice-success', 36 '.notice-error', 37 '.notice-failure', 38 '.updated', 39 39 ] 40 41 this.noticesPanelInner = null; 40 42 41 43 if (rememberedNoticeIds) { … … 59 61 } 60 62 61 console.log('Notice Selectors', this.noticeSelectors);63 turboAdminLog('Notice Selectors', this.noticeSelectors); 62 64 const notices = document.querySelectorAll(this.noticeSelectors.join(',')); 63 console.log('Notices', notices);65 turboAdminLog('Notices', notices); 64 66 65 67 // Add buttons to notices that can be moved 66 68 notices.forEach(notice => { 67 this.maybeAddIdToNotice(notice) 68 69 if (this.keepNotice(notice)) { 70 const rememberButton = document.createElement('button'); 71 rememberButton.classList.add('ta-remember-notice-button'); 72 rememberButton.innerText = 'Move to panel'; 73 74 const forgetButton = document.createElement('button'); 75 forgetButton.classList.add('ta-forget-notice-button'); 76 forgetButton.innerText = 'Move to dashboard'; 77 78 notice.classList.add('ta-added-pos-relative'); 79 80 notice.appendChild(rememberButton); 81 notice.appendChild(forgetButton); 82 83 rememberButton.addEventListener('click', this.rememberNotice.bind(this), false, true); 84 forgetButton.addEventListener('click', this.forgetNotice.bind(this), false, true); 85 } 69 this.maybeAddIdToNotice(notice); 70 this.maybeAddMoveButtonToNotice.call(this, notice); 86 71 }); 87 72 88 const noticesToHide = Array.from(notices).filter(notice => { 89 if (this.rememberedNoticeIds.includes(notice.id)) { 90 return true; 91 } 92 93 if (this.keepNotice(notice)) { 94 return false; 95 } 96 97 // Invisible 98 if ( 99 notice.offsetHeight === 0 || 100 notice.offsetWidth === 0 101 ) { 102 return false; 103 } 104 105 return true; 106 }) 107 108 console.log('Notices to hide', noticesToHide) 73 const noticesToHide = Array.from(notices).filter( this.noticeShouldBeHidden.bind(this) ); 74 75 turboAdminLog('Notices to hide', noticesToHide) 109 76 110 77 /** … … 157 124 noticesPanel.dataset.open='no'; 158 125 159 const noticesPanelInner = document.createElement('div'); 160 noticesPanelInner.id = 'ta-notices-panel-inner'; 161 162 noticesToHide.forEach(notice => { 163 // See Toolbelt's implementation: https://github.com/BinaryMoon/wp-toolbelt/blob/dev/modules/tidy-notifications/src/js/script.js 164 noticesPanelInner.append(notice); 165 }); 126 this.noticesPanelInner = document.createElement('div'); 127 this.noticesPanelInner.id = 'ta-notices-panel-inner'; 128 129 noticesToHide.forEach(this.hideNotice.bind(this)); 166 130 167 131 /** 168 132 * Add wrap to the meta area 169 133 */ 170 noticesPanel.appendChild( noticesPanelInner);134 noticesPanel.appendChild(this.noticesPanelInner); 171 135 const screenMeta = document.getElementById('screen-meta'); 172 136 screenMeta.appendChild(noticesPanel); … … 176 140 // window.screenMeta.init(); 177 141 // } 142 143 // Add a mutation observer to check for notices added by JavaScript 144 // this.addObserver(); 145 } 146 147 addObserver() { 148 const observer = new MutationObserver( this.handleMutations.bind(this) ); 149 observer.observe(document.getElementById('wpbody-content'), { 150 childList: true, 151 subtree: true 152 }); 153 } 154 155 handleMutations(mutations, observer) { 156 mutations.forEach( mutation => { 157 if (mutation.type === 'childList') { 158 mutation.addedNodes.forEach( node => { 159 if (node.nodeType === Node.ELEMENT_NODE) { 160 console.log('MUTATING!!!' + node.id); 161 // this.maybeAddIdToNotice(node); 162 // this.maybeAddMoveButtonToNotice(node); 163 // this.maybeHideNotice(node); 164 } 165 }); 166 } 167 }); 178 168 } 179 169 180 170 // Does the allowedClasses list say that this notice should be shown? 181 171 keepNotice(noticeElem) { 182 return this.allowedClasses.reduce( (found, current) => { 183 return found || noticeElem.classList.contains(current) 184 }, false); 172 return noticeElem.matches(this.allowedClasses.join(', ')); 185 173 } 186 174 … … 193 181 const notice = ev.target.closest(this.noticeSelectors.join(',')); 194 182 const noticeId = notice.id; 195 console.log(`Remembering ${noticeId}`);183 turboAdminLog(`Remembering ${noticeId}`); 196 184 panelInner.appendChild(notice); 197 185 if (count === 0) { … … 206 194 } 207 195 196 noticeShouldBeHidden(notice) { 197 if (this.rememberedNoticeIds.includes(notice.id)) { 198 return true; 199 } 200 201 if (this.keepNotice(notice)) { 202 return false; 203 } 204 205 // Invisible 206 if ( 207 notice.offsetHeight === 0 || 208 notice.offsetWidth === 0 209 ) { 210 return false; 211 } 212 213 return true; 214 } 215 208 216 saveRememberedNotice(noticeId) { 209 217 this.rememberedNoticeIds.push(noticeId); 210 218 211 219 if ('object' === typeof(browser)) { 212 browser.runtime.sendMessage({220 chrome.runtime.sendMessage({ 213 221 'action': 'rememberNotice', 214 222 'noticeId': noticeId, … … 226 234 const notice = ev.target.closest(this.noticeSelectors.join(',')); 227 235 const noticeId = notice.id; 228 console.log(`Forgetting ${noticeId}`);236 turboAdminLog(`Forgetting ${noticeId}`); 229 237 230 238 notice.remove(); … … 253 261 254 262 if ('object' === typeof(browser)) { 255 browser.runtime.sendMessage({263 chrome.runtime.sendMessage({ 256 264 'action': 'rememberNotice', 257 265 'noticeId': noticeId, … … 266 274 * For notices without IDs we'll see if we can add an ID that's a hash of their classlist 267 275 */ 268 maybeAddIdToNotice(notice) { 269 if (notice.id && notice.id !== '' && notice.id !=='message') { 270 return; 271 } 272 273 const classes = notice.classList; 274 notice.id = Array.from(notice.classList).join('-'); 276 maybeAddIdToNotice(noticeElem) { 277 if (noticeElem.id && noticeElem.id !== '' && noticeElem.id !=='message') { 278 return; 279 } 280 281 const classes = noticeElem.classList; 282 noticeElem.id = Array.from(noticeElem.classList).join('-'); 283 } 284 285 /** 286 * Add buttons to notices that we want to be able to move to the panel 287 */ 288 maybeAddMoveButtonToNotice(noticeElem) { 289 if (this.keepNotice(noticeElem)) { 290 const rememberButton = document.createElement('button'); 291 rememberButton.classList.add('ta-remember-notice-button'); 292 rememberButton.innerText = 'Move to panel'; 293 294 const forgetButton = document.createElement('button'); 295 forgetButton.classList.add('ta-forget-notice-button'); 296 forgetButton.innerText = 'Move to dashboard'; 297 298 noticeElem.classList.add('ta-added-pos-relative'); 299 300 noticeElem.appendChild(rememberButton); 301 noticeElem.appendChild(forgetButton); 302 303 rememberButton.addEventListener('click', this.rememberNotice.bind(this), false, true); 304 forgetButton.addEventListener('click', this.forgetNotice.bind(this), false, true); 305 } 306 } 307 308 maybeHideNotice(noticeElem) { 309 if (this.noticeShouldBeHidden(noticeElem) && !noticeElem.classList.contains('ta-notice-hidden')) { 310 this.hideNotice(noticeElem); 311 } 312 } 313 314 hideNotice(noticeElem) { 315 noticeElem.classList.add('ta-notice-hidden'); 316 // WPCore's common.js will re-add the notice below the dashboard header unless it has a .inline class. 317 // It does: $( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $headerEnd ); 318 noticeElem.classList.add('inline'); 319 // See Toolbelt's implementation: https://github.com/BinaryMoon/wp-toolbelt/blob/dev/modules/tidy-notifications/src/js/script.js 320 this.noticesPanelInner.append(noticeElem); 275 321 } 276 322 -
turbo-admin/trunk/src/class-turbo-admin.js
r2835882 r2871191 49 49 import TurboAdminPlugin from './types/class-turbo-admin-plugin.js'; 50 50 import Acf from './plugins/class-acf.js'; 51 //import TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js';52 //import TurboAdminWpBlockEditorWelcomeGuideKill from './class-turbo-admin-wp-block-editor-welcome-guide-kill.js';51 import TurboAdminWpBlockEditorFullscreenKill from './class-turbo-admin-wp-block-editor-fullscreen-kill.js'; 52 import TurboAdminWpBlockEditorWelcomeGuideKill from './class-turbo-admin-wp-block-editor-welcome-guide-kill.js'; 53 53 import TurboAdminWpNotices from './class-turbo-admin-wp-notices.js'; 54 54 import TurboAdminListTableShortcuts from './class-list-table-shortcuts.js'; … … 145 145 146 146 // Add other additional items 147 this.addAdditionalMenuItems();147 await this.addAdditionalMenuItems(); 148 148 // Add items passed in using extraItemsRaw 149 149 this.menu = this.menu.concat(this.options.extraItemsRaw ?? []); … … 189 189 }) 190 190 191 //if (true === this.options['block-editor-fullscreen-disable']) {192 //// Initialise fullscreen kill193 //this.turboAdminFullscreenKill = new TurboAdminWpBlockEditorFullscreenKill();194 //}195 196 //if (true === this.options['block-editor-welcome-screen-kill']) {197 //this.turboAdminWelcomeKill = new TurboAdminWpBlockEditorWelcomeGuideKill();198 //}191 if (true === this.options['block-editor-fullscreen-disable']) { 192 // Initialise fullscreen kill 193 this.turboAdminFullscreenKill = new TurboAdminWpBlockEditorFullscreenKill(); 194 } 195 196 if (true === this.options['block-editor-welcome-screen-kill']) { 197 this.turboAdminWelcomeKill = new TurboAdminWpBlockEditorWelcomeGuideKill(); 198 } 199 199 200 200 if (true === this.options['list-table-keyboard-shortcuts']) { … … 261 261 * menu items list. 262 262 */ 263 a ddAdditionalMenuItems() {263 async addAdditionalMenuItems() { 264 264 265 265 /* … … 291 291 292 292 for (let i=0; i < pluginKeys.length; i++) { 293 extraItems = extraItems.concat( this.plugins[pluginKeys[i]].getAdditionalItemDefinitions());293 extraItems = extraItems.concat(await this.plugins[pluginKeys[i]].getAdditionalItemDefinitions()); 294 294 } 295 295 … … 381 381 if (item.detectType === 'url') { 382 382 detected = Boolean(window.location.href.includes(item.detectPattern)); 383 // Just grab any old element. We shouldn't need it. 384 elements = document.querySelectorAll('body'); 383 385 } else if (item.detectType === 'dom') { 384 386 if (item.detectSelector) { … … 494 496 */ 495 497 registerPlugin(plugin) { 496 console.log('Registering plugin ' + plugin.name);498 turboAdminLog('Registering plugin ' + plugin.name); 497 499 this.plugins[plugin.name] = plugin; 498 500 } … … 506 508 */ 507 509 registerSearchMode(searchMode) { 508 console.log('Registering search mode with keyword ' + searchMode.keyword);510 turboAdminLog('Registering search mode with keyword ' + searchMode.keyword); 509 511 // Don't use `this` as we are bound! 510 512 globalThis.turboAdmin.searchModes[searchMode.keyword] = searchMode; … … 532 534 keysString += 'Shift-'; 533 535 } 534 keysString += shortcut.key ;536 keysString += shortcut.key.toUpperCase(); 535 537 return keysString; 536 538 } -
turbo-admin/trunk/src/class-wp.js
r2702218 r2871191 167 167 window.localStorage.setItem('ta-palette-data-home', this.home); 168 168 } else if (! this.siteUrl || ! this.home) { 169 let urlsFound = false; 169 170 170 171 // If we're not in the backend then (in the extension at least) we … … 172 173 // admin bar and grab from that if there is one. 173 174 if (document.getElementById('wpadminbar')) { 174 this.siteUrl = document.getElementById('wp-admin-bar-dashboard').querySelector('a').href; 175 const dashboardLink = document.getElementById('wp-admin-bar-dashboard')?.querySelector('a'); 176 if (dashboardLink) { 177 this.siteUrl = dashboardLink.href; 178 } 175 179 // Try for the API link 176 180 if (this.apiLinkUrl) { … … 181 185 this.home = this.apiLinkUrl.replace(/index.php\?rest_route.*/, ''); 182 186 } 187 urlsFound = true; 183 188 } else { 184 // We know what the siteUrl is, so guess the home from the siteUrl 185 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 186 } 187 188 } else { 189 // We might know what the siteUrl is, so guess the home from the siteUrl 190 if (this.siteUrl) { 191 this.home = this.guessHomeFromSiteUrl(this.siteUrl); 192 urlsFound = true; 193 } 194 } 195 } 196 if (! urlsFound) { 189 197 // Try for the API link 190 198 // TODO: This needs to be async so it doesn't hold things up. … … 202 210 this.siteUrl = this.guessSiteUrl(); 203 211 } 204 } else { 205 // We got nothing. 206 this.home = await this.guessHome(); 207 if (this.home) { 208 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 209 } 212 urlsFound = true; 213 } 214 } 215 if (! urlsFound) { 216 // We got nothing. 217 this.home = await this.guessHome(); 218 if (this.home) { 219 this.siteUrl = await this.guessSiteUrlFromHome(this.home); 210 220 } 211 221 } … … 220 230 } 221 231 222 // console.log('siteUrl: ', this.siteUrl);223 // console.log('home: ', this.home);232 // turboAdminLog('siteUrl: ', this.siteUrl); 233 // turboAdminLog('home: ', this.home); 224 234 } 225 235 -
turbo-admin/trunk/src/main.js
r2835882 r2871191 8 8 const taStorageKey = 'turbo-admin-settings'; 9 9 10 let debugMode = false; 11 12 window.turboAdminLog = function() { 13 if (debugMode) { 14 console.log(...arguments); 15 } 16 } 17 18 window.turboAdminIsExtension = function() { 19 return 'undefined' !== typeof (chrome.storage); 20 } 21 10 22 // Use this to clear storage 11 // browser.storage.local.remove(taStorageKey).then();23 // chrome.storage.local.remove(taStorageKey).then(); 12 24 13 25 // Note that in the extension, the globalThis is not the browser's global scope, … … 29 41 globalThis.turboAdminOptions = settings[taStorageKey]; 30 42 31 console.log('Preparing Turbo Admin'); 43 // Set debug mode 44 debugMode = globalThis.turboAdminOptions['debug-mode']; 45 46 turboAdminLog('Preparing Turbo Admin'); 32 47 33 48 // Get Wp stuff ready … … 37 52 await globalThis.taWp.completeInit(); 38 53 39 console.log('Turbo Admin: WP is initialised');54 turboAdminLog('Turbo Admin: WP is initialised'); 40 55 41 56 // Get/set api settings … … 46 61 globalThis.gravityFormsApi = new GravityFormsApi(); 47 62 48 console.log('Turbo Admin: Content API is initialised');63 turboAdminLog('Turbo Admin: Content API is initialised'); 49 64 50 65 globalThis.turboAdmin = new TurboAdmin(globalThis.turboAdminOptions); … … 79 94 'barkeeper': globalThis.wpTurboAdmin['barkeeper'] === '1', 80 95 'admin-bar-search': globalThis.wpTurboAdmin['adminBarSearch'] === '1', 96 'debug-mode': globalThis.wpTurboAdmin['debugMode'] === '1', 81 97 } 82 98 await taInit(globalThis.turboAdminOptions); -
turbo-admin/trunk/src/plugins/class-turbo-admin-barkeeper.js
r2835882 r2871191 19 19 return false; 20 20 } 21 // Bail if we don't have the left-hand admin bar (some users only have right-hand side) 22 if (! document.getElementById('wp-admin-bar-root-default')) { 23 return false; 24 } 21 25 return true; 22 26 } … … 35 39 ]; 36 40 37 this.barkeeperState = globalThis.turboAdmin.options['barkeeper-state']; 41 this.selectorsToHide = [ 42 '#wp-admin-bar-root-default > li', 43 '.monsterinsights-adminbar-menu-item', 44 ]; 45 46 this.barkeeperState = this.getBarkeeperState(); 38 47 39 48 this.root = document.getElementById('wp-admin-bar-root-default'); 40 this.itemsToHide = document.querySelectorAll( '#wp-admin-bar-root-default > li'); 49 if (! this.root) { 50 return; 51 } 52 this.itemsToHide = document.querySelectorAll( this.selectorsToHide.join(', ') ); 41 53 42 54 Array.from(this.itemsToHide).forEach( element => { … … 61 73 this.barkeeperState = this.barkeeperState === 'open' ? 'closed' : 'open'; 62 74 63 browser.runtime.sendMessage({ 75 this.setBarkeeperState(this.barkeeperState); 76 }); 77 78 this.root.insertAdjacentElement('afterend', this.button); 79 80 this.setupObserver(); 81 } 82 83 /** 84 * Some awkward plugins add themselves into the bar using JS 85 */ 86 setupObserver() { 87 this.observer = new MutationObserver( mutations => { 88 mutations.forEach( mutation => { 89 if (mutation.type === 'childList') { 90 mutation.addedNodes.forEach( node => { 91 if (node.classList && node.classList.contains('ta-barkeeper-collapsable')) { 92 return; 93 } 94 if (node.id && this.exclusionIds.includes(node.id)) { 95 return; 96 } 97 // Check is the node matches any of the selectors 98 if (node.matches(this.selectorsToHide.join(', '))) { 99 node.classList.add('ta-barkeeper-collapsable'); 100 return; 101 } 102 }); 103 } 104 }); 105 }); 106 107 this.observer.observe(this.root, { 108 childList: true, 109 subtree: true, 110 }); 111 } 112 113 getBarkeeperState() { 114 if (window.turboAdminIsExtension()) { 115 return globalThis.turboAdmin.options['barkeeper-state']; 116 } else { 117 return window.localStorage.getItem('turbo-admin-barkeeper-state'); 118 } 119 } 120 121 setBarkeeperState(state) { 122 if (window.turboAdminIsExtension()) { 123 chrome.runtime.sendMessage({ 64 124 'action': 'barkeeperSetState', 65 125 'barkeeperState': this.barkeeperState, 66 126 }); 67 } );68 69 this.root.insertAdjacentElement('afterend', this.button);127 } else { 128 window.localStorage.setItem('turbo-admin-barkeeper-state', state); 129 } 70 130 } 71 72 131 } -
turbo-admin/trunk/src/plugins/class-turbo-admin-content-search.js
r2835882 r2871191 13 13 const thisPostTypeKey = postTypeKeys[i]; 14 14 const thisPostType = globalThis.contentApi.postTypes[thisPostTypeKey]; 15 // console.log('Adding search mode for post type', thisPostType);15 // turboAdminLog('Adding search mode for post type', thisPostType); 16 16 this.searchModes.push( this.makePostTypeSearchMode(thisPostType) ); 17 17 } -
turbo-admin/trunk/src/plugins/class-turbo-admin-gravity-forms.js
r2835882 r2871191 86 86 ) 87 87 88 console.log(item);88 turboAdminLog(item); 89 89 90 90 resultsArray.push(item); -
turbo-admin/trunk/src/plugins/class-turbo-admin-oxygen-buillder.js
r2835882 r2871191 46 46 * Get additional menu items to be added to the main menu 47 47 * 48 * @return { ItemDefinition[]}48 * @return {Promise<ItemDefinition[]>} 49 49 */ 50 getAdditionalItemDefinitions() {50 async getAdditionalItemDefinitions() { 51 51 const editDefinition = new ItemDefinition(); 52 52 editDefinition.detectType = 'dom'; -
turbo-admin/trunk/src/types/class-item-definition.js
r2835882 r2871191 39 39 40 40 /** 41 * [OPTIONAL] A string to find in the current URL to detect the item 42 * 43 * @type {string} 44 */ 45 detectPattern = ''; 46 47 /** 41 48 * A callback used to generate a menu item title from a detected element. Should be passed an 42 49 * HTML element and should return a string -
turbo-admin/trunk/src/types/class-turbo-admin-plugin.js
r2835882 r2871191 25 25 */ 26 26 registerPlugin() { 27 console.log('Inside plugin - requested registration of ' + this.name);27 turboAdminLog('Inside plugin - requested registration of ' + this.name); 28 28 globalThis.turboAdmin.registerPlugin(this); 29 29 } … … 57 57 * Get additional menu items to be added to the main menu 58 58 * 59 * @return { ItemDefinition[]}59 * @return {Promise<ItemDefinition[]>} 60 60 */ 61 getAdditionalItemDefinitions() {61 async getAdditionalItemDefinitions() { 62 62 return []; 63 63 } -
turbo-admin/trunk/turbo-admin.css
r2835882 r2871191 578 578 * List tables 579 579 */ 580 .ta-active-table-row { 580 .ta-active-table-row, 581 .ta-active-table-row th, 582 .ta-active-table-row td { 581 583 background-color: #ddd !important; 582 584 } -
turbo-admin/trunk/turbo-admin.php
r2835889 r2871191 9 9 * Text Domain: turbo-admin 10 10 * Domain Path: /languages 11 * Version: 1.1 2.111 * Version: 1.13.2 12 12 * 13 13 * @package Turbo_Admin … … 37 37 define('TURBO_ADMIN_BARKEEPER_META_NAME', 'turbo-admin-barkeeper'); 38 38 define('TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME', 'turbo-admin-list-table-shortcuts'); 39 define('TURBO_ADMIN_DEBUG_MODE_NAME', 'turbo-admin-debug-mode'); 39 40 40 41 function add_admin_scripts() … … 46 47 $barkeeper = get_user_meta( get_current_user_id(), TURBO_ADMIN_BARKEEPER_META_NAME, true ); 47 48 $listTableShortcuts = get_user_meta( get_current_user_id(), TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME, true ); 49 $debugMode = get_user_meta( get_current_user_id(), TURBO_ADMIN_DEBUG_MODE_NAME, true ); 48 50 49 51 // We will pass an array of shortcut key objects into the JS … … 61 63 'barkeeper' => intval( $barkeeper ) === 1, 62 64 'listTableShortcuts' => intval( $listTableShortcuts ) === 1, 65 'debugMode' => intval( $debugMode ) === 1, 63 66 ] ); 64 67 } … … 128 131 $barkeeper = get_user_meta( get_current_user_id(), TURBO_ADMIN_BARKEEPER_META_NAME, true ); 129 132 $listTableShortcuts = get_user_meta( get_current_user_id(), TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME, true ); 133 $debugMode = get_user_meta( get_current_user_id(), TURBO_ADMIN_DEBUG_MODE_NAME, true ); 130 134 ?> 131 135 <h3><?php _e('Turbo Admin settings', 'turbo_admin') ?></h3> … … 192 196 List table shortcuts (experimental) 193 197 </label> 198 <br> 199 <label for="turbo-admin-debug-mode"> 200 <input name="turbo-admin-debug-mode" type="checkbox" id="turbo-admin-debug-mode" value="1" <?php checked($debugMode) ?>> 201 Debug mode (lots of console.log!) 202 </label> 194 203 </td> 195 204 </tr> … … 241 250 } else { 242 251 update_user_meta($user_id, TURBO_ADMIN_LIST_TABLE_SHORTCUTS_NAME, 0); 252 } 253 if (isset($_POST['turbo-admin-debug-mode']) && in_array(intval($_POST['turbo-admin-debug-mode']), [0, 1], true) ) { 254 update_user_meta($user_id, TURBO_ADMIN_DEBUG_MODE_NAME, $_POST['turbo-admin-debug-mode']); 255 } else { 256 update_user_meta($user_id, TURBO_ADMIN_DEBUG_MODE_NAME, 0); 243 257 } 244 258 }
Note: See TracChangeset
for help on using the changeset viewer.