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 && (