@snksergio/design-system 0.42.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/chunks/{kpi-delta-DaDwKOaP.mjs → kpi-delta-B_1xjDu_.mjs} +2 -2
- package/dist-lib/chunks/{kpi-delta-DaDwKOaP.mjs.map → kpi-delta-B_1xjDu_.mjs.map} +1 -1
- package/dist-lib/chunks/{kpi-delta-DAfakvFp.cjs → kpi-delta-CXGg2nBx.cjs} +2 -2
- package/dist-lib/chunks/{kpi-delta-DAfakvFp.cjs.map → kpi-delta-CXGg2nBx.cjs.map} +1 -1
- package/dist-lib/chunks/{panel-INPypAHe.cjs → panel-C3fekbdr.cjs} +118 -97
- package/dist-lib/chunks/panel-C3fekbdr.cjs.map +1 -0
- package/dist-lib/chunks/{panel-BI52RBEn.mjs → panel-UwUWfDLf.mjs} +35 -14
- package/dist-lib/chunks/panel-UwUWfDLf.mjs.map +1 -0
- package/dist-lib/chunks/{textarea-K20CL_gF.cjs → sheet-B68Q4-Hn.cjs} +206 -206
- package/dist-lib/chunks/sheet-B68Q4-Hn.cjs.map +1 -0
- package/dist-lib/chunks/{textarea-BPRIHZVd.mjs → sheet-BgA2g6m4.mjs} +206 -206
- package/dist-lib/chunks/sheet-BgA2g6m4.mjs.map +1 -0
- package/dist-lib/chunks/{useTheme-3iZAognE.cjs → useTheme-C9Y6vxTf.cjs} +103 -52
- package/dist-lib/chunks/useTheme-C9Y6vxTf.cjs.map +1 -0
- package/dist-lib/chunks/{useTheme-B3ZakPqk.mjs → useTheme-DCmzLBUR.mjs} +103 -52
- package/dist-lib/chunks/{useTheme-3iZAognE.cjs.map → useTheme-DCmzLBUR.mjs.map} +1 -1
- package/dist-lib/index.cjs +17 -17
- package/dist-lib/index.cjs.map +1 -1
- package/dist-lib/index.mjs +11 -11
- package/dist-lib/index.mjs.map +1 -1
- package/dist-lib/preview/chat.cjs +1 -1
- package/dist-lib/preview/chat.mjs +1 -1
- package/dist-lib/preview/clientes.cjs +8 -14
- package/dist-lib/preview/clientes.cjs.map +1 -1
- package/dist-lib/preview/clientes.mjs +8 -14
- package/dist-lib/preview/clientes.mjs.map +1 -1
- package/dist-lib/preview/dashboard.cjs +2 -2
- package/dist-lib/preview/dashboard.mjs +2 -2
- package/dist-lib/shadcn.cjs +50 -50
- package/dist-lib/shadcn.mjs +1 -1
- package/dist-lib/src/components/ui/ColorPicker/color-picker.d.ts.map +1 -1
- package/dist-lib/src/components/ui/DataTable/column-types/definitions/date-column-type.d.ts.map +1 -1
- package/dist-lib/src/components/ui/DataTable/column-types/definitions/datetime-column-type.d.ts.map +1 -1
- package/dist-lib/src/components/ui/DataTable/utils/calculate-column-widths.d.ts.map +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.d.ts.map +1 -1
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.styles.d.ts +82 -3
- package/dist-lib/src/components/ui/SingleMenuSidebar/single-menu-sidebar.styles.d.ts.map +1 -1
- package/dist-lib/src/preview/pages/ChatV2/components/FiltersColumn/filters-column.styles.d.ts +3 -3
- package/dist-lib/src/preview/pages/ClientesShowcase/ClientesShowcase.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist-lib/chunks/panel-BI52RBEn.mjs.map +0 -1
- package/dist-lib/chunks/panel-INPypAHe.cjs.map +0 -1
- package/dist-lib/chunks/textarea-BPRIHZVd.mjs.map +0 -1
- package/dist-lib/chunks/textarea-K20CL_gF.cjs.map +0 -1
- package/dist-lib/chunks/useTheme-B3ZakPqk.mjs.map +0 -1
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const React = require("react");
|
|
5
5
|
const avatar = require("../chunks/avatar-eM5txRFZ.cjs");
|
|
6
|
-
const useTheme = require("../chunks/useTheme-
|
|
6
|
+
const useTheme = require("../chunks/useTheme-C9Y6vxTf.cjs");
|
|
7
7
|
const lucideReact = require("lucide-react");
|
|
8
8
|
const appShellMocks = require("../chunks/app-shell-mocks-oO_IV3Gw.cjs");
|
|
9
9
|
const chatV2Mocks = require("../chunks/chat-v2-mocks-BV9Wha_Z.cjs");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useRef, useEffect, useCallback, useMemo } from "react";
|
|
3
3
|
import { t as tv, y as DropdownMenu, Q as DropdownMenuTrigger, B as Button, E as DropdownMenuContent, G as DropdownMenuItem, L as DropdownMenuSeparator, A as Avatar, a as AvatarFallback, c as cn } from "../chunks/avatar-DFWEwBKu.mjs";
|
|
4
|
-
import { C as Chip, a as ChipGroup, b as ChipGroupItem, u as useTheme, A as AppShell } from "../chunks/useTheme-
|
|
4
|
+
import { C as Chip, a as ChipGroup, b as ChipGroupItem, u as useTheme, A as AppShell } from "../chunks/useTheme-DCmzLBUR.mjs";
|
|
5
5
|
import { MoreVertical, CheckCircle2, Phone, Video, Tag, UserPlus, Archive, CheckCheck, Check, ArrowLeft, PanelRightClose, PanelRightOpen, Paperclip, Smile, Send, Mic, ChevronDown, X, Plus, Menu, Search } from "lucide-react";
|
|
6
6
|
import { e as APP_SHELL_THEME_OPTIONS, c as APP_SHELL_MESSAGES, d as APP_SHELL_NOTIFICATIONS, A as APP_SHELL_COMMANDS, a as APP_SHELL_CONTEXTS } from "../chunks/app-shell-mocks-kWIVSzLs.mjs";
|
|
7
7
|
import { C as CHANNEL_LABEL, a as CHANNEL_HEX, S as SAMPLE_MESSAGES, b as STATUS_DOT, F as FILTER_GROUPS, d as CONVERSATIONS, e as CONVERSATION_DETAILS, D as DEFAULT_DETAIL } from "../chunks/chat-v2-mocks-DvZRkhmz.mjs";
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const React = require("react");
|
|
5
|
-
const useTheme = require("../chunks/useTheme-
|
|
5
|
+
const useTheme = require("../chunks/useTheme-C9Y6vxTf.cjs");
|
|
6
6
|
const lucideReact = require("lucide-react");
|
|
7
7
|
const clientesShowcaseMocks = require("../chunks/clientes-showcase-mocks-CwhluBTT.cjs");
|
|
8
|
-
const panel = require("../chunks/panel-
|
|
8
|
+
const panel = require("../chunks/panel-C3fekbdr.cjs");
|
|
9
9
|
const avatar = require("../chunks/avatar-eM5txRFZ.cjs");
|
|
10
10
|
require("../chunks/input-az2SuVXQ.cjs");
|
|
11
|
-
require("../chunks/
|
|
11
|
+
require("../chunks/sheet-B68Q4-Hn.cjs");
|
|
12
12
|
const pageHeader = require("../chunks/page-header-DvAJoEfb.cjs");
|
|
13
13
|
require("react-dom");
|
|
14
14
|
const appShellMocks = require("../chunks/app-shell-mocks-oO_IV3Gw.cjs");
|
|
@@ -566,40 +566,34 @@ function buildColumns(handlers) {
|
|
|
566
566
|
field: "_actions",
|
|
567
567
|
headerName: "",
|
|
568
568
|
type: "actions",
|
|
569
|
-
// `width`
|
|
570
|
-
//
|
|
571
|
-
//
|
|
572
|
-
// `col.pinned ?? (isActions ? "right" : undefined)`.
|
|
573
|
-
//
|
|
574
|
-
// prop copiada em toda tela gerada.
|
|
575
|
-
width: 64,
|
|
569
|
+
// Sem `width` e sem `pinned`, de propósito — o `type` já entrega os dois:
|
|
570
|
+
// a largura é DERIVADA do nº de ações (1→44px · 2→74 · 3→104) e acima de 3 elas
|
|
571
|
+
// colapsam no "…" sozinhas; o pin à direita sai de
|
|
572
|
+
// `col.pinned ?? (isActions ? "right" : undefined)`. Prop redundante aqui vira prop
|
|
573
|
+
// copiada em toda tela gerada — o exemplo é a fonte de maior precedência das skills.
|
|
576
574
|
getActions: ({ row }) => [
|
|
577
575
|
{
|
|
578
576
|
id: "edit",
|
|
579
577
|
label: "Editar",
|
|
580
578
|
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pencil, {}),
|
|
581
|
-
showInMenu: true,
|
|
582
579
|
onClick: () => console.log("Editar", row.id)
|
|
583
580
|
},
|
|
584
581
|
{
|
|
585
582
|
id: "whatsapp",
|
|
586
583
|
label: "Abrir atendimento (WhatsApp)",
|
|
587
584
|
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageSquare, {}),
|
|
588
|
-
showInMenu: true,
|
|
589
585
|
onClick: () => console.log("Atendimento", row.id)
|
|
590
586
|
},
|
|
591
587
|
{
|
|
592
588
|
id: "archive",
|
|
593
589
|
label: "Arquivar",
|
|
594
590
|
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Archive, {}),
|
|
595
|
-
showInMenu: true,
|
|
596
591
|
onClick: () => console.log("Arquivar", row.id)
|
|
597
592
|
},
|
|
598
593
|
{
|
|
599
594
|
id: "delete",
|
|
600
595
|
label: "Excluir cliente",
|
|
601
596
|
icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Trash2, {}),
|
|
602
|
-
showInMenu: true,
|
|
603
597
|
destructive: true,
|
|
604
598
|
onClick: () => handlers.onAskDelete(row)
|
|
605
599
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clientes.cjs","sources":["../../src/preview/pages/ClientesShowcase/clientes-showcase.styles.ts","../../src/preview/pages/ClientesShowcase/components/NovoClienteDrawer/novo-cliente-drawer.tsx","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.styles.ts","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.tsx","../../src/preview/pages/ClientesShowcase/ClientesShowcase.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Layout em grid de 2 colunas usado dentro do drawer pra pares de campos\r\n * (Email + WhatsApp, Cidade + Valor).\r\n * `gap-form-gap` (20px) = token DS pra spacing entre FormField units (L-024).\r\n */\r\nexport const drawerFormStyles = tv({\r\n slots: {\r\n twoCols: \"grid grid-cols-2 gap-form-gap\",\r\n statusDot: \"inline-block size-[8px] rounded-radius-full mr-gp-xs shrink-0\",\r\n },\r\n});\r\n","import { useEffect, useState } from \"react\";\r\nimport { Panel } from \"@/components/ui/Panel\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport {\r\n FormField,\r\n FormFieldInput,\r\n FormFieldSelect,\r\n FormFieldTextarea,\r\n} from \"@/components/ui/FormField\";\r\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\r\nimport { STATUSES, CATEGORIES } from \"../../../_table-data\";\r\nimport { CITIES, STATUS_DOT } from \"../../clientes-showcase-mocks\";\r\nimport { drawerFormStyles } from \"../../clientes-showcase.styles\";\r\nimport type { NovoClienteFormData } from \"../../clientes-showcase.types\";\r\n\r\nconst INITIAL_FORM: NovoClienteFormData = {\r\n name: \"\",\r\n email: \"\",\r\n whatsapp: \"\",\r\n statusId: \"active\",\r\n categoryId: \"lead\",\r\n city: \"\",\r\n value: 0,\r\n notes: \"\",\r\n};\r\n\r\nexport type NovoClienteDrawerProps = {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n /** Disparado ao confirmar — drawer fecha automaticamente após o submit. */\r\n onSubmit?: (data: NovoClienteFormData) => void;\r\n};\r\n\r\n/**\r\n * Drawer \"Novo cliente\" — replica visual do TblClientFormDrawer\r\n * (sandbox /design-and-table-v2), recompilado em cima dos componentes do DS:\r\n * Panel + FormField (Input / Select / Textarea) + ChipGroup + Button.\r\n *\r\n * Layout (top → bottom):\r\n * 1. Nome* — full width\r\n * 2. Email + WhatsApp — 2 cols\r\n * 3. Status — ChipGroup com dot colorido\r\n * 4. Categoria — ChipGroup\r\n * 5. Cidade + Valor R$ — 2 cols\r\n * 6. Notas — textarea full width\r\n */\r\nexport function NovoClienteDrawer({\r\n open,\r\n onOpenChange,\r\n onSubmit,\r\n}: NovoClienteDrawerProps) {\r\n const s = drawerFormStyles();\r\n const [form, setForm] = useState<NovoClienteFormData>(INITIAL_FORM);\r\n\r\n // Reseta form sempre que abrir\r\n useEffect(() => {\r\n if (open) setForm(INITIAL_FORM);\r\n }, [open]);\r\n\r\n const canSubmit = form.name.trim().length > 0;\r\n\r\n const handleSubmit = () => {\r\n if (!canSubmit) return;\r\n onSubmit?.(form);\r\n onOpenChange(false);\r\n };\r\n\r\n return (\r\n <Panel\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title=\"Novo cliente\"\r\n side=\"right\"\r\n size=\"md\"\r\n footer={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"md\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n disabled={!canSubmit}\r\n onClick={handleSubmit}\r\n >\r\n Criar cliente\r\n </Button>\r\n </>\r\n }\r\n >\r\n <FormFieldInput\r\n label=\"Nome\"\r\n required\r\n placeholder=\"Maria Silva\"\r\n value={form.name}\r\n onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}\r\n />\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldInput\r\n label=\"Email\"\r\n type=\"email\"\r\n placeholder=\"cliente@exemplo.com\"\r\n value={form.email}\r\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\r\n />\r\n <FormFieldInput\r\n label=\"WhatsApp\"\r\n type=\"tel\"\r\n placeholder=\"55 11 99999-9999\"\r\n value={form.whatsapp}\r\n onChange={(e) => setForm((f) => ({ ...f, whatsapp: e.target.value }))}\r\n />\r\n </div>\r\n\r\n <FormField label=\"Status\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.statusId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n statusId: v as keyof typeof STATUSES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Status do cliente\"\r\n >\r\n {Object.entries(STATUSES).map(([id, st]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n <span\r\n className={s.statusDot()}\r\n style={{ background: STATUS_DOT[id] ?? st.color }}\r\n aria-hidden\r\n />\r\n {st.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <FormField label=\"Categoria\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.categoryId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n categoryId: v as keyof typeof CATEGORIES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Categoria do cliente\"\r\n >\r\n {Object.entries(CATEGORIES).map(([id, cat]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n {cat.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldSelect\r\n label=\"Cidade\"\r\n placeholder=\"Selecionar...\"\r\n value={form.city || undefined}\r\n onValueChange={(v) => setForm((f) => ({ ...f, city: v }))}\r\n options={CITIES.map((c) => ({ value: c, label: c }))}\r\n />\r\n <FormFieldInput\r\n label=\"Valor (R$)\"\r\n type=\"number\"\r\n startAddon=\"R$\"\r\n value={String(form.value)}\r\n onChange={(e) =>\r\n setForm((f) => ({ ...f, value: Number(e.target.value) }))\r\n }\r\n min={0}\r\n step={0.01}\r\n />\r\n </div>\r\n\r\n <FormFieldTextarea\r\n label=\"Notas\"\r\n placeholder=\"Observações sobre o cliente...\"\r\n rows={4}\r\n value={form.notes}\r\n onChange={(e) => setForm((f) => ({ ...f, notes: e.target.value }))}\r\n />\r\n </Panel>\r\n );\r\n}\r\n","import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Styles do DetailDrawer — apenas as partes internas (sections collapsibles\r\n * + DetailField). O shell flutuante (aside, header com avatar+meta, footer\r\n * com botões) é delegado ao `<FloatingPanel>` do DS.\r\n */\r\nexport const detailDrawerStyles = tv({\r\n slots: {\r\n section: \"border-b border-border-default last:border-b-0\",\r\n sectionHead: [\r\n \"flex items-center justify-between w-full\",\r\n \"px-[18px] py-[14px]\",\r\n \"bg-transparent border-0 cursor-pointer text-left\",\r\n \"text-body-sm font-semibold text-fg-default\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-muted\",\r\n \"focus-visible:outline-none focus-visible:bg-bg-muted\",\r\n ],\r\n sectionChev: \"size-[14px] text-fg-muted transition-transform duration-200\",\r\n sectionChevOpen: \"rotate-180\",\r\n sectionBody: \"flex flex-col gap-gp-md px-[18px] pb-pad-2xl\",\r\n\r\n field: \"flex items-baseline justify-between gap-gp-md text-body-sm font-normal\",\r\n fieldLabel: \"text-body-xs font-normal text-fg-muted shrink-0\",\r\n fieldValue: \"text-fg-default text-right break-words min-w-0\",\r\n },\r\n});\r\n","import { useState, type ReactNode } from \"react\";\r\nimport { ChevronDown, Pencil, Trash2 } from \"lucide-react\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { FloatingPanel } from \"@/components/ui/FloatingPanel\";\r\nimport { STATUSES, CATEGORIES, AGENTS } from \"../../../_table-data\";\r\nimport {\r\n CATEGORY_KIND,\r\n STATUS_DOT,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"../../clientes-showcase-mocks\";\r\nimport { detailDrawerStyles } from \"./detail-drawer.styles\";\r\nimport type { DetailDrawerProps } from \"./detail-drawer.types\";\r\n\r\n/* ── Helpers internos ────────────────────────────────────────────── */\r\n\r\nfunction formatLongDate(ms: number): string {\r\n if (!ms) return \"—\";\r\n const d = new Date(ms);\r\n return d.toLocaleDateString(\"pt-BR\", {\r\n day: \"numeric\",\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n}\r\n\r\ntype SectionId = \"contact\" | \"meta\" | \"notes\";\r\n\r\n/* ── DetailField (label : value) ────────────────────────────────── */\r\n\r\ntype DetailFieldProps = {\r\n label: string;\r\n value: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailField({ label, value, s }: DetailFieldProps) {\r\n return (\r\n <div className={s.field()}>\r\n <span className={s.fieldLabel()}>{label}</span>\r\n <span className={s.fieldValue()}>{value || \"—\"}</span>\r\n </div>\r\n );\r\n}\r\n\r\n/* ── DetailSection (collapsible) ─────────────────────────────────── */\r\n\r\ntype DetailSectionProps = {\r\n id: SectionId;\r\n title: string;\r\n open: boolean;\r\n onToggle: (id: SectionId) => void;\r\n children: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailSection({\r\n id,\r\n title,\r\n open,\r\n onToggle,\r\n children,\r\n s,\r\n}: DetailSectionProps) {\r\n return (\r\n <section className={s.section()}>\r\n <button\r\n type=\"button\"\r\n className={s.sectionHead()}\r\n onClick={() => onToggle(id)}\r\n aria-expanded={open}\r\n >\r\n <span>{title}</span>\r\n <ChevronDown\r\n className={[s.sectionChev(), open ? s.sectionChevOpen() : \"\"].join(\" \")}\r\n />\r\n </button>\r\n {open && <div className={s.sectionBody()}>{children}</div>}\r\n </section>\r\n );\r\n}\r\n\r\n/* ── DetailDrawer ────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Drawer \"Detalhes do cliente\" — usa `<FloatingPanel>` do DS (non-modal,\r\n * resizable, maximizable, responsive). Replica visual do `TblDetailsPanel`\r\n * do sandbox /design-and-table-v2.\r\n */\r\nexport function DetailDrawer({\r\n row,\r\n onClose,\r\n onEdit,\r\n onDelete,\r\n onSave,\r\n}: DetailDrawerProps) {\r\n const s = detailDrawerStyles();\r\n const [openSections, setOpenSections] = useState<Set<SectionId>>(\r\n () => new Set([\"contact\", \"meta\", \"notes\"]),\r\n );\r\n\r\n const toggle = (id: SectionId) => {\r\n setOpenSections((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n };\r\n\r\n // Mantém ordem dos hooks estável independente de `row` — depois do toggle.\r\n if (!row) return null;\r\n\r\n const status = STATUSES[row.statusId];\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials =\r\n agent?.name.split(\" \").map((p) => p[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n\r\n return (\r\n <FloatingPanel\r\n open={row !== null}\r\n onOpenChange={(open) => {\r\n if (!open) onClose();\r\n }}\r\n side=\"right\"\r\n size=\"md\"\r\n resizable\r\n maximizable\r\n // Sections internas (DetailSection) gerenciam o próprio padding edge-to-edge.\r\n bodyPadded={false}\r\n resizableStorageKey=\"clientes-showcase.detail-drawer.width\"\r\n titleSlot={\r\n <div className=\"flex items-center gap-gp-md min-w-0\">\r\n <Avatar\r\n className=\"size-[40px] shrink-0\"\r\n style={{ background: row.avatarColor }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-body-md font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <div className=\"flex flex-col min-w-0 flex-1\">\r\n <div className=\"text-body-md font-semibold text-fg-default whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {row.name}\r\n </div>\r\n <div className=\"flex items-center gap-[6px] mt-[2px] text-body-xs font-normal text-fg-muted\">\r\n <span>{row.id}</span>\r\n <span className=\"opacity-50\">·</span>\r\n <span className=\"inline-flex items-center gap-[6px]\">\r\n <span\r\n className=\"inline-block size-[8px] rounded-radius-full shrink-0\"\r\n style={{ background: STATUS_DOT[row.statusId] ?? status?.color }}\r\n aria-hidden\r\n />\r\n {status?.label}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n headerActions={\r\n <>\r\n <Button\r\n variant=\"soft\"\r\n color=\"secondary\"\r\n size=\"icon-sm\"\r\n aria-label=\"Editar\"\r\n onClick={() => onEdit?.(row)}\r\n >\r\n <Pencil />\r\n </Button>\r\n <Button\r\n variant=\"soft\"\r\n color=\"critical\"\r\n size=\"icon-sm\"\r\n aria-label=\"Excluir\"\r\n onClick={() => onDelete?.(row)}\r\n >\r\n <Trash2 />\r\n </Button>\r\n </>\r\n }\r\n footer={\r\n <>\r\n <Button variant=\"outline\" color=\"secondary\" size=\"sm\" onClick={onClose}>\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"sm\"\r\n onClick={() => onSave?.(row)}\r\n >\r\n Salvar alterações\r\n </Button>\r\n </>\r\n }\r\n >\r\n <DetailSection\r\n id=\"contact\"\r\n title=\"Contato\"\r\n open={openSections.has(\"contact\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField\r\n label=\"Email\"\r\n value={\r\n <a\r\n href={`mailto:${row.email}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.email}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Telefone\"\r\n value={\r\n <a\r\n href={`tel:${row.phone.replace(/\\D/g, \"\")}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.phone}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Localização\" value={row.location} s={s} />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"meta\"\r\n title=\"Atendimento\"\r\n open={openSections.has(\"meta\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField label=\"ID\" value={row.id} s={s} />\r\n <DetailField\r\n label=\"Categoria\"\r\n value={\r\n cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Atribuído a\"\r\n value={\r\n agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm\">\r\n <Avatar\r\n className=\"size-[22px]\"\r\n style={{ background: agent.color }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n {agent.name}\r\n </span>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Valor\" value={formatBRL(row.value)} s={s} />\r\n <DetailField label=\"Criado em\" value={formatLongDate(row.createdAt)} s={s} />\r\n <DetailField\r\n label=\"Último contato\"\r\n value={formatShortDate(row.lastContact)}\r\n s={s}\r\n />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"notes\"\r\n title=\"Anotações\"\r\n open={openSections.has(\"notes\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <p className=\"text-body-xs font-normal text-fg-muted\">Sem anotações.</p>\r\n </DetailSection>\r\n </FloatingPanel>\r\n );\r\n}\r\n","import { useCallback, useMemo, useRef, useState } from \"react\";\r\nimport { useTheme, type Theme } from \"@/hooks/useTheme\";\r\nimport {\r\n Archive,\r\n Clock,\r\n Copy,\r\n Download,\r\n Maximize2,\r\n MessageSquare,\r\n MoreHorizontal,\r\n Pencil,\r\n Plus,\r\n RotateCcw,\r\n Trash2,\r\n Upload,\r\n} from \"lucide-react\";\r\nimport {\r\n CATEGORIES,\r\n AGENTS,\r\n type ClientRow,\r\n} from \"../_table-data\";\r\nimport {\r\n DataTable,\r\n presetView,\r\n type DataTableColumnDef,\r\n type DataTableKanbanConfig,\r\n type DataTablePresetView,\r\n type DataTableRef,\r\n type DataTableViewMode,\r\n type FilterModel,\r\n} from \"@/components/ui/DataTable\";\r\nimport { AppShell } from \"@/components/ui/AppShell\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { PageHeader } from \"@/components/ui/PageHeader\";\r\nimport { BulkActionButton } from \"@/components/ui/TableToolbar\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport {\r\n APP_SHELL_CONTEXTS,\r\n APP_SHELL_COMMANDS,\r\n APP_SHELL_NOTIFICATIONS,\r\n APP_SHELL_MESSAGES,\r\n APP_SHELL_THEME_OPTIONS,\r\n APP_SHELL_LAYOUT_OPTIONS,\r\n APP_SHELL_USER,\r\n} from \"../../mocks/app-shell-mocks\";\r\nimport {\r\n CLIENTS_87,\r\n STATUS_OPTIONS,\r\n CATEGORY_OPTIONS,\r\n AGENT_OPTIONS,\r\n AGENTS_LOOKUP,\r\n KANBAN_COLUMNS,\r\n CATEGORY_KIND,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"./clientes-showcase-mocks\";\r\nimport { NovoClienteDrawer } from \"./components/NovoClienteDrawer\";\r\nimport { DetailDrawer } from \"./components/DetailDrawer\";\r\nimport { AlertModal } from \"@/components/ui/AlertModal\";\r\n\r\n/* ── Columns declarativas (type-based) ─────────────────────────── */\r\n\r\ntype ColumnHandlers = {\r\n /** Pede confirmação de exclusão (abre o AlertModal). */\r\n onAskDelete: (row: ClientRow) => void;\r\n};\r\n\r\nfunction buildColumns(handlers: ColumnHandlers): DataTableColumnDef<ClientRow>[] {\r\n return [\r\n { field: \"id\", headerName: \"ID\", type: \"text\", width: 130 },\r\n {\r\n field: \"name\",\r\n headerName: \"Nome\",\r\n type: \"user\",\r\n sortable: true,\r\n width: 220,\r\n typeOptions: {\r\n users: Object.fromEntries(\r\n CLIENTS_87.map((c) => [\r\n c.name,\r\n {\r\n name: c.name,\r\n initials: c.initials,\r\n color: c.avatarColor,\r\n },\r\n ]),\r\n ),\r\n },\r\n valueGetter: (row) => row.name,\r\n },\r\n {\r\n field: \"email\",\r\n headerName: \"Email\",\r\n type: \"email\",\r\n enableColumnFilter: true,\r\n filterType: \"text\",\r\n },\r\n {\r\n field: \"phone\",\r\n headerName: \"Telefone\",\r\n type: \"phone\",\r\n },\r\n {\r\n field: \"statusId\",\r\n headerName: \"Status\",\r\n type: \"status\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: STATUS_OPTIONS,\r\n },\r\n {\r\n field: \"categoryId\",\r\n headerName: \"Categoria\",\r\n type: \"badge\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: CATEGORY_OPTIONS,\r\n },\r\n {\r\n field: \"agentId\",\r\n headerName: \"Atribuído\",\r\n type: \"user\",\r\n enableColumnFilter: true,\r\n filterType: \"select\",\r\n filterOptions: AGENT_OPTIONS,\r\n typeOptions: { users: AGENTS_LOOKUP },\r\n },\r\n {\r\n field: \"value\",\r\n headerName: \"Valor\",\r\n type: \"currency\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"number\",\r\n aggregate: \"sum\",\r\n aggregateFormatter: (v) =>\r\n new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(v),\r\n },\r\n {\r\n field: \"createdAt\",\r\n headerName: \"Criado em\",\r\n type: \"date\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"date\",\r\n width: 130,\r\n },\r\n {\r\n field: \"lastContact\",\r\n headerName: \"Último contato\",\r\n type: \"date\",\r\n sortable: true,\r\n width: 150,\r\n },\r\n {\r\n field: \"location\",\r\n headerName: \"Localização\",\r\n type: \"text\",\r\n minWidth: 150,\r\n },\r\n {\r\n field: \"_actions\",\r\n headerName: \"\",\r\n type: \"actions\",\r\n // `width` fica: `actions` é tipo ESTRUTURAL e não está no registry, então não tem\r\n // `defaultWidth` — sem isto a largura depende do autoFit. Já o `pinned: \"right\"` saiu\r\n // por ser redundante: `use-data-table-columns.ts` resolve\r\n // `col.pinned ?? (isActions ? \"right\" : undefined)`. O exemplo é a fonte de maior\r\n // precedência das skills (\"o exemplo vence tudo\"), então prop redundante aqui vira\r\n // prop copiada em toda tela gerada.\r\n width: 64,\r\n getActions: ({ row }) => [\r\n {\r\n id: \"edit\",\r\n label: \"Editar\",\r\n icon: <Pencil />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Editar\", row.id),\r\n },\r\n {\r\n id: \"whatsapp\",\r\n label: \"Abrir atendimento (WhatsApp)\",\r\n icon: <MessageSquare />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Atendimento\", row.id),\r\n },\r\n {\r\n id: \"archive\",\r\n label: \"Arquivar\",\r\n icon: <Archive />,\r\n showInMenu: true,\r\n onClick: () => console.log(\"Arquivar\", row.id),\r\n },\r\n {\r\n id: \"delete\",\r\n label: \"Excluir cliente\",\r\n icon: <Trash2 />,\r\n showInMenu: true,\r\n destructive: true,\r\n onClick: () => handlers.onAskDelete(row),\r\n },\r\n ],\r\n },\r\n ];\r\n}\r\n\r\n/* ── Saved views / Presets — tabs do toolbar ───────────────────── */\r\n\r\nconst DEFAULT_VIEWS: DataTablePresetView[] = [\r\n presetView({\r\n id: \"preset:meus\",\r\n name: \"Meus\",\r\n filters: [{ field: \"agentId\", value: \"you\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ativos\",\r\n name: \"Ativos\",\r\n filters: [{ field: \"statusId\", value: \"active\" }],\r\n }),\r\n presetView({\r\n id: \"preset:royals\",\r\n name: \"Royals\",\r\n filters: [{ field: \"categoryId\", value: \"royal\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ultimos-7-dias\",\r\n name: \"Últimos 7 dias\",\r\n sort: [{ field: \"createdAt\", direction: \"desc\" }],\r\n }),\r\n];\r\n\r\n/* ── Filtros iniciais (Status=Ativo + Categoria=Royal — print) ─── */\r\n\r\n// statusId e categoryId são filterType=\"multiSelect\" — operator correto é \"isAnyOf\"\r\n// (not \"equals\"). Sem isso, o popover Filtros mostrava o Select de operador VAZIO\r\n// porque \"equals\" não está nos operators de MultiSelectColumnType.\r\nconst INITIAL_FILTERS: FilterModel = {\r\n items: [\r\n { id: \"filter-status-ativo\", field: \"statusId\", operator: \"isAnyOf\", value: \"active\" },\r\n { id: \"filter-categoria-royal\", field: \"categoryId\", operator: \"isAnyOf\", value: \"royal\" },\r\n ],\r\n logicOperator: \"AND\",\r\n};\r\n\r\n/* ── Kanban config (renderCard com JSX) ────────────────────────── */\r\n\r\nconst KANBAN_CONFIG: DataTableKanbanConfig<ClientRow> = {\r\n groupByField: \"statusId\",\r\n columns: KANBAN_COLUMNS,\r\n renderCard: ({ row }) => {\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials = agent?.name.split(\" \").map((s) => s[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n return {\r\n title: row.name,\r\n subtitle: row.id,\r\n avatar: (\r\n <Avatar className=\"size-[28px]\" style={{ background: row.avatarColor }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-sm font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n ),\r\n chip: cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : null,\r\n value: formatBRL(row.value),\r\n footerLeft: agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm min-w-0 flex-1\">\r\n <Avatar className=\"size-[22px]\" style={{ background: agent.color }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <span className=\"text-body-xs font-normal text-fg-muted whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {agent.name}\r\n </span>\r\n </span>\r\n ) : null,\r\n footerRight: (\r\n <span className=\"inline-flex items-center gap-[4px] text-caption-sm text-fg-muted [font-variant-numeric:tabular-nums] shrink-0\">\r\n <Clock size={11} strokeWidth={1.8} aria-hidden />\r\n {formatShortDate(row.lastContact)}\r\n </span>\r\n ),\r\n };\r\n },\r\n};\r\n\r\n/* ═══════════════════════════════════════════════════════════════════════════\r\n Page — Clientes (showcase usando AppShell + DataTable real)\r\n ═══════════════════════════════════════════════════════════════════════════ */\r\n\r\ntype ConfirmDeleteState = {\r\n ids: string[];\r\n label: string;\r\n /** Callback opcional após confirmar — usado pelo bulk pra limpar seleção. */\r\n onAfter?: () => void;\r\n} | null;\r\n\r\nexport default function ClientesShowcase() {\r\n const { theme, setTheme } = useTheme();\r\n const [rows, setRows] = useState<ClientRow[]>(() => CLIENTS_87);\r\n const [layout, setLayout] = useState<string>(\"fluid\");\r\n const [filterModel, setFilterModel] = useState<FilterModel>(INITIAL_FILTERS);\r\n const [viewMode, setViewMode] = useState<DataTableViewMode>(\"table\");\r\n const [novoClienteOpen, setNovoClienteOpen] = useState(false);\r\n const [detailRowId, setDetailRowId] = useState<string | null>(null);\r\n const [confirmDelete, setConfirmDelete] = useState<ConfirmDeleteState>(null);\r\n const detailRow = detailRowId ? rows.find((r) => r.id === detailRowId) ?? null : null;\r\n const tableRef = useRef<DataTableRef>(null);\r\n\r\n const askDelete = useCallback(\r\n (row: ClientRow) =>\r\n setConfirmDelete({ ids: [row.id], label: row.name }),\r\n [],\r\n );\r\n\r\n const askBulkDelete = useCallback(\r\n (ids: string[], onAfter: () => void) =>\r\n setConfirmDelete({\r\n ids,\r\n label: `${ids.length} cliente${ids.length === 1 ? \"\" : \"s\"}`,\r\n onAfter,\r\n }),\r\n [],\r\n );\r\n\r\n const handleConfirmDelete = useCallback(() => {\r\n if (!confirmDelete) return;\r\n const ids = new Set(confirmDelete.ids);\r\n setRows((prev) => prev.filter((r) => !ids.has(r.id)));\r\n if (detailRowId && ids.has(detailRowId)) setDetailRowId(null);\r\n confirmDelete.onAfter?.();\r\n setConfirmDelete(null);\r\n }, [confirmDelete, detailRowId]);\r\n\r\n const columns = useMemo(\r\n () => buildColumns({ onAskDelete: askDelete }),\r\n [askDelete],\r\n );\r\n\r\n return (\r\n <AppShell\r\n contexts={APP_SHELL_CONTEXTS}\r\n defaultActiveContextId=\"inbox\"\r\n defaultActiveItemHref=\"#atendimentos\"\r\n breadcrumb={[{ label: \"Atendimentos\" }]}\r\n commandGroups={APP_SHELL_COMMANDS}\r\n notifications={{\r\n items: APP_SHELL_NOTIFICATIONS,\r\n onMarkAllRead: () => alert(\"Marcar todas como lidas\"),\r\n onMoreActions: () => alert(\"Mais ações\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n messages={{\r\n items: APP_SHELL_MESSAGES,\r\n onNewMessage: () => alert(\"Nova mensagem\"),\r\n onExpand: () => alert(\"Expandir\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n theme={theme}\r\n onThemeChange={(id) => setTheme(id as Theme)}\r\n themeOptions={APP_SHELL_THEME_OPTIONS}\r\n user={APP_SHELL_USER}\r\n layout={layout}\r\n onLayoutChange={setLayout}\r\n layoutOptions={APP_SHELL_LAYOUT_OPTIONS}\r\n onSettings={() => alert(\"Abrir Configurações\")}\r\n onLogout={() => alert(\"Sair (mock)\")}\r\n >\r\n <PageHeader\r\n title=\"Clientes\"\r\n description=\"Gerencie sua base de clientes, acompanhe status de cadastro e abra atendimentos diretos pelo WhatsApp.\"\r\n badge={\r\n <Chip color=\"primary\" variant=\"soft\" size=\"sm\" shape=\"rounded\">\r\n {rows.length.toLocaleString(\"pt-BR\")} registros\r\n </Chip>\r\n }\r\n actions={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"icon-md\"\r\n aria-label=\"Mais ações\"\r\n onClick={() => alert(\"Mais ações\")}\r\n >\r\n <MoreHorizontal />\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n iconLeft={<Plus />}\r\n onClick={() => setNovoClienteOpen(true)}\r\n >\r\n Novo cliente\r\n </Button>\r\n </>\r\n }\r\n />\r\n\r\n {/* DataTable — ocupa o resto do body ──────────────────────── */}\r\n <DataTable<ClientRow>\r\n ref={tableRef}\r\n rows={rows}\r\n columns={columns}\r\n getRowId={(r) => r.id}\r\n persistId=\"showcase-clientes-crud\"\r\n defaultViews={DEFAULT_VIEWS}\r\n /* Chips de filtro VAZIOS já visíveis no load (\"Atribuído\") — a afordância\r\n aparece sem abrir o menu; o usuário clica e preenche. Filtro é recurso\r\n da tabela (nativo), nunca form/select acima dela. */\r\n showEmptyFilterChips={[\"agentId\"]}\r\n filterModel={filterModel}\r\n onFilterModelChange={setFilterModel}\r\n viewMode={viewMode}\r\n onViewModeChange={setViewMode}\r\n kanbanConfig={KANBAN_CONFIG}\r\n toolbar={{\r\n enableSearch: true,\r\n enableFilters: true,\r\n enableColumns: true,\r\n enableDensity: true,\r\n enableExport: true,\r\n moreMenu: {\r\n items: [\r\n {\r\n id: \"fullscreen\",\r\n label: \"Tela cheia\",\r\n icon: <Maximize2 />,\r\n onSelect: () => alert(\"Tela cheia\"),\r\n },\r\n {\r\n id: \"duplicate\",\r\n label: \"Duplicar visualização\",\r\n icon: <Copy />,\r\n onSelect: () => alert(\"Duplicar visualização\"),\r\n },\r\n {\r\n id: \"import\",\r\n label: \"Importar CSV\",\r\n icon: <Upload />,\r\n onSelect: () => alert(\"Importar CSV\"),\r\n },\r\n {\r\n id: \"reset\",\r\n label: \"Resetar visualização\",\r\n icon: <RotateCcw />,\r\n destructive: true,\r\n onSelect: () => tableRef.current?.resetPersistedState(),\r\n },\r\n ],\r\n },\r\n }}\r\n paginationConfig={{\r\n enabled: true,\r\n initialPageSize: 10,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n }}\r\n selectionConfig={{\r\n enabled: true,\r\n enableGlobal: true,\r\n actions: (selectedIds, clearSelection) => (\r\n <>\r\n <BulkActionButton\r\n icon={<Download />}\r\n onClick={() => tableRef.current?.exportCsv(\"selected\")}\r\n >\r\n Exportar\r\n </BulkActionButton>\r\n <BulkActionButton\r\n icon={<Trash2 />}\r\n variant=\"danger\"\r\n onClick={() => askBulkDelete(selectedIds.map(String), clearSelection)}\r\n >\r\n Excluir\r\n </BulkActionButton>\r\n </>\r\n ),\r\n }}\r\n onCellEditCommit={async ({ id, field, value }) => {\r\n await new Promise((res) => setTimeout(res, 400));\r\n setRows((prev) =>\r\n prev.map((r) => (r.id === id ? { ...r, [field]: value } : r)),\r\n );\r\n }}\r\n onRowClick={(row) => setDetailRowId(row.id)}\r\n className=\"flex-1 min-h-0\"\r\n />\r\n\r\n {/* Drawer \"Novo cliente\" — controlado pelo botão do header */}\r\n <NovoClienteDrawer\r\n open={novoClienteOpen}\r\n onOpenChange={setNovoClienteOpen}\r\n onSubmit={(data) => {\r\n console.log(\"Novo cliente:\", data);\r\n alert(`Cliente \"${data.name}\" criado (mock)`);\r\n }}\r\n />\r\n\r\n {/* DetailDrawer — abre ao clicar numa row, slide-in da direita SEM\r\n backdrop modal (tabela continua interativa atrás). */}\r\n <DetailDrawer\r\n row={detailRow}\r\n onClose={() => setDetailRowId(null)}\r\n onEdit={(r) => console.log(\"Editar\", r.id)}\r\n onDelete={(r) => askDelete(r)}\r\n onSave={(r) => alert(`Salvar alterações em ${r.name} (mock)`)}\r\n />\r\n\r\n {/* AlertModal de confirmação de exclusão — compartilhado entre\r\n row action menu, bulk action e DetailDrawer.onDelete. */}\r\n <AlertModal\r\n open={confirmDelete !== null}\r\n onOpenChange={(open) => {\r\n if (!open) setConfirmDelete(null);\r\n }}\r\n tone=\"danger\"\r\n title={\r\n confirmDelete && confirmDelete.ids.length > 1\r\n ? `Excluir ${confirmDelete.label}?`\r\n : \"Excluir cliente?\"\r\n }\r\n description={\r\n confirmDelete\r\n ? confirmDelete.ids.length > 1\r\n ? `Esta ação não pode ser desfeita. ${confirmDelete.label} serão removidos permanentemente.`\r\n : `Esta ação não pode ser desfeita. \"${confirmDelete.label}\" será removido permanentemente.`\r\n : null\r\n }\r\n confirmLabel=\"Excluir\"\r\n cancelLabel=\"Cancelar\"\r\n onConfirm={handleConfirmDelete}\r\n />\r\n </AppShell>\r\n );\r\n}\r\n"],"names":["tv","useState","useEffect","jsxs","Panel","Fragment","jsx","Button","FormFieldInput","FormField","ChipGroup","STATUSES","ChipGroupItem","STATUS_DOT","CATEGORIES","FormFieldSelect","CITIES","FormFieldTextarea","ChevronDown","AGENTS","FloatingPanel","Avatar","AvatarFallback","Pencil","Trash2","Chip","CATEGORY_KIND","formatBRL","formatShortDate","CLIENTS_87","STATUS_OPTIONS","CATEGORY_OPTIONS","AGENT_OPTIONS","AGENTS_LOOKUP","MessageSquare","Archive","presetView","KANBAN_COLUMNS","Clock","useTheme","useRef","useCallback","useMemo","AppShell","APP_SHELL_CONTEXTS","APP_SHELL_COMMANDS","APP_SHELL_NOTIFICATIONS","APP_SHELL_MESSAGES","APP_SHELL_THEME_OPTIONS","APP_SHELL_USER","APP_SHELL_LAYOUT_OPTIONS","PageHeader","MoreHorizontal","Plus","DataTable","Maximize2","Copy","Upload","RotateCcw","BulkActionButton","Download","AlertModal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"clientes.cjs","sources":["../../src/preview/pages/ClientesShowcase/clientes-showcase.styles.ts","../../src/preview/pages/ClientesShowcase/components/NovoClienteDrawer/novo-cliente-drawer.tsx","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.styles.ts","../../src/preview/pages/ClientesShowcase/components/DetailDrawer/detail-drawer.tsx","../../src/preview/pages/ClientesShowcase/ClientesShowcase.tsx"],"sourcesContent":["import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Layout em grid de 2 colunas usado dentro do drawer pra pares de campos\r\n * (Email + WhatsApp, Cidade + Valor).\r\n * `gap-form-gap` (20px) = token DS pra spacing entre FormField units (L-024).\r\n */\r\nexport const drawerFormStyles = tv({\r\n slots: {\r\n twoCols: \"grid grid-cols-2 gap-form-gap\",\r\n statusDot: \"inline-block size-[8px] rounded-radius-full mr-gp-xs shrink-0\",\r\n },\r\n});\r\n","import { useEffect, useState } from \"react\";\r\nimport { Panel } from \"@/components/ui/Panel\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport {\r\n FormField,\r\n FormFieldInput,\r\n FormFieldSelect,\r\n FormFieldTextarea,\r\n} from \"@/components/ui/FormField\";\r\nimport { ChipGroup, ChipGroupItem } from \"@/components/ui/Chip\";\r\nimport { STATUSES, CATEGORIES } from \"../../../_table-data\";\r\nimport { CITIES, STATUS_DOT } from \"../../clientes-showcase-mocks\";\r\nimport { drawerFormStyles } from \"../../clientes-showcase.styles\";\r\nimport type { NovoClienteFormData } from \"../../clientes-showcase.types\";\r\n\r\nconst INITIAL_FORM: NovoClienteFormData = {\r\n name: \"\",\r\n email: \"\",\r\n whatsapp: \"\",\r\n statusId: \"active\",\r\n categoryId: \"lead\",\r\n city: \"\",\r\n value: 0,\r\n notes: \"\",\r\n};\r\n\r\nexport type NovoClienteDrawerProps = {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n /** Disparado ao confirmar — drawer fecha automaticamente após o submit. */\r\n onSubmit?: (data: NovoClienteFormData) => void;\r\n};\r\n\r\n/**\r\n * Drawer \"Novo cliente\" — replica visual do TblClientFormDrawer\r\n * (sandbox /design-and-table-v2), recompilado em cima dos componentes do DS:\r\n * Panel + FormField (Input / Select / Textarea) + ChipGroup + Button.\r\n *\r\n * Layout (top → bottom):\r\n * 1. Nome* — full width\r\n * 2. Email + WhatsApp — 2 cols\r\n * 3. Status — ChipGroup com dot colorido\r\n * 4. Categoria — ChipGroup\r\n * 5. Cidade + Valor R$ — 2 cols\r\n * 6. Notas — textarea full width\r\n */\r\nexport function NovoClienteDrawer({\r\n open,\r\n onOpenChange,\r\n onSubmit,\r\n}: NovoClienteDrawerProps) {\r\n const s = drawerFormStyles();\r\n const [form, setForm] = useState<NovoClienteFormData>(INITIAL_FORM);\r\n\r\n // Reseta form sempre que abrir\r\n useEffect(() => {\r\n if (open) setForm(INITIAL_FORM);\r\n }, [open]);\r\n\r\n const canSubmit = form.name.trim().length > 0;\r\n\r\n const handleSubmit = () => {\r\n if (!canSubmit) return;\r\n onSubmit?.(form);\r\n onOpenChange(false);\r\n };\r\n\r\n return (\r\n <Panel\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n title=\"Novo cliente\"\r\n side=\"right\"\r\n size=\"md\"\r\n footer={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"md\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n disabled={!canSubmit}\r\n onClick={handleSubmit}\r\n >\r\n Criar cliente\r\n </Button>\r\n </>\r\n }\r\n >\r\n <FormFieldInput\r\n label=\"Nome\"\r\n required\r\n placeholder=\"Maria Silva\"\r\n value={form.name}\r\n onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}\r\n />\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldInput\r\n label=\"Email\"\r\n type=\"email\"\r\n placeholder=\"cliente@exemplo.com\"\r\n value={form.email}\r\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\r\n />\r\n <FormFieldInput\r\n label=\"WhatsApp\"\r\n type=\"tel\"\r\n placeholder=\"55 11 99999-9999\"\r\n value={form.whatsapp}\r\n onChange={(e) => setForm((f) => ({ ...f, whatsapp: e.target.value }))}\r\n />\r\n </div>\r\n\r\n <FormField label=\"Status\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.statusId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n statusId: v as keyof typeof STATUSES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Status do cliente\"\r\n >\r\n {Object.entries(STATUSES).map(([id, st]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n <span\r\n className={s.statusDot()}\r\n style={{ background: STATUS_DOT[id] ?? st.color }}\r\n aria-hidden\r\n />\r\n {st.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <FormField label=\"Categoria\">\r\n {() => (\r\n <ChipGroup\r\n type=\"single\"\r\n value={form.categoryId}\r\n onValueChange={(v) =>\r\n v &&\r\n setForm((f) => ({\r\n ...f,\r\n categoryId: v as keyof typeof CATEGORIES,\r\n }))\r\n }\r\n size=\"md\"\r\n shape=\"pill\"\r\n ariaLabel=\"Categoria do cliente\"\r\n >\r\n {Object.entries(CATEGORIES).map(([id, cat]) => (\r\n <ChipGroupItem key={id} value={id}>\r\n {cat.label}\r\n </ChipGroupItem>\r\n ))}\r\n </ChipGroup>\r\n )}\r\n </FormField>\r\n\r\n <div className={s.twoCols()}>\r\n <FormFieldSelect\r\n label=\"Cidade\"\r\n placeholder=\"Selecionar...\"\r\n value={form.city || undefined}\r\n onValueChange={(v) => setForm((f) => ({ ...f, city: v }))}\r\n options={CITIES.map((c) => ({ value: c, label: c }))}\r\n />\r\n <FormFieldInput\r\n label=\"Valor (R$)\"\r\n type=\"number\"\r\n startAddon=\"R$\"\r\n value={String(form.value)}\r\n onChange={(e) =>\r\n setForm((f) => ({ ...f, value: Number(e.target.value) }))\r\n }\r\n min={0}\r\n step={0.01}\r\n />\r\n </div>\r\n\r\n <FormFieldTextarea\r\n label=\"Notas\"\r\n placeholder=\"Observações sobre o cliente...\"\r\n rows={4}\r\n value={form.notes}\r\n onChange={(e) => setForm((f) => ({ ...f, notes: e.target.value }))}\r\n />\r\n </Panel>\r\n );\r\n}\r\n","import { tv } from \"@/utils/tv\";\r\n\r\n/**\r\n * Styles do DetailDrawer — apenas as partes internas (sections collapsibles\r\n * + DetailField). O shell flutuante (aside, header com avatar+meta, footer\r\n * com botões) é delegado ao `<FloatingPanel>` do DS.\r\n */\r\nexport const detailDrawerStyles = tv({\r\n slots: {\r\n section: \"border-b border-border-default last:border-b-0\",\r\n sectionHead: [\r\n \"flex items-center justify-between w-full\",\r\n \"px-[18px] py-[14px]\",\r\n \"bg-transparent border-0 cursor-pointer text-left\",\r\n \"text-body-sm font-semibold text-fg-default\",\r\n \"transition-colors duration-150\",\r\n \"hover:bg-bg-muted\",\r\n \"focus-visible:outline-none focus-visible:bg-bg-muted\",\r\n ],\r\n sectionChev: \"size-[14px] text-fg-muted transition-transform duration-200\",\r\n sectionChevOpen: \"rotate-180\",\r\n sectionBody: \"flex flex-col gap-gp-md px-[18px] pb-pad-2xl\",\r\n\r\n field: \"flex items-baseline justify-between gap-gp-md text-body-sm font-normal\",\r\n fieldLabel: \"text-body-xs font-normal text-fg-muted shrink-0\",\r\n fieldValue: \"text-fg-default text-right break-words min-w-0\",\r\n },\r\n});\r\n","import { useState, type ReactNode } from \"react\";\r\nimport { ChevronDown, Pencil, Trash2 } from \"lucide-react\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { FloatingPanel } from \"@/components/ui/FloatingPanel\";\r\nimport { STATUSES, CATEGORIES, AGENTS } from \"../../../_table-data\";\r\nimport {\r\n CATEGORY_KIND,\r\n STATUS_DOT,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"../../clientes-showcase-mocks\";\r\nimport { detailDrawerStyles } from \"./detail-drawer.styles\";\r\nimport type { DetailDrawerProps } from \"./detail-drawer.types\";\r\n\r\n/* ── Helpers internos ────────────────────────────────────────────── */\r\n\r\nfunction formatLongDate(ms: number): string {\r\n if (!ms) return \"—\";\r\n const d = new Date(ms);\r\n return d.toLocaleDateString(\"pt-BR\", {\r\n day: \"numeric\",\r\n month: \"long\",\r\n year: \"numeric\",\r\n });\r\n}\r\n\r\ntype SectionId = \"contact\" | \"meta\" | \"notes\";\r\n\r\n/* ── DetailField (label : value) ────────────────────────────────── */\r\n\r\ntype DetailFieldProps = {\r\n label: string;\r\n value: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailField({ label, value, s }: DetailFieldProps) {\r\n return (\r\n <div className={s.field()}>\r\n <span className={s.fieldLabel()}>{label}</span>\r\n <span className={s.fieldValue()}>{value || \"—\"}</span>\r\n </div>\r\n );\r\n}\r\n\r\n/* ── DetailSection (collapsible) ─────────────────────────────────── */\r\n\r\ntype DetailSectionProps = {\r\n id: SectionId;\r\n title: string;\r\n open: boolean;\r\n onToggle: (id: SectionId) => void;\r\n children: ReactNode;\r\n s: ReturnType<typeof detailDrawerStyles>;\r\n};\r\n\r\nfunction DetailSection({\r\n id,\r\n title,\r\n open,\r\n onToggle,\r\n children,\r\n s,\r\n}: DetailSectionProps) {\r\n return (\r\n <section className={s.section()}>\r\n <button\r\n type=\"button\"\r\n className={s.sectionHead()}\r\n onClick={() => onToggle(id)}\r\n aria-expanded={open}\r\n >\r\n <span>{title}</span>\r\n <ChevronDown\r\n className={[s.sectionChev(), open ? s.sectionChevOpen() : \"\"].join(\" \")}\r\n />\r\n </button>\r\n {open && <div className={s.sectionBody()}>{children}</div>}\r\n </section>\r\n );\r\n}\r\n\r\n/* ── DetailDrawer ────────────────────────────────────────────────── */\r\n\r\n/**\r\n * Drawer \"Detalhes do cliente\" — usa `<FloatingPanel>` do DS (non-modal,\r\n * resizable, maximizable, responsive). Replica visual do `TblDetailsPanel`\r\n * do sandbox /design-and-table-v2.\r\n */\r\nexport function DetailDrawer({\r\n row,\r\n onClose,\r\n onEdit,\r\n onDelete,\r\n onSave,\r\n}: DetailDrawerProps) {\r\n const s = detailDrawerStyles();\r\n const [openSections, setOpenSections] = useState<Set<SectionId>>(\r\n () => new Set([\"contact\", \"meta\", \"notes\"]),\r\n );\r\n\r\n const toggle = (id: SectionId) => {\r\n setOpenSections((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(id)) next.delete(id);\r\n else next.add(id);\r\n return next;\r\n });\r\n };\r\n\r\n // Mantém ordem dos hooks estável independente de `row` — depois do toggle.\r\n if (!row) return null;\r\n\r\n const status = STATUSES[row.statusId];\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials =\r\n agent?.name.split(\" \").map((p) => p[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n\r\n return (\r\n <FloatingPanel\r\n open={row !== null}\r\n onOpenChange={(open) => {\r\n if (!open) onClose();\r\n }}\r\n side=\"right\"\r\n size=\"md\"\r\n resizable\r\n maximizable\r\n // Sections internas (DetailSection) gerenciam o próprio padding edge-to-edge.\r\n bodyPadded={false}\r\n resizableStorageKey=\"clientes-showcase.detail-drawer.width\"\r\n titleSlot={\r\n <div className=\"flex items-center gap-gp-md min-w-0\">\r\n <Avatar\r\n className=\"size-[40px] shrink-0\"\r\n style={{ background: row.avatarColor }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-body-md font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <div className=\"flex flex-col min-w-0 flex-1\">\r\n <div className=\"text-body-md font-semibold text-fg-default whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {row.name}\r\n </div>\r\n <div className=\"flex items-center gap-[6px] mt-[2px] text-body-xs font-normal text-fg-muted\">\r\n <span>{row.id}</span>\r\n <span className=\"opacity-50\">·</span>\r\n <span className=\"inline-flex items-center gap-[6px]\">\r\n <span\r\n className=\"inline-block size-[8px] rounded-radius-full shrink-0\"\r\n style={{ background: STATUS_DOT[row.statusId] ?? status?.color }}\r\n aria-hidden\r\n />\r\n {status?.label}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n headerActions={\r\n <>\r\n <Button\r\n variant=\"soft\"\r\n color=\"secondary\"\r\n size=\"icon-sm\"\r\n aria-label=\"Editar\"\r\n onClick={() => onEdit?.(row)}\r\n >\r\n <Pencil />\r\n </Button>\r\n <Button\r\n variant=\"soft\"\r\n color=\"critical\"\r\n size=\"icon-sm\"\r\n aria-label=\"Excluir\"\r\n onClick={() => onDelete?.(row)}\r\n >\r\n <Trash2 />\r\n </Button>\r\n </>\r\n }\r\n footer={\r\n <>\r\n <Button variant=\"outline\" color=\"secondary\" size=\"sm\" onClick={onClose}>\r\n Cancelar\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"sm\"\r\n onClick={() => onSave?.(row)}\r\n >\r\n Salvar alterações\r\n </Button>\r\n </>\r\n }\r\n >\r\n <DetailSection\r\n id=\"contact\"\r\n title=\"Contato\"\r\n open={openSections.has(\"contact\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField\r\n label=\"Email\"\r\n value={\r\n <a\r\n href={`mailto:${row.email}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.email}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Telefone\"\r\n value={\r\n <a\r\n href={`tel:${row.phone.replace(/\\D/g, \"\")}`}\r\n className=\"text-fg-brand hover:underline\"\r\n >\r\n {row.phone}\r\n </a>\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Localização\" value={row.location} s={s} />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"meta\"\r\n title=\"Atendimento\"\r\n open={openSections.has(\"meta\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <DetailField label=\"ID\" value={row.id} s={s} />\r\n <DetailField\r\n label=\"Categoria\"\r\n value={\r\n cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField\r\n label=\"Atribuído a\"\r\n value={\r\n agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm\">\r\n <Avatar\r\n className=\"size-[22px]\"\r\n style={{ background: agent.color }}\r\n >\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n {agent.name}\r\n </span>\r\n ) : (\r\n \"—\"\r\n )\r\n }\r\n s={s}\r\n />\r\n <DetailField label=\"Valor\" value={formatBRL(row.value)} s={s} />\r\n <DetailField label=\"Criado em\" value={formatLongDate(row.createdAt)} s={s} />\r\n <DetailField\r\n label=\"Último contato\"\r\n value={formatShortDate(row.lastContact)}\r\n s={s}\r\n />\r\n </DetailSection>\r\n\r\n <DetailSection\r\n id=\"notes\"\r\n title=\"Anotações\"\r\n open={openSections.has(\"notes\")}\r\n onToggle={toggle}\r\n s={s}\r\n >\r\n <p className=\"text-body-xs font-normal text-fg-muted\">Sem anotações.</p>\r\n </DetailSection>\r\n </FloatingPanel>\r\n );\r\n}\r\n","import { useCallback, useMemo, useRef, useState } from \"react\";\r\nimport { useTheme, type Theme } from \"@/hooks/useTheme\";\r\nimport {\r\n Archive,\r\n Clock,\r\n Copy,\r\n Download,\r\n Maximize2,\r\n MessageSquare,\r\n MoreHorizontal,\r\n Pencil,\r\n Plus,\r\n RotateCcw,\r\n Trash2,\r\n Upload,\r\n} from \"lucide-react\";\r\nimport {\r\n CATEGORIES,\r\n AGENTS,\r\n type ClientRow,\r\n} from \"../_table-data\";\r\nimport {\r\n DataTable,\r\n presetView,\r\n type DataTableColumnDef,\r\n type DataTableKanbanConfig,\r\n type DataTablePresetView,\r\n type DataTableRef,\r\n type DataTableViewMode,\r\n type FilterModel,\r\n} from \"@/components/ui/DataTable\";\r\nimport { AppShell } from \"@/components/ui/AppShell\";\r\nimport { Button } from \"@/components/ui/Button/button\";\r\nimport { Chip } from \"@/components/ui/Chip\";\r\nimport { PageHeader } from \"@/components/ui/PageHeader\";\r\nimport { BulkActionButton } from \"@/components/ui/TableToolbar\";\r\nimport { Avatar, AvatarFallback } from \"@/components/shadcn/avatar\";\r\nimport {\r\n APP_SHELL_CONTEXTS,\r\n APP_SHELL_COMMANDS,\r\n APP_SHELL_NOTIFICATIONS,\r\n APP_SHELL_MESSAGES,\r\n APP_SHELL_THEME_OPTIONS,\r\n APP_SHELL_LAYOUT_OPTIONS,\r\n APP_SHELL_USER,\r\n} from \"../../mocks/app-shell-mocks\";\r\nimport {\r\n CLIENTS_87,\r\n STATUS_OPTIONS,\r\n CATEGORY_OPTIONS,\r\n AGENT_OPTIONS,\r\n AGENTS_LOOKUP,\r\n KANBAN_COLUMNS,\r\n CATEGORY_KIND,\r\n formatBRL,\r\n formatShortDate,\r\n} from \"./clientes-showcase-mocks\";\r\nimport { NovoClienteDrawer } from \"./components/NovoClienteDrawer\";\r\nimport { DetailDrawer } from \"./components/DetailDrawer\";\r\nimport { AlertModal } from \"@/components/ui/AlertModal\";\r\n\r\n/* ── Columns declarativas (type-based) ─────────────────────────── */\r\n\r\ntype ColumnHandlers = {\r\n /** Pede confirmação de exclusão (abre o AlertModal). */\r\n onAskDelete: (row: ClientRow) => void;\r\n};\r\n\r\nfunction buildColumns(handlers: ColumnHandlers): DataTableColumnDef<ClientRow>[] {\r\n return [\r\n { field: \"id\", headerName: \"ID\", type: \"text\", width: 130 },\r\n {\r\n field: \"name\",\r\n headerName: \"Nome\",\r\n type: \"user\",\r\n sortable: true,\r\n width: 220,\r\n typeOptions: {\r\n users: Object.fromEntries(\r\n CLIENTS_87.map((c) => [\r\n c.name,\r\n {\r\n name: c.name,\r\n initials: c.initials,\r\n color: c.avatarColor,\r\n },\r\n ]),\r\n ),\r\n },\r\n valueGetter: (row) => row.name,\r\n },\r\n {\r\n field: \"email\",\r\n headerName: \"Email\",\r\n type: \"email\",\r\n enableColumnFilter: true,\r\n filterType: \"text\",\r\n },\r\n {\r\n field: \"phone\",\r\n headerName: \"Telefone\",\r\n type: \"phone\",\r\n },\r\n {\r\n field: \"statusId\",\r\n headerName: \"Status\",\r\n type: \"status\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: STATUS_OPTIONS,\r\n },\r\n {\r\n field: \"categoryId\",\r\n headerName: \"Categoria\",\r\n type: \"badge\",\r\n enableColumnFilter: true,\r\n filterType: \"multiSelect\",\r\n filterOptions: CATEGORY_OPTIONS,\r\n },\r\n {\r\n field: \"agentId\",\r\n headerName: \"Atribuído\",\r\n type: \"user\",\r\n enableColumnFilter: true,\r\n filterType: \"select\",\r\n filterOptions: AGENT_OPTIONS,\r\n typeOptions: { users: AGENTS_LOOKUP },\r\n },\r\n {\r\n field: \"value\",\r\n headerName: \"Valor\",\r\n type: \"currency\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"number\",\r\n aggregate: \"sum\",\r\n aggregateFormatter: (v) =>\r\n new Intl.NumberFormat(\"pt-BR\", { style: \"currency\", currency: \"BRL\" }).format(v),\r\n },\r\n {\r\n field: \"createdAt\",\r\n headerName: \"Criado em\",\r\n type: \"date\",\r\n sortable: true,\r\n enableColumnFilter: true,\r\n filterType: \"date\",\r\n width: 130,\r\n },\r\n {\r\n field: \"lastContact\",\r\n headerName: \"Último contato\",\r\n type: \"date\",\r\n sortable: true,\r\n width: 150,\r\n },\r\n {\r\n field: \"location\",\r\n headerName: \"Localização\",\r\n type: \"text\",\r\n minWidth: 150,\r\n },\r\n {\r\n field: \"_actions\",\r\n headerName: \"\",\r\n type: \"actions\",\r\n // Sem `width` e sem `pinned`, de propósito — o `type` já entrega os dois:\r\n // a largura é DERIVADA do nº de ações (1→44px · 2→74 · 3→104) e acima de 3 elas\r\n // colapsam no \"…\" sozinhas; o pin à direita sai de\r\n // `col.pinned ?? (isActions ? \"right\" : undefined)`. Prop redundante aqui vira prop\r\n // copiada em toda tela gerada — o exemplo é a fonte de maior precedência das skills.\r\n getActions: ({ row }) => [\r\n {\r\n id: \"edit\",\r\n label: \"Editar\",\r\n icon: <Pencil />,\r\n onClick: () => console.log(\"Editar\", row.id),\r\n },\r\n {\r\n id: \"whatsapp\",\r\n label: \"Abrir atendimento (WhatsApp)\",\r\n icon: <MessageSquare />,\r\n onClick: () => console.log(\"Atendimento\", row.id),\r\n },\r\n {\r\n id: \"archive\",\r\n label: \"Arquivar\",\r\n icon: <Archive />,\r\n onClick: () => console.log(\"Arquivar\", row.id),\r\n },\r\n {\r\n id: \"delete\",\r\n label: \"Excluir cliente\",\r\n icon: <Trash2 />,\r\n destructive: true,\r\n onClick: () => handlers.onAskDelete(row),\r\n },\r\n ],\r\n },\r\n ];\r\n}\r\n\r\n/* ── Saved views / Presets — tabs do toolbar ───────────────────── */\r\n\r\nconst DEFAULT_VIEWS: DataTablePresetView[] = [\r\n presetView({\r\n id: \"preset:meus\",\r\n name: \"Meus\",\r\n filters: [{ field: \"agentId\", value: \"you\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ativos\",\r\n name: \"Ativos\",\r\n filters: [{ field: \"statusId\", value: \"active\" }],\r\n }),\r\n presetView({\r\n id: \"preset:royals\",\r\n name: \"Royals\",\r\n filters: [{ field: \"categoryId\", value: \"royal\" }],\r\n }),\r\n presetView({\r\n id: \"preset:ultimos-7-dias\",\r\n name: \"Últimos 7 dias\",\r\n sort: [{ field: \"createdAt\", direction: \"desc\" }],\r\n }),\r\n];\r\n\r\n/* ── Filtros iniciais (Status=Ativo + Categoria=Royal — print) ─── */\r\n\r\n// statusId e categoryId são filterType=\"multiSelect\" — operator correto é \"isAnyOf\"\r\n// (not \"equals\"). Sem isso, o popover Filtros mostrava o Select de operador VAZIO\r\n// porque \"equals\" não está nos operators de MultiSelectColumnType.\r\nconst INITIAL_FILTERS: FilterModel = {\r\n items: [\r\n { id: \"filter-status-ativo\", field: \"statusId\", operator: \"isAnyOf\", value: \"active\" },\r\n { id: \"filter-categoria-royal\", field: \"categoryId\", operator: \"isAnyOf\", value: \"royal\" },\r\n ],\r\n logicOperator: \"AND\",\r\n};\r\n\r\n/* ── Kanban config (renderCard com JSX) ────────────────────────── */\r\n\r\nconst KANBAN_CONFIG: DataTableKanbanConfig<ClientRow> = {\r\n groupByField: \"statusId\",\r\n columns: KANBAN_COLUMNS,\r\n renderCard: ({ row }) => {\r\n const cat = CATEGORIES[row.categoryId as keyof typeof CATEGORIES];\r\n const agent = AGENTS[row.agentId as keyof typeof AGENTS];\r\n const agentInitials = agent?.name.split(\" \").map((s) => s[0]).join(\"\").slice(0, 2) ?? \"?\";\r\n return {\r\n title: row.name,\r\n subtitle: row.id,\r\n avatar: (\r\n <Avatar className=\"size-[28px]\" style={{ background: row.avatarColor }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-sm font-bold\">\r\n {row.initials}\r\n </AvatarFallback>\r\n </Avatar>\r\n ),\r\n chip: cat ? (\r\n <Chip\r\n color={CATEGORY_KIND[row.categoryId] ?? \"info\"}\r\n variant=\"soft\"\r\n size=\"sm\"\r\n shape=\"pill\"\r\n >\r\n {cat.label}\r\n </Chip>\r\n ) : null,\r\n value: formatBRL(row.value),\r\n footerLeft: agent ? (\r\n <span className=\"inline-flex items-center gap-gp-sm min-w-0 flex-1\">\r\n <Avatar className=\"size-[22px]\" style={{ background: agent.color }}>\r\n <AvatarFallback className=\"bg-transparent text-white text-caption-xs font-bold\">\r\n {agentInitials}\r\n </AvatarFallback>\r\n </Avatar>\r\n <span className=\"text-body-xs font-normal text-fg-muted whitespace-nowrap overflow-hidden text-ellipsis\">\r\n {agent.name}\r\n </span>\r\n </span>\r\n ) : null,\r\n footerRight: (\r\n <span className=\"inline-flex items-center gap-[4px] text-caption-sm text-fg-muted [font-variant-numeric:tabular-nums] shrink-0\">\r\n <Clock size={11} strokeWidth={1.8} aria-hidden />\r\n {formatShortDate(row.lastContact)}\r\n </span>\r\n ),\r\n };\r\n },\r\n};\r\n\r\n/* ═══════════════════════════════════════════════════════════════════════════\r\n Page — Clientes (showcase usando AppShell + DataTable real)\r\n ═══════════════════════════════════════════════════════════════════════════ */\r\n\r\ntype ConfirmDeleteState = {\r\n ids: string[];\r\n label: string;\r\n /** Callback opcional após confirmar — usado pelo bulk pra limpar seleção. */\r\n onAfter?: () => void;\r\n} | null;\r\n\r\nexport default function ClientesShowcase() {\r\n const { theme, setTheme } = useTheme();\r\n const [rows, setRows] = useState<ClientRow[]>(() => CLIENTS_87);\r\n const [layout, setLayout] = useState<string>(\"fluid\");\r\n const [filterModel, setFilterModel] = useState<FilterModel>(INITIAL_FILTERS);\r\n const [viewMode, setViewMode] = useState<DataTableViewMode>(\"table\");\r\n const [novoClienteOpen, setNovoClienteOpen] = useState(false);\r\n const [detailRowId, setDetailRowId] = useState<string | null>(null);\r\n const [confirmDelete, setConfirmDelete] = useState<ConfirmDeleteState>(null);\r\n const detailRow = detailRowId ? rows.find((r) => r.id === detailRowId) ?? null : null;\r\n const tableRef = useRef<DataTableRef>(null);\r\n\r\n const askDelete = useCallback(\r\n (row: ClientRow) =>\r\n setConfirmDelete({ ids: [row.id], label: row.name }),\r\n [],\r\n );\r\n\r\n const askBulkDelete = useCallback(\r\n (ids: string[], onAfter: () => void) =>\r\n setConfirmDelete({\r\n ids,\r\n label: `${ids.length} cliente${ids.length === 1 ? \"\" : \"s\"}`,\r\n onAfter,\r\n }),\r\n [],\r\n );\r\n\r\n const handleConfirmDelete = useCallback(() => {\r\n if (!confirmDelete) return;\r\n const ids = new Set(confirmDelete.ids);\r\n setRows((prev) => prev.filter((r) => !ids.has(r.id)));\r\n if (detailRowId && ids.has(detailRowId)) setDetailRowId(null);\r\n confirmDelete.onAfter?.();\r\n setConfirmDelete(null);\r\n }, [confirmDelete, detailRowId]);\r\n\r\n const columns = useMemo(\r\n () => buildColumns({ onAskDelete: askDelete }),\r\n [askDelete],\r\n );\r\n\r\n return (\r\n <AppShell\r\n contexts={APP_SHELL_CONTEXTS}\r\n defaultActiveContextId=\"inbox\"\r\n defaultActiveItemHref=\"#atendimentos\"\r\n breadcrumb={[{ label: \"Atendimentos\" }]}\r\n commandGroups={APP_SHELL_COMMANDS}\r\n notifications={{\r\n items: APP_SHELL_NOTIFICATIONS,\r\n onMarkAllRead: () => alert(\"Marcar todas como lidas\"),\r\n onMoreActions: () => alert(\"Mais ações\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n messages={{\r\n items: APP_SHELL_MESSAGES,\r\n onNewMessage: () => alert(\"Nova mensagem\"),\r\n onExpand: () => alert(\"Expandir\"),\r\n onViewAll: () => alert(\"Ver todas\"),\r\n }}\r\n theme={theme}\r\n onThemeChange={(id) => setTheme(id as Theme)}\r\n themeOptions={APP_SHELL_THEME_OPTIONS}\r\n user={APP_SHELL_USER}\r\n layout={layout}\r\n onLayoutChange={setLayout}\r\n layoutOptions={APP_SHELL_LAYOUT_OPTIONS}\r\n onSettings={() => alert(\"Abrir Configurações\")}\r\n onLogout={() => alert(\"Sair (mock)\")}\r\n >\r\n <PageHeader\r\n title=\"Clientes\"\r\n description=\"Gerencie sua base de clientes, acompanhe status de cadastro e abra atendimentos diretos pelo WhatsApp.\"\r\n badge={\r\n <Chip color=\"primary\" variant=\"soft\" size=\"sm\" shape=\"rounded\">\r\n {rows.length.toLocaleString(\"pt-BR\")} registros\r\n </Chip>\r\n }\r\n actions={\r\n <>\r\n <Button\r\n variant=\"outline\"\r\n color=\"secondary\"\r\n size=\"icon-md\"\r\n aria-label=\"Mais ações\"\r\n onClick={() => alert(\"Mais ações\")}\r\n >\r\n <MoreHorizontal />\r\n </Button>\r\n <Button\r\n variant=\"filled\"\r\n color=\"primary\"\r\n size=\"md\"\r\n iconLeft={<Plus />}\r\n onClick={() => setNovoClienteOpen(true)}\r\n >\r\n Novo cliente\r\n </Button>\r\n </>\r\n }\r\n />\r\n\r\n {/* DataTable — ocupa o resto do body ──────────────────────── */}\r\n <DataTable<ClientRow>\r\n ref={tableRef}\r\n rows={rows}\r\n columns={columns}\r\n getRowId={(r) => r.id}\r\n persistId=\"showcase-clientes-crud\"\r\n defaultViews={DEFAULT_VIEWS}\r\n /* Chips de filtro VAZIOS já visíveis no load (\"Atribuído\") — a afordância\r\n aparece sem abrir o menu; o usuário clica e preenche. Filtro é recurso\r\n da tabela (nativo), nunca form/select acima dela. */\r\n showEmptyFilterChips={[\"agentId\"]}\r\n filterModel={filterModel}\r\n onFilterModelChange={setFilterModel}\r\n viewMode={viewMode}\r\n onViewModeChange={setViewMode}\r\n kanbanConfig={KANBAN_CONFIG}\r\n toolbar={{\r\n enableSearch: true,\r\n enableFilters: true,\r\n enableColumns: true,\r\n enableDensity: true,\r\n enableExport: true,\r\n moreMenu: {\r\n items: [\r\n {\r\n id: \"fullscreen\",\r\n label: \"Tela cheia\",\r\n icon: <Maximize2 />,\r\n onSelect: () => alert(\"Tela cheia\"),\r\n },\r\n {\r\n id: \"duplicate\",\r\n label: \"Duplicar visualização\",\r\n icon: <Copy />,\r\n onSelect: () => alert(\"Duplicar visualização\"),\r\n },\r\n {\r\n id: \"import\",\r\n label: \"Importar CSV\",\r\n icon: <Upload />,\r\n onSelect: () => alert(\"Importar CSV\"),\r\n },\r\n {\r\n id: \"reset\",\r\n label: \"Resetar visualização\",\r\n icon: <RotateCcw />,\r\n destructive: true,\r\n onSelect: () => tableRef.current?.resetPersistedState(),\r\n },\r\n ],\r\n },\r\n }}\r\n paginationConfig={{\r\n enabled: true,\r\n initialPageSize: 10,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n }}\r\n selectionConfig={{\r\n enabled: true,\r\n enableGlobal: true,\r\n actions: (selectedIds, clearSelection) => (\r\n <>\r\n <BulkActionButton\r\n icon={<Download />}\r\n onClick={() => tableRef.current?.exportCsv(\"selected\")}\r\n >\r\n Exportar\r\n </BulkActionButton>\r\n <BulkActionButton\r\n icon={<Trash2 />}\r\n variant=\"danger\"\r\n onClick={() => askBulkDelete(selectedIds.map(String), clearSelection)}\r\n >\r\n Excluir\r\n </BulkActionButton>\r\n </>\r\n ),\r\n }}\r\n onCellEditCommit={async ({ id, field, value }) => {\r\n await new Promise((res) => setTimeout(res, 400));\r\n setRows((prev) =>\r\n prev.map((r) => (r.id === id ? { ...r, [field]: value } : r)),\r\n );\r\n }}\r\n onRowClick={(row) => setDetailRowId(row.id)}\r\n className=\"flex-1 min-h-0\"\r\n />\r\n\r\n {/* Drawer \"Novo cliente\" — controlado pelo botão do header */}\r\n <NovoClienteDrawer\r\n open={novoClienteOpen}\r\n onOpenChange={setNovoClienteOpen}\r\n onSubmit={(data) => {\r\n console.log(\"Novo cliente:\", data);\r\n alert(`Cliente \"${data.name}\" criado (mock)`);\r\n }}\r\n />\r\n\r\n {/* DetailDrawer — abre ao clicar numa row, slide-in da direita SEM\r\n backdrop modal (tabela continua interativa atrás). */}\r\n <DetailDrawer\r\n row={detailRow}\r\n onClose={() => setDetailRowId(null)}\r\n onEdit={(r) => console.log(\"Editar\", r.id)}\r\n onDelete={(r) => askDelete(r)}\r\n onSave={(r) => alert(`Salvar alterações em ${r.name} (mock)`)}\r\n />\r\n\r\n {/* AlertModal de confirmação de exclusão — compartilhado entre\r\n row action menu, bulk action e DetailDrawer.onDelete. */}\r\n <AlertModal\r\n open={confirmDelete !== null}\r\n onOpenChange={(open) => {\r\n if (!open) setConfirmDelete(null);\r\n }}\r\n tone=\"danger\"\r\n title={\r\n confirmDelete && confirmDelete.ids.length > 1\r\n ? `Excluir ${confirmDelete.label}?`\r\n : \"Excluir cliente?\"\r\n }\r\n description={\r\n confirmDelete\r\n ? confirmDelete.ids.length > 1\r\n ? `Esta ação não pode ser desfeita. ${confirmDelete.label} serão removidos permanentemente.`\r\n : `Esta ação não pode ser desfeita. \"${confirmDelete.label}\" será removido permanentemente.`\r\n : null\r\n }\r\n confirmLabel=\"Excluir\"\r\n cancelLabel=\"Cancelar\"\r\n onConfirm={handleConfirmDelete}\r\n />\r\n </AppShell>\r\n );\r\n}\r\n"],"names":["tv","useState","useEffect","jsxs","Panel","Fragment","jsx","Button","FormFieldInput","FormField","ChipGroup","STATUSES","ChipGroupItem","STATUS_DOT","CATEGORIES","FormFieldSelect","CITIES","FormFieldTextarea","ChevronDown","AGENTS","FloatingPanel","Avatar","AvatarFallback","Pencil","Trash2","Chip","CATEGORY_KIND","formatBRL","formatShortDate","CLIENTS_87","STATUS_OPTIONS","CATEGORY_OPTIONS","AGENT_OPTIONS","AGENTS_LOOKUP","MessageSquare","Archive","presetView","KANBAN_COLUMNS","Clock","useTheme","useRef","useCallback","useMemo","AppShell","APP_SHELL_CONTEXTS","APP_SHELL_COMMANDS","APP_SHELL_NOTIFICATIONS","APP_SHELL_MESSAGES","APP_SHELL_THEME_OPTIONS","APP_SHELL_USER","APP_SHELL_LAYOUT_OPTIONS","PageHeader","MoreHorizontal","Plus","DataTable","Maximize2","Copy","Upload","RotateCcw","BulkActionButton","Download","AlertModal"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect, useRef, useCallback, useMemo } from "react";
|
|
3
|
-
import { a as ChipGroup, b as ChipGroupItem, C as Chip, u as useTheme, A as AppShell } from "../chunks/useTheme-
|
|
3
|
+
import { a as ChipGroup, b as ChipGroupItem, C as Chip, u as useTheme, A as AppShell } from "../chunks/useTheme-DCmzLBUR.mjs";
|
|
4
4
|
import { Pencil, Trash2, ChevronDown, MoreHorizontal, Plus, Download, Maximize2, Copy, Upload, RotateCcw, MessageSquare, Archive, Clock } from "lucide-react";
|
|
5
5
|
import { S as STATUSES, a as STATUS_DOT, C as CATEGORIES, b as CITIES, A as AGENTS, d as CATEGORY_KIND, f as formatBRL, e as formatShortDate, g as CLIENTS_87, K as KANBAN_COLUMNS, h as STATUS_OPTIONS, i as CATEGORY_OPTIONS, j as AGENTS_LOOKUP, k as AGENT_OPTIONS } from "../chunks/clientes-showcase-mocks-CwWGCCmf.mjs";
|
|
6
|
-
import { P as Panel, F as FormFieldInput, a as FormField, b as FormFieldSelect, c as FormFieldTextarea, d as FloatingPanel, p as presetView, D as DataTable, B as BulkActionButton, A as AlertModal } from "../chunks/panel-
|
|
6
|
+
import { P as Panel, F as FormFieldInput, a as FormField, b as FormFieldSelect, c as FormFieldTextarea, d as FloatingPanel, p as presetView, D as DataTable, B as BulkActionButton, A as AlertModal } from "../chunks/panel-UwUWfDLf.mjs";
|
|
7
7
|
import { t as tv, B as Button, A as Avatar, a as AvatarFallback } from "../chunks/avatar-DFWEwBKu.mjs";
|
|
8
8
|
import "../chunks/input-CfmzMYtd.mjs";
|
|
9
|
-
import "../chunks/
|
|
9
|
+
import "../chunks/sheet-BgA2g6m4.mjs";
|
|
10
10
|
import { P as PageHeader } from "../chunks/page-header--cPS_Z-a.mjs";
|
|
11
11
|
import "react-dom";
|
|
12
12
|
import { b as APP_SHELL_LAYOUT_OPTIONS, f as APP_SHELL_USER, e as APP_SHELL_THEME_OPTIONS, c as APP_SHELL_MESSAGES, d as APP_SHELL_NOTIFICATIONS, A as APP_SHELL_COMMANDS, a as APP_SHELL_CONTEXTS } from "../chunks/app-shell-mocks-kWIVSzLs.mjs";
|
|
@@ -564,40 +564,34 @@ function buildColumns(handlers) {
|
|
|
564
564
|
field: "_actions",
|
|
565
565
|
headerName: "",
|
|
566
566
|
type: "actions",
|
|
567
|
-
// `width`
|
|
568
|
-
//
|
|
569
|
-
//
|
|
570
|
-
// `col.pinned ?? (isActions ? "right" : undefined)`.
|
|
571
|
-
//
|
|
572
|
-
// prop copiada em toda tela gerada.
|
|
573
|
-
width: 64,
|
|
567
|
+
// Sem `width` e sem `pinned`, de propósito — o `type` já entrega os dois:
|
|
568
|
+
// a largura é DERIVADA do nº de ações (1→44px · 2→74 · 3→104) e acima de 3 elas
|
|
569
|
+
// colapsam no "…" sozinhas; o pin à direita sai de
|
|
570
|
+
// `col.pinned ?? (isActions ? "right" : undefined)`. Prop redundante aqui vira prop
|
|
571
|
+
// copiada em toda tela gerada — o exemplo é a fonte de maior precedência das skills.
|
|
574
572
|
getActions: ({ row }) => [
|
|
575
573
|
{
|
|
576
574
|
id: "edit",
|
|
577
575
|
label: "Editar",
|
|
578
576
|
icon: /* @__PURE__ */ jsx(Pencil, {}),
|
|
579
|
-
showInMenu: true,
|
|
580
577
|
onClick: () => console.log("Editar", row.id)
|
|
581
578
|
},
|
|
582
579
|
{
|
|
583
580
|
id: "whatsapp",
|
|
584
581
|
label: "Abrir atendimento (WhatsApp)",
|
|
585
582
|
icon: /* @__PURE__ */ jsx(MessageSquare, {}),
|
|
586
|
-
showInMenu: true,
|
|
587
583
|
onClick: () => console.log("Atendimento", row.id)
|
|
588
584
|
},
|
|
589
585
|
{
|
|
590
586
|
id: "archive",
|
|
591
587
|
label: "Arquivar",
|
|
592
588
|
icon: /* @__PURE__ */ jsx(Archive, {}),
|
|
593
|
-
showInMenu: true,
|
|
594
589
|
onClick: () => console.log("Arquivar", row.id)
|
|
595
590
|
},
|
|
596
591
|
{
|
|
597
592
|
id: "delete",
|
|
598
593
|
label: "Excluir cliente",
|
|
599
594
|
icon: /* @__PURE__ */ jsx(Trash2, {}),
|
|
600
|
-
showInMenu: true,
|
|
601
595
|
destructive: true,
|
|
602
596
|
onClick: () => handlers.onAskDelete(row)
|
|
603
597
|
}
|