diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index cd0be00d..b91cf6c2 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -33,10 +33,10 @@ const startServer = async () => { fastify.register(profileRouter, { prefix: '/profile' }); fastify.register(liveRouter, { prefix: '/live' }); fastify.register(miscRouter, { prefix: '/misc' }); - fastify.setErrorHandler((error, request, reply) => { + fastify.setErrorHandler((error) => { fastify.log.error(error); }); - fastify.get('/', (request, reply) => { + fastify.get('/', (_request, reply) => { reply.send({ name: 'openpanel sdk api' }); }); // fastify.get('/health-check', async (request, reply) => { diff --git a/apps/api/src/utils/auth.ts b/apps/api/src/utils/auth.ts index ed648bc4..22814f9f 100644 --- a/apps/api/src/utils/auth.ts +++ b/apps/api/src/utils/auth.ts @@ -89,5 +89,5 @@ export async function validateSdkRequest( } } - return client.project_id; + return client.projectId; } diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 8065445e..cc97c829 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -71,7 +71,7 @@ "next-themes": "^0.2.1", "nuqs": "^1.16.1", "prisma-error-enum": "^0.1.3", - "pushmodal": "^0.0.8", + "pushmodal": "^1.0.0", "ramda": "^0.29.1", "random-animal-name": "^0.1.1", "react": "18.2.0", diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx b/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx deleted file mode 100644 index 131a96ce..00000000 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/page.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; - -import { - getClientsByOrganizationId, - getProjectsByOrganizationSlug, -} from '@openpanel/db'; - -import ListProjects from './list-projects'; - -interface PageProps { - params: { - organizationId: string; - }; -} - -export default async function Page({ params: { organizationId } }: PageProps) { - const [projects, clients] = await Promise.all([ - getProjectsByOrganizationSlug(organizationId), - getClientsByOrganizationId(organizationId), - ]); - - return ( - - - - ); -} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx similarity index 87% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx index 05827375..70ba8ea3 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/list-reports.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/list-reports.tsx @@ -1,6 +1,6 @@ 'use client'; -import { StickyBelowHeader } from '@/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header'; +import { StickyBelowHeader } from '@/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header'; import { useOverviewOptions } from '@/components/overview/useOverviewOptions'; import { LazyChart } from '@/components/report/chart/LazyChart'; import { Button } from '@/components/ui/button'; @@ -12,10 +12,12 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { useAppParams } from '@/hooks/useAppParams'; +import { api, handleError } from '@/trpc/client'; import { cn } from '@/utils/cn'; import { ChevronRight, MoreHorizontal, PlusIcon, Trash } from 'lucide-react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; +import { toast } from 'sonner'; import { getDefaultIntervalByDates, @@ -33,7 +35,13 @@ export function ListReports({ reports }: ListReportsProps) { const router = useRouter(); const params = useAppParams<{ dashboardId: string }>(); const { range, startDate, endDate } = useOverviewOptions(); - + const deletion = api.report.delete.useMutation({ + onError: handleError, + onSuccess() { + router.refresh(); + toast('Report deleted'); + }, + }); return ( <> @@ -42,7 +50,7 @@ export function ListReports({ reports }: ListReportsProps) { icon={PlusIcon} onClick={() => { router.push( - `/${params.organizationId}/${ + `/${params.organizationSlug}/${ params.projectId }/reports?${new URLSearchParams({ dashboardId: params.dashboardId, @@ -60,7 +68,7 @@ export function ListReports({ reports }: ListReportsProps) { return (
@@ -95,10 +103,10 @@ export function ListReports({ reports }: ListReportsProps) { { - // event.stopPropagation(); - // deletion.mutate({ - // reportId: report.id, - // }); + event.stopPropagation(); + deletion.mutate({ + reportId: report.id, + }); }} > diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/page.tsx similarity index 78% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/page.tsx index 53eb8f4f..86b3cb5a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/[dashboardId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/[dashboardId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { notFound } from 'next/navigation'; import { getDashboardById, getReportsByDashboardId } from '@openpanel/db'; @@ -7,14 +7,14 @@ import { ListReports } from './list-reports'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; dashboardId: string; }; } export default async function Page({ - params: { organizationId, projectId, dashboardId }, + params: { organizationSlug, projectId, dashboardId }, }: PageProps) { const [dashboard, reports] = await Promise.all([ getDashboardById(dashboardId, projectId), @@ -26,7 +26,7 @@ export default async function Page({ } return ( - + ); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/header-dashboards.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/header-dashboards.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/header-dashboards.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/header-dashboards.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/list-dashboards.tsx similarity index 94% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/list-dashboards.tsx index 0494a50b..a18e14ec 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/list-dashboards.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/list-dashboards.tsx @@ -20,7 +20,7 @@ interface ListDashboardsProps { export function ListDashboards({ dashboards }: ListDashboardsProps) { const router = useRouter(); const params = useAppParams(); - const { organizationId, projectId } = params; + const { organizationSlug, projectId } = params; const deletion = api.dashboard.delete.useMutation({ onError: (error, variables) => { return handleErrorToastOptions({ @@ -65,8 +65,8 @@ export function ListDashboards({ dashboards }: ListDashboardsProps) {
{item.name} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/page.tsx similarity index 77% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/page.tsx index 49cbea01..5058afb1 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/dashboards/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/dashboards/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { getDashboardsByProjectId } from '@openpanel/db'; @@ -8,17 +8,17 @@ import { ListDashboards } from './list-dashboards'; interface PageProps { params: { projectId: string; - organizationId: string; + organizationSlug: string; }; } export default async function Page({ - params: { projectId, organizationId }, + params: { projectId, organizationSlug }, }: PageProps) { const dashboards = await getDashboardsByProjectId(projectId); return ( - + {dashboards.length > 0 && } diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/charts/events-per-day-chart.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/charts/events-per-day-chart.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/charts/events-per-day-chart.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/charts/events-per-day-chart.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/event-conversions-list.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/event-conversions-list.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/event-conversions-list.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/event-conversions-list.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/index.tsx similarity index 90% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/index.tsx index d5b5a97b..57bcee32 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-conversions-list/index.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-conversions-list/index.tsx @@ -1,4 +1,3 @@ -import { Widget } from '@/components/widget'; import { escape } from 'sqlstring'; import { db, getEvents } from '@openpanel/db'; @@ -12,7 +11,7 @@ interface Props { export default async function EventConversionsListServer({ projectId }: Props) { const conversions = await db.eventMeta.findMany({ where: { - project_id: projectId, + projectId, conversion: true, }, }); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-details.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-details.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-details.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-edit.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-edit.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-edit.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-icon.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-icon.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-icon.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list-item.tsx similarity index 95% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list-item.tsx index b8fb0c59..b23c3456 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list-item.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list-item.tsx @@ -15,7 +15,7 @@ import { EventIcon } from './event-icon'; type EventListItemProps = IServiceCreateEventPayload; export function EventListItem(props: EventListItemProps) { - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const { createdAt, name, path, duration, meta, profile } = props; const [isDetailsOpen, setIsDetailsOpen] = useState(false); @@ -77,7 +77,7 @@ export function EventListItem(props: EventListItemProps) { onClick={(e) => { e.stopPropagation(); }} - href={`/${organizationId}/${projectId}/profiles/${profile?.id}`} + href={`/${organizationSlug}/${projectId}/profiles/${profile?.id}`} className="max-w-[80px] overflow-hidden text-ellipsis whitespace-nowrap text-sm text-muted-foreground hover:underline" > {profile?.firstName} {profile?.lastName} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-list.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-list.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-listener.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/event-listener.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/event-listener.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/page.tsx similarity index 90% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/page.tsx index 6721a48b..d3e57f5b 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/events/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/events/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import { @@ -17,7 +17,7 @@ import { EventList } from './event-list'; interface PageProps { params: { projectId: string; - organizationId: string; + organizationSlug: string; }; searchParams: { events?: string; @@ -31,7 +31,7 @@ const nuqsOptions = { }; export default async function Page({ - params: { projectId, organizationId }, + params: { projectId, organizationSlug }, searchParams, }: PageProps) { const filters = @@ -56,7 +56,7 @@ export default async function Page({ ]); return ( - + {pathname?.includes('/settings/') && (
)} @@ -145,7 +145,7 @@ export default function LayoutMenu({ dashboards }: LayoutMenuProps) {
} - href={`/${item.organization_slug}/${item.project_id}/dashboards/${item.id}`} + href={`/${item.organizationSlug}/${item.projectId}/dashboards/${item.id}`} /> ))}
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-organization-selector.tsx similarity index 95% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-organization-selector.tsx index e540c025..03401988 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-organization-selector.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-organization-selector.tsx @@ -18,7 +18,7 @@ export default function LayoutOrganizationSelector({ const router = useRouter(); const organization = organizations.find( - (item) => item.slug === params.organizationId + (item) => item.slug === params.organizationSlug ); if (!organization) { diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-project-selector.tsx similarity index 88% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-project-selector.tsx index aabc6029..41dbaf2f 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-project-selector.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-project-selector.tsx @@ -13,7 +13,7 @@ export default function LayoutProjectSelector({ projects, }: LayoutProjectSelectorProps) { const router = useRouter(); - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const pathname = usePathname() || ''; return ( @@ -24,12 +24,12 @@ export default function LayoutProjectSelector({ className="w-auto min-w-0 max-sm:max-w-[100px]" placeholder={'Select project'} onChange={(value) => { - if (organizationId && projectId) { + if (organizationSlug && projectId) { const split = pathname.replace(projectId, value).split('/'); // slicing here will remove everything after /{orgId}/{projectId}/dashboards [slice here] /xxx/xxx/xxx router.push(split.slice(0, 4).join('/')); } else { - router.push(`/${organizationId}/${value}`); + router.push(`/${organizationSlug}/${value}`); } }} value={projectId} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sidebar.tsx similarity index 95% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sidebar.tsx index 93d91ac2..6a92a1df 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sidebar.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sidebar.tsx @@ -17,13 +17,13 @@ import LayoutOrganizationSelector from './layout-organization-selector'; interface LayoutSidebarProps { organizations: IServiceOrganization[]; dashboards: IServiceDashboards; - organizationId: string; + organizationSlug: string; projectId: string; } export function LayoutSidebar({ organizations, dashboards, - organizationId, + organizationSlug, projectId, }: LayoutSidebarProps) { const [active, setActive] = useState(false); @@ -69,7 +69,7 @@ export function LayoutSidebar({
Create a report diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout.tsx similarity index 82% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout.tsx index b909cb61..79b6e68a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/layout.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/layout.tsx @@ -11,22 +11,22 @@ import { LayoutSidebar } from './layout-sidebar'; interface AppLayoutProps { children: React.ReactNode; params: { - organizationId: string; + organizationSlug: string; projectId: string; }; } export default async function AppLayout({ children, - params: { organizationId, projectId }, + params: { organizationSlug, projectId }, }: AppLayoutProps) { const [organizations, projects, dashboards] = await Promise.all([ getCurrentOrganizations(), - getCurrentProjects(organizationId), + getCurrentProjects(organizationSlug), getDashboardsByProjectId(projectId), ]); - if (!organizations.find((item) => item.slug === organizationId)) { + if (!organizations.find((item) => item.slug === organizationSlug)) { return (
{children}
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/overview-sticky-header.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/overview-sticky-header.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/overview-sticky-header.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/overview-sticky-header.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page-layout.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page-layout.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page-layout.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page-layout.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page.tsx similarity index 85% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page.tsx index 94eab5fb..55f2b36c 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import ServerLiveCounter from '@/components/overview/live-counter'; @@ -10,7 +10,7 @@ import OverviewTopGeo from '@/components/overview/overview-top-geo'; import OverviewTopPages from '@/components/overview/overview-top-pages'; import OverviewTopSources from '@/components/overview/overview-top-sources'; -import { db } from '@openpanel/db'; +import { getShareByProjectId } from '@openpanel/db'; import OverviewMetrics from '../../../../components/overview/overview-metrics'; import { StickyBelowHeader } from './layout-sticky-below-header'; @@ -18,22 +18,18 @@ import { OverviewReportRange } from './overview-sticky-header'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; }; } export default async function Page({ - params: { organizationId, projectId }, + params: { organizationSlug, projectId }, }: PageProps) { - const share = await db.shareOverview.findUnique({ - where: { - project_id: projectId, - }, - }); + const share = await getShareByProjectId(projectId); return ( - +
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/[profileId]/page.tsx similarity index 96% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/[profileId]/page.tsx index 00f26efc..a30223fd 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/[profileId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/[profileId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import { ProfileAvatar } from '@/components/profiles/profile-avatar'; @@ -27,9 +27,9 @@ import { StickyBelowHeader } from '../../layout-sticky-below-header'; interface PageProps { params: { + organizationSlug: string; projectId: string; profileId: string; - organizationId: string; }; searchParams: { events?: string; @@ -41,7 +41,7 @@ interface PageProps { } export default async function Page({ - params: { projectId, profileId, organizationId }, + params: { projectId, profileId, organizationSlug }, searchParams, }: PageProps) { const eventListOptions: GetEventListOptions = { @@ -125,7 +125,7 @@ export default async function Page({ return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/page.tsx similarity index 86% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/page.tsx index 62cd0e22..e3c71115 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import { OverviewFiltersDrawer } from '@/components/overview/filters/overview-filters-drawer'; import { eventQueryFiltersParser } from '@/hooks/useEventQueryFilters'; @@ -11,7 +11,7 @@ import ProfileTopServer from './profile-top'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; }; searchParams: { @@ -25,11 +25,11 @@ const nuqsOptions = { }; export default function Page({ - params: { organizationId, projectId }, + params: { organizationSlug, projectId }, searchParams: { cursor, f }, }: PageProps) { return ( - + {/*
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-last-seen/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-last-seen/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-last-seen/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-last-seen/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/profile-list.tsx similarity index 95% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/profile-list.tsx index 90f8764e..c5eba24c 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-list/profile-list.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-list/profile-list.tsx @@ -21,7 +21,7 @@ interface ProfileListProps { count: number; } export function ProfileList({ data, count }: ProfileListProps) { - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const { cursor, setCursor } = useCursor(); return ( @@ -46,7 +46,7 @@ export function ProfileList({ data, count }: ProfileListProps) { render(profile) { return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-top/index.tsx similarity index 93% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-top/index.tsx index d51661a3..3befc84a 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/profiles/profile-top/index.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/profiles/profile-top/index.tsx @@ -10,11 +10,11 @@ import { chQuery, getProfiles } from '@openpanel/db'; interface Props { projectId: string; - organizationId: string; + organizationSlug: string; } export default async function ProfileTopServer({ - organizationId, + organizationSlug, projectId, }: Props) { // Days since last event from users @@ -44,7 +44,7 @@ export default async function ProfileTopServer({ render(profile) { return ( diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/[reportId]/page.tsx similarity index 77% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/[reportId]/page.tsx index 2f512a6d..394870bb 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/[reportId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/[reportId]/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { Pencil } from 'lucide-react'; import { notFound } from 'next/navigation'; @@ -8,14 +8,14 @@ import ReportEditor from '../report-editor'; interface PageProps { params: { + organizationSlug: string; projectId: string; reportId: string; - organizationId: string; }; } export default async function Page({ - params: { reportId, organizationId }, + params: { reportId, organizationSlug }, }: PageProps) { const report = await getReportById(reportId); @@ -25,7 +25,7 @@ export default async function Page({ return ( {report.name} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/page.tsx similarity index 63% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/page.tsx index 5c5f91b5..537909b2 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/page.tsx @@ -1,19 +1,19 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { Pencil } from 'lucide-react'; import ReportEditor from './report-editor'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; }; } -export default function Page({ params: { organizationId } }: PageProps) { +export default function Page({ params: { organizationSlug } }: PageProps) { return ( Unnamed report diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/report-editor.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/report-editor.tsx similarity index 97% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/report-editor.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/report-editor.tsx index 10debee6..eaea10ad 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/reports/report-editor.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/reports/report-editor.tsx @@ -1,7 +1,7 @@ 'use client'; import { useEffect } from 'react'; -import { StickyBelowHeader } from '@/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header'; +import { StickyBelowHeader } from '@/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header'; import { ChartSwitch } from '@/components/report/chart'; import { ReportChartType } from '@/components/report/ReportChartType'; import { ReportInterval } from '@/components/report/ReportInterval'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/edit-organization.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/edit-organization.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/edit-organization.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/edit-organization.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/create-invite.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/create-invite.tsx similarity index 98% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/create-invite.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/create-invite.tsx index 6b292339..e9933856 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/create-invite.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/create-invite.tsx @@ -33,7 +33,7 @@ interface Props { export default function CreateInvite({ projects }: Props) { const router = useRouter(); - const { organizationId: organizationSlug } = useAppParams(); + const { organizationSlug } = useAppParams(); const { register, handleSubmit, formState, reset, control } = useForm({ resolver: zodResolver(zInviteUser), diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/invites.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/invites.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/invites/invites.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/invites/invites.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/members/index.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/members/index.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/members/index.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/members/index.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/members/members.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/members/members.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/members/members.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/members/members.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/page.tsx similarity index 79% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/page.tsx index ec767905..fdb4ef20 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/organization/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/organization/page.tsx @@ -1,7 +1,7 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { notFound } from 'next/navigation'; -import { getInvites, getOrganizationBySlug } from '@openpanel/db'; +import { getOrganizationBySlug } from '@openpanel/db'; import EditOrganization from './edit-organization'; import InvitesServer from './invites'; @@ -9,12 +9,12 @@ import MembersServer from './members'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; }; } export default async function Page({ - params: { organizationId: organizationSlug }, + params: { organizationSlug }, }: PageProps) { const organization = await getOrganizationBySlug(organizationSlug); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/page.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/page.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/edit-profile.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/profile/edit-profile.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/edit-profile.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/profile/edit-profile.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/logout.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/profile/logout.tsx similarity index 100% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/logout.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/profile/logout.tsx diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/profile/page.tsx similarity index 72% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/profile/page.tsx index 650969b3..9033caea 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/profile/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/profile/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { auth } from '@clerk/nextjs'; import { getUserById } from '@openpanel/db'; @@ -8,15 +8,17 @@ import { Logout } from './logout'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; }; } -export default async function Page({ params: { organizationId } }: PageProps) { +export default async function Page({ + params: { organizationSlug }, +}: PageProps) { const { userId } = auth(); const profile = await getUserById(userId!); return ( - +
diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/projects/list-projects.tsx similarity index 89% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/projects/list-projects.tsx index cc25c480..04f94a49 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/projects/list-projects.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/projects/list-projects.tsx @@ -1,9 +1,8 @@ 'use client'; -import { StickyBelowHeader } from '@/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header'; +import { StickyBelowHeader } from '@/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header'; import { ClientActions } from '@/components/clients/client-actions'; import { ProjectActions } from '@/components/projects/project-actions'; -// import { columns } from '@/components/projects/table'; import { Accordion, AccordionContent, @@ -13,7 +12,6 @@ import { import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { Tooltiper } from '@/components/ui/tooltip'; -import { useAppParams } from '@/hooks/useAppParams'; import { pushModal } from '@/modals'; import { InfoIcon, PlusIcon, PlusSquareIcon } from 'lucide-react'; @@ -24,20 +22,12 @@ interface ListProjectsProps { clients: IServiceClientWithProject[]; } export default function ListProjects({ projects, clients }: ListProjectsProps) { - const organizationId = useAppParams().organizationId; return ( <>
- @@ -57,7 +47,7 @@ export default function ListProjects({ projects, clients }: ListProjectsProps) { {projects.map((project) => { const pClients = clients.filter( - (client) => client.project_id === project.id + (client) => client.projectId === project.id ); return ( + + + ); +} diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/list-references.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/references/list-references.tsx similarity index 89% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/list-references.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/references/list-references.tsx index 0040cc79..85456771 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/list-references.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/references/list-references.tsx @@ -1,6 +1,6 @@ 'use client'; -import { StickyBelowHeader } from '@/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header'; +import { StickyBelowHeader } from '@/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header'; import { DataTable } from '@/components/data-table'; import { columns } from '@/components/references/table'; import { Button } from '@/components/ui/button'; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/references/page.tsx similarity index 71% rename from apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/references/page.tsx index 64351075..f008741d 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/[projectId]/settings/references/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/[projectId]/settings/references/page.tsx @@ -1,4 +1,4 @@ -import PageLayout from '@/app/(app)/[organizationId]/[projectId]/page-layout'; +import PageLayout from '@/app/(app)/[organizationSlug]/[projectId]/page-layout'; import { getReferences } from '@openpanel/db'; @@ -6,24 +6,24 @@ import ListReferences from './list-references'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; projectId: string; }; } export default async function Page({ - params: { organizationId, projectId }, + params: { organizationSlug, projectId }, }: PageProps) { const references = await getReferences({ where: { - project_id: projectId, + projectId, }, take: 50, skip: 0, }); return ( - + ); diff --git a/apps/dashboard/src/app/(app)/[organizationId]/create-project.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/create-project.tsx similarity index 97% rename from apps/dashboard/src/app/(app)/[organizationId]/create-project.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/create-project.tsx index df131a3d..f154eee7 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/create-project.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/create-project.tsx @@ -36,7 +36,7 @@ export function CreateProject() { const onSubmit: SubmitHandler = (values) => { mutation.mutate({ name: values.name, - organizationId: params.organizationId, + organizationSlug: params.organizationSlug, }); }; diff --git a/apps/dashboard/src/app/(app)/[organizationId]/page.tsx b/apps/dashboard/src/app/(app)/[organizationSlug]/page.tsx similarity index 86% rename from apps/dashboard/src/app/(app)/[organizationId]/page.tsx rename to apps/dashboard/src/app/(app)/[organizationSlug]/page.tsx index deaeb033..2ed6f5fb 100644 --- a/apps/dashboard/src/app/(app)/[organizationId]/page.tsx +++ b/apps/dashboard/src/app/(app)/[organizationSlug]/page.tsx @@ -12,14 +12,16 @@ import { CreateProject } from './create-project'; interface PageProps { params: { - organizationId: string; + organizationSlug: string; }; } -export default async function Page({ params: { organizationId } }: PageProps) { +export default async function Page({ + params: { organizationSlug }, +}: PageProps) { const [organization, projects] = await Promise.all([ - getOrganizationBySlug(organizationId), - getCurrentProjects(organizationId), + getOrganizationBySlug(organizationSlug), + getCurrentProjects(organizationSlug), ]); if (!organization) { @@ -55,7 +57,7 @@ export default async function Page({ params: { organizationId } }: PageProps) { } if (projects.length === 1 && projects[0]) { - return redirect(`/${organizationId}/${projects[0].id}`); + return redirect(`/${organizationSlug}/${projects[0].id}`); } return ( diff --git a/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx b/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx index e6d86f25..c9ea643d 100644 --- a/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx +++ b/apps/dashboard/src/app/(public)/share/overview/[id]/page.tsx @@ -1,5 +1,5 @@ -import { StickyBelowHeader } from '@/app/(app)/[organizationId]/[projectId]/layout-sticky-below-header'; -import { OverviewReportRange } from '@/app/(app)/[organizationId]/[projectId]/overview-sticky-header'; +import { StickyBelowHeader } from '@/app/(app)/[organizationSlug]/[projectId]/layout-sticky-below-header'; +import { OverviewReportRange } from '@/app/(app)/[organizationSlug]/[projectId]/overview-sticky-header'; import { Logo } from '@/components/logo'; import { OverviewFiltersButtons } from '@/components/overview/filters/overview-filters-buttons'; import ServerLiveCounter from '@/components/overview/live-counter'; @@ -28,8 +28,8 @@ export default async function Page({ params: { id } }: PageProps) { if (!share.public) { return notFound(); } - const projectId = share.project_id; - const organization = await getOrganizationBySlug(share.organization_slug); + const projectId = share.projectId; + const organization = await getOrganizationBySlug(share.organizationSlug); return (
diff --git a/apps/dashboard/src/app/api/clerk/webhook/route.ts b/apps/dashboard/src/app/api/clerk/webhook/route.ts index 0aa9adc3..2d42a9d8 100644 --- a/apps/dashboard/src/app/api/clerk/webhook/route.ts +++ b/apps/dashboard/src/app/api/clerk/webhook/route.ts @@ -12,9 +12,9 @@ export async function POST(request: Request) { data: access .filter((a): a is string => typeof a === 'string') .map((projectId) => ({ - organization_slug: payload.data.organization.slug!, - project_id: projectId, - user_id: payload.data.public_user_data.user_id, + organizationSlug: payload.data.organization.slug!, + projectId: projectId, + userId: payload.data.public_user_data.user_id, level: AccessLevel.read, })), }); @@ -23,8 +23,8 @@ export async function POST(request: Request) { if (payload.type === 'organizationMembership.deleted') { await db.projectAccess.deleteMany({ where: { - organization_slug: payload.data.organization.slug!, - user_id: payload.data.public_user_data.user_id, + organizationSlug: payload.data.organization.slug!, + userId: payload.data.public_user_data.user_id, }, }); } diff --git a/apps/dashboard/src/components/overview/overview-share.tsx b/apps/dashboard/src/components/overview/overview-share.tsx index 251d40cb..5c8933f7 100644 --- a/apps/dashboard/src/components/overview/overview-share.tsx +++ b/apps/dashboard/src/components/overview/overview-share.tsx @@ -58,9 +58,8 @@ export function OverviewShare({ data }: OverviewShareProps) { { mutation.mutate({ + ...data, public: false, - projectId: data?.project_id, - organizationId: data?.organization_slug, password: null, }); }} diff --git a/apps/dashboard/src/hooks/useAppParams.ts b/apps/dashboard/src/hooks/useAppParams.ts index 805ac9d6..616c7893 100644 --- a/apps/dashboard/src/hooks/useAppParams.ts +++ b/apps/dashboard/src/hooks/useAppParams.ts @@ -1,8 +1,7 @@ import { useParams } from 'next/navigation'; -// eslint-disable-next-line type AppParams = { - organizationId: string; + organizationSlug: string; projectId: string; }; @@ -10,7 +9,7 @@ export function useAppParams() { const params = useParams(); return { ...(params ?? {}), - organizationId: params?.organizationId, + organizationSlug: params?.organizationSlug, projectId: params?.projectId, } as T & AppParams; } diff --git a/apps/dashboard/src/modals/AddClient.tsx b/apps/dashboard/src/modals/AddClient.tsx index fd5c7810..da19d258 100644 --- a/apps/dashboard/src/modals/AddClient.tsx +++ b/apps/dashboard/src/modals/AddClient.tsx @@ -43,7 +43,7 @@ interface Props { projectId: string; } export default function AddClient(props: Props) { - const { organizationId, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const router = useRouter(); const form = useForm({ resolver: zodResolver(validation), @@ -62,14 +62,14 @@ export default function AddClient(props: Props) { }, }); const query = api.project.list.useQuery({ - organizationId, + organizationSlug, }); const onSubmit: SubmitHandler = (values) => { mutation.mutate({ name: values.name, cors: values.tab === 'website' ? values.cors : null, projectId: values.projectId, - organizationId, + organizationSlug, }); }; diff --git a/apps/dashboard/src/modals/AddDashboard.tsx b/apps/dashboard/src/modals/AddDashboard.tsx index e204981e..01ad6660 100644 --- a/apps/dashboard/src/modals/AddDashboard.tsx +++ b/apps/dashboard/src/modals/AddDashboard.tsx @@ -19,7 +19,7 @@ const validator = z.object({ type IForm = z.infer; export default function AddDashboard() { - const { projectId, organizationId: organizationSlug } = useAppParams(); + const { projectId, organizationSlug } = useAppParams(); const router = useRouter(); const { register, handleSubmit, formState } = useForm({ diff --git a/apps/dashboard/src/modals/AddProject.tsx b/apps/dashboard/src/modals/AddProject.tsx index ec6ff79c..60eb71d0 100644 --- a/apps/dashboard/src/modals/AddProject.tsx +++ b/apps/dashboard/src/modals/AddProject.tsx @@ -1,6 +1,7 @@ import { ButtonContainer } from '@/components/button-container'; import { InputWithLabel } from '@/components/forms/input-with-label'; import { Button } from '@/components/ui/button'; +import { useAppParams } from '@/hooks/useAppParams'; import { api, handleError } from '@/trpc/client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/navigation'; @@ -16,10 +17,9 @@ const validator = z.object({ }); type IForm = z.infer; -interface AddProjectProps { - organizationId: string; -} -export default function AddProject({ organizationId }: AddProjectProps) { + +export default function AddProject() { + const { organizationSlug } = useAppParams(); const router = useRouter(); const mutation = api.project.create.useMutation({ onError: handleError, @@ -45,7 +45,7 @@ export default function AddProject({ organizationId }: AddProjectProps) { onSubmit={handleSubmit((values) => { mutation.mutate({ ...values, - organizationId, + organizationSlug, }); })} > diff --git a/apps/dashboard/src/modals/AddReference.tsx b/apps/dashboard/src/modals/AddReference.tsx index 1f08a84e..0bfcbf32 100644 --- a/apps/dashboard/src/modals/AddReference.tsx +++ b/apps/dashboard/src/modals/AddReference.tsx @@ -1,12 +1,11 @@ import { ButtonContainer } from '@/components/button-container'; import { InputWithLabel } from '@/components/forms/input-with-label'; import { Button } from '@/components/ui/button'; -import { Calendar } from '@/components/ui/calendar'; import { useAppParams } from '@/hooks/useAppParams'; import { api, handleError } from '@/trpc/client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/navigation'; -import { Controller, useForm } from 'react-hook-form'; +import { useForm } from 'react-hook-form'; import { toast } from 'sonner'; import type { z } from 'zod'; diff --git a/apps/dashboard/src/modals/EditReport.tsx b/apps/dashboard/src/modals/EditReport.tsx index 35459eff..780c06fd 100644 --- a/apps/dashboard/src/modals/EditReport.tsx +++ b/apps/dashboard/src/modals/EditReport.tsx @@ -21,7 +21,7 @@ type EditReportProps = { }; export default function EditReport({ form, onSubmit }: EditReportProps) { - const { register, handleSubmit, reset, formState } = useForm({ + const { register, handleSubmit, formState } = useForm({ resolver: zodResolver(validator), defaultValues: form, }); diff --git a/apps/dashboard/src/modals/Modal/Container.tsx b/apps/dashboard/src/modals/Modal/Container.tsx index 8b194791..25ca82f8 100644 --- a/apps/dashboard/src/modals/Modal/Container.tsx +++ b/apps/dashboard/src/modals/Modal/Container.tsx @@ -8,10 +8,11 @@ import { popModal } from '..'; interface ModalContentProps { children: React.ReactNode; + className?: string; } -export function ModalContent({ children }: ModalContentProps) { - return {children}; +export function ModalContent({ children, className }: ModalContentProps) { + return {children}; } interface ModalHeaderProps { diff --git a/apps/dashboard/src/modals/SaveReport.tsx b/apps/dashboard/src/modals/SaveReport.tsx index 6a82e9a4..8bee62c9 100644 --- a/apps/dashboard/src/modals/SaveReport.tsx +++ b/apps/dashboard/src/modals/SaveReport.tsx @@ -30,7 +30,7 @@ type IForm = z.infer; export default function SaveReport({ report }: SaveReportProps) { const router = useRouter(); - const { organizationId: organizationSlug, projectId } = useAppParams(); + const { organizationSlug, projectId } = useAppParams(); const searchParams = useSearchParams(); const dashboardId = searchParams?.get('dashboardId') ?? undefined; diff --git a/apps/dashboard/src/modals/ShareOverviewModal.tsx b/apps/dashboard/src/modals/ShareOverviewModal.tsx index 2a4114c5..15fa94e0 100644 --- a/apps/dashboard/src/modals/ShareOverviewModal.tsx +++ b/apps/dashboard/src/modals/ShareOverviewModal.tsx @@ -20,16 +20,16 @@ const validator = zShareOverview; type IForm = z.infer; export default function ShareOverviewModal() { - const { projectId, organizationId: organizationSlug } = useAppParams(); + const { projectId, organizationSlug } = useAppParams(); const router = useRouter(); - const { register, handleSubmit, formState, control } = useForm({ + const { register, handleSubmit, control } = useForm({ resolver: zodResolver(validator), defaultValues: { public: true, password: '', projectId, - organizationId: organizationSlug, + organizationSlug, }, }); diff --git a/apps/dashboard/src/modals/index.tsx b/apps/dashboard/src/modals/index.tsx index 74837922..09b00e8d 100644 --- a/apps/dashboard/src/modals/index.tsx +++ b/apps/dashboard/src/modals/index.tsx @@ -5,8 +5,13 @@ import dynamic from 'next/dynamic'; import { createPushModal } from 'pushmodal'; import type { ConfirmProps } from './Confirm'; +import { ModalContent } from './Modal/Container'; -const Loading = () => ; +const Loading = () => ( + + + +); const modals = { EditProject: dynamic(() => import('./EditProject'), { diff --git a/apps/dashboard/src/trpc/api/routers/client.ts b/apps/dashboard/src/trpc/api/routers/client.ts index a6981a40..0d9ecdbb 100644 --- a/apps/dashboard/src/trpc/api/routers/client.ts +++ b/apps/dashboard/src/trpc/api/routers/client.ts @@ -3,38 +3,9 @@ import { createTRPCRouter, protectedProcedure } from '@/trpc/api/trpc'; import { z } from 'zod'; import { hashPassword, stripTrailingSlash } from '@openpanel/common'; -import { db, transformClient } from '@openpanel/db'; +import { db } from '@openpanel/db'; export const clientRouter = createTRPCRouter({ - list: protectedProcedure - .input( - z.object({ - organizationId: z.string(), - }) - ) - .query(async ({ input: { organizationId } }) => { - return db.client.findMany({ - where: { - organization_slug: organizationId, - }, - include: { - project: true, - }, - }); - }), - get: protectedProcedure - .input( - z.object({ - id: z.string(), - }) - ) - .query(({ input }) => { - return db.client.findUniqueOrThrow({ - where: { - id: input.id, - }, - }); - }), update: protectedProcedure .input( z.object({ @@ -59,7 +30,7 @@ export const clientRouter = createTRPCRouter({ z.object({ name: z.string(), projectId: z.string(), - organizationId: z.string(), + organizationSlug: z.string(), cors: z.string().nullable(), }) ) @@ -67,8 +38,8 @@ export const clientRouter = createTRPCRouter({ const secret = randomUUID(); const client = await db.client.create({ data: { - organization_slug: input.organizationId, - project_id: input.projectId, + organizationSlug: input.organizationSlug, + projectId: input.projectId, name: input.name, secret: input.cors ? null : await hashPassword(secret), cors: input.cors ? stripTrailingSlash(input.cors) : '*', @@ -76,7 +47,7 @@ export const clientRouter = createTRPCRouter({ }); return { - ...transformClient(client), + ...client, secret: input.cors ? null : secret, }; }), diff --git a/apps/dashboard/src/trpc/api/routers/dashboard.ts b/apps/dashboard/src/trpc/api/routers/dashboard.ts index bef7ceb3..57a48638 100644 --- a/apps/dashboard/src/trpc/api/routers/dashboard.ts +++ b/apps/dashboard/src/trpc/api/routers/dashboard.ts @@ -28,8 +28,8 @@ export const dashboardRouter = createTRPCRouter({ return db.dashboard.create({ data: { id: await getId('dashboard', name), - project_id: projectId, - organization_slug: organizationSlug, + projectId: projectId, + organizationSlug: organizationSlug, name, }, }); @@ -63,7 +63,7 @@ export const dashboardRouter = createTRPCRouter({ if (forceDelete) { await db.report.deleteMany({ where: { - dashboard_id: id, + dashboardId: id, }, }); } diff --git a/apps/dashboard/src/trpc/api/routers/event.ts b/apps/dashboard/src/trpc/api/routers/event.ts index be4213f5..d3e728f7 100644 --- a/apps/dashboard/src/trpc/api/routers/event.ts +++ b/apps/dashboard/src/trpc/api/routers/event.ts @@ -22,12 +22,12 @@ export const eventRouter = createTRPCRouter({ .mutation(({ input: { projectId, name, icon, color, conversion } }) => { return db.eventMeta.upsert({ where: { - name_project_id: { + name_projectId: { name, - project_id: projectId, + projectId, }, }, - create: { project_id: projectId, name, icon, color, conversion }, + create: { projectId, name, icon, color, conversion }, update: { icon, color, conversion }, }); }), diff --git a/apps/dashboard/src/trpc/api/routers/onboarding.ts b/apps/dashboard/src/trpc/api/routers/onboarding.ts index 28ecc684..e1b71776 100644 --- a/apps/dashboard/src/trpc/api/routers/onboarding.ts +++ b/apps/dashboard/src/trpc/api/routers/onboarding.ts @@ -4,12 +4,7 @@ import { clerkClient } from '@clerk/nextjs'; import { z } from 'zod'; import { hashPassword, stripTrailingSlash } from '@openpanel/common'; -import { - db, - transformClient, - transformOrganization, - transformProject, -} from '@openpanel/db'; +import { db, transformOrganization } from '@openpanel/db'; export const onboardingRouter = createTRPCRouter({ organziation: protectedProcedure @@ -30,7 +25,7 @@ export const onboardingRouter = createTRPCRouter({ const project = await db.project.create({ data: { name: input.project, - organization_slug: org.slug, + organizationSlug: org.slug, }, }); @@ -38,19 +33,19 @@ export const onboardingRouter = createTRPCRouter({ const client = await db.client.create({ data: { name: `${project.name} Client`, - organization_slug: org.slug, - project_id: project.id, + organizationSlug: org.slug, + projectId: project.id, cors: input.cors ? stripTrailingSlash(input.cors) : '*', secret: input.cors ? null : await hashPassword(secret), }, }); return { - client: transformClient({ + client: { ...client, secret: input.cors ? null : secret, - }), - project: transformProject(project), + }, + project, organization: transformOrganization(org), }; } diff --git a/apps/dashboard/src/trpc/api/routers/organization.ts b/apps/dashboard/src/trpc/api/routers/organization.ts index 6c0f83e0..226ab997 100644 --- a/apps/dashboard/src/trpc/api/routers/organization.ts +++ b/apps/dashboard/src/trpc/api/routers/organization.ts @@ -77,15 +77,15 @@ export const organizationRouter = createTRPCRouter({ return db.$transaction([ db.projectAccess.deleteMany({ where: { - user_id: input.userId, - organization_slug: input.organizationSlug, + userId: input.userId, + organizationSlug: input.organizationSlug, }, }), db.projectAccess.createMany({ data: input.access.map((projectId) => ({ - user_id: input.userId, - organization_slug: input.organizationSlug, - project_id: projectId, + userId: input.userId, + organizationSlug: input.organizationSlug, + projectId: projectId, level: 'read', })), }), diff --git a/apps/dashboard/src/trpc/api/routers/project.ts b/apps/dashboard/src/trpc/api/routers/project.ts index a7868364..fa12c0b1 100644 --- a/apps/dashboard/src/trpc/api/routers/project.ts +++ b/apps/dashboard/src/trpc/api/routers/project.ts @@ -8,12 +8,12 @@ export const projectRouter = createTRPCRouter({ list: protectedProcedure .input( z.object({ - organizationId: z.string().nullable(), + organizationSlug: z.string().nullable(), }) ) - .query(async ({ input: { organizationId } }) => { - if (organizationId === null) return []; - return getProjectsByOrganizationSlug(organizationId); + .query(async ({ input: { organizationSlug } }) => { + if (organizationSlug === null) return []; + return getProjectsByOrganizationSlug(organizationSlug); }), update: protectedProcedure @@ -37,15 +37,15 @@ export const projectRouter = createTRPCRouter({ .input( z.object({ name: z.string().min(1), - organizationId: z.string(), + organizationSlug: z.string(), }) ) - .mutation(async ({ input }) => { + .mutation(async ({ input: { name, organizationSlug } }) => { return db.project.create({ data: { - id: await getId('project', input.name), - organization_slug: input.organizationId, - name: input.name, + id: await getId('project', name), + organizationSlug: organizationSlug, + name: name, }, }); }), diff --git a/apps/dashboard/src/trpc/api/routers/reference.ts b/apps/dashboard/src/trpc/api/routers/reference.ts index 3a03eb14..06571363 100644 --- a/apps/dashboard/src/trpc/api/routers/reference.ts +++ b/apps/dashboard/src/trpc/api/routers/reference.ts @@ -19,7 +19,7 @@ export const referenceRouter = createTRPCRouter({ data: { title, description, - project_id: projectId, + projectId, date: new Date(datetime), }, }); @@ -47,7 +47,7 @@ export const referenceRouter = createTRPCRouter({ const { startDate, endDate } = getChartStartEndDate(input); return getReferences({ where: { - project_id: projectId, + projectId, date: { gte: new Date(startDate), lte: new Date(endDate), diff --git a/apps/dashboard/src/trpc/api/routers/report.ts b/apps/dashboard/src/trpc/api/routers/report.ts index a5246802..b5a58ef7 100644 --- a/apps/dashboard/src/trpc/api/routers/report.ts +++ b/apps/dashboard/src/trpc/api/routers/report.ts @@ -20,14 +20,14 @@ export const reportRouter = createTRPCRouter({ }); return db.report.create({ data: { - project_id: dashboard.project_id, - dashboard_id: dashboardId, + projectId: dashboard.projectId, + dashboardId, name: report.name, events: report.events, interval: report.interval, breakdowns: report.breakdowns, - chart_type: report.chartType, - line_type: report.lineType, + chartType: report.chartType, + lineType: report.lineType, range: report.range, formula: report.formula, }, @@ -50,8 +50,8 @@ export const reportRouter = createTRPCRouter({ events: report.events, interval: report.interval, breakdowns: report.breakdowns, - chart_type: report.chartType, - line_type: report.lineType, + chartType: report.chartType, + lineType: report.lineType, range: report.range, formula: report.formula, }, diff --git a/apps/dashboard/src/trpc/api/routers/share.ts b/apps/dashboard/src/trpc/api/routers/share.ts index a365c397..969d42ec 100644 --- a/apps/dashboard/src/trpc/api/routers/share.ts +++ b/apps/dashboard/src/trpc/api/routers/share.ts @@ -12,12 +12,12 @@ export const shareRouter = createTRPCRouter({ .mutation(({ input }) => { return db.shareOverview.upsert({ where: { - project_id: input.projectId, + projectId: input.projectId, }, create: { id: uid.rnd(), - organization_slug: input.organizationId, - project_id: input.projectId, + organizationSlug: input.organizationSlug, + projectId: input.projectId, public: input.public, password: input.password || null, }, diff --git a/apps/public/src/app/footer.tsx b/apps/public/src/app/footer.tsx index 05c203bb..b7f0c18a 100644 --- a/apps/public/src/app/footer.tsx +++ b/apps/public/src/app/footer.tsx @@ -4,11 +4,10 @@ import Image from 'next/image'; import Link from 'next/link'; import { Heading2, Lead2 } from './copy'; -import { JoinWaitlist } from './join-waitlist'; export default function Footer() { return ( -