From ed65d6976cb7db3a03186aae0ed53a5edccf94b6 Mon Sep 17 00:00:00 2001 From: Ben Senescu <44480372+bensenescu@users.noreply.github.com> Date: Mon, 20 Apr 2026 15:23:25 -0400 Subject: [PATCH] feat: support all 94 DataForSEO countries across features (#127) --- package.json | 2 +- release-notes/v0.0.7.md | 9 + .../features/domain/DomainOverviewPage.tsx | 5 + .../domain/components/DomainResultsCard.tsx | 9 +- .../domain/components/DomainSearchCard.tsx | 25 ++- src/client/features/domain/domainActions.ts | 8 +- .../domainOverviewControllerInternals.ts | 44 ++++- src/client/features/domain/types.ts | 2 + .../domain/useDomainOverviewController.ts | 53 +++++- .../keywords/hooks/useKeywordResearchData.ts | 7 +- src/client/features/keywords/locations.ts | 159 ++++++++++++++---- src/client/hooks/useDomainSearchHistory.ts | 3 + src/routes/_project/p/$projectId/domain.tsx | 9 + src/types/schemas/domain.ts | 1 + 14 files changed, 281 insertions(+), 55 deletions(-) create mode 100644 release-notes/v0.0.7.md diff --git a/package.json b/package.json index 8927ec4..5791724 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "open-seo", "private": true, "sideEffects": false, - "version": "0.0.6", + "version": "0.0.7", "type": "module", "scripts": { "dev": "AUTH_MODE=local_noauth vite dev", diff --git a/release-notes/v0.0.7.md b/release-notes/v0.0.7.md new file mode 100644 index 0000000..c2a6a9a --- /dev/null +++ b/release-notes/v0.0.7.md @@ -0,0 +1,9 @@ +This release expands country coverage and adds bulk delete for saved keywords. + +## Added + +- Support all countries tracked by DataForSEO. +- Add country selector to Domain Overview Page +- Improve bulk delete of saved keywords. + +Full Changelog: https://github.com/every-app/open-seo/compare/v0.0.6...v0.0.7 diff --git a/src/client/features/domain/DomainOverviewPage.tsx b/src/client/features/domain/DomainOverviewPage.tsx index c439f30..2bd9dd5 100644 --- a/src/client/features/domain/DomainOverviewPage.tsx +++ b/src/client/features/domain/DomainOverviewPage.tsx @@ -25,6 +25,7 @@ type Props = { order?: SortOrder; tab: DomainActiveTab; search: string; + locationCode: number; }; navigate: (args: { search: (prev: Record) => Record; @@ -69,6 +70,9 @@ export function DomainOverviewPage({ onSortChange={(sort) => state.applySort(sort, getDefaultSortOrder(sort)) } + onLocationChange={(locationCode) => + state.applyLocationChange(locationCode) + } /> {state.isLoading ? ( @@ -148,6 +152,7 @@ export function DomainOverviewPage({ }} onSearchChange={state.setPendingSearch} onSaveKeywords={state.handleSaveKeywords} + canSaveKeywords={state.canSaveKeywords} onSortClick={state.handleSortColumnClick} onToggleKeyword={state.toggleKeywordSelection} onToggleAllVisible={state.toggleAllVisibleKeywords} diff --git a/src/client/features/domain/components/DomainResultsCard.tsx b/src/client/features/domain/components/DomainResultsCard.tsx index 3fb7567..0545ab3 100644 --- a/src/client/features/domain/components/DomainResultsCard.tsx +++ b/src/client/features/domain/components/DomainResultsCard.tsx @@ -46,6 +46,7 @@ type Props = { onTabChange: (tab: DomainActiveTab) => void; onSearchChange: (value: string) => void; onSaveKeywords: () => void; + canSaveKeywords: boolean; onSortClick: (sort: DomainSortMode) => void; onToggleKeyword: (keyword: string) => void; onToggleAllVisible: () => void; @@ -69,6 +70,7 @@ export function DomainResultsCard({ onTabChange, onSearchChange, onSaveKeywords, + canSaveKeywords, onSortClick, onToggleKeyword, onToggleAllVisible, @@ -124,7 +126,12 @@ export function DomainResultsCard({ diff --git a/src/client/features/domain/components/DomainSearchCard.tsx b/src/client/features/domain/components/DomainSearchCard.tsx index 1f7214a..4d62a43 100644 --- a/src/client/features/domain/components/DomainSearchCard.tsx +++ b/src/client/features/domain/components/DomainSearchCard.tsx @@ -4,12 +4,14 @@ import { getFieldError, getFormError } from "@/client/lib/forms"; import type { useDomainOverviewController } from "@/client/features/domain/useDomainOverviewController"; import { toSortMode } from "@/client/features/domain/utils"; import type { DomainSortMode } from "@/client/features/domain/types"; +import { LOCATION_OPTIONS } from "@/client/features/keywords/locations"; type Props = { controlsForm: ReturnType["controlsForm"]; isLoading: boolean; onSubmit: (event: FormEvent) => void; onSortChange: (sort: DomainSortMode) => void; + onLocationChange: (locationCode: number) => void; }; export function DomainSearchCard({ @@ -17,6 +19,7 @@ export function DomainSearchCard({ isLoading, onSubmit, onSortChange, + onLocationChange, }: Props) { return (
@@ -31,7 +34,7 @@ export function DomainSearchCard({ return (