feat: activity assignment + team view for owner/admin

db: activities.assigneeId column (string, optional)

activity-actions: assigneeId saved on create (default: self), cleared on update
validation: assigneeId added to activitySchema
schema: assigneeId field on Activity type

activity-form-sheet: Atanan Kişi dropdown for owner/admin with member list
activity-team-view: new component — activities grouped by assignee,
  completion/edit/delete actions, overdue indicator, member avatars
activities-client: Ekip tab (owner/admin only), members + currentUserId props
activities page: fetches team memberships + user details, passes to client
activity-email-actions: filter by assigneeId ?? createdBy for both me/team modes
This commit is contained in:
egecankomur
2026-05-12 17:40:21 +03:00
parent 5ac6a1f8b0
commit 7c23a2b4ae
8 changed files with 319 additions and 7 deletions
+16 -2
View File
@@ -11,9 +11,9 @@ import { ActivitiesClient } from "@/components/activities/activities-client";
export default async function ActivitiesPage() {
const ctx = await requireTenant();
const { tablesDB } = createAdminClient();
const { tablesDB, teams, users } = createAdminClient();
const [customers, properties, activitiesResult] = await Promise.all([
const [customers, properties, activitiesResult, membershipsResult] = await Promise.all([
listCustomers(ctx.tenantId),
listProperties(ctx.tenantId),
tablesDB.listRows({
@@ -25,10 +25,22 @@ export default async function ActivitiesPage() {
Query.limit(300),
],
}),
teams.listMemberships(ctx.tenantId),
]);
const activities = JSON.parse(JSON.stringify(activitiesResult.rows)) as Activity[];
const members = (
await Promise.all(
membershipsResult.memberships
.filter((m) => m.userId && m.confirm)
.map(async (m) => {
const u = await users.get(m.userId).catch(() => null);
return u ? { id: m.userId, name: u.name } : null;
}),
)
).filter((m): m is { id: string; name: string } => m !== null);
return (
<div className="flex flex-1 flex-col gap-4 p-4 md:p-6">
<ActivitiesClient
@@ -36,6 +48,8 @@ export default async function ActivitiesPage() {
customers={customers}
properties={properties}
role={ctx.role}
members={members}
currentUserId={ctx.user.id}
/>
</div>
);