feat: setup card assignees
This commit is contained in:
@@ -35,6 +35,7 @@ interface Card {
|
|||||||
publicId: string;
|
publicId: string;
|
||||||
title: string;
|
title: string;
|
||||||
labels?: Label[];
|
labels?: Label[];
|
||||||
|
members?: Member[];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Label {
|
interface Label {
|
||||||
@@ -47,6 +48,19 @@ interface LabelData {
|
|||||||
colourCode: string;
|
colourCode: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface Member {
|
||||||
|
member: MemberData;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MemberData {
|
||||||
|
publicId: string;
|
||||||
|
user: User;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface User {
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
interface FormValues {
|
interface FormValues {
|
||||||
boardId: string;
|
boardId: string;
|
||||||
name: string;
|
name: string;
|
||||||
@@ -222,9 +236,10 @@ export default function BoardPage() {
|
|||||||
{...provided.dragHandleProps}
|
{...provided.dragHandleProps}
|
||||||
>
|
>
|
||||||
<div>{card.title}</div>
|
<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">
|
<div className="mt-2 flex justify-end space-x-1">
|
||||||
{card.labels.map(({ label }) => (
|
{card.labels?.map(({ label }) => (
|
||||||
<span
|
<span
|
||||||
key={label.publicId}
|
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"
|
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>
|
<div>{label.name}</div>
|
||||||
</span>
|
</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>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
</Link>
|
</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,
|
"when": 1709542143845,
|
||||||
"tag": "0011_familiar_aaron_stack",
|
"tag": "0011_familiar_aaron_stack",
|
||||||
"breakpoints": true
|
"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(
|
export const lists = mySqlTable(
|
||||||
"list",
|
"list",
|
||||||
{
|
{
|
||||||
@@ -212,6 +233,7 @@ export const cardsRelations = relations(cards, ({ one, many }) => ({
|
|||||||
references: [users.id],
|
references: [users.id],
|
||||||
}),
|
}),
|
||||||
labels: many(cardsToLabels),
|
labels: many(cardsToLabels),
|
||||||
|
members: many(cardToWorkspaceMembers),
|
||||||
import: one(imports, {
|
import: one(imports, {
|
||||||
fields: [cards.importId],
|
fields: [cards.importId],
|
||||||
references: [imports.id],
|
references: [imports.id],
|
||||||
|
|||||||
Reference in New Issue
Block a user