diff --git a/code/frontend/src/app/core/feature-badges/feature-registry.ts b/code/frontend/src/app/core/feature-badges/feature-registry.ts index 9e3fe323..22d35754 100644 --- a/code/frontend/src/app/core/feature-badges/feature-registry.ts +++ b/code/frontend/src/app/core/feature-badges/feature-registry.ts @@ -68,4 +68,5 @@ export const NEW_FEATURES: NewFeature[] = [ { id: 'seeker-quiet-hours' }, { id: 'seeker-radarr-release-gate' }, { id: 'seeker-whisparr' }, + { id: 'seeker-lidarr' }, ]; diff --git a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts index d9e7153d..bf1360df 100644 --- a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts +++ b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.spec.ts @@ -162,6 +162,7 @@ describe('funnelStages', () => { expect(funnelStages(funnel, 'Radarr').narrowing[0]).toEqual({ label: 'movies', value: 10 }); expect(funnelStages(funnel, 'Sonarr').narrowing[0]).toEqual({ label: 'series', value: 10 }); expect(funnelStages(funnel, 'Whisparr').narrowing[0]).toEqual({ label: 'movies', value: 10 }); + expect(funnelStages(funnel, 'Lidarr').narrowing[0]).toEqual({ label: 'artists', value: 10 }); }); it('splits the units needing a search by state', () => { diff --git a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts index 31ac5bdc..b7313a8f 100644 --- a/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts +++ b/code/frontend/src/app/features/seeker-stats/searches-tab/search-display.util.ts @@ -79,6 +79,17 @@ export interface FunnelStage { value: number; } +function libraryLabel(instanceType: string): string { + switch (instanceType) { + case 'Sonarr': + return 'series'; + case 'Lidarr': + return 'artists'; + default: + return 'movies'; + } +} + /** * Splits the funnel into the stages that narrow the library down to units needing a search, * and the split of those units by state. @@ -87,7 +98,7 @@ export function funnelStages(funnel: InstanceFunnel, instanceType: string): { na const resting: FunnelStage[] = funnel.restingUnits > 0 ? [{ label: 'resting', value: funnel.restingUnits }] : []; return { narrowing: [ - { label: instanceType === 'Sonarr' ? 'series' : 'movies', value: funnel.libraryItems }, + { label: libraryLabel(instanceType), value: funnel.libraryItems }, { label: 'released', value: funnel.releasedItems }, { label: 'monitored', value: funnel.monitoredItems }, { label: 'tag filtered', value: funnel.tagFilteredItems }, diff --git a/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html b/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html index e471c0c3..188912b8 100644 --- a/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html +++ b/code/frontend/src/app/features/seeker-stats/searches-tab/searches-tab.component.html @@ -54,7 +54,7 @@
- + Cycle Progress diff --git a/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts b/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts index d23e008e..17e4e194 100644 --- a/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts +++ b/code/frontend/src/app/features/seeker-stats/upgrades-tab/upgrades-tab.component.spec.ts @@ -234,6 +234,7 @@ describe('UpgradesTabComponent', () => { expect(component.itemTypeSeverity('Sonarr')).toBe('info'); expect(component.itemTypeSeverity('Radarr')).toBe('info'); expect(component.itemTypeSeverity('Whisparr')).toBe('info'); + expect(component.itemTypeSeverity('Lidarr')).toBe('info'); }); it('toasts the error message when loading upgrades fails', () => { diff --git a/code/frontend/src/app/features/settings/seeker/seeker.component.html b/code/frontend/src/app/features/settings/seeker/seeker.component.html index 22c2e83d..f3711633 100644 --- a/code/frontend/src/app/features/settings/seeker/seeker.component.html +++ b/code/frontend/src/app/features/settings/seeker/seeker.component.html @@ -96,6 +96,9 @@ @if (instance.instanceType === 'Whisparr') { } + @if (instance.instanceType === 'Lidarr') { + + }
diff --git a/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts b/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts index d44c1132..94046cd5 100644 --- a/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts +++ b/code/frontend/src/app/features/settings/seeker/seeker.component.spec.ts @@ -545,6 +545,16 @@ describe('SeekerComponent', () => { expect(fixture.nativeElement.textContent).not.toContain('Search Mode'); }); + it('marks a Lidarr row as new and shows no release gate or search mode', () => { + const lidarr: SeekerInstanceConfig = { ...RADARR, instanceName: 'Lidarr', instanceType: 'Lidarr', enabled: true }; + const { fixture } = setup({ config: { ...CONFIG, instances: [lidarr] } }); + + const badge = fixture.nativeElement.querySelector('.instance-row__info app-new-badge') as HTMLElement; + expect(badge.getAttribute('featureId')).toBe('seeker-lidarr'); + expect(releaseGateSelect(fixture, 0)).toBeUndefined(); + expect(fixture.nativeElement.textContent).not.toContain('Search Mode'); + }); + it('sends the picked release gate for the Radarr row only', () => { const { fixture, updateConfig } = setup(); diff --git a/code/frontend/src/app/shared/utils/instance-display.util.spec.ts b/code/frontend/src/app/shared/utils/instance-display.util.spec.ts index 5de0d8ba..6907304d 100644 --- a/code/frontend/src/app/shared/utils/instance-display.util.spec.ts +++ b/code/frontend/src/app/shared/utils/instance-display.util.spec.ts @@ -21,6 +21,7 @@ describe('instanceTypeHighlight', () => { [InstanceType.Radarr, 'info'], [InstanceType.Sonarr, 'info'], [InstanceType.Whisparr, 'info'], + [InstanceType.Lidarr, 'info'], ])('maps %s to %s', (type, expected) => { expect(instanceTypeHighlight(type)).toBe(expected); }); diff --git a/code/frontend/src/app/shared/utils/instance-display.util.ts b/code/frontend/src/app/shared/utils/instance-display.util.ts index d6a7835d..bb36865f 100644 --- a/code/frontend/src/app/shared/utils/instance-display.util.ts +++ b/code/frontend/src/app/shared/utils/instance-display.util.ts @@ -18,6 +18,7 @@ export function instanceTypeHighlight(type: string): BadgeSeverity { case InstanceType.Radarr: case InstanceType.Sonarr: case InstanceType.Whisparr: + case InstanceType.Lidarr: return 'info'; default: return 'default';