feat: setup card assignees
This commit is contained in:
@@ -35,6 +35,7 @@ interface Card {
|
||||
publicId: string;
|
||||
title: string;
|
||||
labels?: Label[];
|
||||
members?: Member[];
|
||||
}
|
||||
|
||||
interface Label {
|
||||
@@ -47,6 +48,19 @@ interface LabelData {
|
||||
colourCode: string;
|
||||
}
|
||||
|
||||
interface Member {
|
||||
member: MemberData;
|
||||
}
|
||||
|
||||
interface MemberData {
|
||||
publicId: string;
|
||||
user: User;
|
||||
}
|
||||
|
||||
interface User {
|
||||
name: string;
|
||||
}
|
||||
|
||||
interface FormValues {
|
||||
boardId: string;
|
||||
name: string;
|
||||
@@ -222,9 +236,10 @@ export default function BoardPage() {
|
||||
{...provided.dragHandleProps}
|
||||
>
|
||||
<div>{card.title}</div>
|
||||
{card.labels?.length ? (
|
||||
{(card.labels?.length ?? 0) ||
|
||||
(card.members?.length ?? 0) ? (
|
||||
<div className="mt-2 flex justify-end space-x-1">
|
||||
{card.labels.map(({ label }) => (
|
||||
{card.labels?.map(({ label }) => (
|
||||
<span
|
||||
key={label.publicId}
|
||||
className="inline-flex w-fit items-center gap-x-1.5 rounded-full px-2 py-1 text-[10px] font-medium text-dark-1000 ring-1 ring-inset ring-dark-800"
|
||||
@@ -240,6 +255,23 @@ export default function BoardPage() {
|
||||
<div>{label.name}</div>
|
||||
</span>
|
||||
))}
|
||||
{card.members?.map(({ member }) => (
|
||||
<span
|
||||
key={member.publicId}
|
||||
className="inline-flex h-6 w-6 items-center justify-center rounded-full bg-gray-500"
|
||||
>
|
||||
<span className="text-[10px] font-medium leading-none text-white">
|
||||
{member.user.name
|
||||
.split(" ")
|
||||
.map((namePart) =>
|
||||
namePart
|
||||
.charAt(0)
|
||||
.toUpperCase(),
|
||||
)
|
||||
.join("")}
|
||||
</span>
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
) : null}
|
||||
</Link>
|
||||
|
||||
@@ -78,6 +78,26 @@ export const boardRouter = createTRPCRouter({
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
members: {
|
||||
columns: {
|
||||
workspaceMemberId: false,
|
||||
cardId: false,
|
||||
},
|
||||
with: {
|
||||
member: {
|
||||
columns: {
|
||||
publicId: true,
|
||||
},
|
||||
with: {
|
||||
user: {
|
||||
columns: {
|
||||
name: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
8
src/server/db/migrations/0012_powerful_gressill.sql
Normal file
8
src/server/db/migrations/0012_powerful_gressill.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
CREATE TABLE `card_workspace_members` (
|
||||
`cardId` bigint NOT NULL,
|
||||
`workspaceMemberId` bigint NOT NULL,
|
||||
CONSTRAINT `card_workspace_members_cardId_workspaceMemberId` PRIMARY KEY(`cardId`,`workspaceMemberId`)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
-- ALTER TABLE `card_workspace_members` ADD CONSTRAINT `card_workspace_members_cardId_card_id_fk` FOREIGN KEY (`cardId`) REFERENCES `card`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||
-- ALTER TABLE `card_workspace_members` ADD CONSTRAINT `card_workspace_members_workspaceMemberId_workspace_members_id_fk` FOREIGN KEY (`workspaceMemberId`) REFERENCES `workspace_members`(`id`) ON DELETE no action ON UPDATE no action;
|
||||
1050
src/server/db/migrations/meta/0012_snapshot.json
Normal file
1050
src/server/db/migrations/meta/0012_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -85,6 +85,13 @@
|
||||
"when": 1709542143845,
|
||||
"tag": "0011_familiar_aaron_stack",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 12,
|
||||
"version": "5",
|
||||
"when": 1709676468112,
|
||||
"tag": "0012_powerful_gressill",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -139,6 +139,27 @@ export const cardToLabelsRelations = relations(cardsToLabels, ({ one }) => ({
|
||||
}),
|
||||
}));
|
||||
|
||||
export const cardToWorkspaceMembers = mySqlTable(
|
||||
"card_workspace_members",
|
||||
{
|
||||
cardId: bigint("cardId", { mode: "number" }).notNull().references(() => cards.id),
|
||||
workspaceMemberId: bigint("workspaceMemberId", { mode: "number" }).notNull().references(() => workspaceMembers.id),
|
||||
}, (t) => ({
|
||||
pk: primaryKey(t.cardId, t.workspaceMemberId),
|
||||
}),
|
||||
);
|
||||
|
||||
export const cardToWorkspaceMembersRelations = relations(cardToWorkspaceMembers, ({ one }) => ({
|
||||
card: one(cards, {
|
||||
fields: [cardToWorkspaceMembers.cardId],
|
||||
references: [cards.id],
|
||||
}),
|
||||
member: one(workspaceMembers, {
|
||||
fields: [cardToWorkspaceMembers.workspaceMemberId],
|
||||
references: [workspaceMembers.id],
|
||||
}),
|
||||
}));
|
||||
|
||||
export const lists = mySqlTable(
|
||||
"list",
|
||||
{
|
||||
@@ -212,6 +233,7 @@ export const cardsRelations = relations(cards, ({ one, many }) => ({
|
||||
references: [users.id],
|
||||
}),
|
||||
labels: many(cardsToLabels),
|
||||
members: many(cardToWorkspaceMembers),
|
||||
import: one(imports, {
|
||||
fields: [cards.importId],
|
||||
references: [imports.id],
|
||||
|
||||
Reference in New Issue
Block a user