Changeset 3331684
- Timestamp:
- 07/21/2025 06:58:00 PM (8 months ago)
- Location:
- quick-admin-launcher
- Files:
-
- 28 added
- 2 deleted
- 10 edited
- 1 copied
-
tags/1.1 (copied) (copied from quick-admin-launcher/trunk)
-
tags/1.1/README.txt (modified) (3 diffs)
-
tags/1.1/build/index.asset.php (modified) (1 diff)
-
tags/1.1/build/index.css (modified) (1 diff)
-
tags/1.1/build/index.js (modified) (1 diff)
-
tags/1.1/includes/Config (added)
-
tags/1.1/includes/Config/PluginConfig.php (added)
-
tags/1.1/includes/DI (added)
-
tags/1.1/includes/DI/Container.php (added)
-
tags/1.1/includes/Interfaces (added)
-
tags/1.1/includes/Interfaces/SearchHandlerInterface.php (added)
-
tags/1.1/includes/QuickAL.php (added)
-
tags/1.1/includes/Services (added)
-
tags/1.1/includes/Services/AdminScriptsService.php (added)
-
tags/1.1/includes/Services/LoggerService.php (added)
-
tags/1.1/includes/Services/PostSearchHandler.php (added)
-
tags/1.1/includes/Services/SearchService.php (added)
-
tags/1.1/includes/Services/SettingsService.php (added)
-
tags/1.1/includes/Services/UserSearchHandler.php (added)
-
tags/1.1/includes/autoload.php (deleted)
-
tags/1.1/quick-admin-launcher.php (modified) (1 diff)
-
trunk/README.txt (modified) (3 diffs)
-
trunk/build/index.asset.php (modified) (1 diff)
-
trunk/build/index.css (modified) (1 diff)
-
trunk/build/index.js (modified) (1 diff)
-
trunk/includes/Config (added)
-
trunk/includes/Config/PluginConfig.php (added)
-
trunk/includes/DI (added)
-
trunk/includes/DI/Container.php (added)
-
trunk/includes/Interfaces (added)
-
trunk/includes/Interfaces/SearchHandlerInterface.php (added)
-
trunk/includes/QuickAL.php (added)
-
trunk/includes/Services (added)
-
trunk/includes/Services/AdminScriptsService.php (added)
-
trunk/includes/Services/LoggerService.php (added)
-
trunk/includes/Services/PostSearchHandler.php (added)
-
trunk/includes/Services/SearchService.php (added)
-
trunk/includes/Services/SettingsService.php (added)
-
trunk/includes/Services/UserSearchHandler.php (added)
-
trunk/includes/autoload.php (deleted)
-
trunk/quick-admin-launcher.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
quick-admin-launcher/tags/1.1/README.txt
r3254046 r3331684 4 4 Donate link: https://www.paypal.com/paypalme/dbkode 5 5 Requires at least: 5.7 6 Tested up to: 6. 76 Tested up to: 6.8 7 7 Requires PHP: 7.2 8 Stable tag: 1. 0.28 Stable tag: 1.1 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 65 65 66 66 == Changelog == 67 = 1.1 = 68 * Fix: console crash when less than 2 chars 69 * Fix: Shortcut keys saving issue 70 * PHP code refactoring 71 67 72 = 1.0.2 = 68 73 * Minor performance improvements … … 73 78 = 1.0 = 74 79 * Plugin release 80 81 == Development & Testing == 82 83 Requirements: 84 - PHP 8.0 or higher (required for PHPUnit 9) 85 - Composer 86 - Node.js & npm (for building assets) 87 - WordPress (for integration testing) 88 89 Setup: 90 1. Install PHP dependencies: 91 composer install 92 2. Install Node dependencies and build assets: 93 npm install 94 npm run build 95 3. Set up the WordPress test environment: 96 bash bin/install-wp-tests.sh wordpress_test root '' 127.0.0.1 latest 97 (Adjust DB credentials as needed) 98 99 Running Tests: 100 - Run all tests: 101 composer test 102 or 103 vendor/bin/phpunit 104 - Run tests with coverage: 105 composer test-coverage 106 107 Notes: 108 - Tests are located in the tests/ directory. 109 - The plugin uses the wp-phpunit framework for WordPress integration. 110 - Make sure your database is running and accessible for the test suite. -
quick-admin-launcher/tags/1.1/build/index.asset.php
r3253429 r3331684 1 <?php return array('dependencies' => array('react', 'wp-element'), 'version' => ' 92a7a31955b23100c983');1 <?php return array('dependencies' => array('react', 'wp-element'), 'version' => 'e54f72ebbdcfe2e73d0f'); -
quick-admin-launcher/tags/1.1/build/index.css
r3253429 r3331684 1 #quickal-modal-wrapper{background-color:rgba(0,0,0,.7);height:100%;left:0;position:fixed;top:0;width:100%;z-index:10000}#quickal-modal{background-color:#fefefe;border:1px solid #a9a9a9;border-radius:5px;box-shadow:0 0 10px 0;left:50%;margin-left:-200px;padding:10px;position:absolute;top:40%}#quickal-modal-input{background-color:#fefefe;border:none;font-size:20px;width:400px}#quickal-modal-input:focus{border:none;box-shadow:none}.quickal-modal-dropdown-item{color:#3c434a;padding:5px}.quickal-modal-dropdown-item a{color:#3c434a;text-decoration:none}.quickal-modal-dropdown-item.quickal-selected{background-color:#2271b1;color:#fff}.quickal-modal-dropdown-item.quickal-selected a{color:#fff}.quickal-icon-base64{background-repeat:no-repeat;background-size:contain;display:inline-block;height:12px;width:12px}.quickal-result-type{float:right}.quickal-ribbon{filter:drop-shadow(2px 3px 2px rgba(0,0,0,.5));position:absolute;right:10px;top:-3px}.quickal-ribbon .quickal-ribbon-content{background:#ba051b linear-gradient(45deg,transparent,hsla(0,0%,100%,.25));background-size:400% 400%;clip-path:polygon(0 0,100% 0,100% 100%,50% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,50% calc(100% - 6px),0 calc(100% - 12px));color:#fff;font-size:.75rem;font-weight:700;min-height:26px;padding:8px 2px 4px;position:relative;text-align:center;transition:clip-path 1s,padding 1s,background 1s;width:22px}.quickal-ribbon .quickal-ribbon-content.quickal-ribbon-content-loading{animation:quickalLoadingAnimation 1s ease-out infinite}.quickal-ribbon .quickal-ribbon-content .quickal-ribbon-logo{background:transparent url(images/logo.823fa92c.png) no-repeat 50%;background-size:contain;bottom:10px;left:0;position:absolute;top:5px;width:100%}@keyframes quickalLoadingAnimation{0%{background-color:#d12525}25%{background-color:#000}50%{background-color:#d12525}75%{background-color:#000}to{background-color:#d12525}}#quickal-modal .spinner{position:absolute;right:30px;top:20px}.quickal-settings-title{background:transparent url(images/logo-red.abbdc065.png) no-repeat 0;background-size:contain;line-height:30px;padding-left: 25px}#wpadminbar .quickal-admin-bar{position:relative}#wpadminbar .quickal-admin-bar .ab-item{width:15px}#wpadminbar .quickal-admin-bar .quickal-admin-bar-icon{background:transparent url(images/logo.823fa92c.png) no-repeat 0;background-size:contain;height:20px;margin-top:-10px;position:absolute;top:50%;width:20px}1 #quickal-modal-wrapper{background-color:rgba(0,0,0,.7);height:100%;left:0;position:fixed;top:0;width:100%;z-index:10000}#quickal-modal{background-color:#fefefe;border:1px solid #a9a9a9;border-radius:5px;box-shadow:0 0 10px 0;left:50%;margin-left:-200px;padding:10px;position:absolute;top:40%}#quickal-modal-input{background-color:#fefefe;border:none;font-size:20px;width:400px}#quickal-modal-input:focus{border:none;box-shadow:none}.quickal-modal-dropdown-item{color:#3c434a;padding:5px}.quickal-modal-dropdown-item a{color:#3c434a;text-decoration:none}.quickal-modal-dropdown-item.quickal-selected{background-color:#2271b1;color:#fff}.quickal-modal-dropdown-item.quickal-selected a{color:#fff}.quickal-icon-base64{background-repeat:no-repeat;background-size:contain;display:inline-block;height:12px;width:12px}.quickal-result-type{float:right}.quickal-ribbon{filter:drop-shadow(2px 3px 2px rgba(0,0,0,.5));position:absolute;right:10px;top:-3px}.quickal-ribbon .quickal-ribbon-content{background:#ba051b linear-gradient(45deg,transparent,hsla(0,0%,100%,.25));background-size:400% 400%;clip-path:polygon(0 0,100% 0,100% 100%,50% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,50% calc(100% - 6px),0 calc(100% - 12px));color:#fff;font-size:.75rem;font-weight:700;min-height:26px;padding:8px 2px 4px;position:relative;text-align:center;transition:clip-path 1s,padding 1s,background 1s;width:22px}.quickal-ribbon .quickal-ribbon-content.quickal-ribbon-content-loading{animation:quickalLoadingAnimation 1s ease-out infinite}.quickal-ribbon .quickal-ribbon-content .quickal-ribbon-logo{background:transparent url(images/logo.823fa92c.png) no-repeat 50%;background-size:contain;bottom:10px;left:0;position:absolute;top:5px;width:100%}@keyframes quickalLoadingAnimation{0%{background-color:#d12525}25%{background-color:#000}50%{background-color:#d12525}75%{background-color:#000}to{background-color:#d12525}}#quickal-modal .spinner{position:absolute;right:30px;top:20px}.quickal-settings-title{background:transparent url(images/logo-red.abbdc065.png) no-repeat 0;background-size:contain;line-height:30px;padding-left:40px!important}#wpadminbar .quickal-admin-bar{position:relative}#wpadminbar .quickal-admin-bar .ab-item{width:15px}#wpadminbar .quickal-admin-bar .quickal-admin-bar-icon{background:transparent url(images/logo.823fa92c.png) no-repeat 0;background-size:contain;height:20px;margin-top:-10px;position:absolute;top:50%;width:20px} -
quick-admin-launcher/tags/1.1/build/index.js
r3253429 r3331684 1 (()=>{"use strict";const e=window.React,t=window.wp.element,a=({quickalData:a})=>{const[n, l]=(0,t.useState)(!1),[o,c]=(0,t.useState)(""),[i,r]=(0,t.useState)([]),[s,u]=(0,t.useState)(0),[m,d]=(0,t.useState)(!1),[k,y]=(0,t.useState)(null);return(0,t.useEffect)((()=>{document.querySelector(".quickal-admin-bar > a").addEventListener("click",(e=>{l(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()}));const e=e=>{"quickal_setting_hotkey_display"!==document.activeElement.id&&(a.hotkey.key===e.key&&a.hotkey.alt===e.altKey&&a.hotkey.ctrl===e.ctrlKey&&a.hotkey.shift===e.shiftKey&&a.hotkey.meta===e.metaKey&&(l(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()),n&&"Escape"===e.key&&(l(!1),d(!1)),n&&"ArrowDown"===e.key&&u((e=>(e+1)%i.length)),n&&"ArrowUp"===e.key&&u((e=>(e-1+i.length)%i.length)),n&&"Enter"===e.key&&i[s]&&(window.location=i[s].link))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[n,i,s,a]),n?(0,e.createElement)("div",{id:"quickal-modal-wrapper",onClick:()=>{l(!1),d(!1)}},(0,e.createElement)("div",{id:"quickal-modal"},(0,e.createElement)("div",{className:"quickal-ribbon"},(0,e.createElement)("div",{className:"quickal-ribbon-content "+(m?"quickal-ribbon-content-loading":"")},(0,e.createElement)("div",{className:"quickal-ribbon-logo"}))),(0,e.createElement)("input",{id:"quickal-modal-input",type:"text",value:o,onChange:e=>{const t=e.target.value.toLowerCase().trim();if(c(t),0===t.length)return void r([]);const n=t.split(" "),l=a.adminMenu.filter((e=>n.every((t=>e.term.includes(t)))));r(l),u(0),d(!0);const o=t.replace(" ","+");clearTimeout(k),y(setTimeout((async()=>{const e=await fetch(`${a.rest}/search/${o}`,{headers:{"X-WP-Nonce":a.nonce,"Content-Type":"application/json;charset=utf-8"}}),t=await e.json();r((e=>[...e,...t])),d(!1)}),300))},onKeyDown:e=>{if("ArrowUp"===e.key||"ArrowDown"===e.key)return!1},placeholder:"Search any admin tool or content..."}),(0,e.createElement)("div",{className:"quickal-modal-dropdown"},i.map(((t,a)=>(0,e.createElement)("div",{key:a,className:"quickal-modal-dropdown-item "+(a===s?"quickal-selected":""),onMouseOver:()=>(e=>{u(e)})(a)},t.icon&&t.icon.includes("dashicons-")&&(0,e.createElement)("span",{className:`dashicons-before ${t.icon}`}),t.icon&&t.icon.includes("base64")&&(0,e.createElement)("span",{className:"quickal-icon-base64",style:{backgroundImage:`url(${t.icon})`}}),(0,e.createElement)("a",{href:t.link},(0,e.createElement)("span",null,t.label)),t.type&&(0,e.createElement)("div",{className:"quickal-result-type"},"(",(0,e.createElement)("span",null,t.type),")"))))))):null};document.addEventListener("DOMContentLoaded",(()=>{const n=(0,t.createRoot)(document.getElementById("quickal-modal-root")),l=window.quickalData;l.hotkey.alt=!!l.hotkey.alt,l.hotkey.ctrl=!!l.hotkey.ctrl,l.hotkey.shift=!!l.hotkey.shift,l.hotkey.meta=!!l.hotkey.meta,l.adminMenu=(()=>{const e=document.querySelectorAll("#adminmenu a");let t=[],a="",n=!1;var l="";for(let u=0;u<e.length;u+=1){var o=e[u].href,c=e[u].innerText.replace(/\n|\r/g,"").trim();if(n=e[u].className.includes("menu-top"),n){a=c;var i=e[u].querySelector(".wp-menu-image");if(i){var r=i.className.replace("dashicons-before","").match(/(dashicons-[a-z0-9-]*)/g);if(r)l=r[0];else{var s=i.querySelector("img");s&&(l=s.src)}}}else c=`${a} - ${c}`;const m={label:c,term:c.toLowerCase(),link:o,icon:l};t.push(m)}return t})(),l.extra_items.length>0&&(l.adminMenu=[...l.adminMenu,...l.extra_items]),n.render((0,e.createElement)(a,{quickalData:l}))}))})();1 (()=>{"use strict";const e=window.React,t=window.wp.element,a=({quickalData:a})=>{const[n,o]=(0,t.useState)(!1),[l,c]=(0,t.useState)(""),[i,r]=(0,t.useState)([]),[s,u]=(0,t.useState)(0),[m,d]=(0,t.useState)(!1),[k,y]=(0,t.useState)(null);return(0,t.useEffect)((()=>{document.querySelector(".quickal-admin-bar > a").addEventListener("click",(e=>{o(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()}));const e=e=>{"quickal_setting_hotkey_display"!==document.activeElement.id&&(a.hotkey.key===e.key&&a.hotkey.alt===e.altKey&&a.hotkey.ctrl===e.ctrlKey&&a.hotkey.shift===e.shiftKey&&a.hotkey.meta===e.metaKey&&(o(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()),n&&"Escape"===e.key&&(o(!1),d(!1)),n&&"ArrowDown"===e.key&&u((e=>(e+1)%i.length)),n&&"ArrowUp"===e.key&&u((e=>(e-1+i.length)%i.length)),n&&"Enter"===e.key&&i[s]&&(window.location=i[s].link))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[n,i,s,a]),n?(0,e.createElement)("div",{id:"quickal-modal-wrapper",onClick:()=>{o(!1),d(!1)}},(0,e.createElement)("div",{id:"quickal-modal"},(0,e.createElement)("div",{className:"quickal-ribbon"},(0,e.createElement)("div",{className:"quickal-ribbon-content "+(m?"quickal-ribbon-content-loading":"")},(0,e.createElement)("div",{className:"quickal-ribbon-logo"}))),(0,e.createElement)("input",{id:"quickal-modal-input",type:"text",value:l,onChange:e=>{const t=e.target.value;c(t);const n=t.toLowerCase().trim();if(0===n.length)return r([]),void d(!1);const o=n.split(" "),l=a.adminMenu.filter((e=>o.every((t=>e.term.includes(t)))));if(r(l),u(0),n.length<2)return void d(!1);d(!0);const i=n.replace(" ","+");clearTimeout(k),y(setTimeout((async()=>{try{const e=await fetch(`${a.rest}/search/${i}`,{headers:{"X-WP-Nonce":a.nonce,"Content-Type":"application/json;charset=utf-8"}});if(!e.ok)return void d(!1);const t=await e.json();Array.isArray(t)&&r((e=>[...e,...t]))}catch(e){d(!1)}d(!1)}),300))},onKeyDown:e=>{if("ArrowUp"===e.key||"ArrowDown"===e.key)return!1},placeholder:"Search any admin tool or content..."}),(0,e.createElement)("div",{className:"quickal-modal-dropdown"},i.map(((t,a)=>(0,e.createElement)("div",{key:a,className:"quickal-modal-dropdown-item "+(a===s?"quickal-selected":""),onMouseOver:()=>(e=>{u(e)})(a)},t.icon&&t.icon.includes("dashicons-")&&(0,e.createElement)("span",{className:`dashicons-before ${t.icon}`}),t.icon&&t.icon.includes("base64")&&(0,e.createElement)("span",{className:"quickal-icon-base64",style:{backgroundImage:`url(${t.icon})`}}),(0,e.createElement)("a",{href:t.link},(0,e.createElement)("span",null,t.label)),t.type&&(0,e.createElement)("div",{className:"quickal-result-type"},"(",(0,e.createElement)("span",null,t.type),")"))))))):null};document.addEventListener("DOMContentLoaded",(()=>{const n=(0,t.createRoot)(document.getElementById("quickal-modal-root")),o=window.quickalData;o.hotkey.alt=!!o.hotkey.alt,o.hotkey.ctrl=!!o.hotkey.ctrl,o.hotkey.shift=!!o.hotkey.shift,o.hotkey.meta=!!o.hotkey.meta,o.adminMenu=(()=>{const e=document.querySelectorAll("#adminmenu a");let t=[],a="",n=!1;var o="";for(let u=0;u<e.length;u+=1){var l=e[u].href,c=e[u].innerText.replace(/\n|\r/g,"").trim();if(n=e[u].className.includes("menu-top"),n){a=c;var i=e[u].querySelector(".wp-menu-image");if(i){var r=i.className.replace("dashicons-before","").match(/(dashicons-[a-z0-9-]*)/g);if(r)o=r[0];else{var s=i.querySelector("img");s&&(o=s.src)}}}else c=`${a} - ${c}`;const m={label:c,term:c.toLowerCase(),link:l,icon:o};t.push(m)}return t})(),o.extra_items.length>0&&(o.adminMenu=[...o.adminMenu,...o.extra_items]),n.render((0,e.createElement)(a,{quickalData:o}))}))})(); -
quick-admin-launcher/tags/1.1/quick-admin-launcher.php
r3254046 r3331684 4 4 * Plugin URI: https://wordpress.org/plugins/quick-admin-launcher/ 5 5 * Description: Quick Admin Launcher is a WordPress plugin that allows to quickly launch any admin tool from a search box. 6 * Version: 1. 0.26 * Version: 1.1 7 7 * Author: dbeja 8 8 * Text Domain: quickal 9 9 * Domain Path: /languages 10 * Requires PHP: 7.4 10 11 */ 11 12 12 defined( 'ABSPATH' ) || die( 'No script kiddies please!');13 defined('ABSPATH') || die('No script kiddies please!'); 13 14 14 define( 'QUICKAL_PLUGIN_DIR', plugin_dir_path( __FILE__ ));15 define( 'QUICKAL_PLUGIN_URL', plugin_dir_url( __FILE__ ));16 define( 'QUICKAL_VERSION', '1.0.2');15 define('QUICKAL_PLUGIN_DIR', plugin_dir_path(__FILE__)); 16 define('QUICKAL_PLUGIN_URL', plugin_dir_url(__FILE__)); 17 define('QUICKAL_VERSION', '1.1'); 17 18 18 require_once QUICKAL_PLUGIN_DIR . '/includes/autoload.php'; 19 // Load Composer autoloader 20 require_once QUICKAL_PLUGIN_DIR . '/vendor/autoload.php'; 19 21 20 register_activation_hook( __FILE__, 'quickal_activate' ); 21 register_deactivation_hook( __FILE__, 'quickal_deactivate' ); 22 // Register activation and deactivation hooks 23 register_activation_hook(__FILE__, 'quickal_activate'); 24 register_deactivation_hook(__FILE__, 'quickal_deactivate'); 22 25 23 26 /** 24 * Activation hook27 * Plugin activation hook 25 28 * 26 29 * @since 1.0.0 30 * @return void 27 31 */ 28 function quickal_activate() {29 // set default quickal settings. 30 $options = get_option( 'quickal_settings' ); 31 if ( false === $options ) { 32 $default = array( 33 'post_types' => array( 'page', 'post' ), 34 'users_search' => 1, 35 'hotkey' => array( 36 'display' => 'CTRL + k', 37 'key' => 'k', 38 'alt' => '', 39 'ctrl' => 1, 40 'shift' => '', 41 'meta' => '', 42 ), 43 ); 44 update_option( 'quickal_settings', $default);45 }32 function quickal_activate(): void 33 { 34 try { 35 // Set default settings if they don't exist 36 $options = get_option('quickal_settings'); 37 if (false === $options) { 38 $defaults = \QUICKAL\Config\PluginConfig::getDefaults(); 39 update_option('quickal_settings', $defaults); 40 } 41 42 // Log activation 43 if (defined('WP_DEBUG') && WP_DEBUG) { 44 error_log('[QuickAL] Plugin activated successfully'); 45 } 46 47 } catch (\Exception $e) { 48 error_log('[QuickAL] Activation error: ' . $e->getMessage()); 49 } 46 50 } 47 51 48 52 /** 49 * Deactivation hook53 * Plugin deactivation hook 50 54 * 51 55 * @since 1.0.0 56 * @return void 52 57 */ 53 function quickal_deactivate() {} 58 function quickal_deactivate(): void 59 { 60 try { 61 // Clean up any temporary data if needed 62 if (defined('WP_DEBUG') && WP_DEBUG) { 63 error_log('[QuickAL] Plugin deactivated'); 64 } 65 66 } catch (\Exception $e) { 67 error_log('[QuickAL] Deactivation error: ' . $e->getMessage()); 68 } 69 } 54 70 55 $quickal = new QUICKAL\QuickAL(); 56 $quickal->init(); 71 /** 72 * Initialize the plugin with dependency injection 73 * 74 * @return void 75 */ 76 function quickal_init(): void 77 { 78 try { 79 // Create dependency injection container 80 $container = new \QUICKAL\DI\Container(); 81 82 // Get the main plugin instance 83 $plugin = $container->get(\QUICKAL\QuickAL::class); 84 85 // Initialize the plugin 86 $plugin->init(); 87 88 } catch (\Exception $e) { 89 error_log('[QuickAL] Initialization error: ' . $e->getMessage()); 90 } 91 } 92 93 // Initialize plugin after WordPress is loaded 94 add_action('plugins_loaded', 'quickal_init'); -
quick-admin-launcher/trunk/README.txt
r3254046 r3331684 4 4 Donate link: https://www.paypal.com/paypalme/dbkode 5 5 Requires at least: 5.7 6 Tested up to: 6. 76 Tested up to: 6.8 7 7 Requires PHP: 7.2 8 Stable tag: 1. 0.28 Stable tag: 1.1 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 65 65 66 66 == Changelog == 67 = 1.1 = 68 * Fix: console crash when less than 2 chars 69 * Fix: Shortcut keys saving issue 70 * PHP code refactoring 71 67 72 = 1.0.2 = 68 73 * Minor performance improvements … … 73 78 = 1.0 = 74 79 * Plugin release 80 81 == Development & Testing == 82 83 Requirements: 84 - PHP 8.0 or higher (required for PHPUnit 9) 85 - Composer 86 - Node.js & npm (for building assets) 87 - WordPress (for integration testing) 88 89 Setup: 90 1. Install PHP dependencies: 91 composer install 92 2. Install Node dependencies and build assets: 93 npm install 94 npm run build 95 3. Set up the WordPress test environment: 96 bash bin/install-wp-tests.sh wordpress_test root '' 127.0.0.1 latest 97 (Adjust DB credentials as needed) 98 99 Running Tests: 100 - Run all tests: 101 composer test 102 or 103 vendor/bin/phpunit 104 - Run tests with coverage: 105 composer test-coverage 106 107 Notes: 108 - Tests are located in the tests/ directory. 109 - The plugin uses the wp-phpunit framework for WordPress integration. 110 - Make sure your database is running and accessible for the test suite. -
quick-admin-launcher/trunk/build/index.asset.php
r3253429 r3331684 1 <?php return array('dependencies' => array('react', 'wp-element'), 'version' => ' 92a7a31955b23100c983');1 <?php return array('dependencies' => array('react', 'wp-element'), 'version' => 'e54f72ebbdcfe2e73d0f'); -
quick-admin-launcher/trunk/build/index.css
r3253429 r3331684 1 #quickal-modal-wrapper{background-color:rgba(0,0,0,.7);height:100%;left:0;position:fixed;top:0;width:100%;z-index:10000}#quickal-modal{background-color:#fefefe;border:1px solid #a9a9a9;border-radius:5px;box-shadow:0 0 10px 0;left:50%;margin-left:-200px;padding:10px;position:absolute;top:40%}#quickal-modal-input{background-color:#fefefe;border:none;font-size:20px;width:400px}#quickal-modal-input:focus{border:none;box-shadow:none}.quickal-modal-dropdown-item{color:#3c434a;padding:5px}.quickal-modal-dropdown-item a{color:#3c434a;text-decoration:none}.quickal-modal-dropdown-item.quickal-selected{background-color:#2271b1;color:#fff}.quickal-modal-dropdown-item.quickal-selected a{color:#fff}.quickal-icon-base64{background-repeat:no-repeat;background-size:contain;display:inline-block;height:12px;width:12px}.quickal-result-type{float:right}.quickal-ribbon{filter:drop-shadow(2px 3px 2px rgba(0,0,0,.5));position:absolute;right:10px;top:-3px}.quickal-ribbon .quickal-ribbon-content{background:#ba051b linear-gradient(45deg,transparent,hsla(0,0%,100%,.25));background-size:400% 400%;clip-path:polygon(0 0,100% 0,100% 100%,50% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,50% calc(100% - 6px),0 calc(100% - 12px));color:#fff;font-size:.75rem;font-weight:700;min-height:26px;padding:8px 2px 4px;position:relative;text-align:center;transition:clip-path 1s,padding 1s,background 1s;width:22px}.quickal-ribbon .quickal-ribbon-content.quickal-ribbon-content-loading{animation:quickalLoadingAnimation 1s ease-out infinite}.quickal-ribbon .quickal-ribbon-content .quickal-ribbon-logo{background:transparent url(images/logo.823fa92c.png) no-repeat 50%;background-size:contain;bottom:10px;left:0;position:absolute;top:5px;width:100%}@keyframes quickalLoadingAnimation{0%{background-color:#d12525}25%{background-color:#000}50%{background-color:#d12525}75%{background-color:#000}to{background-color:#d12525}}#quickal-modal .spinner{position:absolute;right:30px;top:20px}.quickal-settings-title{background:transparent url(images/logo-red.abbdc065.png) no-repeat 0;background-size:contain;line-height:30px;padding-left: 25px}#wpadminbar .quickal-admin-bar{position:relative}#wpadminbar .quickal-admin-bar .ab-item{width:15px}#wpadminbar .quickal-admin-bar .quickal-admin-bar-icon{background:transparent url(images/logo.823fa92c.png) no-repeat 0;background-size:contain;height:20px;margin-top:-10px;position:absolute;top:50%;width:20px}1 #quickal-modal-wrapper{background-color:rgba(0,0,0,.7);height:100%;left:0;position:fixed;top:0;width:100%;z-index:10000}#quickal-modal{background-color:#fefefe;border:1px solid #a9a9a9;border-radius:5px;box-shadow:0 0 10px 0;left:50%;margin-left:-200px;padding:10px;position:absolute;top:40%}#quickal-modal-input{background-color:#fefefe;border:none;font-size:20px;width:400px}#quickal-modal-input:focus{border:none;box-shadow:none}.quickal-modal-dropdown-item{color:#3c434a;padding:5px}.quickal-modal-dropdown-item a{color:#3c434a;text-decoration:none}.quickal-modal-dropdown-item.quickal-selected{background-color:#2271b1;color:#fff}.quickal-modal-dropdown-item.quickal-selected a{color:#fff}.quickal-icon-base64{background-repeat:no-repeat;background-size:contain;display:inline-block;height:12px;width:12px}.quickal-result-type{float:right}.quickal-ribbon{filter:drop-shadow(2px 3px 2px rgba(0,0,0,.5));position:absolute;right:10px;top:-3px}.quickal-ribbon .quickal-ribbon-content{background:#ba051b linear-gradient(45deg,transparent,hsla(0,0%,100%,.25));background-size:400% 400%;clip-path:polygon(0 0,100% 0,100% 100%,50% 100%,0 100%);clip-path:polygon(0 0,100% 0,100% 100%,50% calc(100% - 6px),0 calc(100% - 12px));color:#fff;font-size:.75rem;font-weight:700;min-height:26px;padding:8px 2px 4px;position:relative;text-align:center;transition:clip-path 1s,padding 1s,background 1s;width:22px}.quickal-ribbon .quickal-ribbon-content.quickal-ribbon-content-loading{animation:quickalLoadingAnimation 1s ease-out infinite}.quickal-ribbon .quickal-ribbon-content .quickal-ribbon-logo{background:transparent url(images/logo.823fa92c.png) no-repeat 50%;background-size:contain;bottom:10px;left:0;position:absolute;top:5px;width:100%}@keyframes quickalLoadingAnimation{0%{background-color:#d12525}25%{background-color:#000}50%{background-color:#d12525}75%{background-color:#000}to{background-color:#d12525}}#quickal-modal .spinner{position:absolute;right:30px;top:20px}.quickal-settings-title{background:transparent url(images/logo-red.abbdc065.png) no-repeat 0;background-size:contain;line-height:30px;padding-left:40px!important}#wpadminbar .quickal-admin-bar{position:relative}#wpadminbar .quickal-admin-bar .ab-item{width:15px}#wpadminbar .quickal-admin-bar .quickal-admin-bar-icon{background:transparent url(images/logo.823fa92c.png) no-repeat 0;background-size:contain;height:20px;margin-top:-10px;position:absolute;top:50%;width:20px} -
quick-admin-launcher/trunk/build/index.js
r3253429 r3331684 1 (()=>{"use strict";const e=window.React,t=window.wp.element,a=({quickalData:a})=>{const[n, l]=(0,t.useState)(!1),[o,c]=(0,t.useState)(""),[i,r]=(0,t.useState)([]),[s,u]=(0,t.useState)(0),[m,d]=(0,t.useState)(!1),[k,y]=(0,t.useState)(null);return(0,t.useEffect)((()=>{document.querySelector(".quickal-admin-bar > a").addEventListener("click",(e=>{l(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()}));const e=e=>{"quickal_setting_hotkey_display"!==document.activeElement.id&&(a.hotkey.key===e.key&&a.hotkey.alt===e.altKey&&a.hotkey.ctrl===e.ctrlKey&&a.hotkey.shift===e.shiftKey&&a.hotkey.meta===e.metaKey&&(l(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()),n&&"Escape"===e.key&&(l(!1),d(!1)),n&&"ArrowDown"===e.key&&u((e=>(e+1)%i.length)),n&&"ArrowUp"===e.key&&u((e=>(e-1+i.length)%i.length)),n&&"Enter"===e.key&&i[s]&&(window.location=i[s].link))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[n,i,s,a]),n?(0,e.createElement)("div",{id:"quickal-modal-wrapper",onClick:()=>{l(!1),d(!1)}},(0,e.createElement)("div",{id:"quickal-modal"},(0,e.createElement)("div",{className:"quickal-ribbon"},(0,e.createElement)("div",{className:"quickal-ribbon-content "+(m?"quickal-ribbon-content-loading":"")},(0,e.createElement)("div",{className:"quickal-ribbon-logo"}))),(0,e.createElement)("input",{id:"quickal-modal-input",type:"text",value:o,onChange:e=>{const t=e.target.value.toLowerCase().trim();if(c(t),0===t.length)return void r([]);const n=t.split(" "),l=a.adminMenu.filter((e=>n.every((t=>e.term.includes(t)))));r(l),u(0),d(!0);const o=t.replace(" ","+");clearTimeout(k),y(setTimeout((async()=>{const e=await fetch(`${a.rest}/search/${o}`,{headers:{"X-WP-Nonce":a.nonce,"Content-Type":"application/json;charset=utf-8"}}),t=await e.json();r((e=>[...e,...t])),d(!1)}),300))},onKeyDown:e=>{if("ArrowUp"===e.key||"ArrowDown"===e.key)return!1},placeholder:"Search any admin tool or content..."}),(0,e.createElement)("div",{className:"quickal-modal-dropdown"},i.map(((t,a)=>(0,e.createElement)("div",{key:a,className:"quickal-modal-dropdown-item "+(a===s?"quickal-selected":""),onMouseOver:()=>(e=>{u(e)})(a)},t.icon&&t.icon.includes("dashicons-")&&(0,e.createElement)("span",{className:`dashicons-before ${t.icon}`}),t.icon&&t.icon.includes("base64")&&(0,e.createElement)("span",{className:"quickal-icon-base64",style:{backgroundImage:`url(${t.icon})`}}),(0,e.createElement)("a",{href:t.link},(0,e.createElement)("span",null,t.label)),t.type&&(0,e.createElement)("div",{className:"quickal-result-type"},"(",(0,e.createElement)("span",null,t.type),")"))))))):null};document.addEventListener("DOMContentLoaded",(()=>{const n=(0,t.createRoot)(document.getElementById("quickal-modal-root")),l=window.quickalData;l.hotkey.alt=!!l.hotkey.alt,l.hotkey.ctrl=!!l.hotkey.ctrl,l.hotkey.shift=!!l.hotkey.shift,l.hotkey.meta=!!l.hotkey.meta,l.adminMenu=(()=>{const e=document.querySelectorAll("#adminmenu a");let t=[],a="",n=!1;var l="";for(let u=0;u<e.length;u+=1){var o=e[u].href,c=e[u].innerText.replace(/\n|\r/g,"").trim();if(n=e[u].className.includes("menu-top"),n){a=c;var i=e[u].querySelector(".wp-menu-image");if(i){var r=i.className.replace("dashicons-before","").match(/(dashicons-[a-z0-9-]*)/g);if(r)l=r[0];else{var s=i.querySelector("img");s&&(l=s.src)}}}else c=`${a} - ${c}`;const m={label:c,term:c.toLowerCase(),link:o,icon:l};t.push(m)}return t})(),l.extra_items.length>0&&(l.adminMenu=[...l.adminMenu,...l.extra_items]),n.render((0,e.createElement)(a,{quickalData:l}))}))})();1 (()=>{"use strict";const e=window.React,t=window.wp.element,a=({quickalData:a})=>{const[n,o]=(0,t.useState)(!1),[l,c]=(0,t.useState)(""),[i,r]=(0,t.useState)([]),[s,u]=(0,t.useState)(0),[m,d]=(0,t.useState)(!1),[k,y]=(0,t.useState)(null);return(0,t.useEffect)((()=>{document.querySelector(".quickal-admin-bar > a").addEventListener("click",(e=>{o(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()}));const e=e=>{"quickal_setting_hotkey_display"!==document.activeElement.id&&(a.hotkey.key===e.key&&a.hotkey.alt===e.altKey&&a.hotkey.ctrl===e.ctrlKey&&a.hotkey.shift===e.shiftKey&&a.hotkey.meta===e.metaKey&&(o(!n),n||setTimeout((()=>{document.getElementById("quickal-modal-input").focus()}),100),e.preventDefault()),n&&"Escape"===e.key&&(o(!1),d(!1)),n&&"ArrowDown"===e.key&&u((e=>(e+1)%i.length)),n&&"ArrowUp"===e.key&&u((e=>(e-1+i.length)%i.length)),n&&"Enter"===e.key&&i[s]&&(window.location=i[s].link))};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[n,i,s,a]),n?(0,e.createElement)("div",{id:"quickal-modal-wrapper",onClick:()=>{o(!1),d(!1)}},(0,e.createElement)("div",{id:"quickal-modal"},(0,e.createElement)("div",{className:"quickal-ribbon"},(0,e.createElement)("div",{className:"quickal-ribbon-content "+(m?"quickal-ribbon-content-loading":"")},(0,e.createElement)("div",{className:"quickal-ribbon-logo"}))),(0,e.createElement)("input",{id:"quickal-modal-input",type:"text",value:l,onChange:e=>{const t=e.target.value;c(t);const n=t.toLowerCase().trim();if(0===n.length)return r([]),void d(!1);const o=n.split(" "),l=a.adminMenu.filter((e=>o.every((t=>e.term.includes(t)))));if(r(l),u(0),n.length<2)return void d(!1);d(!0);const i=n.replace(" ","+");clearTimeout(k),y(setTimeout((async()=>{try{const e=await fetch(`${a.rest}/search/${i}`,{headers:{"X-WP-Nonce":a.nonce,"Content-Type":"application/json;charset=utf-8"}});if(!e.ok)return void d(!1);const t=await e.json();Array.isArray(t)&&r((e=>[...e,...t]))}catch(e){d(!1)}d(!1)}),300))},onKeyDown:e=>{if("ArrowUp"===e.key||"ArrowDown"===e.key)return!1},placeholder:"Search any admin tool or content..."}),(0,e.createElement)("div",{className:"quickal-modal-dropdown"},i.map(((t,a)=>(0,e.createElement)("div",{key:a,className:"quickal-modal-dropdown-item "+(a===s?"quickal-selected":""),onMouseOver:()=>(e=>{u(e)})(a)},t.icon&&t.icon.includes("dashicons-")&&(0,e.createElement)("span",{className:`dashicons-before ${t.icon}`}),t.icon&&t.icon.includes("base64")&&(0,e.createElement)("span",{className:"quickal-icon-base64",style:{backgroundImage:`url(${t.icon})`}}),(0,e.createElement)("a",{href:t.link},(0,e.createElement)("span",null,t.label)),t.type&&(0,e.createElement)("div",{className:"quickal-result-type"},"(",(0,e.createElement)("span",null,t.type),")"))))))):null};document.addEventListener("DOMContentLoaded",(()=>{const n=(0,t.createRoot)(document.getElementById("quickal-modal-root")),o=window.quickalData;o.hotkey.alt=!!o.hotkey.alt,o.hotkey.ctrl=!!o.hotkey.ctrl,o.hotkey.shift=!!o.hotkey.shift,o.hotkey.meta=!!o.hotkey.meta,o.adminMenu=(()=>{const e=document.querySelectorAll("#adminmenu a");let t=[],a="",n=!1;var o="";for(let u=0;u<e.length;u+=1){var l=e[u].href,c=e[u].innerText.replace(/\n|\r/g,"").trim();if(n=e[u].className.includes("menu-top"),n){a=c;var i=e[u].querySelector(".wp-menu-image");if(i){var r=i.className.replace("dashicons-before","").match(/(dashicons-[a-z0-9-]*)/g);if(r)o=r[0];else{var s=i.querySelector("img");s&&(o=s.src)}}}else c=`${a} - ${c}`;const m={label:c,term:c.toLowerCase(),link:l,icon:o};t.push(m)}return t})(),o.extra_items.length>0&&(o.adminMenu=[...o.adminMenu,...o.extra_items]),n.render((0,e.createElement)(a,{quickalData:o}))}))})(); -
quick-admin-launcher/trunk/quick-admin-launcher.php
r3254046 r3331684 4 4 * Plugin URI: https://wordpress.org/plugins/quick-admin-launcher/ 5 5 * Description: Quick Admin Launcher is a WordPress plugin that allows to quickly launch any admin tool from a search box. 6 * Version: 1. 0.26 * Version: 1.1 7 7 * Author: dbeja 8 8 * Text Domain: quickal 9 9 * Domain Path: /languages 10 * Requires PHP: 7.4 10 11 */ 11 12 12 defined( 'ABSPATH' ) || die( 'No script kiddies please!');13 defined('ABSPATH') || die('No script kiddies please!'); 13 14 14 define( 'QUICKAL_PLUGIN_DIR', plugin_dir_path( __FILE__ ));15 define( 'QUICKAL_PLUGIN_URL', plugin_dir_url( __FILE__ ));16 define( 'QUICKAL_VERSION', '1.0.2');15 define('QUICKAL_PLUGIN_DIR', plugin_dir_path(__FILE__)); 16 define('QUICKAL_PLUGIN_URL', plugin_dir_url(__FILE__)); 17 define('QUICKAL_VERSION', '1.1'); 17 18 18 require_once QUICKAL_PLUGIN_DIR . '/includes/autoload.php'; 19 // Load Composer autoloader 20 require_once QUICKAL_PLUGIN_DIR . '/vendor/autoload.php'; 19 21 20 register_activation_hook( __FILE__, 'quickal_activate' ); 21 register_deactivation_hook( __FILE__, 'quickal_deactivate' ); 22 // Register activation and deactivation hooks 23 register_activation_hook(__FILE__, 'quickal_activate'); 24 register_deactivation_hook(__FILE__, 'quickal_deactivate'); 22 25 23 26 /** 24 * Activation hook27 * Plugin activation hook 25 28 * 26 29 * @since 1.0.0 30 * @return void 27 31 */ 28 function quickal_activate() {29 // set default quickal settings. 30 $options = get_option( 'quickal_settings' ); 31 if ( false === $options ) { 32 $default = array( 33 'post_types' => array( 'page', 'post' ), 34 'users_search' => 1, 35 'hotkey' => array( 36 'display' => 'CTRL + k', 37 'key' => 'k', 38 'alt' => '', 39 'ctrl' => 1, 40 'shift' => '', 41 'meta' => '', 42 ), 43 ); 44 update_option( 'quickal_settings', $default);45 }32 function quickal_activate(): void 33 { 34 try { 35 // Set default settings if they don't exist 36 $options = get_option('quickal_settings'); 37 if (false === $options) { 38 $defaults = \QUICKAL\Config\PluginConfig::getDefaults(); 39 update_option('quickal_settings', $defaults); 40 } 41 42 // Log activation 43 if (defined('WP_DEBUG') && WP_DEBUG) { 44 error_log('[QuickAL] Plugin activated successfully'); 45 } 46 47 } catch (\Exception $e) { 48 error_log('[QuickAL] Activation error: ' . $e->getMessage()); 49 } 46 50 } 47 51 48 52 /** 49 * Deactivation hook53 * Plugin deactivation hook 50 54 * 51 55 * @since 1.0.0 56 * @return void 52 57 */ 53 function quickal_deactivate() {} 58 function quickal_deactivate(): void 59 { 60 try { 61 // Clean up any temporary data if needed 62 if (defined('WP_DEBUG') && WP_DEBUG) { 63 error_log('[QuickAL] Plugin deactivated'); 64 } 65 66 } catch (\Exception $e) { 67 error_log('[QuickAL] Deactivation error: ' . $e->getMessage()); 68 } 69 } 54 70 55 $quickal = new QUICKAL\QuickAL(); 56 $quickal->init(); 71 /** 72 * Initialize the plugin with dependency injection 73 * 74 * @return void 75 */ 76 function quickal_init(): void 77 { 78 try { 79 // Create dependency injection container 80 $container = new \QUICKAL\DI\Container(); 81 82 // Get the main plugin instance 83 $plugin = $container->get(\QUICKAL\QuickAL::class); 84 85 // Initialize the plugin 86 $plugin->init(); 87 88 } catch (\Exception $e) { 89 error_log('[QuickAL] Initialization error: ' . $e->getMessage()); 90 } 91 } 92 93 // Initialize plugin after WordPress is loaded 94 add_action('plugins_loaded', 'quickal_init');
Note: See TracChangeset
for help on using the changeset viewer.