TorbatYar/frontend/modules/crm/features/sales/activities.tsx
Mortezakoohjani e140908034 Ship enterprise CRM frontend with real API wiring and thin app routes.
Connect all CRM pages to the BFF and CRM service, add module docs, and mark CRM available in the SuperApp catalog.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-26 20:58:17 +03:30

74 lines
2.5 KiB
TypeScript

import { z } from "zod";
import { crmApi } from "@/modules/crm/services/crm-api";
import { createCrmListPage } from "@/modules/crm/components/CrmListCrudPage";
import { CrmStatusChip } from "@/modules/crm/design-system";
import type { SalesActivity } from "@/modules/crm/types";
const schema = z.object({
subject: z.string().min(1),
activity_type: z.enum(["call", "email", "meeting", "task", "note", "other"]).default("task"),
priority: z.enum(["low", "medium", "high", "urgent"]).default("medium"),
description: z.string().optional(),
});
export default createCrmListPage<SalesActivity>({
title: "فعالیت‌های فروش",
description: "ثبت و پیگیری فعالیت‌های مرتبط با CRM entities.",
breadcrumb: "فعالیت‌ها",
resourceKey: "activities",
createSchema: schema,
editSchema: schema.partial(),
createDefaults: {
subject: "",
activity_type: "task",
priority: "medium",
description: "",
},
fields: [
{ name: "subject", label: "موضوع" },
{
name: "activity_type",
label: "نوع",
type: "select",
options: [
{ value: "call", label: "تماس" },
{ value: "email", label: "ایمیل" },
{ value: "meeting", label: "جلسه" },
{ value: "task", label: "وظیفه" },
{ value: "note", label: "یادداشت" },
{ value: "other", label: "سایر" },
],
},
{
name: "priority",
label: "اولویت",
type: "select",
options: [
{ value: "low", label: "کم" },
{ value: "medium", label: "متوسط" },
{ value: "high", label: "بالا" },
{ value: "urgent", label: "فوری" },
],
},
{ name: "description", label: "توضیحات", type: "textarea" },
],
columns: [
{ key: "subject", header: "موضوع" },
{ key: "activity_type", header: "نوع" },
{
key: "status",
header: "وضعیت",
render: (r) => <CrmStatusChip status={r.status} domain="generic" />,
},
{
key: "priority",
header: "اولویت",
render: (r) => <CrmStatusChip status={r.priority} domain="priority" />,
},
],
list: (tid) => crmApi.activities.list(tid, { page: 1, page_size: 500 }),
create: (tid, d) => crmApi.activities.create(tid, d),
update: (tid, id, d) => crmApi.activities.update(tid, id, d),
exportColumns: ["subject", "activity_type", "status", "priority"],
});