implement showActions to pixels/links for viewonly users.

This commit is contained in:
Francis Cao 2026-01-26 23:26:40 -08:00
parent 57eef5866b
commit 2f998ff9d8
7 changed files with 76 additions and 36 deletions

View file

@ -2,13 +2,13 @@ import { DataGrid } from '@/components/common/DataGrid';
import { useLinksQuery, useNavigation } from '@/components/hooks'; import { useLinksQuery, useNavigation } from '@/components/hooks';
import { LinksTable } from './LinksTable'; import { LinksTable } from './LinksTable';
export function LinksDataTable() { export function LinksDataTable({ showActions = false }: { showActions?: boolean }) {
const { teamId } = useNavigation(); const { teamId } = useNavigation();
const query = useLinksQuery({ teamId }); const query = useLinksQuery({ teamId });
return ( return (
<DataGrid query={query} allowSearch={true} autoFocus={false} allowPaging={true}> <DataGrid query={query} allowSearch={true} autoFocus={false} allowPaging={true}>
{({ data }) => <LinksTable data={data} />} {({ data }) => <LinksTable data={data} showActions={showActions} />}
</DataGrid> </DataGrid>
); );
} }

View file

@ -4,21 +4,30 @@ import { LinksDataTable } from '@/app/(main)/links/LinksDataTable';
import { PageBody } from '@/components/common/PageBody'; import { PageBody } from '@/components/common/PageBody';
import { PageHeader } from '@/components/common/PageHeader'; import { PageHeader } from '@/components/common/PageHeader';
import { Panel } from '@/components/common/Panel'; import { Panel } from '@/components/common/Panel';
import { useMessages, useNavigation } from '@/components/hooks'; import { useLoginQuery, useMessages, useNavigation, useTeamMembersQuery } from '@/components/hooks';
import { ROLES } from '@/lib/constants';
import { LinkAddButton } from './LinkAddButton'; import { LinkAddButton } from './LinkAddButton';
export function LinksPage() { export function LinksPage() {
const { user } = useLoginQuery();
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { teamId } = useNavigation(); const { teamId } = useNavigation();
const { data } = useTeamMembersQuery(teamId);
const showActions =
(teamId &&
data?.data.filter(team => team.userId === user.id && team.role !== ROLES.teamViewOnly)
.length > 0) ||
(!teamId && user.role !== ROLES.viewOnly);
return ( return (
<PageBody> <PageBody>
<Column gap="6" margin="2"> <Column gap="6" margin="2">
<PageHeader title={formatMessage(labels.links)}> <PageHeader title={formatMessage(labels.links)}>
<LinkAddButton teamId={teamId} /> {showActions && <LinkAddButton teamId={teamId} />}
</PageHeader> </PageHeader>
<Panel> <Panel>
<LinksDataTable /> <LinksDataTable showActions={showActions} />
</Panel> </Panel>
</Column> </Column>
</PageBody> </PageBody>

View file

@ -6,7 +6,11 @@ import { useMessages, useNavigation, useSlug } from '@/components/hooks';
import { LinkDeleteButton } from './LinkDeleteButton'; import { LinkDeleteButton } from './LinkDeleteButton';
import { LinkEditButton } from './LinkEditButton'; import { LinkEditButton } from './LinkEditButton';
export function LinksTable(props: DataTableProps) { export interface LinksTableProps extends DataTableProps {
showActions?: boolean;
}
export function LinksTable({ showActions, ...props }: LinksTableProps) {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { websiteId, renderUrl } = useNavigation(); const { websiteId, renderUrl } = useNavigation();
const { getSlugUrl } = useSlug('link'); const { getSlugUrl } = useSlug('link');
@ -36,16 +40,18 @@ export function LinksTable(props: DataTableProps) {
<DataColumn id="created" label={formatMessage(labels.created)} width="200px"> <DataColumn id="created" label={formatMessage(labels.created)} width="200px">
{(row: any) => <DateDistance date={new Date(row.createdAt)} />} {(row: any) => <DateDistance date={new Date(row.createdAt)} />}
</DataColumn> </DataColumn>
<DataColumn id="action" align="end" width="100px"> {showActions && (
{({ id, name }: any) => { <DataColumn id="action" align="end" width="100px">
return ( {({ id, name }: any) => {
<Row> return (
<LinkEditButton linkId={id} /> <Row>
<LinkDeleteButton linkId={id} websiteId={websiteId} name={name} /> <LinkEditButton linkId={id} />
</Row> <LinkDeleteButton linkId={id} websiteId={websiteId} name={name} />
); </Row>
}} );
</DataColumn> }}
</DataColumn>
)}
</DataTable> </DataTable>
); );
} }

View file

@ -2,13 +2,13 @@ import { DataGrid } from '@/components/common/DataGrid';
import { useNavigation, usePixelsQuery } from '@/components/hooks'; import { useNavigation, usePixelsQuery } from '@/components/hooks';
import { PixelsTable } from './PixelsTable'; import { PixelsTable } from './PixelsTable';
export function PixelsDataTable() { export function PixelsDataTable({ showActions = false }: { showActions?: boolean }) {
const { teamId } = useNavigation(); const { teamId } = useNavigation();
const query = usePixelsQuery({ teamId }); const query = usePixelsQuery({ teamId });
return ( return (
<DataGrid query={query} allowSearch={true} autoFocus={false} allowPaging={true}> <DataGrid query={query} allowSearch={true} autoFocus={false} allowPaging={true}>
{({ data }) => <PixelsTable data={data} />} {({ data }) => <PixelsTable data={data} showActions={showActions} />}
</DataGrid> </DataGrid>
); );
} }

View file

@ -3,22 +3,31 @@ import { Column } from '@umami/react-zen';
import { PageBody } from '@/components/common/PageBody'; import { PageBody } from '@/components/common/PageBody';
import { PageHeader } from '@/components/common/PageHeader'; import { PageHeader } from '@/components/common/PageHeader';
import { Panel } from '@/components/common/Panel'; import { Panel } from '@/components/common/Panel';
import { useMessages, useNavigation } from '@/components/hooks'; import { useLoginQuery, useMessages, useNavigation, useTeamMembersQuery } from '@/components/hooks';
import { ROLES } from '@/lib/constants';
import { PixelAddButton } from './PixelAddButton'; import { PixelAddButton } from './PixelAddButton';
import { PixelsDataTable } from './PixelsDataTable'; import { PixelsDataTable } from './PixelsDataTable';
export function PixelsPage() { export function PixelsPage() {
const { user } = useLoginQuery();
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { teamId } = useNavigation(); const { teamId } = useNavigation();
const { data } = useTeamMembersQuery(teamId);
const showActions =
(teamId &&
data?.data.filter(team => team.userId === user.id && team.role !== ROLES.teamViewOnly)
.length > 0) ||
(!teamId && user.role !== ROLES.viewOnly);
return ( return (
<PageBody> <PageBody>
<Column gap="6" margin="2"> <Column gap="6" margin="2">
<PageHeader title={formatMessage(labels.pixels)}> <PageHeader title={formatMessage(labels.pixels)}>
<PixelAddButton teamId={teamId} /> {showActions && <PixelAddButton teamId={teamId} />}
</PageHeader> </PageHeader>
<Panel> <Panel>
<PixelsDataTable /> <PixelsDataTable showActions={showActions} />
</Panel> </Panel>
</Column> </Column>
</PageBody> </PageBody>

View file

@ -6,10 +6,15 @@ import { useMessages, useNavigation, useSlug } from '@/components/hooks';
import { PixelDeleteButton } from './PixelDeleteButton'; import { PixelDeleteButton } from './PixelDeleteButton';
import { PixelEditButton } from './PixelEditButton'; import { PixelEditButton } from './PixelEditButton';
export function PixelsTable(props: DataTableProps) { export interface PixelsTableProps extends DataTableProps {
showActions?: boolean;
}
export function PixelsTable({ showActions, ...props }: PixelsTableProps) {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { renderUrl } = useNavigation(); const { renderUrl } = useNavigation();
const { getSlugUrl } = useSlug('pixel'); const { getSlugUrl } = useSlug('pixel');
console.log(showActions);
return ( return (
<DataTable {...props}> <DataTable {...props}>
@ -31,18 +36,20 @@ export function PixelsTable(props: DataTableProps) {
<DataColumn id="created" label={formatMessage(labels.created)}> <DataColumn id="created" label={formatMessage(labels.created)}>
{(row: any) => <DateDistance date={new Date(row.createdAt)} />} {(row: any) => <DateDistance date={new Date(row.createdAt)} />}
</DataColumn> </DataColumn>
<DataColumn id="action" align="end" width="100px"> {showActions && (
{(row: any) => { <DataColumn id="action" align="end" width="100px">
const { id, name } = row; {(row: any) => {
const { id, name } = row;
return ( return (
<Row> <Row>
<PixelEditButton pixelId={id} /> <PixelEditButton pixelId={id} />
<PixelDeleteButton pixelId={id} name={name} /> <PixelDeleteButton pixelId={id} name={name} />
</Row> </Row>
); );
}} }}
</DataColumn> </DataColumn>
)}
</DataTable> </DataTable>
); );
} }

View file

@ -3,22 +3,31 @@ import { Column } from '@umami/react-zen';
import { PageBody } from '@/components/common/PageBody'; import { PageBody } from '@/components/common/PageBody';
import { PageHeader } from '@/components/common/PageHeader'; import { PageHeader } from '@/components/common/PageHeader';
import { Panel } from '@/components/common/Panel'; import { Panel } from '@/components/common/Panel';
import { useMessages, useNavigation } from '@/components/hooks'; import { useLoginQuery, useMessages, useNavigation, useTeamMembersQuery } from '@/components/hooks';
import { ROLES } from '@/lib/constants';
import { WebsiteAddButton } from './WebsiteAddButton'; import { WebsiteAddButton } from './WebsiteAddButton';
import { WebsitesDataTable } from './WebsitesDataTable'; import { WebsitesDataTable } from './WebsitesDataTable';
export function WebsitesPage() { export function WebsitesPage() {
const { user } = useLoginQuery();
const { teamId } = useNavigation(); const { teamId } = useNavigation();
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const { data } = useTeamMembersQuery(teamId);
const showActions =
(teamId &&
data?.data.filter(team => team.userId === user.id && team.role !== ROLES.teamViewOnly)
.length > 0) ||
(!teamId && user.role !== ROLES.viewOnly);
return ( return (
<PageBody> <PageBody>
<Column gap="6" margin="2"> <Column gap="6" margin="2">
<PageHeader title={formatMessage(labels.websites)}> <PageHeader title={formatMessage(labels.websites)}>
<WebsiteAddButton teamId={teamId} /> {showActions && <WebsiteAddButton teamId={teamId} />}
</PageHeader> </PageHeader>
<Panel> <Panel>
<WebsitesDataTable teamId={teamId} /> <WebsitesDataTable teamId={teamId} showActions={showActions} />
</Panel> </Panel>
</Column> </Column>
</PageBody> </PageBody>