Skip to content

Commit b490682

Browse files
9larsonscmraible
authored andcommitted
Removed ui60 and trafficAnalytics flags from Ghost backend (#24440)
ref https://linear.app/ghost/issue/PROD-2321/ - removed flag from labs - removed trafficAnalytics from settingsHelper (calculated web_analytics_enabled setting) - removed mention of flags from docs - updated posts list analytics to not be dependent on trafficAnalytics flag - removed ui60 from Settings This ended up being a bit of a grab bag at the end. The Ember posts list content is dependent on the SettingsHelper update here, so it makes reasonable sense to roll into this one PR. ui60 was still hanging around in Settings and we want to remove that before it causes more conflicts. --------- Co-authored-by: Chris Raible <[email protected]>
1 parent 7a4ae0a commit b490682

File tree

11 files changed

+39
-139
lines changed

11 files changed

+39
-139
lines changed

apps/admin-x-settings/src/components/settings/advanced/labs/PrivateFeatures.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ const features: Feature[] = [{
2323
title: 'Import Member Tier',
2424
description: 'Enables tier to be specified when importing members',
2525
flag: 'importMemberTier'
26-
}, {
27-
title: 'UI 6.0 (internal alpha)',
28-
description: 'General structural changes to the admin UI in 6.0',
29-
flag: 'ui60'
3026
}, {
3127
title: 'Explore',
3228
description: 'Enables keeping in touch with the new Explore API',

ghost/admin/app/components/posts-list/list-item-analytics.hbs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@
181181
</div>
182182
</div>
183183
</div>
184-
<div class="gh-post-list-analytics-metric">
184+
<div class="gh-post-list-analytics-metric" data-test-analytics-visitors>
185185
{{svg-jar "analytics-visitors" class="gh-list-analytics-icon"}}
186186
<span class="gh-content-email-stats-value">
187187
{{abbreviate-number this.visitorCount}}
@@ -224,7 +224,7 @@
224224
{{!-- Opened / Signups column --}}
225225
{{#if (and @post.showEmailOpenAnalytics @post.showEmailClickAnalytics) }}
226226
<LinkTo @route="members" @query={{hash filterParam=(concat "opened_emails.post_id:" @post.id) }} class="permalink gh-list-data gh-post-list-metrics">
227-
<div class="gh-post-list-analytics-metric">
227+
<div class="gh-post-list-analytics-metric" data-test-analytics-opens>
228228
{{svg-jar "analytics-opens" class="gh-list-analytics-icon"}}
229229
<span class="gh-content-email-stats-value">
230230
{{@post.email.openRate}}%
@@ -236,7 +236,7 @@
236236
{{!-- Clicked / Conversions column --}}
237237
{{#if @post.showEmailClickAnalytics }}
238238
<LinkTo @route="members" @query={{hash filterParam=(concat "clicked_links.post_id:" @post.id) }} class="permalink gh-list-data gh-post-list-metrics">
239-
<div class="gh-post-list-analytics-metric">
239+
<div class="gh-post-list-analytics-metric" data-test-analytics-clicks>
240240
{{svg-jar "analytics-clicks" class="gh-list-analytics-icon"}}
241241
<span class="gh-content-email-stats-value">
242242
{{@post.clickRate}}%
@@ -246,7 +246,7 @@
246246
{{else}}
247247
{{#if @post.showEmailOpenAnalytics }}
248248
<LinkTo @route="members" @query={{hash filterParam=(concat "opened_emails.post_id:" @post.id) }} class="permalink gh-list-data gh-post-list-metrics">
249-
<div class="gh-post-list-analytics-metric">
249+
<div class="gh-post-list-analytics-metric" data-test-analytics-opens>
250250
{{svg-jar "analytics-opens" class="gh-list-analytics-icon"}}
251251
<span class="gh-content-email-stats-value">
252252
{{@post.email.openRate}}%
@@ -258,7 +258,7 @@
258258
</div>
259259

260260
{{!-- Member conversions column (only show for published posts when traffic analytics is enabled AND web analytics is enabled) --}}
261-
{{#if (or this.settings.membersTrackSources false)}}
261+
{{#if this.settings.membersTrackSources}}
262262
{{#if @post.isPublished}}
263263
{{#if this.hasMemberData}}
264264
<LinkTo @route="posts-x" @model={{@post.id}} class="permalink gh-list-data gh-post-list-metrics gh-post-list-analytics-tt-container">
@@ -281,7 +281,7 @@
281281
</div>
282282
</div>
283283
</div>
284-
<div class="gh-post-list-analytics-metric">
284+
<div class="gh-post-list-analytics-metric" data-test-analytics-member-conversions>
285285
{{svg-jar "analytics-members" class="gh-list-analytics-icon"}}
286286
<span class="gh-content-email-stats-value">
287287
{{format-number this.totalMemberConversions}}

ghost/admin/app/components/posts-list/list.hbs

Lines changed: 32 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,38 @@
11
<MultiList::List @model={{@list}} class="posts-list gh-list {{unless @model "no-posts"}} feature-memberAttribution" as |list| >
2-
{{#if (feature "trafficAnalytics")}}
3-
{{!-- always order as scheduled, draft, remainder --}}
4-
{{#if (or @model.scheduledInfinityModel (or @model.draftInfinityModel @model.publishedAndSentInfinityModel))}}
5-
{{#if @model.scheduledInfinityModel}}
6-
{{#each @model.scheduledInfinityModel as |post|}}
7-
<list.item @id={{post.id}} class="gh-posts-list-item-group gh-posts-list-item-analytics">
8-
<PostsList::ListItemAnalytics
9-
@post={{post}}
10-
data-test-post-id={{post.id}}
11-
/>
12-
</list.item>
13-
{{/each}}
14-
{{/if}}
15-
{{#if (and @model.draftInfinityModel (or (not @model.scheduledInfinityModel) (and @model.scheduledInfinityModel @model.scheduledInfinityModel.reachedInfinity)))}}
16-
{{#each @model.draftInfinityModel as |post|}}
17-
<list.item @id={{post.id}} class="gh-posts-list-item-group gh-posts-list-item-analytics">
18-
<PostsList::ListItemAnalytics
19-
@post={{post}}
20-
data-test-post-id={{post.id}}
21-
/>
22-
</list.item>
23-
{{/each}}
24-
{{/if}}
25-
{{#if (and @model.publishedAndSentInfinityModel (and (or (not @model.scheduledInfinityModel) @model.scheduledInfinityModel.reachedInfinity) (or (not @model.draftInfinityModel) @model.draftInfinityModel.reachedInfinity)))}}
26-
{{#each @model.publishedAndSentInfinityModel as |post|}}
27-
<list.item @id={{post.id}} class="gh-posts-list-item-group gh-posts-list-item-analytics">
28-
<PostsList::ListItemAnalytics
29-
@post={{post}}
30-
data-test-post-id={{post.id}}
31-
/>
32-
</list.item>
33-
{{/each}}
34-
{{/if}}
35-
{{else}}
36-
{{yield}}
2+
{{!-- always order as scheduled, draft, remainder --}}
3+
{{#if (or @model.scheduledInfinityModel (or @model.draftInfinityModel @model.publishedAndSentInfinityModel))}}
4+
{{#if @model.scheduledInfinityModel}}
5+
{{#each @model.scheduledInfinityModel as |post|}}
6+
<list.item @id={{post.id}} class="gh-posts-list-item-group gh-posts-list-item-analytics">
7+
<PostsList::ListItemAnalytics
8+
@post={{post}}
9+
data-test-post-id={{post.id}}
10+
/>
11+
</list.item>
12+
{{/each}}
3713
{{/if}}
38-
{{else}}
39-
{{!-- always order as scheduled, draft, remainder --}}
40-
{{#if (or @model.scheduledInfinityModel (or @model.draftInfinityModel @model.publishedAndSentInfinityModel))}}
41-
{{#if @model.scheduledInfinityModel}}
42-
{{#each @model.scheduledInfinityModel as |post|}}
43-
<list.item @id={{post.id}} class="gh-posts-list-item-group">
44-
<PostsList::ListItem
45-
@post={{post}}
46-
data-test-post-id={{post.id}}
47-
/>
48-
</list.item>
49-
{{/each}}
50-
{{/if}}
51-
{{#if (and @model.draftInfinityModel (or (not @model.scheduledInfinityModel) (and @model.scheduledInfinityModel @model.scheduledInfinityModel.reachedInfinity)))}}
52-
{{#each @model.draftInfinityModel as |post|}}
53-
<list.item @id={{post.id}} class="gh-posts-list-item-group">
54-
<PostsList::ListItem
55-
@post={{post}}
56-
data-test-post-id={{post.id}}
57-
/>
58-
</list.item>
59-
{{/each}}
60-
{{/if}}
61-
{{#if (and @model.publishedAndSentInfinityModel (and (or (not @model.scheduledInfinityModel) @model.scheduledInfinityModel.reachedInfinity) (or (not @model.draftInfinityModel) @model.draftInfinityModel.reachedInfinity)))}}
62-
{{#each @model.publishedAndSentInfinityModel as |post|}}
63-
<list.item @id={{post.id}} class="gh-posts-list-item-group">
64-
<PostsList::ListItem
65-
@post={{post}}
66-
data-test-post-id={{post.id}}
67-
/>
68-
</list.item>
69-
{{/each}}
70-
{{/if}}
71-
{{else}}
72-
{{yield}}
14+
{{#if (and @model.draftInfinityModel (or (not @model.scheduledInfinityModel) (and @model.scheduledInfinityModel @model.scheduledInfinityModel.reachedInfinity)))}}
15+
{{#each @model.draftInfinityModel as |post|}}
16+
<list.item @id={{post.id}} class="gh-posts-list-item-group gh-posts-list-item-analytics">
17+
<PostsList::ListItemAnalytics
18+
@post={{post}}
19+
data-test-post-id={{post.id}}
20+
/>
21+
</list.item>
22+
{{/each}}
23+
{{/if}}
24+
{{#if (and @model.publishedAndSentInfinityModel (and (or (not @model.scheduledInfinityModel) @model.scheduledInfinityModel.reachedInfinity) (or (not @model.draftInfinityModel) @model.draftInfinityModel.reachedInfinity)))}}
25+
{{#each @model.publishedAndSentInfinityModel as |post|}}
26+
<list.item @id={{post.id}} class="gh-posts-list-item-group gh-posts-list-item-analytics">
27+
<PostsList::ListItemAnalytics
28+
@post={{post}}
29+
data-test-post-id={{post.id}}
30+
/>
31+
</list.item>
32+
{{/each}}
7333
{{/if}}
34+
{{else}}
35+
{{yield}}
7436
{{/if}}
7537
</MultiList::List>
7638

ghost/admin/tests/acceptance/content-test.js

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -951,23 +951,6 @@ describe('Acceptance: Posts / Pages', function () {
951951
expect(visitorsText, 'visitor count column').to.not.exist;
952952
});
953953

954-
it('shows visitor count column when webAnalyticsEnabled is enabled and trafficAnalytics feature is enabled', async function () {
955-
// Enable webAnalyticsEnabled setting
956-
this.server.db.settings.update({key: 'web_analytics_enabled'}, {value: 'true'});
957-
958-
// Enable trafficAnalytics feature flag
959-
this.server.db.settings.update({key: 'labs'}, {value: JSON.stringify({trafficAnalytics: true})});
960-
961-
await visit('/posts');
962-
963-
// When both settings are enabled, the visitor count column container should exist
964-
// even if it shows "—" without actual data
965-
expect(find('.gh-post-list-metrics-container'), 'metrics container').to.exist;
966-
967-
// The page should load without errors when analytics are enabled
968-
expect(currentURL(), 'current URL').to.equal('/posts');
969-
});
970-
971954
it('hides member conversions column when membersTrackSources is disabled', async function () {
972955
// Disable membersTrackSources setting
973956
this.server.db.settings.update({key: 'members_track_sources'}, {value: 'false'});
@@ -979,17 +962,6 @@ describe('Acceptance: Posts / Pages', function () {
979962
expect(membersText, 'member conversions column').to.not.exist;
980963
});
981964

982-
it('shows member conversions column when membersTrackSources is enabled', async function () {
983-
// Enable membersTrackSources setting
984-
this.server.db.settings.update({key: 'members_track_sources'}, {value: 'true'});
985-
986-
await visit('/posts');
987-
988-
// Check that member conversions column is visible
989-
let membersText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'members');
990-
expect(membersText, 'member conversions column').to.exist;
991-
});
992-
993965
it('shows analytics button when post has analytics page', async function () {
994966
// Update post to have analytics page
995967
publishedPost.update({hasAnalyticsPage: true});

ghost/core/core/server/data/tinybird/ARCHITECTURE.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -303,10 +303,6 @@ Click Tracking → redirects → members_click_events
303303
2. MySQL tracks member signup with attribution
304304
3. MySQL tracks paid conversion with attribution
305305

306-
## API Endpoints
307-
308-
All endpoints require authentication (`mw.authAdminApi`) and are gated behind `labs.isSet('trafficAnalytics')`.
309-
310306
### Core Stats Endpoints
311307

312308
```javascript

ghost/core/core/server/data/tinybird/DOCS.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,6 @@ Click Tracking → redirects → members_click_events
311311
3. MySQL tracks paid conversion with attribution
312312
4. Combined view shows complete funnel
313313

314-
## API Endpoints
315-
316-
All endpoints require authentication (`mw.authAdminApi`) and are gated behind `labs.isSet('trafficAnalytics')`.
317-
318314
### Core Stats Endpoints
319315

320316
```javascript

ghost/core/core/server/services/settings-helpers/SettingsHelpers.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,12 +273,6 @@ class SettingsHelpers {
273273
return false;
274274
}
275275

276-
// Labs setting
277-
if (!this.labs.isSet('trafficAnalytics')) {
278-
debug('Web analytics is disabled in labs');
279-
return false;
280-
}
281-
282276
// Check if web analytics can be configured (limit service and required config)
283277
if (!this.isWebAnalyticsConfigured()) {
284278
return false;

ghost/core/core/server/services/settings/settings-service.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ module.exports = {
112112
fields.push(new CalculatedField({key: 'social_web_enabled', type: 'boolean', group: 'social_web', fn: settingsHelpers.isSocialWebEnabled.bind(settingsHelpers), dependents: ['social_web', 'labs']}));
113113

114114
// Web analytics
115-
fields.push(new CalculatedField({key: 'web_analytics_enabled', type: 'boolean', group: 'analytics', fn: settingsHelpers.isWebAnalyticsEnabled.bind(settingsHelpers), dependents: ['web_analytics', 'labs']}));
115+
fields.push(new CalculatedField({key: 'web_analytics_enabled', type: 'boolean', group: 'analytics', fn: settingsHelpers.isWebAnalyticsEnabled.bind(settingsHelpers), dependents: ['web_analytics']}));
116116
fields.push(new CalculatedField({key: 'web_analytics_configured', type: 'boolean', group: 'analytics', fn: settingsHelpers.isWebAnalyticsConfigured.bind(settingsHelpers), dependents: ['web_analytics']}));
117117

118118
return fields;

ghost/core/core/shared/labs.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ const GA_FEATURES = [
2727
'announcementBar',
2828
'customFonts',
2929
'contentVisibility',
30-
'trafficAnalytics',
31-
'ui60',
3230
'explore'
3331
];
3432

ghost/core/test/e2e-api/admin/__snapshots__/config.test.js.snap

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ Object {
2525
"stripeAutomaticTax": true,
2626
"superEditors": true,
2727
"themeErrorsNotification": true,
28-
"trafficAnalytics": true,
29-
"ui60": true,
3028
"urlCache": true,
3129
"webmentions": true,
3230
},

0 commit comments

Comments
 (0)