diff --git a/next.config.js b/next.config.js index 4a316433..d0336b10 100644 --- a/next.config.js +++ b/next.config.js @@ -78,6 +78,11 @@ const redirects = [ destination: '/teams/:id/websites', permanent: true, }, + { + source: '/teams/:id/settings', + destination: cloudMode ? `${cloudUrl}/teams/:id/settings` : '/teams/:id/settings/team', + permanent: true, + }, ]; if (cloudMode && cloudUrl && disableLogin) { diff --git a/src/app/(main)/NavBar.tsx b/src/app/(main)/NavBar.tsx index fdf70ae8..c26e5906 100644 --- a/src/app/(main)/NavBar.tsx +++ b/src/app/(main)/NavBar.tsx @@ -8,14 +8,16 @@ import LanguageButton from 'components/input/LanguageButton'; import ProfileButton from 'components/input/ProfileButton'; import TeamsButton from 'components/input/TeamsButton'; import Icons from 'components/icons'; -import { useLogin, useMessages, useNavigation } from 'components/hooks'; +import { useLogin, useMessages, useNavigation, useTeamContext } from 'components/hooks'; import styles from './NavBar.module.css'; export function NavBar() { const { user } = useLogin(); const { formatMessage, labels } = useMessages(); + const { pathname } = useNavigation(); + const { teamId, renderTeamUrl } = useTeamContext(); + const cloudMode = Boolean(process.env.cloudMode); - const { pathname, renderTeamUrl, teamId } = useNavigation(); const links = [ { label: formatMessage(labels.dashboard), url: renderTeamUrl('/dashboard') }, diff --git a/src/app/(main)/console/[[...websiteId]]/page.tsx b/src/app/(main)/console/[[...websiteId]]/page.tsx index 3c4b8bb8..0c69f4a5 100644 --- a/src/app/(main)/console/[[...websiteId]]/page.tsx +++ b/src/app/(main)/console/[[...websiteId]]/page.tsx @@ -16,5 +16,5 @@ export default async function ({ params: { websiteId } }) { } export const metadata: Metadata = { - title: 'Test Console | umami', + title: 'Test Console | Umami', }; diff --git a/src/app/(main)/dashboard/page.tsx b/src/app/(main)/dashboard/page.tsx index 1853a9f5..50c08f47 100644 --- a/src/app/(main)/dashboard/page.tsx +++ b/src/app/(main)/dashboard/page.tsx @@ -6,5 +6,5 @@ export default function () { } export const metadata: Metadata = { - title: 'Dashboard | umami', + title: 'Dashboard | Umami', }; diff --git a/src/app/(main)/reports/ReportsHeader.tsx b/src/app/(main)/reports/ReportsHeader.tsx index 0f885af7..76e9b343 100644 --- a/src/app/(main)/reports/ReportsHeader.tsx +++ b/src/app/(main)/reports/ReportsHeader.tsx @@ -1,12 +1,12 @@ 'use client'; import PageHeader from 'components/layout/PageHeader'; import { Icon, Icons, Text } from 'react-basics'; -import { useMessages, useNavigation } from 'components/hooks'; +import { useMessages, useTeamContext } from 'components/hooks'; import LinkButton from 'components/common/LinkButton'; export function ReportsHeader() { const { formatMessage, labels } = useMessages(); - const { renderTeamUrl } = useNavigation(); + const { renderTeamUrl } = useTeamContext(); return ( diff --git a/src/app/(main)/reports/ReportsTable.tsx b/src/app/(main)/reports/ReportsTable.tsx index 09f8b3fc..aae604b6 100644 --- a/src/app/(main)/reports/ReportsTable.tsx +++ b/src/app/(main)/reports/ReportsTable.tsx @@ -1,6 +1,6 @@ import { GridColumn, GridTable, Icon, Icons, Text, useBreakpoint } from 'react-basics'; import LinkButton from 'components/common/LinkButton'; -import { useMessages, useLogin, useNavigation } from 'components/hooks'; +import { useMessages, useLogin, useTeamContext } from 'components/hooks'; import { REPORT_TYPES } from 'lib/constants'; import ReportDeleteButton from './ReportDeleteButton'; @@ -8,7 +8,7 @@ export function ReportsTable({ data = [], showDomain }: { data: any[]; showDomai const { formatMessage, labels } = useMessages(); const { user } = useLogin(); const breakpoint = useBreakpoint(); - const { renderTeamUrl } = useNavigation(); + const { renderTeamUrl } = useTeamContext(); return ( diff --git a/src/app/(main)/reports/[reportId]/BaseParameters.tsx b/src/app/(main)/reports/[reportId]/BaseParameters.tsx index 9b6be5d8..113f917d 100644 --- a/src/app/(main)/reports/[reportId]/BaseParameters.tsx +++ b/src/app/(main)/reports/[reportId]/BaseParameters.tsx @@ -3,7 +3,7 @@ import { FormRow } from 'react-basics'; import { parseDateRange } from 'lib/date'; import DateFilter from 'components/input/DateFilter'; import WebsiteSelect from 'components/input/WebsiteSelect'; -import { useMessages } from 'components/hooks'; +import { useLogin, useMessages, useTeamContext } from 'components/hooks'; import { ReportContext } from './Report'; export interface BaseParametersProps { @@ -21,6 +21,8 @@ export function BaseParameters({ }: BaseParametersProps) { const { report, updateReport } = useContext(ReportContext); const { formatMessage, labels } = useMessages(); + const { user } = useLogin(); + const { teamId } = useTeamContext(); const { parameters } = report || {}; const { websiteId, dateRange } = parameters || {}; @@ -39,7 +41,12 @@ export function BaseParameters({ {showWebsiteSelect && ( {allowWebsiteSelect && ( - + )} )} diff --git a/src/app/(main)/reports/[reportId]/ReportHeader.tsx b/src/app/(main)/reports/[reportId]/ReportHeader.tsx index d69cd0cd..303781df 100644 --- a/src/app/(main)/reports/[reportId]/ReportHeader.tsx +++ b/src/app/(main)/reports/[reportId]/ReportHeader.tsx @@ -1,7 +1,6 @@ import { useContext } from 'react'; -import { useRouter } from 'next/navigation'; import { Icon, LoadingButton, InlineEditField, useToasts } from 'react-basics'; -import { useMessages, useApi } from 'components/hooks'; +import { useMessages, useApi, useNavigation, useTeamContext } from 'components/hooks'; import { ReportContext } from './Report'; import styles from './ReportHeader.module.css'; import { REPORT_TYPES } from 'lib/constants'; @@ -10,8 +9,10 @@ export function ReportHeader({ icon }) { const { report, updateReport } = useContext(ReportContext); const { formatMessage, labels, messages } = useMessages(); const { showToast } = useToasts(); + const { router } = useNavigation(); + const { renderTeamUrl } = useTeamContext(); + const { post, useMutation } = useApi(); - const router = useRouter(); const { mutate: create, isPending: isCreating } = useMutation({ mutationFn: (data: any) => post(`/reports`, data), }); @@ -28,7 +29,7 @@ export function ReportHeader({ icon }) { create(report, { onSuccess: async ({ id }) => { showToast({ message: formatMessage(messages.saved), variant: 'success' }); - router.push(`/reports/${id}`); + router.push(renderTeamUrl(`/reports/${id}`)); }, }); } else { diff --git a/src/app/(main)/reports/[reportId]/page.tsx b/src/app/(main)/reports/[reportId]/page.tsx index 1f173d7c..179ee2ff 100644 --- a/src/app/(main)/reports/[reportId]/page.tsx +++ b/src/app/(main)/reports/[reportId]/page.tsx @@ -10,5 +10,5 @@ export default function ReportDetailsPage({ params: { reportId } }) { } export const metadata: Metadata = { - title: 'Reports | umami', + title: 'Reports | Umami', }; diff --git a/src/app/(main)/reports/create/ReportTemplates.tsx b/src/app/(main)/reports/create/ReportTemplates.tsx index 886146b2..5abdb9fb 100644 --- a/src/app/(main)/reports/create/ReportTemplates.tsx +++ b/src/app/(main)/reports/create/ReportTemplates.tsx @@ -6,7 +6,7 @@ import Funnel from 'assets/funnel.svg'; import Lightbulb from 'assets/lightbulb.svg'; import Magnet from 'assets/magnet.svg'; import styles from './ReportTemplates.module.css'; -import { useMessages, useNavigation } from 'components/hooks'; +import { useMessages, useTeamContext } from 'components/hooks'; function ReportItem({ title, description, url, icon }) { const { formatMessage, labels } = useMessages(); @@ -34,7 +34,7 @@ function ReportItem({ title, description, url, icon }) { export function ReportTemplates({ showHeader = true }: { showHeader?: boolean }) { const { formatMessage, labels } = useMessages(); - const { renderTeamUrl } = useNavigation(); + const { renderTeamUrl } = useTeamContext(); const reports = [ { diff --git a/src/app/(main)/reports/create/page.tsx b/src/app/(main)/reports/create/page.tsx index a1a761bc..8726f435 100644 --- a/src/app/(main)/reports/create/page.tsx +++ b/src/app/(main)/reports/create/page.tsx @@ -6,5 +6,5 @@ export default function ReportsCreatePage() { } export const metadata: Metadata = { - title: 'Create Report | umami', + title: 'Create Report | Umami', }; diff --git a/src/app/(main)/reports/event-data/EventDataReport.tsx b/src/app/(main)/reports/event-data/EventDataReport.tsx index 2ce17306..fb786b31 100644 --- a/src/app/(main)/reports/event-data/EventDataReport.tsx +++ b/src/app/(main)/reports/event-data/EventDataReport.tsx @@ -11,7 +11,7 @@ const defaultParameters = { parameters: { fields: [], filters: [] }, }; -export default function EventDataReport({ reportId }: { reportId: string }) { +export default function EventDataReport({ reportId }: { reportId?: string }) { return ( } /> diff --git a/src/app/(main)/reports/event-data/page.tsx b/src/app/(main)/reports/event-data/page.tsx new file mode 100644 index 00000000..7ed435ef --- /dev/null +++ b/src/app/(main)/reports/event-data/page.tsx @@ -0,0 +1,10 @@ +import EventDataReport from './EventDataReport'; +import { Metadata } from 'next'; + +export default function FunnelReportPage() { + return ; +} + +export const metadata: Metadata = { + title: 'Funnel Report | Umami', +}; diff --git a/src/app/(main)/reports/funnel/FunnelReport.tsx b/src/app/(main)/reports/funnel/FunnelReport.tsx index b9b4bd77..4013f073 100644 --- a/src/app/(main)/reports/funnel/FunnelReport.tsx +++ b/src/app/(main)/reports/funnel/FunnelReport.tsx @@ -14,7 +14,7 @@ const defaultParameters = { parameters: { window: 60, urls: [] }, }; -export default function FunnelReport({ reportId }) { +export default function FunnelReport({ reportId }: { reportId?: string }) { return ( } /> diff --git a/src/app/(main)/reports/funnel/page.tsx b/src/app/(main)/reports/funnel/page.tsx index 1ce70c75..7a2f2a5a 100644 --- a/src/app/(main)/reports/funnel/page.tsx +++ b/src/app/(main)/reports/funnel/page.tsx @@ -2,9 +2,9 @@ import FunnelReport from './FunnelReport'; import { Metadata } from 'next'; export default function FunnelReportPage() { - return ; + return ; } export const metadata: Metadata = { - title: 'Funnel Report | umami', + title: 'Funnel Report | Umami', }; diff --git a/src/app/(main)/reports/insights/InsightsReport.tsx b/src/app/(main)/reports/insights/InsightsReport.tsx index 709cdf72..3c199003 100644 --- a/src/app/(main)/reports/insights/InsightsReport.tsx +++ b/src/app/(main)/reports/insights/InsightsReport.tsx @@ -13,7 +13,7 @@ const defaultParameters = { parameters: { fields: [], filters: [] }, }; -export default function InsightsReport({ reportId }: { reportId: string }) { +export default function InsightsReport({ reportId }: { reportId?: string }) { return ( } /> diff --git a/src/app/(main)/reports/insights/page.tsx b/src/app/(main)/reports/insights/page.tsx index 1f4db5c6..e09565c0 100644 --- a/src/app/(main)/reports/insights/page.tsx +++ b/src/app/(main)/reports/insights/page.tsx @@ -2,9 +2,9 @@ import InsightsReport from './InsightsReport'; import { Metadata } from 'next'; export default function InsightsReportPage() { - return ; + return ; } export const metadata: Metadata = { - title: 'Insights Report | umami', + title: 'Insights Report | Umami', }; diff --git a/src/app/(main)/reports/page.tsx b/src/app/(main)/reports/page.tsx index 22e6e2a7..0dc380a9 100644 --- a/src/app/(main)/reports/page.tsx +++ b/src/app/(main)/reports/page.tsx @@ -1,14 +1,14 @@ import ReportsHeader from './ReportsHeader'; import ReportsDataTable from './ReportsDataTable'; -export default function () { +export default function ({ params: { teamId } }: { params: { teamId: string } }) { return ( <> - + ); } export const metadata = { - title: 'Reports | umami', + title: 'Reports | Umami', }; diff --git a/src/app/(main)/reports/retention/RetentionReport.tsx b/src/app/(main)/reports/retention/RetentionReport.tsx index b49975dc..f02e5bb1 100644 --- a/src/app/(main)/reports/retention/RetentionReport.tsx +++ b/src/app/(main)/reports/retention/RetentionReport.tsx @@ -19,7 +19,7 @@ const defaultParameters = { }, }; -export default function RetentionReport({ reportId }: { reportId: string }) { +export default function RetentionReport({ reportId }: { reportId?: string }) { return ( } /> diff --git a/src/app/(main)/reports/retention/page.tsx b/src/app/(main)/reports/retention/page.tsx index 4e316793..41784372 100644 --- a/src/app/(main)/reports/retention/page.tsx +++ b/src/app/(main)/reports/retention/page.tsx @@ -2,9 +2,9 @@ import { Metadata } from 'next'; import RetentionReport from './RetentionReport'; export default function RetentionReportPage() { - return ; + return ; } export const metadata: Metadata = { - title: 'Create Report | umami', + title: 'Create Report | Umami', }; diff --git a/src/app/(main)/settings/layout.tsx b/src/app/(main)/settings/layout.tsx index 2f80a5d0..f8d0d1f0 100644 --- a/src/app/(main)/settings/layout.tsx +++ b/src/app/(main)/settings/layout.tsx @@ -1,6 +1,6 @@ 'use client'; import { usePathname } from 'next/navigation'; -import { useLogin, useMessages } from 'components/hooks'; +import { useLogin, useMessages, useTeamContext } from 'components/hooks'; import SideNav from 'components/layout/SideNav'; import styles from './layout.module.css'; @@ -9,12 +9,32 @@ export default function SettingsLayout({ children }) { const pathname = usePathname(); const { formatMessage, labels } = useMessages(); const cloudMode = !!process.env.cloudMode; + const { teamId, renderTeamUrl } = useTeamContext(); const items = [ - { key: 'websites', label: formatMessage(labels.websites), url: '/settings/websites' }, - { key: 'teams', label: formatMessage(labels.teams), url: '/settings/teams' }, - user.isAdmin && { key: 'users', label: formatMessage(labels.users), url: '/settings/users' }, - { key: 'profile', label: formatMessage(labels.profile), url: '/settings/profile' }, + { + key: 'team', + label: formatMessage(labels.team), + url: renderTeamUrl('/settings/team'), + }, + teamId && { + key: 'members', + label: formatMessage(labels.members), + url: renderTeamUrl('/settings/members'), + }, + { + key: 'websites', + label: formatMessage(labels.websites), + url: renderTeamUrl('/settings/websites'), + }, + !teamId && { key: 'teams', label: formatMessage(labels.teams), url: '/settings/teams' }, + !teamId && + user.isAdmin && { + key: 'users', + label: formatMessage(labels.users), + url: renderTeamUrl('/settings/users'), + }, + !teamId && { key: 'profile', label: formatMessage(labels.profile), url: '/settings/profile' }, ].filter(n => n); const getKey = () => items.find(({ url }) => pathname === url)?.key; diff --git a/src/app/(main)/settings/profile/page.tsx b/src/app/(main)/settings/profile/page.tsx index d7a3ad92..f0c1047e 100644 --- a/src/app/(main)/settings/profile/page.tsx +++ b/src/app/(main)/settings/profile/page.tsx @@ -12,5 +12,5 @@ export default function () { } export const metadata: Metadata = { - title: 'Profile Settings | umami', + title: 'Profile Settings | Umami', }; diff --git a/src/app/(main)/settings/teams/[teamId]/TeamData.tsx b/src/app/(main)/settings/teams/[teamId]/TeamData.tsx index 003737f0..facee764 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamData.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamData.tsx @@ -1,3 +1,4 @@ +'use client'; import { ActionForm, Button, Modal, ModalTrigger } from 'react-basics'; import { useMessages } from 'components/hooks'; import TeamDeleteForm from '../TeamDeleteForm'; diff --git a/src/app/(main)/settings/teams/[teamId]/TeamEditForm.tsx b/src/app/(main)/settings/teams/[teamId]/TeamEditForm.tsx index 8af74a26..d1e80f7b 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamEditForm.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamEditForm.tsx @@ -1,3 +1,4 @@ +'use client'; import { SubmitButton, Form, diff --git a/src/app/(main)/settings/teams/[teamId]/TeamMemberRemoveButton.tsx b/src/app/(main)/settings/teams/[teamId]/TeamMemberRemoveButton.tsx index 19f29fd2..581b97a2 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamMemberRemoveButton.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamMemberRemoveButton.tsx @@ -1,3 +1,4 @@ +'use client'; import { useApi, useMessages } from 'components/hooks'; import { Icon, Icons, LoadingButton, Text } from 'react-basics'; import { touch } from 'store/cache'; diff --git a/src/app/(main)/settings/teams/[teamId]/TeamMembers.tsx b/src/app/(main)/settings/teams/[teamId]/TeamMembers.tsx index 75e88e25..c56511f9 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamMembers.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamMembers.tsx @@ -1,3 +1,4 @@ +'use client'; import DataTable from 'components/common/DataTable'; import TeamMembersTable from './TeamMembersTable'; import useTeamMembers from 'components/hooks/queries/useTeamMembers'; diff --git a/src/app/(main)/settings/teams/[teamId]/TeamMembersTable.tsx b/src/app/(main)/settings/teams/[teamId]/TeamMembersTable.tsx index d993bbc0..aceb5894 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamMembersTable.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamMembersTable.tsx @@ -1,3 +1,4 @@ +'use client'; import { GridColumn, GridTable, useBreakpoint } from 'react-basics'; import { useMessages, useLogin } from 'components/hooks'; import { ROLES } from 'lib/constants'; diff --git a/src/app/(main)/settings/teams/[teamId]/TeamSettings.tsx b/src/app/(main)/settings/teams/[teamId]/TeamSettings.tsx index d26ddc95..d3463bbf 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamSettings.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamSettings.tsx @@ -1,7 +1,6 @@ 'use client'; import { useState } from 'react'; import { Item, Loading, Tabs, Flexbox, Text, Icon } from 'react-basics'; -import TeamsContext from 'app/(main)/teams/TeamsContext'; import PageHeader from 'components/layout/PageHeader'; import { ROLES } from 'lib/constants'; import Icons from 'components/icons'; @@ -27,32 +26,26 @@ export function TeamSettings({ teamId }: { teamId: string }) { ); return ( - - - }> - - - - - {formatMessage(labels.view)} - - - setTab(value)} - style={{ marginBottom: 30 }} - > - {formatMessage(labels.details)} - {formatMessage(labels.members)} - {formatMessage(labels.websites)} - {formatMessage(labels.data)} - - {tab === 'details' && } - {tab === 'members' && } - {tab === 'websites' && } - {canEdit && tab === 'data' && } - - + + }> + + + + + {formatMessage(labels.view)} + + + setTab(value)} style={{ marginBottom: 30 }}> + {formatMessage(labels.details)} + {formatMessage(labels.members)} + {formatMessage(labels.websites)} + {formatMessage(labels.data)} + + {tab === 'details' && } + {tab === 'members' && } + {tab === 'websites' && } + {canEdit && tab === 'data' && } + ); } diff --git a/src/app/(main)/settings/teams/[teamId]/TeamWebsiteRemoveButton.tsx b/src/app/(main)/settings/teams/[teamId]/TeamWebsiteRemoveButton.tsx index 336e151a..843b76d3 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamWebsiteRemoveButton.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamWebsiteRemoveButton.tsx @@ -1,3 +1,4 @@ +'use client'; import { useApi, useMessages } from 'components/hooks'; import { Icon, Icons, LoadingButton, Text } from 'react-basics'; diff --git a/src/app/(main)/settings/teams/[teamId]/TeamWebsites.tsx b/src/app/(main)/settings/teams/[teamId]/TeamWebsites.tsx index 25f459d5..1fce8c23 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamWebsites.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamWebsites.tsx @@ -1,3 +1,4 @@ +'use client'; import WebsitesDataTable from 'app/(main)/settings/websites/WebsitesDataTable'; export function TeamWebsites({ teamId, allowEdit }: { teamId: string; allowEdit: boolean }) { diff --git a/src/app/(main)/settings/teams/[teamId]/TeamWebsitesTable.tsx b/src/app/(main)/settings/teams/[teamId]/TeamWebsitesTable.tsx index 2fe74b65..fe08c059 100644 --- a/src/app/(main)/settings/teams/[teamId]/TeamWebsitesTable.tsx +++ b/src/app/(main)/settings/teams/[teamId]/TeamWebsitesTable.tsx @@ -1,3 +1,4 @@ +'use client'; import Link from 'next/link'; import { Button, GridColumn, GridTable, Icon, Text } from 'react-basics'; import { useMessages } from 'components/hooks'; diff --git a/src/app/(main)/settings/teams/[teamId]/page.tsx b/src/app/(main)/settings/teams/[teamId]/page.tsx index ad242431..de53549f 100644 --- a/src/app/(main)/settings/teams/[teamId]/page.tsx +++ b/src/app/(main)/settings/teams/[teamId]/page.tsx @@ -1,9 +1,5 @@ import TeamSettings from './TeamSettings'; export default function ({ params: { teamId } }) { - if (process.env.cloudMode) { - return null; - } - return ; } diff --git a/src/app/(main)/settings/teams/page.tsx b/src/app/(main)/settings/teams/page.tsx index 08e96595..98ce95fb 100644 --- a/src/app/(main)/settings/teams/page.tsx +++ b/src/app/(main)/settings/teams/page.tsx @@ -3,10 +3,6 @@ import TeamsDataTable from './TeamsDataTable'; import TeamsHeader from './TeamsHeader'; export default function () { - if (process.env.cloudMode) { - return null; - } - return ( <> diff --git a/src/app/(main)/settings/users/[userId]/page.tsx b/src/app/(main)/settings/users/[userId]/page.tsx index e8f1793e..2e2e4137 100644 --- a/src/app/(main)/settings/users/[userId]/page.tsx +++ b/src/app/(main)/settings/users/[userId]/page.tsx @@ -1,9 +1,5 @@ import UserSettings from './UserSettings'; export default function ({ params: { userId } }) { - if (process.env.cloudMode) { - return null; - } - return ; } diff --git a/src/app/(main)/settings/users/page.tsx b/src/app/(main)/settings/users/page.tsx index 06bb5f1e..0be95a0d 100644 --- a/src/app/(main)/settings/users/page.tsx +++ b/src/app/(main)/settings/users/page.tsx @@ -11,5 +11,5 @@ export default function () { ); } export const metadata: Metadata = { - title: 'Users | umami', + title: 'Users | Umami', }; diff --git a/src/app/(main)/settings/websites/Websites.tsx b/src/app/(main)/settings/websites/Websites.tsx index 9f14f4e6..09750656 100644 --- a/src/app/(main)/settings/websites/Websites.tsx +++ b/src/app/(main)/settings/websites/Websites.tsx @@ -3,13 +3,13 @@ import { useLogin } from 'components/hooks'; import WebsitesDataTable from './WebsitesDataTable'; import WebsitesHeader from './WebsitesHeader'; -export default function Websites() { +export default function Websites({ teamId }: { teamId: string }) { const { user } = useLogin(); return ( <> - + ); } diff --git a/src/app/(main)/settings/websites/WebsitesTable.tsx b/src/app/(main)/settings/websites/WebsitesTable.tsx index a1f0c475..884221bf 100644 --- a/src/app/(main)/settings/websites/WebsitesTable.tsx +++ b/src/app/(main)/settings/websites/WebsitesTable.tsx @@ -1,7 +1,7 @@ import { ReactNode } from 'react'; import Link from 'next/link'; import { Button, Text, Icon, Icons, GridTable, GridColumn, useBreakpoint } from 'react-basics'; -import { useMessages, useLogin, useNavigation } from 'components/hooks'; +import { useMessages, useLogin, useTeamContext } from 'components/hooks'; export interface WebsitesTableProps { data: any[]; @@ -23,7 +23,7 @@ export function WebsitesTable({ const { formatMessage, labels } = useMessages(); const { user } = useLogin(); const breakpoint = useBreakpoint(); - const { renderTeamUrl } = useNavigation(); + const { renderTeamUrl } = useTeamContext(); return ( @@ -32,12 +32,12 @@ export function WebsitesTable({ {showActions && ( {row => { - const { id, userId } = row; + const { id } = row; return ( <> - {allowEdit && !teamId && user.id === userId && ( - + {allowEdit && (teamId || user.isAdmin) && ( + - - - - - ); -} - -export default TeamReports; diff --git a/src/app/(main)/teams/[teamId]/reports/[reportId]/page.tsx b/src/app/(main)/teams/[teamId]/reports/[reportId]/page.tsx new file mode 100644 index 00000000..0f51aa88 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/reports/[reportId]/page.tsx @@ -0,0 +1,3 @@ +import Page from 'app/(main)/reports/[reportId]/page'; + +export default Page; diff --git a/src/app/(main)/teams/[teamId]/reports/create/page.tsx b/src/app/(main)/teams/[teamId]/reports/create/page.tsx index 77127dfb..c1e77757 100644 --- a/src/app/(main)/teams/[teamId]/reports/create/page.tsx +++ b/src/app/(main)/teams/[teamId]/reports/create/page.tsx @@ -1,10 +1,3 @@ -import { Metadata } from 'next'; -import ReportTemplates from 'app/(main)/reports/create/ReportTemplates'; +import Page from 'app/(main)/reports/create/page'; -export default function () { - return ; -} - -export const metadata: Metadata = { - title: 'Create Report | umami', -}; +export default Page; diff --git a/src/app/(main)/teams/[teamId]/reports/event-data/page.tsx b/src/app/(main)/teams/[teamId]/reports/event-data/page.tsx new file mode 100644 index 00000000..77a6c44d --- /dev/null +++ b/src/app/(main)/teams/[teamId]/reports/event-data/page.tsx @@ -0,0 +1,3 @@ +import Page from 'app/(main)/reports/event-data/page'; + +export default Page; diff --git a/src/app/(main)/teams/[teamId]/reports/funnel/page.tsx b/src/app/(main)/teams/[teamId]/reports/funnel/page.tsx new file mode 100644 index 00000000..be91966c --- /dev/null +++ b/src/app/(main)/teams/[teamId]/reports/funnel/page.tsx @@ -0,0 +1,3 @@ +import Page from 'app/(main)/reports/funnel/page'; + +export default Page; diff --git a/src/app/(main)/teams/[teamId]/reports/insights/page.tsx b/src/app/(main)/teams/[teamId]/reports/insights/page.tsx new file mode 100644 index 00000000..f8a91c65 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/reports/insights/page.tsx @@ -0,0 +1,3 @@ +import Page from 'app/(main)/reports/insights/page'; + +export default Page; diff --git a/src/app/(main)/teams/[teamId]/reports/page.tsx b/src/app/(main)/teams/[teamId]/reports/page.tsx index ad2ea4dd..6eedabb4 100644 --- a/src/app/(main)/teams/[teamId]/reports/page.tsx +++ b/src/app/(main)/teams/[teamId]/reports/page.tsx @@ -1,15 +1,3 @@ -import { Metadata } from 'next'; -import ReportsHeader from 'app/(main)/reports/ReportsHeader'; -import ReportsDataTable from 'app/(main)/reports/ReportsDataTable'; +import Page from 'app/(main)/reports/page'; -export default function ({ params: { teamId } }) { - return ( - <> - - - - ); -} -export const metadata: Metadata = { - title: 'Reports | umami', -}; +export default Page; diff --git a/src/app/(main)/teams/[teamId]/reports/retention/page.tsx b/src/app/(main)/teams/[teamId]/reports/retention/page.tsx new file mode 100644 index 00000000..62f8e5bf --- /dev/null +++ b/src/app/(main)/teams/[teamId]/reports/retention/page.tsx @@ -0,0 +1,3 @@ +import Page from 'app/(main)/reports/retention/page'; + +export default Page; diff --git a/src/app/(main)/teams/[teamId]/settings/layout.tsx b/src/app/(main)/teams/[teamId]/settings/layout.tsx new file mode 100644 index 00000000..f3b1b94b --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/layout.tsx @@ -0,0 +1,3 @@ +import Layout from 'app/(main)/settings/layout'; + +export default Layout; diff --git a/src/app/(main)/teams/[teamId]/settings/members/Members.tsx b/src/app/(main)/teams/[teamId]/settings/members/Members.tsx new file mode 100644 index 00000000..28639981 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/members/Members.tsx @@ -0,0 +1,15 @@ +'use client'; +import TeamMembers from 'app/(main)/settings/teams/[teamId]/TeamMembers'; +import PageHeader from 'components/layout/PageHeader'; +import { useMessages } from 'components/hooks'; + +export default function ({ teamId }: { teamId: string }) { + const { formatMessage, labels } = useMessages(); + + return ( + <> + + + + ); +} diff --git a/src/app/(main)/teams/[teamId]/settings/members/page.tsx b/src/app/(main)/teams/[teamId]/settings/members/page.tsx new file mode 100644 index 00000000..04f89399 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/members/page.tsx @@ -0,0 +1,5 @@ +import Members from './Members'; + +export default function ({ params: { teamId } }) { + return ; +} diff --git a/src/app/(main)/teams/[teamId]/settings/team/Team.tsx b/src/app/(main)/teams/[teamId]/settings/team/Team.tsx new file mode 100644 index 00000000..40a57ce7 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/team/Team.tsx @@ -0,0 +1,26 @@ +'use client'; +import TeamEditForm from 'app/(main)/settings/teams/[teamId]/TeamEditForm'; +import { useLogin, useMessages, useTeam } from 'components/hooks'; +import { Loading } from 'react-basics'; +import PageHeader from 'components/layout/PageHeader'; +import { ROLES } from 'lib/constants'; + +export default function Team({ teamId }: { teamId: string }) { + const { user } = useLogin(); + const { formatMessage, labels } = useMessages(); + const { data: team, isLoading } = useTeam(teamId); + const allowEdit = !!team?.teamUser?.find( + ({ userId, role }) => role === ROLES.teamOwner && userId === user.id, + ); + + if (isLoading) { + return ; + } + + return ( + <> + + + + ); +} diff --git a/src/app/(main)/teams/[teamId]/settings/team/page.tsx b/src/app/(main)/teams/[teamId]/settings/team/page.tsx new file mode 100644 index 00000000..19edd98c --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/team/page.tsx @@ -0,0 +1,5 @@ +import Team from './Team'; + +export default function ({ params: { teamId } }) { + return ; +} diff --git a/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx b/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx new file mode 100644 index 00000000..ad1a97dd --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/websites/[websiteId]/page.tsx @@ -0,0 +1,3 @@ +import Page from 'app/(main)/settings/websites/[websiteId]/page'; + +export default Page; diff --git a/src/app/(main)/teams/[teamId]/settings/websites/page.tsx b/src/app/(main)/teams/[teamId]/settings/websites/page.tsx new file mode 100644 index 00000000..66290215 --- /dev/null +++ b/src/app/(main)/teams/[teamId]/settings/websites/page.tsx @@ -0,0 +1,3 @@ +import Page from 'app/(main)/settings/websites/page'; + +export default Page; diff --git a/src/app/(main)/teams/[teamId]/websites/[websiteId]/page.tsx b/src/app/(main)/teams/[teamId]/websites/[websiteId]/page.tsx index 1684e740..224ff4d5 100644 --- a/src/app/(main)/teams/[teamId]/websites/[websiteId]/page.tsx +++ b/src/app/(main)/teams/[teamId]/websites/[websiteId]/page.tsx @@ -1,5 +1,3 @@ -import WebsiteDetails from 'app/(main)/websites/[websiteId]/WebsiteDetails'; +import Page from 'app/(main)/websites/[websiteId]/page'; -export default function TeamWebsitePage({ params: { websiteId } }) { - return ; -} +export default Page; diff --git a/src/app/(main)/teams/[teamId]/websites/page.tsx b/src/app/(main)/teams/[teamId]/websites/page.tsx index 1218c620..553c852a 100644 --- a/src/app/(main)/teams/[teamId]/websites/page.tsx +++ b/src/app/(main)/teams/[teamId]/websites/page.tsx @@ -1,11 +1,3 @@ -import WebsitesDataTable from 'app/(main)/settings/websites/WebsitesDataTable'; -import WebsitesHeader from 'app/(main)/settings/websites/WebsitesHeader'; +import Page from 'app/(main)/websites/page'; -export default function TeamWebsitesPage({ params: { teamId } }: { params: { teamId: string } }) { - return ( - <> - - - - ); -} +export default Page; diff --git a/src/app/(main)/websites/WebsitesBrowse.tsx b/src/app/(main)/websites/WebsitesBrowse.tsx index 30e22618..88fa9e5e 100644 --- a/src/app/(main)/websites/WebsitesBrowse.tsx +++ b/src/app/(main)/websites/WebsitesBrowse.tsx @@ -2,11 +2,11 @@ import WebsitesDataTable from '../settings/websites/WebsitesDataTable'; import { useLogin } from 'components/hooks'; -export function WebsitesBrowse() { +export function WebsitesBrowse({ teamId, userId }: { teamId: string; userId: string }) { const { user } = useLogin(); const allowEdit = !process.env.cloudMode; - return ; + return ; } export default WebsitesBrowse; diff --git a/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx b/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx index eba155c1..c4df6e71 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteChart.tsx @@ -5,7 +5,7 @@ import { getDateArray } from 'lib/date'; export function WebsiteChart({ websiteId }: { websiteId: string }) { const [dateRange] = useDateRange(websiteId); - const { startDate, endDate, unit, modified } = dateRange; + const { startDate, endDate, unit } = dateRange; const [timezone] = useTimezone(); const { query: { url, referrer, os, browser, device, country, region, city, title }, @@ -15,7 +15,7 @@ export function WebsiteChart({ websiteId }: { websiteId: string }) { const { data, isLoading } = useQuery({ queryKey: [ 'websites:pageviews', - { websiteId, modified, url, referrer, os, browser, device, country, region, city, title }, + { websiteId, url, referrer, os, browser, device, country, region, city, title }, ], queryFn: () => get(`/websites/${websiteId}/pageviews`, { diff --git a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx index e40dd11b..3c5c4e9a 100644 --- a/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx +++ b/src/app/(main)/websites/[websiteId]/WebsiteMetricsBar.tsx @@ -19,7 +19,7 @@ export function WebsiteMetricsBar({ const { formatMessage, labels } = useMessages(); const { get, useQuery } = useApi(); const [dateRange] = useDateRange(websiteId); - const { startDate, endDate, modified } = dateRange; + const { startDate, endDate } = dateRange; const { ref, isSticky } = useSticky({ enabled: sticky }); const { query: { url, referrer, title, os, browser, device, country, region, city }, @@ -28,7 +28,7 @@ export function WebsiteMetricsBar({ const { data, error, isLoading, isFetched } = useQuery({ queryKey: [ 'websites:stats', - { websiteId, modified, url, referrer, title, os, browser, device, country, region, city }, + { websiteId, url, referrer, title, os, browser, device, country, region, city }, ], queryFn: () => get(`/websites/${websiteId}/stats`, { diff --git a/src/app/(main)/websites/page.tsx b/src/app/(main)/websites/page.tsx index a1542510..a1cc5216 100644 --- a/src/app/(main)/websites/page.tsx +++ b/src/app/(main)/websites/page.tsx @@ -2,15 +2,15 @@ import WebsitesHeader from 'app/(main)/settings/websites/WebsitesHeader'; import WebsitesBrowse from './WebsitesBrowse'; import { Metadata } from 'next'; -export default function WebsitesPage() { +export default function WebsitesPage({ params: { teamId, userId } }) { return ( <> - + ); } export const metadata: Metadata = { - title: 'Websites | umami', + title: 'Websites | Umami', }; diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 2ac3f724..aa2765c9 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -21,5 +21,5 @@ export default async function LoginPage() { } export const metadata: Metadata = { - title: 'Login | umami', + title: 'Login | Umami', }; diff --git a/src/app/logout/page.tsx b/src/app/logout/page.tsx index 89a3bce9..11ee9b67 100644 --- a/src/app/logout/page.tsx +++ b/src/app/logout/page.tsx @@ -6,5 +6,5 @@ export default function () { } export const metadata: Metadata = { - title: 'Logout | umami', + title: 'Logout | Umami', }; diff --git a/src/components/hooks/index.ts b/src/components/hooks/index.ts index 9e9993c3..23ba94ff 100644 --- a/src/components/hooks/index.ts +++ b/src/components/hooks/index.ts @@ -25,5 +25,6 @@ export * from './useLocale'; export * from './useMessages'; export * from './useNavigation'; export * from './useSticky'; +export * from './useTeamContext'; export * from './useTheme'; export * from './useTimezone'; diff --git a/src/components/hooks/queries/useLogin.ts b/src/components/hooks/queries/useLogin.ts index af9eba85..c17687b0 100644 --- a/src/components/hooks/queries/useLogin.ts +++ b/src/components/hooks/queries/useLogin.ts @@ -1,9 +1,13 @@ import useStore, { setUser } from 'store/app'; import useApi from './useApi'; +import { UseQueryResult } from '@tanstack/react-query'; const selector = (state: { user: any }) => state.user; -export function useLogin() { +export function useLogin(): { + user: any; + setUser: (data: any) => void; +} & UseQueryResult { const { get, useQuery } = useApi(); const user = useStore(selector); @@ -19,7 +23,7 @@ export function useLogin() { enabled: !user, }); - return { user, ...query }; + return { user, setUser, ...query }; } export default useLogin; diff --git a/src/components/hooks/queries/useWebsites.ts b/src/components/hooks/queries/useWebsites.ts index 575ef236..5a091123 100644 --- a/src/components/hooks/queries/useWebsites.ts +++ b/src/components/hooks/queries/useWebsites.ts @@ -2,14 +2,18 @@ import useApi from './useApi'; import useFilterQuery from './useFilterQuery'; import useCache from 'store/cache'; -export function useWebsites({ userId, teamId }: { userId?: string; teamId?: string }) { +export function useWebsites( + { userId, teamId }: { userId?: string; teamId?: string }, + params?: { [key: string]: string | number }, +) { const { get } = useApi(); const modified = useCache((state: any) => state?.websites); return useFilterQuery({ - queryKey: ['websites', { userId, teamId, modified }], - queryFn: (params: any) => { + queryKey: ['websites', { userId, teamId, modified, ...params }], + queryFn: (data: any) => { return get(teamId ? `/teams/${teamId}/websites` : `/users/${userId}/websites`, { + ...data, ...params, }); }, diff --git a/src/components/hooks/useNavigation.ts b/src/components/hooks/useNavigation.ts index bf839177..0ff7155a 100644 --- a/src/components/hooks/useNavigation.ts +++ b/src/components/hooks/useNavigation.ts @@ -7,13 +7,10 @@ export function useNavigation(): { query: { [key: string]: string }; router: any; renderUrl: (params: any, reset?: boolean) => string; - renderTeamUrl: (url: string) => string; - teamId?: string; } { const router = useRouter(); const pathname = usePathname(); const params = useSearchParams(); - const [, teamId] = pathname.match(/^\/teams\/([a-f0-9-]+)/) || []; const query = useMemo(() => { const obj = {}; @@ -29,11 +26,7 @@ export function useNavigation(): { return reset ? pathname : buildUrl(pathname, { ...query, ...params }); } - function renderTeamUrl(url: string) { - return teamId ? `/teams/${teamId}${url}` : url; - } - - return { pathname, query, router, renderUrl, renderTeamUrl, teamId }; + return { pathname, query, router, renderUrl }; } export default useNavigation; diff --git a/src/components/hooks/useTeamContext.ts b/src/components/hooks/useTeamContext.ts new file mode 100644 index 00000000..0c0c0a7d --- /dev/null +++ b/src/components/hooks/useTeamContext.ts @@ -0,0 +1,17 @@ +import { usePathname } from 'next/navigation'; + +export function useTeamContext(): { + teamId?: string; + renderTeamUrl: (url: string) => string; +} { + const pathname = usePathname(); + const [, teamId] = pathname.match(/^\/teams\/([a-f0-9-]+)/) || []; + + function renderTeamUrl(url: string) { + return teamId ? `/teams/${teamId}${url}` : url; + } + + return { teamId, renderTeamUrl }; +} + +export default useTeamContext; diff --git a/src/components/input/TeamsButton.module.css b/src/components/input/TeamsButton.module.css index 46583fbc..7b4d8c7b 100644 --- a/src/components/input/TeamsButton.module.css +++ b/src/components/input/TeamsButton.module.css @@ -1,3 +1,7 @@ +.button { + font-weight: 700; +} + .menu { background: var(--base50); } diff --git a/src/components/input/TeamsButton.tsx b/src/components/input/TeamsButton.tsx index 41235a80..a91cdb2f 100644 --- a/src/components/input/TeamsButton.tsx +++ b/src/components/input/TeamsButton.tsx @@ -1,9 +1,9 @@ import { Key } from 'react'; import { Text, Icon, Button, Popup, Menu, Item, PopupTrigger, Flexbox } from 'react-basics'; +import classNames from 'classnames'; import Icons from 'components/icons'; import { useLogin, useMessages, useNavigation } from 'components/hooks'; import styles from './TeamsButton.module.css'; -import classNames from 'classnames'; export function TeamsButton({ teamId }: { teamId: string }) { const { user } = useLogin(); diff --git a/src/components/input/WebsiteSelect.tsx b/src/components/input/WebsiteSelect.tsx index 71f96100..1ea8d392 100644 --- a/src/components/input/WebsiteSelect.tsx +++ b/src/components/input/WebsiteSelect.tsx @@ -1,30 +1,27 @@ import { useState, Key } from 'react'; import { Dropdown, Item } from 'react-basics'; -import { useApi } from 'components/hooks'; -import { useMessages } from 'components/hooks'; -import styles from './WebsiteSelect.module.css'; +import { useWebsite, useWebsites, useMessages } from 'components/hooks'; import Empty from 'components/common/Empty'; +import styles from './WebsiteSelect.module.css'; export function WebsiteSelect({ websiteId, + teamId, + userId, onSelect, }: { websiteId?: string; + teamId?: string; + userId?: string; onSelect?: (key: any) => void; }) { + const { formatMessage, labels, messages } = useMessages(); const [query, setQuery] = useState(''); const [selectedId, setSelectedId] = useState(websiteId); - const { formatMessage, labels, messages } = useMessages(); - const { get, useQuery } = useApi(); - const { data: websites, isLoading } = useQuery({ - queryKey: ['websites:me', { query }], - queryFn: () => get('/me/websites', { query, pageSize: 5 }), - }); - const { data: website } = useQuery({ - queryKey: ['websites', { selectedId }], - queryFn: () => get(`/websites/${selectedId}`), - enabled: !!selectedId, - }); + + const { data: website } = useWebsite(selectedId as string); + + const queryResult = useWebsites({ teamId, userId }, { query, pageSize: 5 }); const renderValue = () => { return website?.name; @@ -46,7 +43,7 @@ export function WebsiteSelect({ return ( {({ id, name }) => {name}} diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index ea2d849e..ad8e45a9 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -176,12 +176,13 @@ async function rawQuery(sql: string, data: object): Promise { } async function pagedQuery(model: string, criteria: T, filters: SearchFilter) { - const { page = 1, pageSize = DEFAULT_PAGE_SIZE, orderBy, sortDescending = false } = filters || {}; + const { page = 1, pageSize, orderBy, sortDescending = false } = filters || {}; + const size = +pageSize || DEFAULT_PAGE_SIZE; const data = await prisma.client[model].findMany({ ...criteria, ...{ - ...(pageSize > 0 && { take: +pageSize, skip: +pageSize * (page - 1) }), + ...(size > 0 && { take: +size, skip: +size * (page - 1) }), ...(orderBy && { orderBy: [ { diff --git a/src/pages/api/teams/[teamId]/users/index.ts b/src/pages/api/teams/[teamId]/users/index.ts index b79df943..53f0dd0a 100644 --- a/src/pages/api/teams/[teamId]/users/index.ts +++ b/src/pages/api/teams/[teamId]/users/index.ts @@ -46,11 +46,24 @@ export default async ( const { query, page, pageSize } = req.query; - const users = await getTeamUsers(teamId, { - query, - page, - pageSize: +pageSize || undefined, - }); + const users = await getTeamUsers( + { + where: { teamId }, + include: { + user: { + select: { + id: true, + username: true, + }, + }, + }, + }, + { + query, + page, + pageSize, + }, + ); return ok(res, users); } diff --git a/src/queries/admin/teamUser.ts b/src/queries/admin/teamUser.ts index e082c94c..34e4a1a5 100644 --- a/src/queries/admin/teamUser.ts +++ b/src/queries/admin/teamUser.ts @@ -1,7 +1,8 @@ -import { TeamUser } from '@prisma/client'; +import { Prisma, TeamUser } from '@prisma/client'; import { uuid } from 'lib/crypto'; import prisma from 'lib/prisma'; import { FilterResult, TeamUserSearchFilter } from 'lib/types'; +import TeamUserFindManyArgs = Prisma.TeamUserFindManyArgs; export async function getTeamUser(teamId: string, userId: string): Promise { return prisma.client.teamUser.findFirst({ @@ -13,23 +14,29 @@ export async function getTeamUser(teamId: string, userId: string): Promise> { + const { query } = filters; + const mode = prisma.getQueryMode(); + + const where: Prisma.TeamUserWhereInput = { + ...criteria.where, + user: { + username: query + ? { + contains: query, + mode, + } + : undefined, + }, + }; + return prisma.pagedQuery( 'teamUser', { - where: { - teamId, - }, - include: { - user: { - select: { - id: true, - username: true, - }, - }, - }, + ...criteria, + where, }, filters, ); diff --git a/src/queries/admin/website.ts b/src/queries/admin/website.ts index 984770ae..ab63d255 100644 --- a/src/queries/admin/website.ts +++ b/src/queries/admin/website.ts @@ -28,37 +28,23 @@ export async function getWebsites( criteria: WebsiteFindManyArgs, filters: WebsiteSearchFilter, ): Promise> { - const { userId, teamId, query } = filters; + const { query } = filters; const mode = prisma.getQueryMode(); const where: Prisma.WebsiteWhereInput = { ...criteria.where, - AND: [ - { - OR: [ - { - ...(userId && { userId }), - ...(teamId && { teamId }), - }, - ], - }, - { - OR: query - ? [ - { - name: { contains: query, mode }, - }, - { - domain: { contains: query, mode }, - }, - ] - : [], - }, - ], + name: { + contains: query ? query : undefined, + mode, + }, + domain: { + contains: query ? query : undefined, + mode, + }, deletedAt: null, }; - return prisma.pagedQuery('website', { where }, filters); + return prisma.pagedQuery('website', { ...criteria, where }, filters); } export async function getAllWebsites(userId: string) {