Skip to content

Commit 5ea85df

Browse files
Merge pull request #12809 from google/enhancement/12765-hide-widget
Enhancement/12765 hide widget
2 parents 602c57a + 598ce37 commit 5ea85df

19 files changed

Lines changed: 426 additions & 0 deletions

File tree

assets/js/googlesitekit/datastore/site/info.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ export const reducer = createReducer( ( state, { payload, type } ) => {
194194
consentModeRegions,
195195
anyoneCanRegister,
196196
isMultisite,
197+
hasActiveLeadEventProviders,
198+
hasActiveEcommerceEventProviders,
197199
} = payload.siteInfo;
198200

199201
state.siteInfo = {
@@ -230,6 +232,8 @@ export const reducer = createReducer( ( state, { payload, type } ) => {
230232
consentModeRegions,
231233
anyoneCanRegister,
232234
isMultisite,
235+
hasActiveLeadEventProviders,
236+
hasActiveEcommerceEventProviders,
233237
};
234238
break;
235239

@@ -319,6 +323,8 @@ export const resolvers = {
319323
consentModeRegions,
320324
anyoneCanRegister,
321325
isMultisite,
326+
hasActiveLeadEventProviders,
327+
hasActiveEcommerceEventProviders,
322328
} = global._googlesitekitBaseData;
323329

324330
const {
@@ -362,6 +368,8 @@ export const resolvers = {
362368
consentModeRegions,
363369
anyoneCanRegister,
364370
isMultisite,
371+
hasActiveLeadEventProviders,
372+
hasActiveEcommerceEventProviders,
365373
} );
366374
},
367375
};
@@ -986,6 +994,30 @@ export const selectors = {
986994
* @return {boolean|undefined} `true` if it is multisite; `false` if not. Returns `undefined` if not yet loaded.
987995
*/
988996
isMultisite: getSiteInfoProperty( 'isMultisite' ),
997+
998+
/**
999+
* Checks if any lead event provider plugin is active.
1000+
*
1001+
* @since n.e.x.t
1002+
*
1003+
* @param {Object} state Data store's state.
1004+
* @return {boolean|undefined} `true` if a lead event provider is active; `false` if not. Returns `undefined` if not yet loaded.
1005+
*/
1006+
hasActiveLeadEventProviders: getSiteInfoProperty(
1007+
'hasActiveLeadEventProviders'
1008+
),
1009+
1010+
/**
1011+
* Checks if any ecommerce event provider plugin is active.
1012+
*
1013+
* @since n.e.x.t
1014+
*
1015+
* @param {Object} state Data store's state.
1016+
* @return {boolean|undefined} `true` if an ecommerce event provider is active; `false` if not. Returns `undefined` if not yet loaded.
1017+
*/
1018+
hasActiveEcommerceEventProviders: getSiteInfoProperty(
1019+
'hasActiveEcommerceEventProviders'
1020+
),
9891021
};
9901022

9911023
export default {

assets/js/googlesitekit/datastore/site/info.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ describe( 'core/site site info', () => {
5151
],
5252
productPostType: [ 'product' ],
5353
isMultisite: false,
54+
hasActiveLeadEventProviders: false,
55+
hasActiveEcommerceEventProviders: false,
5456
};
5557
const entityInfoVar = '_googlesitekitEntityData';
5658
const entityInfo = {
@@ -483,6 +485,11 @@ describe( 'core/site site info', () => {
483485
[ 'isKeyMetricsSetupCompleted', 'keyMetricsSetupCompletedBy' ],
484486
[ 'getConsentModeRegions', 'consentModeRegions' ],
485487
[ 'isMultisite', 'isMultisite' ],
488+
[ 'hasActiveLeadEventProviders', 'hasActiveLeadEventProviders' ],
489+
[
490+
'hasActiveEcommerceEventProviders',
491+
'hasActiveEcommerceEventProviders',
492+
],
486493
] )( '%s', ( selector, infoKey ) => {
487494
it( 'uses a resolver to load site info then returns the info when this specific selector is used', async () => {
488495
global[ baseInfoVar ] = baseInfo;

assets/js/modules/analytics-4/widgets/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
* Internal dependencies
2121
*/
2222
import { isFeatureEnabled } from '@/js/features';
23+
import { CORE_SITE } from '@/js/googlesitekit/datastore/site/constants';
2324
import {
2425
CORE_USER,
2526
KM_ANALYTICS_ENGAGED_TRAFFIC_SOURCE,
@@ -758,6 +759,8 @@ export function registerWidgets( widgets ) {
758759
priority: 1,
759760
wrapWidget: false,
760761
modules: [ MODULE_SLUG_ANALYTICS_4 ],
762+
isActive: ( select ) =>
763+
!! select( CORE_SITE ).hasActiveEcommerceEventProviders(),
761764
},
762765
[ AREA_MAIN_DASHBOARD_SITE_GOALS_PRIMARY ]
763766
);
@@ -770,6 +773,8 @@ export function registerWidgets( widgets ) {
770773
priority: 2,
771774
wrapWidget: false,
772775
modules: [ MODULE_SLUG_ANALYTICS_4 ],
776+
isActive: ( select ) =>
777+
!! select( CORE_SITE ).hasActiveLeadEventProviders(),
773778
},
774779
[ AREA_MAIN_DASHBOARD_SITE_GOALS_PRIMARY ]
775780
);
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/**
2+
* Analytics module widget registration tests.
3+
*
4+
* Site Kit by Google, Copyright 2026 Google LLC
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* https://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
/**
20+
* Internal dependencies
21+
*/
22+
import { enabledFeatures } from '@/js/features';
23+
import {
24+
createWidgets,
25+
registerWidgets as registerDefaultWidgets,
26+
} from '@/js/googlesitekit/widgets';
27+
import { CORE_WIDGETS } from '@/js/googlesitekit/widgets/datastore/constants';
28+
import { AREA_MAIN_DASHBOARD_SITE_GOALS_PRIMARY } from '@/js/googlesitekit/widgets/default-areas';
29+
import {
30+
createTestRegistry,
31+
provideSiteInfo,
32+
} from '../../../../../tests/js/utils';
33+
import { registerWidgets } from './index';
34+
35+
describe( 'Analytics 4 widget registrations', () => {
36+
let registry;
37+
let widgets;
38+
39+
beforeEach( () => {
40+
registry = createTestRegistry();
41+
enabledFeatures.add( 'siteGoals' );
42+
widgets = createWidgets( registry );
43+
registerDefaultWidgets( widgets );
44+
} );
45+
46+
afterEach( () => {
47+
enabledFeatures.delete( 'siteGoals' );
48+
} );
49+
50+
describe( 'Site Goals widgets', () => {
51+
it.each( [
52+
[
53+
'only ecommerce active',
54+
{
55+
hasActiveEcommerceEventProviders: true,
56+
hasActiveLeadEventProviders: false,
57+
},
58+
[ 'analyticsOnlineStorePerformance' ],
59+
[ 'analyticsLeadGenerationPerformance' ],
60+
],
61+
[
62+
'only lead active',
63+
{
64+
hasActiveEcommerceEventProviders: false,
65+
hasActiveLeadEventProviders: true,
66+
},
67+
[ 'analyticsLeadGenerationPerformance' ],
68+
[ 'analyticsOnlineStorePerformance' ],
69+
],
70+
[
71+
'both active',
72+
{
73+
hasActiveEcommerceEventProviders: true,
74+
hasActiveLeadEventProviders: true,
75+
},
76+
[
77+
'analyticsOnlineStorePerformance',
78+
'analyticsLeadGenerationPerformance',
79+
],
80+
[],
81+
],
82+
[
83+
'neither active',
84+
{
85+
hasActiveEcommerceEventProviders: false,
86+
hasActiveLeadEventProviders: false,
87+
},
88+
[],
89+
[
90+
'analyticsOnlineStorePerformance',
91+
'analyticsLeadGenerationPerformance',
92+
],
93+
],
94+
] )(
95+
'should gate widgets correctly when %s',
96+
( _, siteInfo, expectedPresent, expectedAbsent ) => {
97+
provideSiteInfo( registry, siteInfo );
98+
registerWidgets( widgets );
99+
100+
const slugs = registry
101+
.select( CORE_WIDGETS )
102+
.getWidgets( AREA_MAIN_DASHBOARD_SITE_GOALS_PRIMARY )
103+
.map( ( w ) => w.slug );
104+
105+
expectedPresent.forEach( ( slug ) => {
106+
expect( slugs ).toContain( slug );
107+
} );
108+
expectedAbsent.forEach( ( slug ) => {
109+
expect( slugs ).not.toContain( slug );
110+
} );
111+
}
112+
);
113+
} );
114+
} );

includes/Core/Conversion_Tracking/Conversion_Event_Providers/Contact_Form_7.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ class Contact_Form_7 extends Conversion_Events_Provider {
2424

2525
const CONVERSION_EVENT_PROVIDER_SLUG = 'contact-form-7';
2626

27+
/**
28+
* Gets the provider category.
29+
*
30+
* @since n.e.x.t
31+
*
32+
* @return string Provider category.
33+
*/
34+
public function get_category() {
35+
return self::CATEGORY_LEAD;
36+
}
37+
2738
/**
2839
* Checks if the Contact Form 7 plugin is active.
2940
*

includes/Core/Conversion_Tracking/Conversion_Event_Providers/Easy_Digital_Downloads.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ class Easy_Digital_Downloads extends Conversion_Events_Provider {
3131

3232
const CONVERSION_EVENT_PROVIDER_SLUG = 'easy-digital-downloads';
3333

34+
/**
35+
* Gets the provider category.
36+
*
37+
* @since n.e.x.t
38+
*
39+
* @return string Provider category.
40+
*/
41+
public function get_category() {
42+
return self::CATEGORY_ECOMMERCE;
43+
}
44+
3445
/**
3546
* Checks if the Easy Digital Downloads plugin is active.
3647
*

includes/Core/Conversion_Tracking/Conversion_Event_Providers/Mailchimp.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ class Mailchimp extends Conversion_Events_Provider {
2424

2525
const CONVERSION_EVENT_PROVIDER_SLUG = 'mailchimp';
2626

27+
/**
28+
* Gets the provider category.
29+
*
30+
* @since n.e.x.t
31+
*
32+
* @return string Provider category.
33+
*/
34+
public function get_category() {
35+
return self::CATEGORY_LEAD;
36+
}
37+
2738
/**
2839
* Checks if the Mailchimp plugin is active.
2940
*

includes/Core/Conversion_Tracking/Conversion_Event_Providers/Ninja_Forms.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ class Ninja_Forms extends Conversion_Events_Provider {
2424

2525
const CONVERSION_EVENT_PROVIDER_SLUG = 'ninja-forms';
2626

27+
/**
28+
* Gets the provider category.
29+
*
30+
* @since n.e.x.t
31+
*
32+
* @return string Provider category.
33+
*/
34+
public function get_category() {
35+
return self::CATEGORY_LEAD;
36+
}
37+
2738
/**
2839
* Checks if the Ninja Forms plugin is active.
2940
*

includes/Core/Conversion_Tracking/Conversion_Event_Providers/OptinMonster.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ class OptinMonster extends Conversion_Events_Provider {
2424

2525
const CONVERSION_EVENT_PROVIDER_SLUG = 'optin-monster';
2626

27+
/**
28+
* Gets the provider category.
29+
*
30+
* @since n.e.x.t
31+
*
32+
* @return string Provider category.
33+
*/
34+
public function get_category() {
35+
return self::CATEGORY_LEAD;
36+
}
37+
2738
/**
2839
* Checks if the OptinMonster plugin is active.
2940
*

includes/Core/Conversion_Tracking/Conversion_Event_Providers/PopupMaker.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ class PopupMaker extends Conversion_Events_Provider {
2424

2525
const CONVERSION_EVENT_PROVIDER_SLUG = 'popup-maker';
2626

27+
/**
28+
* Gets the provider category.
29+
*
30+
* @since n.e.x.t
31+
*
32+
* @return string Provider category.
33+
*/
34+
public function get_category() {
35+
return self::CATEGORY_LEAD;
36+
}
37+
2738
/**
2839
* Checks if the PopupMaker plugin is active.
2940
*

0 commit comments

Comments
 (0)