diff --git a/resources/views/components/component-group.blade.php b/resources/views/components/component-group.blade.php
index ddbc52ee..6e2871b1 100644
--- a/resources/views/components/component-group.blade.php
+++ b/resources/views/components/component-group.blade.php
@@ -12,16 +12,21 @@
{{ $componentGroup->name }}
- @if ($showComponentGroupStatus)
- @php($groupStatus = $componentGroup->worstComponentStatus())
-
- {{ $groupStatus->getLabel() }}
-
- @else
-
- {{ trans_choice('cachet::component_group.incident_count', $componentGroup->openIncidentCount()) }}
-
- @endif
+ @php($groupStatus = $componentGroup->worstComponentStatus())
+ @php($openIncidentCount = $componentGroup->openIncidentCount())
+ @php($showGroupStatusLabel = $showComponentGroupStatus || $openIncidentCount === 0)
+
+ @if ($showGroupStatusLabel)
+ {{ $groupStatus->getLabel() }}
+ @endif
+
+ @if ($openIncidentCount > 0)
+ @if ($showGroupStatusLabel)
+ ·
+ @endif
+ {{ trans_choice('cachet::component_group.incident_count', $openIncidentCount) }}
+ @endif
+
diff --git a/tests/Feature/StatusPage/StatusPageTest.php b/tests/Feature/StatusPage/StatusPageTest.php
index dd3fd5d5..43a45cae 100644
--- a/tests/Feature/StatusPage/StatusPageTest.php
+++ b/tests/Feature/StatusPage/StatusPageTest.php
@@ -179,7 +179,80 @@
expect($page)
->toContain('Core services')
->toContain('1 Incident')
- ->not->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage\s*<\\/span>/');
+ ->not->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage<\\/span>/');
+});
+
+it('shows the component group status alongside the open incident count', function () {
+ $group = ComponentGroup::factory()->create(['name' => 'Core services']);
+ $component = Component::factory()->create([
+ 'component_group_id' => $group->id,
+ 'status' => ComponentStatusEnum::major_outage,
+ ]);
+ $incident = Incident::factory()->create(['status' => IncidentStatusEnum::investigating]);
+ $incident->components()->attach($component->id);
+
+ $page = $this->get(route('cachet.status-page'))
+ ->assertOk()
+ ->getContent();
+
+ expect($page)
+ ->toContain('Core services')
+ ->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage<\\/span>\s*]*>·<\\/span>\s*1 Incident<\\/span>/');
+});
+
+it('does not show a zero incident count on component groups', function () {
+ ComponentGroup::factory()
+ ->has(Component::factory(['status' => ComponentStatusEnum::operational]))
+ ->create(['name' => 'Core services']);
+
+ $page = $this->get(route('cachet.status-page'))
+ ->assertOk()
+ ->getContent();
+
+ expect($page)
+ ->toContain('Core services')
+ ->toContain('Operational')
+ ->not->toContain('0 Incident');
+});
+
+it('falls back to the group status when statuses are hidden and there are no open incidents', function () {
+ $settings = app(AppSettings::class);
+ $settings->show_component_group_status = false;
+ $settings->save();
+
+ ComponentGroup::factory()
+ ->has(Component::factory(['status' => ComponentStatusEnum::operational]))
+ ->create(['name' => 'Core services']);
+
+ $page = $this->get(route('cachet.status-page'))
+ ->assertOk()
+ ->getContent();
+
+ expect($page)
+ ->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Operational<\\/span>/')
+ ->not->toContain('0 Incident');
+});
+
+it('colours the incident count by the worst component status when group statuses are hidden', function () {
+ $settings = app(AppSettings::class);
+ $settings->show_component_group_status = false;
+ $settings->save();
+
+ $group = ComponentGroup::factory()->create(['name' => 'Core services']);
+ $component = Component::factory()->create([
+ 'component_group_id' => $group->id,
+ 'status' => ComponentStatusEnum::major_outage,
+ ]);
+ $incident = Incident::factory()->create(['status' => IncidentStatusEnum::investigating]);
+ $incident->components()->attach($component->id);
+
+ $page = $this->get(route('cachet.status-page'))
+ ->assertOk()
+ ->getContent();
+
+ expect($page)
+ ->toMatch('/getTextColorClasses(), '/').'[^"]*">\s*1 Incident<\/span>/')
+ ->not->toMatch('/Core services\s*<\\/h2>\s*]*>\s*Major outage<\\/span>/');
});
it('can display component tags', function () {