Skip to content

Commit 3fe3888

Browse files
authored
feat: use consistent headers almost everywhere (#1337)
* feat: add contentlayout for members page * feat: add contentLayout to action run page * feat: prettify token page * fix: make token page slightly prettier * fix: fix type errors for toekens * fix: fix broken tests * feat: improve stage page look * feat: add layout to stages and stageid page * feat: add layout for actions settings pages * feat: add contentlayout to pubs page
1 parent 1f50df5 commit 3fe3888

File tree

20 files changed

+976
-563
lines changed

20 files changed

+976
-563
lines changed
Lines changed: 25 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
import type { Metadata } from "next";
22

33
import { notFound, redirect } from "next/navigation";
4-
import { jsonObjectFrom } from "kysely/helpers/postgres";
54

65
import { Capabilities, MembershipType } from "db/public";
6+
import { Activity } from "ui/icon";
77

8-
import type { ActionRun } from "./getActionRunsTableColumns";
9-
import { db } from "~/kysely/database";
108
import { getPageLoginData } from "~/lib/authentication/loginData";
119
import { userCan } from "~/lib/authorization/capabilities";
12-
import { pubType } from "~/lib/server";
13-
import { autoCache } from "~/lib/server/cache/autoCache";
10+
import { getActionRuns } from "~/lib/server/actions";
1411
import { findCommunityBySlug } from "~/lib/server/community";
12+
import { ContentLayout } from "../../ContentLayout";
1513
import { ActionRunsTable } from "./ActionRunsTable";
1614

1715
export const metadata: Metadata = {
@@ -27,81 +25,40 @@ export default async function Page(props: {
2725

2826
const { communitySlug } = params;
2927

30-
const { user } = await getPageLoginData();
28+
const [{ user }, community] = await Promise.all([
29+
getPageLoginData(),
30+
findCommunityBySlug(communitySlug),
31+
]);
3132

32-
const community = await findCommunityBySlug(communitySlug);
3333
if (!community) {
3434
notFound();
3535
}
3636

37-
if (
38-
!(await userCan(
37+
const [canEditCommunity, actionRuns] = await Promise.all([
38+
userCan(
3939
Capabilities.editCommunity,
4040
{ type: MembershipType.community, communityId: community.id },
4141
user.id
42-
))
43-
) {
42+
),
43+
getActionRuns(community.id).execute(),
44+
]);
45+
46+
if (!canEditCommunity) {
4447
redirect(`/c/${communitySlug}/unauthorized`);
4548
}
4649

47-
const actionRuns = (await autoCache(
48-
db
49-
.selectFrom("stages")
50-
.where("stages.communityId", "=", community.id)
51-
.innerJoin("action_instances", "stages.id", "action_instances.stageId")
52-
.innerJoin("action_runs", "action_instances.id", "action_runs.actionInstanceId")
53-
.leftJoin("users", "action_runs.userId", "users.id")
54-
.select((eb) => [
55-
"action_runs.id",
56-
"action_runs.config",
57-
"action_runs.event",
58-
"action_runs.params",
59-
"action_runs.status",
60-
"action_runs.result",
61-
"action_runs.createdAt",
62-
jsonObjectFrom(
63-
eb
64-
.selectFrom("action_instances")
65-
.whereRef("action_instances.id", "=", "action_runs.actionInstanceId")
66-
.select(["action_instances.name", "action_instances.action"])
67-
).as("actionInstance"),
68-
"action_runs.sourceActionRunId",
69-
jsonObjectFrom(
70-
eb
71-
.selectFrom("action_runs as ar")
72-
.innerJoin("action_instances", "ar.actionInstanceId", "action_instances.id")
73-
.whereRef("ar.id", "=", "action_runs.sourceActionRunId")
74-
.select(["action_instances.name", "action_instances.action"])
75-
).as("sourceActionInstance"),
76-
jsonObjectFrom(
77-
eb
78-
.selectFrom("stages")
79-
.whereRef("stages.id", "=", "action_instances.stageId")
80-
.select(["stages.id", "stages.name"])
81-
).as("stage"),
82-
jsonObjectFrom(
83-
eb
84-
.selectFrom("pubs")
85-
.select(["pubs.id", "pubs.createdAt", "pubs.title"])
86-
.whereRef("pubs.id", "=", "action_runs.pubId")
87-
.select((eb) => pubType({ eb, pubTypeIdRef: "pubs.pubTypeId" }))
88-
).as("pub"),
89-
jsonObjectFrom(
90-
eb
91-
.selectFrom("users")
92-
.whereRef("users.id", "=", "action_runs.userId")
93-
.select(["id", "firstName", "lastName"])
94-
).as("user"),
95-
])
96-
.orderBy("action_runs.createdAt", "desc")
97-
).execute()) as ActionRun[];
98-
9950
return (
100-
<>
101-
<div className="mb-16 flex items-center justify-between">
102-
<h1 className="text-xl font-bold">Action Activity</h1>
51+
<ContentLayout
52+
title={
53+
<>
54+
<Activity size={24} strokeWidth={1} className="mr-2 text-gray-500" /> Action
55+
Logs
56+
</>
57+
}
58+
>
59+
<div className="m-4">
60+
<ActionRunsTable actionRuns={actionRuns} communitySlug={community.slug} />
10361
</div>
104-
<ActionRunsTable actionRuns={actionRuns} communitySlug={community.slug} />
105-
</>
62+
</ContentLayout>
10663
);
10764
}

core/app/c/[communitySlug]/members/page.tsx

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { notFound, redirect } from "next/navigation";
44

55
import type { FormsId } from "db/public";
66
import { Capabilities, MemberRole, MembershipType } from "db/public";
7+
import { Users } from "ui/icon";
78

89
import type { TableMember } from "./getMemberTableColumns";
910
import { AddMemberDialog } from "~/app/components/Memberships/AddMemberDialog";
@@ -13,6 +14,7 @@ import { compareMemberRoles } from "~/lib/authorization/rolesRanking";
1314
import { findCommunityBySlug } from "~/lib/server/community";
1415
import { getSimpleForms } from "~/lib/server/form";
1516
import { selectAllCommunityMemberships } from "~/lib/server/member";
17+
import { ContentLayout } from "../ContentLayout";
1618
import { addMember, createUserWithCommunityMembership } from "./actions";
1719
import { MemberTable } from "./MemberTable";
1820

@@ -34,31 +36,31 @@ export default async function Page(props: {
3436

3537
const { communitySlug } = params;
3638

37-
const community = await findCommunityBySlug(communitySlug);
39+
const [{ user }, community] = await Promise.all([
40+
getPageLoginData(),
41+
findCommunityBySlug(communitySlug),
42+
]);
3843

3944
if (!community) {
4045
return notFound();
4146
}
4247

43-
const { user } = await getPageLoginData();
44-
45-
if (
46-
!(await userCan(
47-
Capabilities.editCommunity,
48-
{ type: MembershipType.community, communityId: community.id },
49-
user.id
50-
))
51-
) {
52-
redirect(`/c/${communitySlug}/unauthorized`);
53-
}
54-
5548
const page = parseInt(searchParams.page ?? "1", 10);
56-
const [members, availableForms] = await Promise.all([
49+
const [members, availableForms, canEditCommunity] = await Promise.all([
5750
selectAllCommunityMemberships({ communityId: community.id }).execute(),
5851

5952
getSimpleForms(),
53+
userCan(
54+
Capabilities.editCommunity,
55+
{ type: MembershipType.community, communityId: community.id },
56+
user.id
57+
),
6058
]);
6159

60+
if (!canEditCommunity) {
61+
return redirect(`/c/${communitySlug}/unauthorized`);
62+
}
63+
6264
if (!members.length && page !== 1) {
6365
return notFound();
6466
}
@@ -127,19 +129,27 @@ export default async function Page(props: {
127129
const dedupedMembers = [...dedupedMembersMap.values()];
128130

129131
return (
130-
<>
131-
<div className="mb-16 flex items-center justify-between">
132-
<h1 className="text-xl font-bold">Members</h1>
132+
<ContentLayout
133+
title={
134+
<>
135+
<Users size={24} strokeWidth={1} className="mr-2 text-gray-500" /> Members
136+
</>
137+
}
138+
right={
133139
<AddMemberDialog
134140
addMember={addMember}
135141
addUserMember={createUserWithCommunityMembership}
136142
existingMembers={dedupedMembers.map((member) => member.id)}
137143
isSuperAdmin={user.isSuperAdmin}
138144
membershipType={MembershipType.community}
139145
availableForms={availableForms}
146+
className="bg-emerald-500 text-white"
140147
/>
148+
}
149+
>
150+
<div className="m-4">
151+
<MemberTable members={dedupedMembers} />
141152
</div>
142-
<MemberTable members={dedupedMembers} />
143-
</>
153+
</ContentLayout>
144154
);
145155
}

0 commit comments

Comments
 (0)