Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import {
getApexDomain,
getPrettyUrl,
} from "@dub/utils";
import Link from "next/link";
import { useParams, useRouter } from "next/navigation";
import { useMemo } from "react";
import { usePartnerCustomerFilters } from "./use-partner-customer-filters";
Expand Down Expand Up @@ -132,8 +131,9 @@ export function ProgramCustomersPageClient() {
accessorKey: "activity.link",
cell: ({ row }) =>
row.original.activity.link ? (
<Link
href={`/programs/${programSlug}/links?domain=${row.original.activity.link.domain}&key=${row.original.activity.link.key}`}
<a
href={`/programs/${programSlug}/analytics?linkId=${row.original.activity.link.id}`}
target="_blank"
className="flex cursor-alias items-center gap-3 decoration-dotted underline-offset-2 hover:underline"
>
<LinkLogo
Expand All @@ -148,7 +148,7 @@ export function ProgramCustomersPageClient() {
>
{getPrettyUrl(row.original.activity.link.shortLink)}
</span>
</Link>
</a>
) : (
"-"
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ const StatsBadge = memo(({ link }: { link: PartnerProfileLinkProps }) => {
const As = showDetailedAnalytics ? Link : "div";
return (
<As
href={`/programs/${programEnrollment?.program.slug}/analytics?domain=${link.domain}&key=${link.key}`}
href={`/programs/${programEnrollment?.program.slug}/analytics?linkId=${link.id}`}
className="flex items-center gap-0.5 rounded-md border border-neutral-200 bg-neutral-50 p-0.5 text-sm text-neutral-600"
>
{[
Expand Down Expand Up @@ -291,8 +291,7 @@ const StatsCharts = memo(({ link }: { link: PartnerProfileLinkProps }) => {
key={chart.key}
href={`/programs/${programEnrollment?.program.slug}/analytics${getQueryString(
{
domain: link.domain,
key: link.key,
linkId: link.id,
event: chart.key === "saleAmount" ? "sales" : chart.key,
},
)}`}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -470,8 +470,8 @@ export function ProgramPartnersApplicationsPageClient() {
onRemove={onRemove}
/>
<SearchBoxPersisted
placeholder="Search by name or email"
inputClassName="md:w-72"
placeholder="Search by name, email, or company"
inputClassName="md:w-80"
/>
</div>
<AnimatedSizeContainer height>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,8 +413,8 @@ export function ProgramPartnersRejectedApplicationsPageClient() {
onRemove={onRemove}
/>
<SearchBoxPersisted
placeholder="Search by name or email"
inputClassName="md:w-72"
placeholder="Search by name, email, or company"
inputClassName="md:w-80"
/>
</div>
<AnimatedSizeContainer height>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -576,8 +576,8 @@ export function PartnersTable() {
onRemove={onRemove}
/>
<SearchBoxPersisted
placeholder="Search by name or email"
inputClassName="md:w-72"
placeholder="Search by name, email, or company"
inputClassName="md:w-80"
/>
</div>
<AnimatedSizeContainer height>
Expand Down
1 change: 1 addition & 0 deletions apps/web/lib/api/partners/get-partners-count.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export async function getPartnersCount<T>(
: {
email: { search: sanitizeFullTextSearch(search) },
name: { search: sanitizeFullTextSearch(search) },
companyName: { search: sanitizeFullTextSearch(search) },
}
: {}),
...(partnerIds && {
Expand Down
1 change: 1 addition & 0 deletions apps/web/lib/api/partners/get-partners.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export async function getPartners(filters: PartnerFilters) {
: {
email: { search: sanitizeFullTextSearch(search) },
name: { search: sanitizeFullTextSearch(search) },
companyName: { search: sanitizeFullTextSearch(search) },
}
: {}),
},
Expand Down
62 changes: 62 additions & 0 deletions apps/web/scripts/programs/delete-program-enrollments.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { prisma } from "@dub/prisma";
import "dotenv-flow/config";
import { bulkDeleteLinks } from "../../lib/api/links/bulk-delete-links";

const programId = "prog_xxx";

async function main() {
while (true) {
const programEnrollments = await prisma.programEnrollment.findMany({
where: {
programId,
totalLeads: 0,
},
take: 250,
include: {
links: true,
},
});

if (programEnrollments.length === 0) {
console.log("No program enrollments found");
break;
}

const linksToDelete = programEnrollments.flatMap(({ links }) => links);

// in case some of the links actually do have leads
if (linksToDelete.some(({ leads }) => leads > 0)) {
console.log(
`Found links with leads: ${linksToDelete
.filter(({ leads }) => leads > 0)
.map(({ shortLink }) => shortLink)
.join(", ")}`,
);
break;
}

await bulkDeleteLinks(linksToDelete);

const deleteLinkPrisma = await prisma.link.deleteMany({
where: {
id: {
in: linksToDelete.map(({ id }) => id),
},
},
});

console.log("deleteLinkPrisma", deleteLinkPrisma);

const deleteProgramEnrollment = await prisma.programEnrollment.deleteMany({
where: {
id: {
in: programEnrollments.map(({ id }) => id),
},
},
});

console.log("deleteProgramEnrollment", deleteProgramEnrollment);
}
}

main();
5 changes: 5 additions & 0 deletions apps/web/ui/colors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ export const RESOURCE_COLORS_DATA = [
tagVariants: "bg-brown-100 text-brown-600",
groupVariants: "bg-brown-600",
},
{
color: "gray",
tagVariants: "bg-gray-100 text-gray-600",
groupVariants: "bg-gray-600",
},
] as const;

export const RESOURCE_COLORS = RESOURCE_COLORS_DATA.map(
Expand Down
2 changes: 1 addition & 1 deletion apps/web/ui/customers/customer-activity-list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const activityData = {
<Link
href={
programSlug
? `${analyticsBaseUrl}?domain=${event.link.domain}&key=${event.link.key}`
? `${analyticsBaseUrl}?linkId=${event.link.id}`
: `/${slug}/links/${getPrettyUrl(event.link.shortLink)}`
}
target="_blank"
Expand Down
2 changes: 1 addition & 1 deletion apps/web/ui/customers/customer-details-column.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ export function CustomerDetailsColumn({
workspaceSlug
? `/${workspaceSlug}/links/${link.domain}/${link.key}`
: programSlug
? `/programs/${programSlug}/analytics?domain=${encodeURIComponent(link.domain)}&key=${encodeURIComponent(link.key)}`
? `/programs/${programSlug}/analytics?linkId=${link.id}`
: undefined
}
target="_blank"
Expand Down
2 changes: 1 addition & 1 deletion apps/web/ui/domains/domain-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ export default function DomainCard({ props }: { props: DomainProps }) {
}
>
<Link
href={`/${slug}/analytics?domain=${domain}&key=_root`}
href={`/${slug}/analytics?linkId=${props.link?.id}`}
className="flex items-center space-x-1 whitespace-nowrap rounded-md border border-neutral-200 bg-neutral-50 px-3 py-1 transition-colors hover:bg-neutral-100"
>
<CursorRays className="h-4 w-4 text-neutral-700" />
Expand Down
4 changes: 2 additions & 2 deletions apps/web/ui/links/link-analytics-badge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ export function LinkAnalyticsBadge({

return isMobile ? (
<Link
href={`/${slug}/analytics?domain=${domain}&key=${key}`}
href={`/${slug}/analytics?linkId=${link.id}`}
className="flex items-center gap-1 rounded-md border border-neutral-200 bg-neutral-50 px-2 py-0.5 text-sm text-neutral-800"
>
<CursorRays className="h-4 w-4 text-neutral-600" />
Expand Down Expand Up @@ -147,7 +147,7 @@ export function LinkAnalyticsBadge({
}
>
<Link
href={`/${slug}/analytics?domain=${domain}&key=${key}${url ? `&url=${url}` : ""}&interval=${plan === "free" ? "30d" : plan === "pro" ? "1y" : "all"}`}
href={`/${slug}/analytics?linkId=${link.id}`}
className={cn(
"block overflow-hidden rounded-md border border-neutral-200 bg-neutral-50 p-0.5 text-sm text-neutral-600 transition-colors",
variant === "loose" ? "hover:bg-neutral-100" : "hover:bg-white",
Expand Down
4 changes: 2 additions & 2 deletions apps/web/ui/modals/export-partners-modal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ function ExportPartnersModal({
const columnCheckboxId = useId();
const { program } = useProgram();
const { id: workspaceId } = useWorkspace();
const { getQueryString } = useRouterStuff();
const { getQueryString, searchParamsObj } = useRouterStuff();

const {
control,
Expand All @@ -65,7 +65,7 @@ function ExportPartnersModal({
const params = {
workspaceId,
programId: program.id,
status: "approved",
status: searchParamsObj.status || "approved",
...(data.columns.length
? { columns: data.columns.join(",") }
: undefined),
Expand Down
2 changes: 1 addition & 1 deletion packages/prisma/schema/partner.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ model Partner {
@@index(discoverableAt)
@@index(trustedAt)
@@index(payoutMethodHash)
@@fulltext([email, name]) // For full-text search
@@fulltext([email, name, companyName]) // For full-text search
}

model PartnerInvite {
Expand Down