From b3f44f15f8db797ae719d41552f387f4f0d9f0b7 Mon Sep 17 00:00:00 2001 From: RaduCristianPopescu <119046336+RaduCristianPopescu@users.noreply.github.com> Date: Fri, 26 Sep 2025 13:34:35 +0300 Subject: [PATCH 01/10] feat: add offload metric --- .../dashboard/parts/connected/dashboard/index.js | 15 ++++++++++++++- inc/admin.php | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/assets/src/dashboard/parts/connected/dashboard/index.js b/assets/src/dashboard/parts/connected/dashboard/index.js index b0aa594f..74ed6544 100644 --- a/assets/src/dashboard/parts/connected/dashboard/index.js +++ b/assets/src/dashboard/parts/connected/dashboard/index.js @@ -52,6 +52,11 @@ const metrics = [ label: optimoleDashboardApp.strings.metrics.metricsTitle4, description: optimoleDashboardApp.strings.metrics.metricsSubtitle4, value: 'traffic' + }, + { + label: optimoleDashboardApp.strings.metrics.metricsTitle5, + description: optimoleDashboardApp.strings.metrics.metricsSubtitle5, + value: 'offloaded_images' } ]; @@ -140,6 +145,8 @@ const Dashboard = () => { }; }); + window.console.log( 'userData', userData ); + const visitorsLimitPercent = ( ( userData.visitors / userData.visitors_limit ) * 100 ).toFixed( 0 ); const renewalDate = useMemo( () => { @@ -163,7 +170,9 @@ const Dashboard = () => { Math.floor( Math.random() * 2500000 ) + 500000 : // Mock KB 'traffic' === type ? Math.floor( Math.random() * 2500 ) + 500 : // Mock MB - Math.floor( Math.random() * 40 ) + 10; // Mock Percentage + 'offloaded_images' === type ? + Math.floor( Math.random() * 500 ) + 50 : // Mock images count + Math.floor( Math.random() * 40 ) + 10; // Mock Percentage } switch ( type ) { @@ -196,6 +205,10 @@ const Dashboard = () => { unit = 'TB'; } break; + case 'offloaded_images': + formattedValue = parseInt( value ); + unit = 1 === formattedValue ? optimoleDashboardApp.strings.metrics.image : optimoleDashboardApp.strings.metrics.images; + break; default: formattedValue = parseFloat( value ).toFixed( 2 ); unit = ''; diff --git a/inc/admin.php b/inc/admin.php index 0ad50566..c17010c2 100755 --- a/inc/admin.php +++ b/inc/admin.php @@ -1748,6 +1748,10 @@ private function get_dashboard_strings() { 'metricsSubtitle3' => __( 'Average Reduction', 'optimole-wp' ), 'metricsTitle4' => __( 'CDN Traffic', 'optimole-wp' ), 'metricsSubtitle4' => __( 'This month', 'optimole-wp' ), + 'metricsTitle5' => __( 'Offloaded images', 'optimole-wp' ), + 'metricsSubtitle5' => __( 'Offloaded to cloud', 'optimole-wp'), + 'image' => __( 'image', 'optimole-wp' ), + 'images' => __( 'images', 'optimole-wp' ), ], 'quick_actions' => [ 'speed_test_title' => __( 'Test Your Site Speed', 'optimole-wp' ), From 46508455bff46e678bc754e74db282f00236a5d0 Mon Sep 17 00:00:00 2001 From: RaduCristianPopescu <119046336+RaduCristianPopescu@users.noreply.github.com> Date: Fri, 26 Sep 2025 17:29:05 +0300 Subject: [PATCH 02/10] feat: add offload metric and pro redirect feature --- .../parts/connected/dashboard/index.js | 59 ++++++++++++++++--- inc/admin.php | 9 ++- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/assets/src/dashboard/parts/connected/dashboard/index.js b/assets/src/dashboard/parts/connected/dashboard/index.js index 74ed6544..8b5f543e 100644 --- a/assets/src/dashboard/parts/connected/dashboard/index.js +++ b/assets/src/dashboard/parts/connected/dashboard/index.js @@ -14,8 +14,8 @@ import { import { sprintf } from '@wordpress/i18n'; -import { useSelect } from '@wordpress/data'; -import { warning, help } from '@wordpress/icons'; +import { useSelect, select } from '@wordpress/data'; +import { warning, external, help } from '@wordpress/icons'; import { clearCache } from '../../../utils/api'; @@ -41,22 +41,30 @@ const metrics = [ { label: optimoleDashboardApp.strings.metrics.metricsTitle2, description: optimoleDashboardApp.strings.metrics.metricsSubtitle2, - value: 'saved_size' + value: 'saved_size', + hasButton: true, + buttonText: optimoleDashboardApp.strings.metrics.adjust_compression }, { label: optimoleDashboardApp.strings.metrics.metricsTitle3, description: optimoleDashboardApp.strings.metrics.metricsSubtitle3, - value: 'compression_percentage' + value: 'compression_percentage', + hasButton: true, + buttonText: optimoleDashboardApp.strings.metrics.adjust_compression }, { label: optimoleDashboardApp.strings.metrics.metricsTitle4, description: optimoleDashboardApp.strings.metrics.metricsSubtitle4, - value: 'traffic' + value: 'traffic', + hasButton: true, + buttonText: optimoleDashboardApp.strings.metrics.view_analytics }, { label: optimoleDashboardApp.strings.metrics.metricsTitle5, description: optimoleDashboardApp.strings.metrics.metricsSubtitle5, - value: 'offloaded_images' + value: 'offloaded_images', + hasButton: true, + buttonText: optimoleDashboardApp.strings.metrics.manage_offloading } ]; @@ -65,6 +73,9 @@ const settingsTab = { advance: 2 }; +const { getUserData } = select( 'optimole' ); +const user = getUserData(); + const navigate = ( tabId ) => { const links = window.optimoleDashboardApp.submenu_links; const settingsLink = links.find( link => '#settings' === link.hash ); @@ -217,6 +228,24 @@ const Dashboard = () => { return { formattedValue, unit }; }; + const getMetricButtonAction = ( metricValue ) => { + switch ( metricValue ) { + case 'saved_size': + return () => navigate( settingsTab.advance ); + case 'compression_percentage': + return () => navigate( settingsTab.advance ); + case 'traffic': + return () => { + const newWindow = window.open( 'https://dashboard.optimole.com/metrics', '_blank' ); + if ( newWindow ) { + newWindow.focus(); + } + }; + case 'offloaded_images': + return () => navigate( settingsTab.offload_image ); + } + }; + return (
@@ -319,9 +348,25 @@ const Dashboard = () => { {unit}
-
+
{ metric.description }
+ + + { 'free' !== user.plan && metric.hasButton && ( + + ) } +
); diff --git a/inc/admin.php b/inc/admin.php index c17010c2..af9e2a2d 100755 --- a/inc/admin.php +++ b/inc/admin.php @@ -1749,9 +1749,12 @@ private function get_dashboard_strings() { 'metricsTitle4' => __( 'CDN Traffic', 'optimole-wp' ), 'metricsSubtitle4' => __( 'This month', 'optimole-wp' ), 'metricsTitle5' => __( 'Offloaded images', 'optimole-wp' ), - 'metricsSubtitle5' => __( 'Offloaded to cloud', 'optimole-wp'), - 'image' => __( 'image', 'optimole-wp' ), - 'images' => __( 'images', 'optimole-wp' ), + 'metricsSubtitle5' => __( 'Offloaded to cloud', 'optimole-wp' ), + 'image' => __( 'image', 'optimole-wp' ), + 'images' => __( 'images', 'optimole-wp' ), + 'view_analytics' => __( 'View Analytics', 'optimole-wp' ), + 'adjust_compression' => __( 'Adjust Compression', 'optimole-wp' ), + 'manage_offloading' => __( 'Manage image offloading', 'optimole-wp' ), ], 'quick_actions' => [ 'speed_test_title' => __( 'Test Your Site Speed', 'optimole-wp' ), From 75a6e7247445b079900866fd9b7b70a675891923 Mon Sep 17 00:00:00 2001 From: RaduCristianPopescu <119046336+RaduCristianPopescu@users.noreply.github.com> Date: Fri, 26 Sep 2025 17:38:26 +0300 Subject: [PATCH 03/10] chore: copilot suggestions --- assets/src/dashboard/parts/connected/dashboard/index.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/assets/src/dashboard/parts/connected/dashboard/index.js b/assets/src/dashboard/parts/connected/dashboard/index.js index 8b5f543e..b24e3a5e 100644 --- a/assets/src/dashboard/parts/connected/dashboard/index.js +++ b/assets/src/dashboard/parts/connected/dashboard/index.js @@ -73,8 +73,6 @@ const settingsTab = { advance: 2 }; -const { getUserData } = select( 'optimole' ); -const user = getUserData(); const navigate = ( tabId ) => { const links = window.optimoleDashboardApp.submenu_links; @@ -352,8 +350,7 @@ const Dashboard = () => { { metric.description } - - { 'free' !== user.plan && metric.hasButton && ( + { 'free' !== userData.plan && metric.hasButton && ( ) } - ); From ac25f1945c62d9006063679a8216d6f739a9f4bb Mon Sep 17 00:00:00 2001 From: RaduCristianPopescu <119046336+RaduCristianPopescu@users.noreply.github.com> Date: Mon, 29 Sep 2025 10:22:40 +0300 Subject: [PATCH 04/10] chore: remove log --- assets/src/dashboard/parts/connected/dashboard/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/assets/src/dashboard/parts/connected/dashboard/index.js b/assets/src/dashboard/parts/connected/dashboard/index.js index b24e3a5e..4d9db25f 100644 --- a/assets/src/dashboard/parts/connected/dashboard/index.js +++ b/assets/src/dashboard/parts/connected/dashboard/index.js @@ -154,8 +154,6 @@ const Dashboard = () => { }; }); - window.console.log( 'userData', userData ); - const visitorsLimitPercent = ( ( userData.visitors / userData.visitors_limit ) * 100 ).toFixed( 0 ); const renewalDate = useMemo( () => { From 2ff7cca5632b3cb8b5f14376c35d70d6a07b8c04 Mon Sep 17 00:00:00 2001 From: Soare Robert-Daniel Date: Wed, 1 Oct 2025 18:20:49 +0300 Subject: [PATCH 05/10] refactor: use href props for Button and remove unused component --- .../parts/components/DashboardMetricBox.js | 33 ------------------- .../parts/connected/dashboard/index.js | 24 ++++++-------- inc/admin.php | 1 + 3 files changed, 11 insertions(+), 47 deletions(-) delete mode 100644 assets/src/dashboard/parts/components/DashboardMetricBox.js diff --git a/assets/src/dashboard/parts/components/DashboardMetricBox.js b/assets/src/dashboard/parts/components/DashboardMetricBox.js deleted file mode 100644 index 2903805f..00000000 --- a/assets/src/dashboard/parts/components/DashboardMetricBox.js +++ /dev/null @@ -1,33 +0,0 @@ -import { Icon } from '@wordpress/components'; - -import classnames from 'classnames'; - -export default function DashboardMetricBox({ value, label, description, icon, compact = false }) { - const wrapClasses = classnames( - 'flex bg-light-blue border border-blue-300 rounded-md basis-1/4 flex-col items-start', - { - 'p-4': compact, - 'p-6': ! compact - } - ); - - return ( -
- - -
-
- { value } -
- -
- { label } -
- -
- { description } -
-
-
- ); -} diff --git a/assets/src/dashboard/parts/connected/dashboard/index.js b/assets/src/dashboard/parts/connected/dashboard/index.js index 4d9db25f..c0cc0569 100644 --- a/assets/src/dashboard/parts/connected/dashboard/index.js +++ b/assets/src/dashboard/parts/connected/dashboard/index.js @@ -14,7 +14,7 @@ import { import { sprintf } from '@wordpress/i18n'; -import { useSelect, select } from '@wordpress/data'; +import { useSelect } from '@wordpress/data'; import { warning, external, help } from '@wordpress/icons'; import { clearCache } from '../../../utils/api'; @@ -30,7 +30,6 @@ import { } from '../../../utils/icons'; import ProgressBar from '../../components/ProgressBar'; -import DashboardMetricBox from '../../components/DashboardMetricBox'; import LastImages from './LastImages'; import { useMemo } from 'react'; @@ -227,18 +226,13 @@ const Dashboard = () => { const getMetricButtonAction = ( metricValue ) => { switch ( metricValue ) { case 'saved_size': - return () => navigate( settingsTab.advance ); + return { onClick: () => navigate( settingsTab.advance ) }; case 'compression_percentage': - return () => navigate( settingsTab.advance ); + return { onClick: () => navigate( settingsTab.advance ) }; case 'traffic': - return () => { - const newWindow = window.open( 'https://dashboard.optimole.com/metrics', '_blank' ); - if ( newWindow ) { - newWindow.focus(); - } - }; + return { href: window.optimoleDashboardApp.optimoleDashMetrics, target: '_blank' }; case 'offloaded_images': - return () => navigate( settingsTab.offload_image ); + return { onClick: () => navigate( settingsTab.offload_image ) }; } }; @@ -326,6 +320,8 @@ const Dashboard = () => { { metrics.map( metric => { const rawValue = userData[ metric.value ]; const { formattedValue, unit } = formatMetric( metric.value, rawValue ); + const buttonAction = getMetricButtonAction( metric.value ); + const showButton = 'free' !== userData.plan && metric.hasButton; return (
{ {unit}
-
+
{ metric.description }
- { 'free' !== userData.plan && metric.hasButton && ( + { showButton && (