payload-plugin-marketing 0.9.2 → 0.9.4

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.
Files changed (94) hide show
  1. package/README.md +77 -14
  2. package/dist/admin/client.cjs +3 -0
  3. package/dist/admin/client.cjs.map +1 -0
  4. package/dist/admin/client.d.ts +7 -0
  5. package/dist/admin/client.d.ts.map +1 -0
  6. package/dist/admin/client.js +3 -0
  7. package/dist/admin/client.js.map +1 -0
  8. package/dist/admin/components/audience-buttons.d.ts.map +1 -0
  9. package/dist/admin/components/audience-detail.d.ts +6 -0
  10. package/dist/admin/components/audience-detail.d.ts.map +1 -0
  11. package/dist/admin/components/audience-list.d.ts +6 -0
  12. package/dist/admin/components/audience-list.d.ts.map +1 -0
  13. package/dist/admin/components/broadcast-list.d.ts +6 -0
  14. package/dist/admin/components/broadcast-list.d.ts.map +1 -0
  15. package/dist/admin/{broadcasts-table.d.ts → components/broadcasts-table.d.ts} +1 -1
  16. package/dist/admin/components/broadcasts-table.d.ts.map +1 -0
  17. package/dist/admin/{contacts-table.d.ts → components/contacts-table.d.ts} +1 -1
  18. package/dist/admin/components/contacts-table.d.ts.map +1 -0
  19. package/dist/admin/components/create-broadcast-button.d.ts +14 -0
  20. package/dist/admin/components/create-broadcast-button.d.ts.map +1 -0
  21. package/dist/admin/{components.d.ts → components/marketing-components.d.ts} +1 -7
  22. package/dist/admin/components/marketing-components.d.ts.map +1 -0
  23. package/dist/admin/components/marketing-view-shell.d.ts +8 -0
  24. package/dist/admin/components/marketing-view-shell.d.ts.map +1 -0
  25. package/dist/admin/components/payload-modal.d.ts +13 -0
  26. package/dist/admin/components/payload-modal.d.ts.map +1 -0
  27. package/dist/admin/components/provider-dashboard-link.d.ts.map +1 -0
  28. package/dist/admin/components/view-params.d.ts +4 -0
  29. package/dist/admin/components/view-params.d.ts.map +1 -0
  30. package/dist/admin/components/views.d.ts +4 -0
  31. package/dist/admin/components/views.d.ts.map +1 -0
  32. package/dist/admin/constants.cjs +2 -0
  33. package/dist/admin/constants.cjs.map +1 -0
  34. package/dist/admin/constants.d.ts +2 -0
  35. package/dist/admin/constants.d.ts.map +1 -0
  36. package/dist/admin/constants.js +2 -0
  37. package/dist/admin/constants.js.map +1 -0
  38. package/dist/admin/index.cjs +1 -1
  39. package/dist/admin/index.cjs.map +1 -1
  40. package/dist/admin/index.d.ts +3 -3
  41. package/dist/admin/index.d.ts.map +1 -1
  42. package/dist/admin/index.js +1 -1
  43. package/dist/admin/index.js.map +1 -1
  44. package/dist/admin/locale-options.d.ts +7 -0
  45. package/dist/admin/locale-options.d.ts.map +1 -0
  46. package/dist/admin/paths.d.ts +2 -0
  47. package/dist/admin/paths.d.ts.map +1 -1
  48. package/dist/admin/server.cjs +2 -0
  49. package/dist/admin/server.cjs.map +1 -0
  50. package/dist/admin/server.d.ts +2 -0
  51. package/dist/admin/server.d.ts.map +1 -0
  52. package/dist/admin/server.js +2 -0
  53. package/dist/admin/server.js.map +1 -0
  54. package/dist/admin/use-marketing-api.d.ts.map +1 -1
  55. package/dist/chunk-G6DIJ7B2.js +2 -0
  56. package/dist/chunk-G6DIJ7B2.js.map +1 -0
  57. package/dist/email-broadcast-template.d.ts +15 -0
  58. package/dist/email-broadcast-template.d.ts.map +1 -0
  59. package/dist/endpoints/marketing-endpoints.d.ts.map +1 -1
  60. package/dist/form-builder/fields.d.ts +3 -2
  61. package/dist/form-builder/fields.d.ts.map +1 -1
  62. package/dist/form-builder/index.cjs +1 -1
  63. package/dist/form-builder/index.cjs.map +1 -1
  64. package/dist/form-builder/index.js +1 -1
  65. package/dist/form-builder/mutate-collections.d.ts.map +1 -1
  66. package/dist/form-builder/normalize-placeholder-rows.d.ts +5 -0
  67. package/dist/form-builder/normalize-placeholder-rows.d.ts.map +1 -0
  68. package/dist/index.cjs +1 -1
  69. package/dist/index.cjs.map +1 -1
  70. package/dist/index.d.ts +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +1 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/marketing-integration.d.ts +2 -1
  75. package/dist/marketing-integration.d.ts.map +1 -1
  76. package/dist/plugin.d.ts.map +1 -1
  77. package/dist/types.d.ts +32 -0
  78. package/dist/types.d.ts.map +1 -1
  79. package/package.json +10 -2
  80. package/dist/admin/audience-buttons.d.ts.map +0 -1
  81. package/dist/admin/broadcasts-table.d.ts.map +0 -1
  82. package/dist/admin/components.d.ts.map +0 -1
  83. package/dist/admin/contacts-table.d.ts.map +0 -1
  84. package/dist/admin/create-broadcast-button.d.ts +0 -6
  85. package/dist/admin/create-broadcast-button.d.ts.map +0 -1
  86. package/dist/admin/payload-modal.d.ts +0 -13
  87. package/dist/admin/payload-modal.d.ts.map +0 -1
  88. package/dist/admin/provider-dashboard-link.d.ts.map +0 -1
  89. package/dist/admin/views.d.ts +0 -4
  90. package/dist/admin/views.d.ts.map +0 -1
  91. package/dist/chunk-4RBNCG5Q.js +0 -2
  92. package/dist/chunk-4RBNCG5Q.js.map +0 -1
  93. /package/dist/admin/{audience-buttons.d.ts → components/audience-buttons.d.ts} +0 -0
  94. /package/dist/admin/{provider-dashboard-link.d.ts → components/provider-dashboard-link.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/components/marketing-components.tsx","../../src/admin/paths.ts","../../src/admin/use-marketing-api.ts","../../src/admin/components/broadcasts-table.tsx","../../src/admin/date-format.ts","../../src/admin/components/payload-modal.tsx","../../src/admin/components/audience-buttons.tsx","../../src/admin/components/contacts-table.tsx","../../src/admin/components/create-broadcast-button.tsx"],"sourcesContent":["\"use client\"\n\nimport { Link, NavGroup, SelectField } from \"@payloadcms/ui\"\nimport React from \"react\"\n\nimport { marketingAdminHref } from \"../paths\"\nimport { useMarketingApi } from \"../use-marketing-api\"\n\nimport type { MarketingAudience } from \"../../types\"\nimport type { TextFieldClientComponent } from \"payload\"\n\nfunction parseAudiences(payload: unknown): MarketingAudience[] {\n if (!Array.isArray(payload)) return []\n const out: MarketingAudience[] = []\n for (const item of payload) {\n if (!item || typeof item !== \"object\") continue\n const rec = item as Record<string, unknown>\n const id = rec.id\n const name = rec.name\n if (typeof id === \"string\" && typeof name === \"string\") {\n out.push({ id, name })\n }\n }\n return out\n}\n\nexport const AudienceSelect: TextFieldClientComponent = ({ field, path, readOnly }) => {\n const { requestJson } = useMarketingApi()\n const [audiences, setAudiences] = React.useState<MarketingAudience[]>([])\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const data = await requestJson(\"/marketing/audiences\")\n if (!cancelled) {\n setAudiences(parseAudiences(data))\n setLoadError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setLoadError(err instanceof Error ? err.message : \"Failed to load audiences\")\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [requestJson])\n\n return (\n <div className=\"field-type relative\">\n {loadError ? (\n <p className=\"text-red-500\" role=\"alert\">\n {loadError}\n </p>\n ) : null}\n <SelectField\n field={{\n label: typeof field.label === \"string\" ? field.label : \"Audience\",\n name: field.name,\n options: audiences.map((a) => ({ label: a.name, value: a.id })),\n required: field.required === true,\n type: \"select\",\n }}\n path={path}\n readOnly={readOnly}\n />\n </div>\n )\n}\n\nexport function MarketingMenu({ basePath = \"\" }: { basePath?: string }) {\n return (\n <NavGroup isOpen label=\"Marketing\">\n <Link className=\"nav__link\" href={marketingAdminHref(basePath, \"audience\")}>\n Audience\n </Link>\n <Link className=\"nav__link\" href={marketingAdminHref(basePath, \"broadcast\")}>\n Broadcast\n </Link>\n </NavGroup>\n )\n}\n\nexport function AudienceTable({ audiences }: { audiences: Array<{ id: string; name: string }> }) {\n return (\n <table>\n <tbody>\n {audiences.map((audience) => (\n <tr key={audience.id}>\n <td>{audience.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function ContactsTable({ contacts }: { contacts: Array<{ email: string; id: string }> }) {\n return (\n <table>\n <tbody>\n {contacts.map((contact) => (\n <tr key={contact.id}>\n <td>{contact.email}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n","export function joinAdminSegments(adminRoute: string, ...segments: string[]): string {\n const trimmedAdmin = adminRoute.replace(/\\/+$/, \"\") || \"\"\n const body = segments\n .flatMap((s) => String(s).split(\"/\"))\n .map((segment) => segment.replace(/^\\/+|\\/+$/g, \"\"))\n .filter(Boolean)\n .join(\"/\")\n const combined = trimmedAdmin === \"\" ? `/${body}` : `${trimmedAdmin}/${body}`\n return combined.replace(/\\/{2,}/g, \"/\")\n}\n\n/** Absolute admin hrefs for marketing custom views (`/admin`, optional plugin `basePath`, then path segments). */\nexport function marketingAdminHref(basePath: string | undefined, ...segments: string[]): string {\n const normalized = basePath?.replace(/^\\/+|\\/+$/g, \"\") ?? \"\"\n const parts = [normalized, ...segments].filter(Boolean)\n return joinAdminSegments(\"/admin\", ...parts)\n}\n","\"use client\"\n\nimport { useConfig } from \"@payloadcms/ui\"\nimport { useCallback, useMemo } from \"react\"\n\nexport function useMarketingApi() {\n const context = useConfig() as unknown as {\n routes?: { api?: string }\n serverURL?: string\n }\n\n const base = useMemo(\n () => `${context.serverURL ?? \"\"}${context.routes?.api ?? \"/api\"}`,\n [context.routes?.api, context.serverURL],\n )\n\n const requestJson = useCallback(\n async (pathSegment: string, init?: RequestInit): Promise<unknown> => {\n const { headers: _headersIgnored, ...restInit } = init ?? {}\n const headers = new Headers(init?.headers)\n if (restInit.body !== undefined && restInit.body !== \"\" && restInit.body !== null) {\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\")\n }\n }\n\n const res = await fetch(`${base}${pathSegment}`, {\n ...restInit,\n credentials: \"include\",\n headers,\n })\n\n if (!res.ok) {\n let detail = `${res.status} ${res.statusText}`\n try {\n const parsed = (await res.json()) as { message?: string }\n if (typeof parsed.message === \"string\") detail = parsed.message\n } catch {\n //\n }\n throw new Error(detail)\n }\n\n if (res.status === 204) {\n return undefined\n }\n\n try {\n return await res.json()\n } catch {\n return undefined\n }\n },\n [base],\n )\n\n return { base, requestJson }\n}\n","\"use client\"\n\nimport {\n Button as PayloadButton,\n DateTimeField,\n Form,\n Pagination,\n Pill,\n Table,\n toast,\n useModal,\n useTranslation,\n} from \"@payloadcms/ui\"\nimport Link from \"next/link\"\nimport { useRouter } from \"next/navigation\"\nimport React from \"react\"\n\nimport { formatMarketingDate } from \"../date-format\"\nimport { useMarketingApi } from \"../use-marketing-api\"\nimport {\n PayloadModal,\n PayloadModalBody,\n PayloadModalClose,\n PayloadModalContent,\n PayloadModalFooter,\n PayloadModalTitle,\n} from \"./payload-modal\"\n\nimport type { MarketingBroadcast } from \"../../types\"\nimport type { Data, FormState } from \"payload\"\n\nexport interface MarketingBroadcastRow extends MarketingBroadcast {\n externalDashboardUrl?: string\n}\n\ninterface BroadcastsTableProps {\n broadcasts: MarketingBroadcastRow[]\n}\n\nexport function BroadcastsTable({ broadcasts }: BroadcastsTableProps) {\n const [page, setPage] = React.useState(1)\n const [limit] = React.useState(100)\n const currentPage = React.useMemo(\n () => broadcasts.slice((page - 1) * limit, page * limit),\n [broadcasts, limit, page],\n )\n\n return (\n <>\n <Table\n columns={[\n {\n Heading: \"Campaign name\",\n accessor: \"name\",\n active: true,\n field: { name: \"name\", type: \"text\" },\n renderedCells: currentPage.map((b) => <div key={b.id}>{b.name}</div>),\n },\n {\n Heading: \"Schedule date\",\n accessor: \"scheduledAt\",\n active: true,\n field: { name: \"scheduledAt\", type: \"text\" },\n renderedCells: currentPage.map((b) => (\n <div key={b.id}>{formatMarketingDate(b.scheduledAt)}</div>\n )),\n },\n {\n Heading: \"Sent date\",\n accessor: \"sentAt\",\n active: true,\n field: { name: \"sentAt\", type: \"text\" },\n renderedCells: currentPage.map((b) => (\n <div key={b.id}>{formatMarketingDate(b.sentAt)}</div>\n )),\n },\n {\n Heading: \"Status\",\n accessor: \"status\",\n active: true,\n field: { name: \"status\", type: \"text\" },\n renderedCells: currentPage.map((broadcast) => (\n <div key={broadcast.id}>\n <BroadcastStatusPill status={broadcast.status} />\n </div>\n )),\n },\n {\n Heading: \"\",\n accessor: \"\",\n active: true,\n field: { name: \"_\", type: \"text\" },\n renderedCells: currentPage.map((broadcast) => (\n <div key={broadcast.id} className=\"flex items-center gap-4 flex-wrap\">\n {broadcast.externalDashboardUrl ? (\n <Link\n href={broadcast.externalDashboardUrl}\n rel=\"noreferrer noopener\"\n target=\"_blank\"\n >\n <Pill>dashboard ↗</Pill>\n </Link>\n ) : null}\n {broadcast.status === \"draft\" || broadcast.status === \"save\" ? (\n <>\n <DeleteBroadcastButton\n broadcastId={broadcast.id}\n broadcastName={broadcast.name}\n />\n <SendBroadcastButton\n broadcastId={broadcast.id}\n broadcastName={broadcast.name}\n />\n </>\n ) : null}\n </div>\n )),\n },\n ]}\n data={currentPage as unknown as Record<string, unknown>[]}\n />\n <Pagination\n hasNextPage={page * limit < broadcasts.length}\n hasPrevPage={page > 1}\n limit={limit}\n onChange={(p) => setPage(p)}\n page={page}\n totalPages={Math.ceil(broadcasts.length / limit)}\n />\n </>\n )\n}\n\nfunction BroadcastStatusPill({ status }: { status: string }) {\n switch (status) {\n case \"draft\":\n case \"save\": {\n return <Pill pillStyle=\"light-gray\">Draft</Pill>\n }\n case \"queued\": {\n return <Pill pillStyle=\"white\">Queued</Pill>\n }\n case \"sent\": {\n return <Pill pillStyle=\"success\">Sent</Pill>\n }\n default: {\n return <Pill>{status}</Pill>\n }\n }\n}\n\nfunction DeleteBroadcastButton({\n broadcastId,\n broadcastName,\n}: {\n broadcastId: string\n broadcastName: string\n}) {\n const modal = useModal()\n const { t } = useTranslation()\n const router = useRouter()\n const { requestJson } = useMarketingApi()\n const modalSlug = `delete-broadcast_${broadcastId}`\n\n async function confirmDelete(): Promise<void> {\n await requestJson(`/marketing/broadcasts/${encodeURIComponent(broadcastId)}`, {\n method: \"DELETE\",\n })\n toast.success(t(\"general:deletedSuccessfully\"))\n modal.closeModal(modalSlug)\n router.refresh()\n }\n\n return (\n <>\n <PayloadModal slug={modalSlug}>\n <PayloadModalContent>\n <PayloadModalBody>\n <PayloadModalTitle>{t(\"general:confirmDeletion\")}</PayloadModalTitle>\n <p>{`Delete draft broadcast \"${broadcastName}\"?`}</p>\n </PayloadModalBody>\n <PayloadModalFooter style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\n <PayloadModalClose />\n <PayloadButton\n buttonStyle=\"error\"\n onClick={() => {\n void confirmDelete().catch((err: unknown) =>\n toast.error(err instanceof Error ? err.message : \"Delete failed\"),\n )\n }}\n >\n {t(\"general:confirm\")}\n </PayloadButton>\n </PayloadModalFooter>\n </PayloadModalContent>\n </PayloadModal>\n <button onClick={() => modal.openModal(modalSlug)} type=\"button\">\n {t(\"general:delete\")}\n </button>\n </>\n )\n}\n\nexport function SendBroadcastButton({\n broadcastId,\n broadcastName,\n}: {\n broadcastId: string\n broadcastName: string\n}) {\n const modal = useModal()\n const { t } = useTranslation()\n const router = useRouter()\n const { requestJson } = useMarketingApi()\n const modalSlug = `send-broadcast_${broadcastId}`\n\n const submit = (fields: FormState, data: Data) => {\n const row = data as Record<string, unknown>\n const scheduledRaw: unknown = row.scheduledAt\n let scheduledAt = \"\"\n if (typeof scheduledRaw === \"string\") {\n scheduledAt = scheduledRaw\n } else if (scheduledRaw instanceof Date) {\n scheduledAt = scheduledRaw.toISOString()\n }\n\n void (async () => {\n try {\n await requestJson(`/marketing/broadcasts/${encodeURIComponent(broadcastId)}/send`, {\n body: JSON.stringify({\n ...(scheduledAt && scheduledAt.trim() !== \"\"\n ? { scheduledAt: scheduledAt.trim() }\n : {}),\n }),\n method: \"POST\",\n })\n modal.closeModal(modalSlug)\n toast.success(t(\"general:success\"))\n router.refresh()\n } catch (err) {\n toast.error(err instanceof Error ? err.message : \"Send failed\")\n }\n })()\n }\n\n return (\n <>\n <PayloadModal slug={modalSlug}>\n <PayloadModalContent style={{ width: \"100%\", maxWidth: \"24rem\" }}>\n <PayloadModalBody>\n <PayloadModalTitle>{`Send “${broadcastName}”`}</PayloadModalTitle>\n <Form initialState={{}} onSubmit={submit} waitForAutocomplete>\n <DateTimeField\n field={{\n label: \"Schedule at (optional)\",\n name: \"scheduledAt\",\n required: false,\n }}\n path=\"scheduledAt\"\n />\n <PayloadModalFooter\n style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}\n >\n <PayloadModalClose />\n <PayloadButton size=\"large\" type=\"submit\">\n Send\n </PayloadButton>\n </PayloadModalFooter>\n </Form>\n </PayloadModalBody>\n </PayloadModalContent>\n </PayloadModal>\n <Pill pillStyle=\"dark\" onClick={() => modal.openModal(modalSlug)} size=\"small\">\n Send\n </Pill>\n </>\n )\n}\n","export function formatMarketingDate(iso?: string | null): string {\n if (!iso) return \"—\"\n const d = new Date(iso)\n return Number.isNaN(d.valueOf())\n ? String(iso)\n : new Intl.DateTimeFormat(undefined, { dateStyle: \"medium\" }).format(d)\n}\n","\"use client\"\n\nimport { Button, Modal, useModal, useTranslation } from \"@payloadcms/ui\"\nimport React from \"react\"\n\nfunction cn(...parts: Array<string | undefined | false | null>): string {\n return parts.filter(Boolean).join(\" \")\n}\n\nconst PayloadModalContext = React.createContext({\n modalSlug: \"\",\n})\n\ninterface PayloadModalProps extends React.ComponentProps<typeof Modal> {\n children: React.ReactNode\n}\n\nfunction PayloadModal({ children, className, slug: modalSlug, ...props }: PayloadModalProps) {\n const [loaded, setLoaded] = React.useState(false)\n\n React.useEffect(() => {\n setLoaded(true)\n }, [])\n\n return (\n <PayloadModalContext.Provider value={{ modalSlug }}>\n {/* Fix hydration error */}\n {loaded && (\n <Modal slug={modalSlug} className={cn(\"confirmation-modal\", className)} {...props}>\n {children}\n </Modal>\n )}\n </PayloadModalContext.Provider>\n )\n}\n\nfunction PayloadModalContent({ children, className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"confirmation-modal__wrapper\", className)}\n data-slot=\"payload-modal-content\"\n {...props}\n >\n {children}\n </div>\n )\n}\n\nfunction PayloadModalBody({ children, className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"confirmation-modal__content\", className)}\n data-slot=\"payload-modal-body\"\n {...props}\n >\n {children}\n </div>\n )\n}\n\nfunction PayloadModalTitle({ children, className, ...props }: React.ComponentProps<\"h1\">) {\n return (\n <h1 className={cn(\"\", className)} data-slot=\"payload-modal-title\" {...props}>\n {children}\n </h1>\n )\n}\n\nfunction PayloadModalFooter({ children, className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n className={cn(\"confirmation-modal__controls\", className)}\n data-slot=\"payload-modal-footer\"\n {...props}\n >\n {children}\n </div>\n )\n}\n\nfunction PayloadModalClose({ children, className, ...props }: React.ComponentProps<typeof Button>) {\n const { t } = useTranslation()\n const { modalSlug } = React.useContext(PayloadModalContext)\n const modal = useModal()\n\n return (\n <Button\n className={cn(\"\", className)}\n buttonStyle=\"secondary\"\n size=\"large\"\n data-slot=\"payload-modal-close\"\n {...props}\n onClick={() => modal.closeModal(modalSlug)}\n >\n {children ?? t(\"general:cancel\")}\n </Button>\n )\n}\n\nexport {\n PayloadModal,\n PayloadModalContent,\n PayloadModalBody,\n PayloadModalTitle,\n PayloadModalFooter,\n PayloadModalClose,\n}\n","\"use client\"\n\nimport {\n Button,\n Form,\n TextField,\n toast,\n useModal,\n useTranslation,\n Button as PayloadButton,\n} from \"@payloadcms/ui\"\nimport { useRouter } from \"next/navigation\"\nimport { useTransition } from \"react\"\n\nimport { useMarketingApi } from \"../use-marketing-api\"\nimport {\n PayloadModal,\n PayloadModalBody,\n PayloadModalClose,\n PayloadModalContent,\n PayloadModalFooter,\n PayloadModalTitle,\n} from \"./payload-modal\"\n\nimport type { Data, FormState } from \"payload\"\n\nconst createAudienceSlug = \"create-audience\"\n\nexport function CreateAudienceButton() {\n const modal = useModal()\n const { t } = useTranslation()\n\n return (\n <>\n <CreateAudienceModal />\n <Button onClick={() => modal.openModal(createAudienceSlug)} size=\"large\" type=\"button\">\n {t(\"general:createNew\")}\n </Button>\n </>\n )\n}\n\nfunction CreateAudienceModal() {\n const modal = useModal()\n const { t } = useTranslation()\n const router = useRouter()\n const { requestJson } = useMarketingApi()\n const [isPending, startTransition] = useTransition()\n\n const submit = (fields: FormState, data: Data) => {\n const row = data as Record<string, unknown>\n const nameRaw: unknown = row.audienceName\n const name = typeof nameRaw === \"string\" ? nameRaw.trim() : \"\"\n startTransition(() => {\n void (async () => {\n try {\n if (!name) {\n throw new Error(\"Name is required.\")\n }\n await requestJson(\"/marketing/audiences\", {\n body: JSON.stringify({ name }),\n method: \"POST\",\n })\n modal.closeModal(createAudienceSlug)\n toast.success(t(\"general:successfullyCreated\"))\n router.refresh()\n } catch (err) {\n toast.error(err instanceof Error ? err.message : \"Create failed\")\n }\n })()\n })\n }\n\n return (\n <PayloadModal closeOnBlur slug={createAudienceSlug}>\n <PayloadModalContent style={{ width: \"100%\", maxWidth: \"24rem\" }}>\n <Form initialState={{}} onSubmit={submit} waitForAutocomplete>\n <PayloadModalBody>\n <PayloadModalTitle>{t(\"general:createNew\")}</PayloadModalTitle>\n <TextField\n field={{\n name: \"audienceName\",\n required: true,\n type: \"text\",\n }}\n path=\"audienceName\"\n validate={(v) =>\n typeof v === \"string\" && v.trim().length > 0 ? true : \"Name is required\"\n }\n />\n <PayloadModalFooter style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\n <PayloadModalClose />\n <Button disabled={isPending} size=\"large\" type=\"submit\">\n {t(\"general:confirm\")}\n </Button>\n </PayloadModalFooter>\n </PayloadModalBody>\n </Form>\n </PayloadModalContent>\n </PayloadModal>\n )\n}\n\nexport function DeleteAudienceButton({\n audienceId,\n audienceName,\n}: {\n audienceId: string\n audienceName: string\n}) {\n const modal = useModal()\n const { t } = useTranslation()\n const router = useRouter()\n const { requestJson } = useMarketingApi()\n const modalSlug = `delete-audience_${audienceId}`\n\n async function confirmDelete(): Promise<void> {\n await requestJson(`/marketing/audiences/${encodeURIComponent(audienceId)}`, {\n method: \"DELETE\",\n })\n toast.success(t(\"general:deletedSuccessfully\"))\n modal.closeModal(modalSlug)\n router.refresh()\n }\n\n return (\n <>\n <PayloadModal slug={modalSlug}>\n <PayloadModalContent>\n <PayloadModalBody>\n <PayloadModalTitle>{t(\"general:confirmDeletion\")}</PayloadModalTitle>\n <p>{`Remove audience \"${audienceName}\"?`}</p>\n </PayloadModalBody>\n <PayloadModalFooter style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\n <PayloadModalClose />\n <PayloadButton\n buttonStyle=\"error\"\n onClick={() => {\n void confirmDelete().catch((err: unknown) =>\n toast.error(err instanceof Error ? err.message : \"Delete failed\"),\n )\n }}\n >\n {t(\"general:confirm\")}\n </PayloadButton>\n </PayloadModalFooter>\n </PayloadModalContent>\n </PayloadModal>\n <button onClick={() => modal.openModal(modalSlug)} type=\"button\">\n {t(\"general:delete\")}\n </button>\n </>\n )\n}\n","\"use client\"\n\nimport {\n CheckboxField,\n Form,\n Pagination,\n Table,\n TextField,\n toast,\n useModal,\n useTranslation,\n Button as PayloadButton,\n} from \"@payloadcms/ui\"\nimport { useRouter } from \"next/navigation\"\nimport React from \"react\"\nimport ReactRaw from \"react\"\nimport { useTransition } from \"react\"\n\nimport { formatMarketingDate } from \"../date-format\"\nimport { useMarketingApi } from \"../use-marketing-api\"\nimport {\n PayloadModal,\n PayloadModalBody,\n PayloadModalClose,\n PayloadModalContent,\n PayloadModalFooter,\n} from \"./payload-modal\"\n\nimport type { MarketingContact } from \"../../types\"\nimport type { Data, FormState } from \"payload\"\n\ninterface ContactsTableProps {\n audienceId: string\n contacts: MarketingContact[]\n}\n\nexport function ContactsTable({ audienceId, contacts }: ContactsTableProps) {\n const [page, setPage] = React.useState(1)\n const [limit] = React.useState(100)\n const currentPage = React.useMemo(\n () => contacts.slice((page - 1) * limit, page * limit),\n [contacts, limit, page],\n )\n\n return (\n <>\n <Table\n columns={[\n {\n Heading: \"First name\",\n accessor: \"firstName\",\n active: true,\n field: { name: \"firstName\", type: \"text\" },\n renderedCells: currentPage.map((contact) => (\n <div key={contact.id}>{contact.firstName ?? \"—\"}</div>\n )),\n },\n {\n Heading: \"Last name\",\n accessor: \"lastName\",\n active: true,\n field: { name: \"lastName\", type: \"text\" },\n renderedCells: currentPage.map((contact) => (\n <div key={contact.id}>{contact.lastName ?? \"—\"}</div>\n )),\n },\n {\n Heading: \"Email\",\n accessor: \"email\",\n active: true,\n field: { name: \"email\", type: \"text\" },\n renderedCells: currentPage.map((contact) => (\n <div key={contact.id}>{contact.email}</div>\n )),\n },\n {\n Heading: \"Created\",\n accessor: \"createdAt\",\n active: true,\n field: { name: \"createdAt\", type: \"text\" },\n renderedCells: currentPage.map((contact) => (\n <div key={contact.id}>{formatMarketingDate(contact.createdAt)}</div>\n )),\n },\n {\n Heading: \"Status\",\n accessor: \"subscribed\",\n active: true,\n field: { name: \"subscribed\", type: \"text\" },\n renderedCells: currentPage.map((contact) => (\n <div key={contact.id} className=\"flex items-center gap-4 flex-wrap\">\n <span>{contact.subscribed !== false ? \"✅ subscribed\" : \"❌ unsubscribed\"}</span>\n <EditContactButton audienceId={audienceId} contact={contact} />\n <DeleteContactButton\n audienceId={audienceId}\n contactEmail={contact.email}\n contactId={contact.id}\n />\n </div>\n )),\n },\n ]}\n data={currentPage as unknown as Record<string, unknown>[]}\n />\n <Pagination\n hasNextPage={page * limit < contacts.length}\n hasPrevPage={page > 1}\n limit={limit}\n onChange={(p) => {\n setPage(p)\n }}\n page={page}\n totalPages={Math.ceil(contacts.length / limit)}\n />\n </>\n )\n}\n\nfunction DeleteContactButton({\n audienceId,\n contactId,\n contactEmail,\n}: {\n audienceId: string\n contactEmail: string\n contactId: string\n}) {\n const modal = useModal()\n const { t } = useTranslation()\n const router = useRouter()\n const { requestJson } = useMarketingApi()\n const modalSlug = `delete-contact_${contactId}`\n\n async function confirmDelete(): Promise<void> {\n await requestJson(\n `/marketing/audiences/${encodeURIComponent(audienceId)}/contacts/${encodeURIComponent(contactId)}`,\n {\n method: \"DELETE\",\n },\n )\n toast.success(t(\"general:deletedSuccessfully\"))\n modal.closeModal(modalSlug)\n router.refresh()\n }\n\n return (\n <>\n <PayloadModal slug={modalSlug}>\n <PayloadModalContent>\n <PayloadModalBody>\n <h1>{t(\"general:confirmDeletion\")}</h1>\n <p>{`Remove contact ${contactEmail}?`}</p>\n </PayloadModalBody>\n <PayloadModalFooter style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\n <PayloadModalClose />\n <PayloadButton\n buttonStyle=\"error\"\n onClick={() => {\n void confirmDelete().catch((err: unknown) =>\n toast.error(err instanceof Error ? err.message : \"Delete failed\"),\n )\n }}\n >\n {t(\"general:confirm\")}\n </PayloadButton>\n </PayloadModalFooter>\n </PayloadModalContent>\n </PayloadModal>\n <button onClick={() => modal.openModal(modalSlug)} type=\"button\">\n {t(\"general:delete\")}\n </button>\n </>\n )\n}\n\nexport function EditContactButton({\n audienceId,\n contact,\n}: {\n audienceId: string\n contact: MarketingContact | null\n}) {\n const modal = useModal()\n const { t } = useTranslation()\n const id = ReactRaw.useId()\n const slug = contact ? `edit-contact_${contact.id}` : `create-contact_${audienceId}_${id}`\n\n const ButtonComp = contact ? \"button\" : PayloadButton\n\n return (\n <>\n <EditContactModalWrapper audienceId={audienceId} contact={contact} modalSlug={slug} />\n <ButtonComp\n {...(contact ? {} : { size: \"large\" })}\n onClick={() => modal.openModal(slug)}\n type=\"button\"\n >\n {contact ? t(\"general:edit\") : t(\"general:createNew\")}\n </ButtonComp>\n </>\n )\n}\n\nfunction EditContactModalWrapper({\n audienceId,\n contact,\n modalSlug,\n}: {\n audienceId: string\n contact: MarketingContact | null\n modalSlug: string\n}) {\n const modal = useModal()\n const { t } = useTranslation()\n const router = useRouter()\n const { requestJson } = useMarketingApi()\n const [, startTransition] = useTransition()\n\n const submit = (fields: FormState, data: Data) => {\n const email = data.email as string\n const firstName = String(data.firstName ?? \"\")\n const lastName = String(data.lastName ?? \"\")\n const subscribed = Boolean(data.subscribed)\n\n startTransition(() => {\n void (async () => {\n try {\n await requestJson(\"/marketing/contacts\", {\n body: JSON.stringify({\n audienceId,\n email,\n firstName,\n id: contact?.id,\n lastName,\n subscribed,\n }),\n method: \"POST\",\n })\n toast.success(contact ? \"Contact updated.\" : \"Contact created.\")\n modal.closeModal(modalSlug)\n router.refresh()\n } catch (err) {\n toast.error(err instanceof Error ? err.message : \"Save failed\")\n }\n })()\n })\n }\n\n return (\n <PayloadModal slug={modalSlug}>\n <PayloadModalContent style={{ width: \"100%\", maxWidth: \"32rem\" }}>\n <PayloadModalBody>\n <h1>{contact ? t(\"general:edit\") : t(\"general:createNew\")}</h1>\n <Form\n className=\"flex w-full flex-col gap-6\"\n initialState={{\n email: {\n value: contact?.email ?? \"\",\n },\n firstName: {\n value: contact?.firstName ?? \"\",\n },\n lastName: {\n value: contact?.lastName ?? \"\",\n },\n subscribed: {\n value: contact?.subscribed !== false,\n },\n }}\n onSubmit={submit}\n waitForAutocomplete\n >\n <TextField\n field={{\n label: t(\"general:email\"),\n name: \"email\",\n required: true,\n type: \"text\",\n }}\n path=\"email\"\n validate={(v) =>\n typeof v === \"string\" && v.includes(\"@\") ? true : \"Valid email required\"\n }\n />\n <TextField\n field={{\n label: \"First name\",\n name: \"firstName\",\n type: \"text\",\n }}\n path=\"firstName\"\n />\n <TextField\n field={{\n label: \"Last name\",\n name: \"lastName\",\n type: \"text\",\n }}\n path=\"lastName\"\n />\n <CheckboxField\n field={{\n label: \"Subscribed\",\n name: \"subscribed\",\n }}\n path=\"subscribed\"\n />\n <PayloadModalFooter style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\n <PayloadModalClose />\n <PayloadButton size=\"large\" type=\"submit\">\n {contact ? t(\"general:save\") : t(\"general:create\")}\n </PayloadButton>\n </PayloadModalFooter>\n </Form>\n </PayloadModalBody>\n </PayloadModalContent>\n </PayloadModal>\n )\n}\n","\"use client\"\n\nimport {\n Button,\n Drawer,\n Form,\n SelectField,\n TextareaField,\n TextField,\n toast,\n useFormFields,\n useModal,\n useTranslation,\n} from \"@payloadcms/ui\"\nimport { useRouter } from \"next/navigation\"\nimport React from \"react\"\n\nimport { useMarketingApi } from \"../use-marketing-api\"\n\nimport type { MarketingAudience } from \"../../types\"\nimport type { Data, FormState } from \"payload\"\n\nconst modalSlug = \"create-marketing-broadcast\"\n\nexport function CreateBroadcastButton({\n audiences,\n emailBroadcastTemplates,\n localeOptions,\n provider,\n}: {\n audiences: MarketingAudience[]\n emailBroadcastTemplates?: { id: string; name: string }[]\n localeOptions?: { label: string; value: string }[]\n provider: string\n}) {\n const modal = useModal()\n const { t } = useTranslation()\n\n return (\n <>\n <CreateBroadcastModal\n audiences={audiences}\n emailBroadcastTemplates={emailBroadcastTemplates}\n localeOptions={localeOptions ?? []}\n provider={provider}\n />\n <Button onClick={() => modal.openModal(modalSlug)} size=\"large\" type=\"button\">\n {t(\"general:createNew\")}\n </Button>\n </>\n )\n}\n\nfunction BroadcastContentFields({\n localeOptions,\n showReactEmailTemplates,\n showTemplateField,\n templateOptions,\n}: {\n localeOptions: { label: string; value: string }[]\n showReactEmailTemplates: boolean\n showTemplateField: boolean\n templateOptions: { id: string; name: string }[]\n}) {\n const broadcastFormat = useFormFields(([fields]) => {\n if (!showReactEmailTemplates) {\n return \"html\"\n }\n const v = fields?.broadcastFormat?.value\n return typeof v === \"string\" && v !== \"\" ? v : \"html\"\n })\n\n if (showReactEmailTemplates) {\n const isHtml = broadcastFormat === \"html\"\n return (\n <>\n <SelectField\n field={{\n label: \"Email content\",\n name: \"broadcastFormat\",\n options: [\n { label: \"<html>\", value: \"html\" },\n ...templateOptions.map((opt) => ({ label: opt.name, value: opt.id })),\n ],\n required: true,\n }}\n path=\"broadcastFormat\"\n />\n {!isHtml && localeOptions.length > 0 ? (\n <SelectField\n field={{\n label: \"Locale\",\n name: \"locale\",\n options: localeOptions,\n required: false,\n }}\n path=\"locale\"\n />\n ) : null}\n {isHtml ? (\n <TextareaField\n field={{\n admin: {\n description: \"Shown when Email content is <html>.\",\n },\n label: \"<html>\",\n name: \"htmlBody\",\n required: true,\n }}\n path=\"htmlBody\"\n />\n ) : null}\n </>\n )\n }\n\n return (\n <>\n {showTemplateField ? (\n <TextField\n field={{\n admin: {\n description:\n \"Optional Mailchimp saved-template id (numeric string). Leave <html> empty when using templates.\",\n },\n label: \"Template id\",\n name: \"templateId\",\n required: false,\n type: \"text\",\n }}\n path=\"templateId\"\n />\n ) : null}\n <TextareaField\n field={{\n admin: {\n description: showTemplateField\n ? \"Optional plain HTML alternative to a Mailchimp template.\"\n : \"HTML broadcast body.\",\n },\n label: showTemplateField ? \"<html> (optional with Mailchimp)\" : \"<html>\",\n name: \"htmlBody\",\n required: !showTemplateField,\n }}\n path=\"htmlBody\"\n />\n </>\n )\n}\n\nfunction CreateBroadcastModal({\n audiences,\n emailBroadcastTemplates,\n localeOptions,\n provider,\n}: {\n audiences: MarketingAudience[]\n emailBroadcastTemplates?: { id: string; name: string }[]\n localeOptions: { label: string; value: string }[]\n provider: string\n}) {\n const router = useRouter()\n const modal = useModal()\n const { t } = useTranslation()\n const { requestJson } = useMarketingApi()\n const [isPending, setIsPending] = React.useState(false)\n\n const showTemplateField = provider === \"mailchimp\"\n const templateOptions = emailBroadcastTemplates ?? []\n const showReactEmailTemplates = provider === \"resend\" && templateOptions.length > 0\n\n const submit = (fields: FormState, data: Data) => {\n const row = data as Record<string, unknown>\n const audienceIdRaw: unknown = row.audienceId\n const nameRaw: unknown = row.name\n const subjectRaw: unknown = row.subject\n const htmlRaw: unknown = row.htmlBody\n const templateIdRaw: unknown = row.templateId\n const replyToRaw: unknown = row.replyTo\n\n const broadcastFormatRaw: unknown = row.broadcastFormat\n const localeRaw: unknown = row.locale\n\n const audienceId = typeof audienceIdRaw === \"string\" ? audienceIdRaw : \"\"\n const name = typeof nameRaw === \"string\" ? nameRaw.trim() : \"\"\n const subject = typeof subjectRaw === \"string\" ? subjectRaw.trim() : \"\"\n const htmlBody = typeof htmlRaw === \"string\" ? htmlRaw.trim() : \"\"\n const templateId = typeof templateIdRaw === \"string\" ? templateIdRaw.trim() : \"\"\n const replyTo = typeof replyToRaw === \"string\" ? replyToRaw.trim() : \"\"\n const broadcastFormat =\n typeof broadcastFormatRaw === \"string\" ? broadcastFormatRaw.trim() : \"html\"\n const locale = typeof localeRaw === \"string\" ? localeRaw.trim() : \"\"\n\n setIsPending(true)\n void (async () => {\n try {\n if (!audienceId || !name || !subject) {\n throw new Error(\"Audience, name, and subject are required.\")\n }\n\n const mailchimpMode = showTemplateField\n const usingReactTemplate = showReactEmailTemplates && broadcastFormat !== \"html\"\n\n if (showReactEmailTemplates) {\n if (usingReactTemplate) {\n await requestJson(\"/marketing/broadcasts\", {\n body: JSON.stringify({\n audienceId,\n emailTemplateId: broadcastFormat,\n locale: locale || undefined,\n name,\n replyTo,\n subject,\n }),\n method: \"POST\",\n })\n } else if (!htmlBody) {\n throw new Error(\"<html> is required when using the <html> content option.\")\n } else {\n await requestJson(\"/marketing/broadcasts\", {\n body: JSON.stringify({\n audienceId,\n html: htmlBody,\n name,\n replyTo,\n subject,\n }),\n method: \"POST\",\n })\n }\n } else if (mailchimpMode) {\n if (!templateId && !htmlBody) {\n throw new Error(\"Provide <html> or a Mailchimp template id.\")\n }\n if (templateId && htmlBody) {\n throw new Error(\"Use either <html> or Mailchimp template id, not both.\")\n }\n await requestJson(\"/marketing/broadcasts\", {\n body: JSON.stringify({\n audienceId,\n html: htmlBody,\n name,\n replyTo,\n subject,\n templateId: templateId || undefined,\n }),\n method: \"POST\",\n })\n } else if (!htmlBody) {\n throw new Error(\"<html> is required for this provider.\")\n } else {\n await requestJson(\"/marketing/broadcasts\", {\n body: JSON.stringify({\n audienceId,\n html: htmlBody,\n name,\n replyTo,\n subject,\n }),\n method: \"POST\",\n })\n }\n\n modal.closeModal(modalSlug)\n toast.success(t(\"general:successfullyCreated\", { label: \"Broadcast\" }))\n router.refresh()\n } catch (err) {\n toast.error(err instanceof Error ? err.message : \"Create failed\")\n } finally {\n setIsPending(false)\n }\n })()\n }\n\n return (\n <Drawer slug={modalSlug} title={t(\"general:createNew\")}>\n <Form\n className=\"flex w-full flex-col gap-8\"\n initialState={showReactEmailTemplates ? { broadcastFormat: { value: \"html\" } } : {}}\n onSubmit={submit}\n waitForAutocomplete\n >\n <SelectField\n field={{\n label: \"Audience\",\n name: \"audienceId\",\n options: audiences.map((a) => ({ label: a.name, value: a.id })),\n required: true,\n }}\n path=\"audienceId\"\n />\n <TextField\n field={{\n label: \"Campaign name\",\n name: \"name\",\n required: true,\n type: \"text\",\n }}\n path=\"name\"\n />\n <TextField\n field={{\n label: \"Subject\",\n name: \"subject\",\n required: true,\n type: \"text\",\n }}\n path=\"subject\"\n />\n <TextField\n field={{\n label: \"Reply-to (optional)\",\n name: \"replyTo\",\n type: \"text\",\n }}\n path=\"replyTo\"\n />\n\n <BroadcastContentFields\n localeOptions={localeOptions}\n showReactEmailTemplates={showReactEmailTemplates}\n showTemplateField={showTemplateField}\n templateOptions={templateOptions}\n />\n\n <Button className=\"w-full\" disabled={isPending} type=\"submit\">\n {t(\"general:create\")}\n </Button>\n </Form>\n </Drawer>\n )\n}\n"],"mappings":"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","names":["Link","NavGroup","SelectField","React","joinAdminSegments","adminRoute","segments","trimmedAdmin","body","s","segment","marketingAdminHref","basePath","parts","useConfig","useCallback","useMemo","useMarketingApi","context","base","requestJson","pathSegment","init","_headersIgnored","restInit","headers","res","detail","parsed","jsx","jsxs","parseAudiences","payload","out","item","rec","id","name","AudienceSelect","field","path","readOnly","requestJson","useMarketingApi","audiences","setAudiences","React","loadError","setLoadError","cancelled","data","err","SelectField","a","MarketingMenu","basePath","NavGroup","Link","marketingAdminHref","AudienceTable","audience","ContactsTable","contacts","contact","PayloadButton","DateTimeField","Form","Pagination","Pill","Table","toast","useModal","useTranslation","Link","useRouter","React","formatMarketingDate","iso","d","Button","Modal","useModal","useTranslation","React","jsx","cn","parts","PayloadModalContext","PayloadModal","children","className","modalSlug","props","loaded","setLoaded","PayloadModalContent","PayloadModalBody","PayloadModalTitle","PayloadModalFooter","PayloadModalClose","t","modal","Fragment","jsx","jsxs","BroadcastsTable","broadcasts","page","setPage","React","limit","currentPage","Table","b","formatMarketingDate","broadcast","BroadcastStatusPill","Link","Pill","DeleteBroadcastButton","SendBroadcastButton","Pagination","p","status","broadcastId","broadcastName","modal","useModal","t","useTranslation","router","useRouter","requestJson","useMarketingApi","modalSlug","confirmDelete","toast","PayloadModal","PayloadModalContent","PayloadModalBody","PayloadModalTitle","PayloadModalFooter","PayloadModalClose","PayloadButton","err","submit","fields","data","scheduledRaw","scheduledAt","Form","DateTimeField","Button","Form","TextField","toast","useModal","useTranslation","PayloadButton","useRouter","useTransition","Fragment","jsx","jsxs","createAudienceSlug","CreateAudienceButton","modal","useModal","t","useTranslation","CreateAudienceModal","Button","router","useRouter","requestJson","useMarketingApi","isPending","startTransition","useTransition","PayloadModal","PayloadModalContent","Form","fields","data","nameRaw","name","toast","err","PayloadModalBody","PayloadModalTitle","TextField","v","PayloadModalFooter","PayloadModalClose","DeleteAudienceButton","audienceId","audienceName","modalSlug","confirmDelete","PayloadButton","CheckboxField","Form","Pagination","Table","TextField","toast","useModal","useTranslation","PayloadButton","useRouter","React","ReactRaw","useTransition","Fragment","jsx","jsxs","ContactsTable","audienceId","contacts","page","setPage","React","limit","currentPage","Table","contact","formatMarketingDate","EditContactButton","DeleteContactButton","Pagination","p","contactId","contactEmail","modal","useModal","t","useTranslation","router","useRouter","requestJson","useMarketingApi","modalSlug","confirmDelete","toast","PayloadModal","PayloadModalContent","PayloadModalBody","PayloadModalFooter","PayloadModalClose","PayloadButton","err","id","ReactRaw","slug","EditContactModalWrapper","startTransition","useTransition","submit","fields","data","email","firstName","lastName","subscribed","Form","TextField","v","CheckboxField","Button","Drawer","Form","SelectField","TextareaField","TextField","toast","useFormFields","useModal","useTranslation","useRouter","React","Fragment","jsx","jsxs","modalSlug","CreateBroadcastButton","audiences","emailBroadcastTemplates","localeOptions","provider","modal","useModal","t","useTranslation","CreateBroadcastModal","Button","BroadcastContentFields","showReactEmailTemplates","showTemplateField","templateOptions","broadcastFormat","useFormFields","fields","v","isHtml","SelectField","opt","TextareaField","TextField","router","useRouter","requestJson","useMarketingApi","isPending","setIsPending","React","submit","data","row","audienceIdRaw","nameRaw","subjectRaw","htmlRaw","templateIdRaw","replyToRaw","broadcastFormatRaw","localeRaw","audienceId","name","subject","htmlBody","templateId","replyTo","locale","mailchimpMode","usingReactTemplate","toast","err","Drawer","Form","a"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience-buttons.d.ts","sourceRoot":"","sources":["../../../src/admin/components/audience-buttons.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,oBAAoB,4CAYnC;AA+DD,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB,2CA4CA"}
@@ -0,0 +1,6 @@
1
+ import type { AdminViewServerProps } from "payload";
2
+ export type AudienceDetailViewProps = AdminViewServerProps & {
3
+ basePath?: string;
4
+ };
5
+ export default function AudienceDetail({ initPageResult, params, searchParams, }: AudienceDetailViewProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=audience-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience-detail.d.ts","sourceRoot":"","sources":["../../../src/admin/components/audience-detail.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,MAAM,MAAM,uBAAuB,GAAG,oBAAoB,GAAG;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,cAAc,EACd,MAAM,EACN,YAAY,GACb,EAAE,uBAAuB,2CAczB"}
@@ -0,0 +1,6 @@
1
+ import type { AdminViewServerProps } from "payload";
2
+ export type AudienceListViewProps = AdminViewServerProps & {
3
+ basePath?: string;
4
+ };
5
+ export default function AudienceList({ basePath, initPageResult, params, searchParams, }: AudienceListViewProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=audience-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience-list.d.ts","sourceRoot":"","sources":["../../../src/admin/components/audience-list.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,GAAG;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,QAAa,EACb,cAAc,EACd,MAAM,EACN,YAAY,GACb,EAAE,qBAAqB,2CAQvB"}
@@ -0,0 +1,6 @@
1
+ import type { AdminViewServerProps } from "payload";
2
+ export type BroadcastListViewProps = AdminViewServerProps & {
3
+ basePath?: string;
4
+ };
5
+ export default function BroadcastList({ initPageResult, params, searchParams, }: BroadcastListViewProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=broadcast-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcast-list.d.ts","sourceRoot":"","sources":["../../../src/admin/components/broadcast-list.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEnD,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,GAAG;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,cAAc,EACd,MAAM,EACN,YAAY,GACb,EAAE,sBAAsB,2CAQxB"}
@@ -1,4 +1,4 @@
1
- import type { MarketingBroadcast } from "../types";
1
+ import type { MarketingBroadcast } from "../../types";
2
2
  export interface MarketingBroadcastRow extends MarketingBroadcast {
3
3
  externalDashboardUrl?: string;
4
4
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broadcasts-table.d.ts","sourceRoot":"","sources":["../../../src/admin/components/broadcasts-table.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGrD,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,UAAU,oBAAoB;IAC5B,UAAU,EAAE,qBAAqB,EAAE,CAAA;CACpC;AAED,wBAAgB,eAAe,CAAC,EAAE,UAAU,EAAE,EAAE,oBAAoB,2CA4FnE;AAwED,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,aAAa,GACd,EAAE;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;CACtB,2CAoEA"}
@@ -1,4 +1,4 @@
1
- import type { MarketingContact } from "../types";
1
+ import type { MarketingContact } from "../../types";
2
2
  interface ContactsTableProps {
3
3
  audienceId: string;
4
4
  contacts: MarketingContact[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-table.d.ts","sourceRoot":"","sources":["../../../src/admin/components/contacts-table.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGnD,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC7B;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAgFzE;AA2DD,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,OAAO,GACR,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;CACjC,2CAoBA"}
@@ -0,0 +1,14 @@
1
+ import type { MarketingAudience } from "../../types";
2
+ export declare function CreateBroadcastButton({ audiences, emailBroadcastTemplates, localeOptions, provider, }: {
3
+ audiences: MarketingAudience[];
4
+ emailBroadcastTemplates?: {
5
+ id: string;
6
+ name: string;
7
+ }[];
8
+ localeOptions?: {
9
+ label: string;
10
+ value: string;
11
+ }[];
12
+ provider: string;
13
+ }): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=create-broadcast-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-broadcast-button.d.ts","sourceRoot":"","sources":["../../../src/admin/components/create-broadcast-button.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAKpD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,uBAAuB,EACvB,aAAa,EACb,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,uBAAuB,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACxD,aAAa,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAClD,QAAQ,EAAE,MAAM,CAAA;CACjB,2CAiBA"}
@@ -15,10 +15,4 @@ export declare function ContactsTable({ contacts }: {
15
15
  id: string;
16
16
  }>;
17
17
  }): import("react/jsx-runtime").JSX.Element;
18
- export declare function BroadcastsTable({ broadcasts, }: {
19
- broadcasts: Array<{
20
- id: string;
21
- name: string;
22
- }>;
23
- }): import("react/jsx-runtime").JSX.Element;
24
- //# sourceMappingURL=components.d.ts.map
18
+ //# sourceMappingURL=marketing-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-components.d.ts","sourceRoot":"","sources":["../../../src/admin/components/marketing-components.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAiBvD,eAAO,MAAM,cAAc,EAAE,wBA6C5B,CAAA;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAa,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,2CAWrE;AAED,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2CAY9F;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,2CAY7F"}
@@ -0,0 +1,8 @@
1
+ import type { AdminViewServerProps } from "payload";
2
+ import type { ReactNode } from "react";
3
+ type ShellProps = Pick<AdminViewServerProps, "initPageResult" | "params" | "searchParams"> & {
4
+ children: ReactNode;
5
+ };
6
+ export declare function MarketingViewShell({ children, initPageResult, params, searchParams }: ShellProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=marketing-view-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing-view-shell.d.ts","sourceRoot":"","sources":["../../../src/admin/components/marketing-view-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEtC,KAAK,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,GAAG,QAAQ,GAAG,cAAc,CAAC,GAAG;IAC3F,QAAQ,EAAE,SAAS,CAAA;CACpB,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,UAAU,2CAehG"}
@@ -0,0 +1,13 @@
1
+ import { Button, Modal } from "@payloadcms/ui";
2
+ import React from "react";
3
+ interface PayloadModalProps extends React.ComponentProps<typeof Modal> {
4
+ children: React.ReactNode;
5
+ }
6
+ declare function PayloadModal({ children, className, slug: modalSlug, ...props }: PayloadModalProps): import("react/jsx-runtime").JSX.Element;
7
+ declare function PayloadModalContent({ children, className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
8
+ declare function PayloadModalBody({ children, className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
9
+ declare function PayloadModalTitle({ children, className, ...props }: React.ComponentProps<"h1">): import("react/jsx-runtime").JSX.Element;
10
+ declare function PayloadModalFooter({ children, className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
11
+ declare function PayloadModalClose({ children, className, ...props }: React.ComponentProps<typeof Button>): import("react/jsx-runtime").JSX.Element;
12
+ export { PayloadModal, PayloadModalContent, PayloadModalBody, PayloadModalTitle, PayloadModalFooter, PayloadModalClose, };
13
+ //# sourceMappingURL=payload-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-modal.d.ts","sourceRoot":"","sources":["../../../src/admin/components/payload-modal.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,KAAK,EAA4B,MAAM,gBAAgB,CAAA;AACxE,OAAO,KAAK,MAAM,OAAO,CAAA;AAUzB,UAAU,iBAAkB,SAAQ,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC;IACpE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,iBAAS,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,2CAiB1F;AAED,iBAAS,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAU1F;AAED,iBAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAUvF;AAED,iBAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAMvF;AAED,iBAAS,kBAAkB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAUzF;AAED,iBAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,2CAiBhG;AAED,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GAClB,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-dashboard-link.d.ts","sourceRoot":"","sources":["../../../src/admin/components/provider-dashboard-link.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,4HAA4H;AAC5H,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,0BAA0B,kDAe3F"}
@@ -0,0 +1,4 @@
1
+ import type { AdminViewServerProps } from "payload";
2
+ /** Resolve audience id from custom admin view params (`:id` or URL segments). */
3
+ export declare function marketingAudienceIdFromParams(params: AdminViewServerProps["params"] | undefined): string | undefined;
4
+ //# sourceMappingURL=view-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-params.d.ts","sourceRoot":"","sources":["../../../src/admin/components/view-params.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAYnD,iFAAiF;AACjF,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GAAG,SAAS,GACjD,MAAM,GAAG,SAAS,CA+BpB"}
@@ -0,0 +1,4 @@
1
+ export { default as AudienceDetail } from "./audience-detail";
2
+ export { default as AudienceList } from "./audience-list";
3
+ export { default as BroadcastList } from "./broadcast-list";
4
+ //# sourceMappingURL=views.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../../src/admin/components/views.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,2 @@
1
+ "use strict";var d=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(a,n)=>{for(var o in n)d(a,o,{get:n[o],enumerable:!0})},g=(a,n,o,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of m(n))!p.call(a,t)&&t!==o&&d(a,t,{get:()=>n[t],enumerable:!(e=i(n,t))||e.enumerable});return a};var r=a=>g(d({},"__esModule",{value:!0}),a);var c={};l(c,{defaultAdminComponentPath:()=>u});module.exports=r(c);var u="payload-plugin-marketing/admin";0&&(module.exports={defaultAdminComponentPath});
2
+ //# sourceMappingURL=constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/constants.ts"],"sourcesContent":["export const defaultAdminComponentPath = \"payload-plugin-marketing/admin\"\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,IAAA,eAAAC,EAAAH,GAAO,IAAME,EAA4B","names":["constants_exports","__export","defaultAdminComponentPath","__toCommonJS"]}
@@ -0,0 +1,2 @@
1
+ export declare const defaultAdminComponentPath = "payload-plugin-marketing/admin";
2
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/admin/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,mCAAmC,CAAA"}
@@ -0,0 +1,2 @@
1
+ var n="payload-plugin-marketing/admin";export{n as defaultAdminComponentPath};
2
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/constants.ts"],"sourcesContent":["export const defaultAdminComponentPath = \"payload-plugin-marketing/admin\"\n"],"mappings":"AAAO,IAAMA,EAA4B","names":["defaultAdminComponentPath"]}
@@ -1,2 +1,2 @@
1
- "use strict";var R=Object.create;var p=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,E=Object.prototype.hasOwnProperty;var S=(e,t)=>{for(var r in t)p(e,r,{get:t[r],enumerable:!0})},b=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of N(t))!E.call(e,i)&&i!==r&&p(e,i,{get:()=>t[i],enumerable:!(o=$(t,i))||o.enumerable});return e};var _=(e,t,r)=>(r=e!=null?R(q(e)):{},b(t||!e||!e.__esModule?p(r,"default",{value:e,enumerable:!0}):r,e)),F=e=>b(p({},"__esModule",{value:!0}),e);var I={};S(I,{AudienceDetail:()=>T,AudienceList:()=>L,AudienceSelect:()=>h,AudienceTable:()=>M,BroadcastList:()=>B,BroadcastsTable:()=>C,ContactsTable:()=>w,MarketingMenu:()=>x,defaultAdminComponentPath:()=>D});module.exports=F(I);var f=_(require("react"),1),c=require("@payloadcms/ui");var A=require("@payloadcms/ui"),m=require("react");function k(){let e=(0,A.useConfig)(),t=(0,m.useMemo)(()=>`${e.serverURL??""}${e.routes?.api??"/api"}`,[e.routes?.api,e.serverURL]),r=(0,m.useCallback)(async(o,i)=>{let{headers:l,...s}=i??{},u=new Headers(i?.headers);s.body!==void 0&&s.body!==""&&s.body!==null&&(u.has("Content-Type")||u.set("Content-Type","application/json"));let a=await fetch(`${t}${o}`,{...s,credentials:"include",headers:u});if(!a.ok){let d=`${a.status} ${a.statusText}`;try{let y=await a.json();typeof y.message=="string"&&(d=y.message)}catch{}throw new Error(d)}if(a.status!==204)try{return await a.json()}catch{return}},[t]);return{base:t,requestJson:r}}var n=require("react/jsx-runtime");function j(e){if(!Array.isArray(e))return[];let t=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r,i=o.id,l=o.name;typeof i=="string"&&typeof l=="string"&&t.push({id:i,name:l})}return t}var h=({field:e,path:t,readOnly:r})=>{let{requestJson:o}=k(),[i,l]=f.default.useState([]),[s,u]=f.default.useState(null);return f.default.useEffect(()=>{let a=!1;return(async()=>{try{let d=await o("/marketing/audiences");a||(l(j(d)),u(null))}catch(d){a||u(d instanceof Error?d.message:"Failed to load audiences")}})(),()=>{a=!0}},[o]),(0,n.jsxs)("div",{className:"field-type relative",children:[s?(0,n.jsx)("p",{className:"text-red-500",role:"alert",children:s}):null,(0,n.jsx)(c.SelectField,{field:{label:typeof e.label=="string"?e.label:"Audience",name:e.name,options:i.map(a=>({label:a.name,value:a.id})),required:e.required===!0,type:"select"},path:t,readOnly:r})]})};function v(e,t){return["/admin",e?.replace(/^\/+|\/+$/g,""),t].filter(Boolean).join("/")}function x({basePath:e=""}){return(0,n.jsxs)(c.NavGroup,{isOpen:!0,label:"Marketing",children:[(0,n.jsx)(c.Link,{className:"nav__link",href:v(e,"audience"),children:"Audience"}),(0,n.jsx)(c.Link,{className:"nav__link",href:v(e,"broadcast"),children:"Broadcast"})]})}function M({audiences:e}){return(0,n.jsx)("table",{children:(0,n.jsx)("tbody",{children:e.map(t=>(0,n.jsx)("tr",{children:(0,n.jsx)("td",{children:t.name})},t.id))})})}function w({contacts:e}){return(0,n.jsx)("table",{children:(0,n.jsx)("tbody",{children:e.map(t=>(0,n.jsx)("tr",{children:(0,n.jsx)("td",{children:t.email})},t.id))})})}function C({broadcasts:e}){return(0,n.jsx)("table",{children:(0,n.jsx)("tbody",{children:e.map(t=>(0,n.jsx)("tr",{children:(0,n.jsx)("td",{children:t.name})},t.id))})})}var g=require("react/jsx-runtime");function L(){return(0,g.jsx)("div",{children:"Audience"})}function T(){return(0,g.jsx)("div",{children:"Audience Detail"})}function B(){return(0,g.jsx)("div",{children:"Broadcasts"})}var D="payload-plugin-marketing/admin";0&&(module.exports={AudienceDetail,AudienceList,AudienceSelect,AudienceTable,BroadcastList,BroadcastsTable,ContactsTable,MarketingMenu,defaultAdminComponentPath});
1
+ "use strict";var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var t=(f,r,p,x)=>{if(r&&typeof r=="object"||typeof r=="function")for(let m of c(r))!d.call(f,m)&&m!==p&&a(f,m,{get:()=>r[m],enumerable:!(x=b(r,m))||x.enumerable});return f},e=(f,r,p)=>(t(f,r,"default"),p&&t(p,r,"default"));var g=f=>t(a({},"__esModule",{value:!0}),f);var o={};module.exports=g(o);e(o,require("./constants"),module.exports);e(o,require("./server"),module.exports);e(o,require("./client"),module.exports);0&&(module.exports={...require("./constants"),...require("./server"),...require("./client")});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/admin/index.ts","../../src/admin/components.tsx","../../src/admin/use-marketing-api.ts","../../src/admin/views.tsx"],"sourcesContent":["export const defaultAdminComponentPath = \"payload-plugin-marketing/admin\"\n\nexport {\n AudienceSelect,\n AudienceTable,\n BroadcastsTable,\n ContactsTable,\n MarketingMenu,\n} from \"./components\"\nexport { AudienceDetail, AudienceList, BroadcastList } from \"./views\"\n","\"use client\"\n\nimport React from \"react\"\nimport { Link, NavGroup, SelectField } from \"@payloadcms/ui\"\n\nimport { useMarketingApi } from \"./use-marketing-api\"\n\nimport type { MarketingAudience } from \"../types\"\nimport type { TextFieldClientComponent } from \"payload\"\n\nfunction parseAudiences(payload: unknown): MarketingAudience[] {\n if (!Array.isArray(payload)) return []\n const out: MarketingAudience[] = []\n for (const item of payload) {\n if (!item || typeof item !== \"object\") continue\n const rec = item as Record<string, unknown>\n const id = rec.id\n const name = rec.name\n if (typeof id === \"string\" && typeof name === \"string\") {\n out.push({ id, name })\n }\n }\n return out\n}\n\nexport const AudienceSelect: TextFieldClientComponent = ({ field, path, readOnly }) => {\n const { requestJson } = useMarketingApi()\n const [audiences, setAudiences] = React.useState<MarketingAudience[]>([])\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const data = await requestJson(\"/marketing/audiences\")\n if (!cancelled) {\n setAudiences(parseAudiences(data))\n setLoadError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setLoadError(err instanceof Error ? err.message : \"Failed to load audiences\")\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [requestJson])\n\n return (\n <div className=\"field-type relative\">\n {loadError ? (\n <p className=\"text-red-500\" role=\"alert\">\n {loadError}\n </p>\n ) : null}\n <SelectField\n field={{\n label: typeof field.label === \"string\" ? field.label : \"Audience\",\n name: field.name,\n options: audiences.map((a) => ({ label: a.name, value: a.id })),\n required: field.required === true,\n type: \"select\",\n }}\n path={path}\n readOnly={readOnly}\n />\n </div>\n )\n}\n\nfunction adminHref(basePath: string | undefined, segment: string): string {\n const normalized = basePath?.replace(/^\\/+|\\/+$/g, \"\")\n return [\"/admin\", normalized, segment].filter(Boolean).join(\"/\")\n}\n\nexport function MarketingMenu({ basePath = \"\" }: { basePath?: string }) {\n return (\n <NavGroup isOpen label=\"Marketing\">\n <Link className=\"nav__link\" href={adminHref(basePath, \"audience\")}>\n Audience\n </Link>\n <Link className=\"nav__link\" href={adminHref(basePath, \"broadcast\")}>\n Broadcast\n </Link>\n </NavGroup>\n )\n}\n\nexport function AudienceTable({ audiences }: { audiences: Array<{ id: string; name: string }> }) {\n return (\n <table>\n <tbody>\n {audiences.map((audience) => (\n <tr key={audience.id}>\n <td>{audience.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function ContactsTable({ contacts }: { contacts: Array<{ email: string; id: string }> }) {\n return (\n <table>\n <tbody>\n {contacts.map((contact) => (\n <tr key={contact.id}>\n <td>{contact.email}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function BroadcastsTable({\n broadcasts,\n}: {\n broadcasts: Array<{ id: string; name: string }>\n}) {\n return (\n <table>\n <tbody>\n {broadcasts.map((broadcast) => (\n <tr key={broadcast.id}>\n <td>{broadcast.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n","\"use client\"\n\nimport { useConfig } from \"@payloadcms/ui\"\nimport { useCallback, useMemo } from \"react\"\n\nexport function useMarketingApi() {\n const context = useConfig() as unknown as {\n routes?: { api?: string }\n serverURL?: string\n }\n\n const base = useMemo(() => `${context.serverURL ?? \"\"}${context.routes?.api ?? \"/api\"}`, [\n context.routes?.api,\n context.serverURL,\n ])\n\n const requestJson = useCallback(\n async (pathSegment: string, init?: RequestInit): Promise<unknown> => {\n const { headers: _headersIgnored, ...restInit } = init ?? {}\n const headers = new Headers(init?.headers)\n if (\n restInit.body !== undefined &&\n restInit.body !== \"\" &&\n restInit.body !== null\n ) {\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\")\n }\n }\n\n const res = await fetch(`${base}${pathSegment}`, {\n ...restInit,\n credentials: \"include\",\n headers,\n })\n\n if (!res.ok) {\n let detail = `${res.status} ${res.statusText}`\n try {\n const parsed = (await res.json()) as { message?: string }\n if (typeof parsed.message === \"string\") detail = parsed.message\n } catch {\n //\n }\n throw new Error(detail)\n }\n\n if (res.status === 204) {\n return undefined\n }\n\n try {\n return await res.json()\n } catch {\n return undefined\n }\n },\n [base],\n )\n\n return { base, requestJson }\n}\n","import React from \"react\"\n\nexport function AudienceList() {\n return <div>Audience</div>\n}\n\nexport function AudienceDetail() {\n return <div>Audience Detail</div>\n}\n\nexport function BroadcastList() {\n return <div>Broadcasts</div>\n}\n"],"mappings":"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","names":["admin_exports","__export","AudienceDetail","AudienceList","AudienceSelect","AudienceTable","BroadcastList","BroadcastsTable","ContactsTable","MarketingMenu","defaultAdminComponentPath","__toCommonJS","import_react","import_ui","import_ui","import_react","useMarketingApi","context","base","requestJson","pathSegment","init","_headersIgnored","restInit","headers","res","detail","parsed","import_jsx_runtime","parseAudiences","payload","out","item","rec","id","name","AudienceSelect","field","path","readOnly","requestJson","useMarketingApi","audiences","setAudiences","React","loadError","setLoadError","cancelled","data","err","adminHref","basePath","segment","MarketingMenu","AudienceTable","audience","ContactsTable","contacts","contact","BroadcastsTable","broadcasts","broadcast","import_jsx_runtime","AudienceList","AudienceDetail","BroadcastList","defaultAdminComponentPath"]}
1
+ {"version":3,"sources":["../../src/admin/index.ts"],"sourcesContent":["export * from \"./constants\"\nexport * from \"./server\"\nexport * from \"./client\"\n"],"mappings":"iaAAA,IAAAA,EAAA,kBAAAC,EAAAD,GAAAE,EAAAF,EAAc,uBAAd,gBACAE,EAAAF,EAAc,oBADd,gBAEAE,EAAAF,EAAc,oBAFd","names":["admin_exports","__toCommonJS","__reExport"]}
@@ -1,4 +1,4 @@
1
- export declare const defaultAdminComponentPath = "payload-plugin-marketing/admin";
2
- export { AudienceSelect, AudienceTable, BroadcastsTable, ContactsTable, MarketingMenu, } from "./components";
3
- export { AudienceDetail, AudienceList, BroadcastList } from "./views";
1
+ export * from "./constants";
2
+ export * from "./server";
3
+ export * from "./client";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,mCAAmC,CAAA;AAEzE,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA"}
@@ -1,2 +1,2 @@
1
- import l from"react";import{Link as g,NavGroup as h,SelectField as x}from"@payloadcms/ui";import{useConfig as A}from"@payloadcms/ui";import{useCallback as k,useMemo as v}from"react";function f(){let e=A(),t=v(()=>`${e.serverURL??""}${e.routes?.api??"/api"}`,[e.routes?.api,e.serverURL]),i=k(async(a,o)=>{let{headers:u,...s}=o??{},c=new Headers(o?.headers);s.body!==void 0&&s.body!==""&&s.body!==null&&(c.has("Content-Type")||c.set("Content-Type","application/json"));let r=await fetch(`${t}${a}`,{...s,credentials:"include",headers:c});if(!r.ok){let d=`${r.status} ${r.statusText}`;try{let m=await r.json();typeof m.message=="string"&&(d=m.message)}catch{}throw new Error(d)}if(r.status!==204)try{return await r.json()}catch{return}},[t]);return{base:t,requestJson:i}}import{jsx as n,jsxs as b}from"react/jsx-runtime";function M(e){if(!Array.isArray(e))return[];let t=[];for(let i of e){if(!i||typeof i!="object")continue;let a=i,o=a.id,u=a.name;typeof o=="string"&&typeof u=="string"&&t.push({id:o,name:u})}return t}var w=({field:e,path:t,readOnly:i})=>{let{requestJson:a}=f(),[o,u]=l.useState([]),[s,c]=l.useState(null);return l.useEffect(()=>{let r=!1;return(async()=>{try{let d=await a("/marketing/audiences");r||(u(M(d)),c(null))}catch(d){r||c(d instanceof Error?d.message:"Failed to load audiences")}})(),()=>{r=!0}},[a]),b("div",{className:"field-type relative",children:[s?n("p",{className:"text-red-500",role:"alert",children:s}):null,n(x,{field:{label:typeof e.label=="string"?e.label:"Audience",name:e.name,options:o.map(r=>({label:r.name,value:r.id})),required:e.required===!0,type:"select"},path:t,readOnly:i})]})};function y(e,t){return["/admin",e?.replace(/^\/+|\/+$/g,""),t].filter(Boolean).join("/")}function C({basePath:e=""}){return b(h,{isOpen:!0,label:"Marketing",children:[n(g,{className:"nav__link",href:y(e,"audience"),children:"Audience"}),n(g,{className:"nav__link",href:y(e,"broadcast"),children:"Broadcast"})]})}function L({audiences:e}){return n("table",{children:n("tbody",{children:e.map(t=>n("tr",{children:n("td",{children:t.name})},t.id))})})}function T({contacts:e}){return n("table",{children:n("tbody",{children:e.map(t=>n("tr",{children:n("td",{children:t.email})},t.id))})})}function B({broadcasts:e}){return n("table",{children:n("tbody",{children:e.map(t=>n("tr",{children:n("td",{children:t.name})},t.id))})})}import{jsx as p}from"react/jsx-runtime";function R(){return p("div",{children:"Audience"})}function $(){return p("div",{children:"Audience Detail"})}function N(){return p("div",{children:"Broadcasts"})}var G="payload-plugin-marketing/admin";export{$ as AudienceDetail,R as AudienceList,w as AudienceSelect,L as AudienceTable,N as BroadcastList,B as BroadcastsTable,T as ContactsTable,C as MarketingMenu,G as defaultAdminComponentPath};
1
+ export*from"./constants";export*from"./server";export*from"./client";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/admin/components.tsx","../../src/admin/use-marketing-api.ts","../../src/admin/views.tsx","../../src/admin/index.ts"],"sourcesContent":["\"use client\"\n\nimport React from \"react\"\nimport { Link, NavGroup, SelectField } from \"@payloadcms/ui\"\n\nimport { useMarketingApi } from \"./use-marketing-api\"\n\nimport type { MarketingAudience } from \"../types\"\nimport type { TextFieldClientComponent } from \"payload\"\n\nfunction parseAudiences(payload: unknown): MarketingAudience[] {\n if (!Array.isArray(payload)) return []\n const out: MarketingAudience[] = []\n for (const item of payload) {\n if (!item || typeof item !== \"object\") continue\n const rec = item as Record<string, unknown>\n const id = rec.id\n const name = rec.name\n if (typeof id === \"string\" && typeof name === \"string\") {\n out.push({ id, name })\n }\n }\n return out\n}\n\nexport const AudienceSelect: TextFieldClientComponent = ({ field, path, readOnly }) => {\n const { requestJson } = useMarketingApi()\n const [audiences, setAudiences] = React.useState<MarketingAudience[]>([])\n const [loadError, setLoadError] = React.useState<string | null>(null)\n\n React.useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const data = await requestJson(\"/marketing/audiences\")\n if (!cancelled) {\n setAudiences(parseAudiences(data))\n setLoadError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setLoadError(err instanceof Error ? err.message : \"Failed to load audiences\")\n }\n }\n })()\n return () => {\n cancelled = true\n }\n }, [requestJson])\n\n return (\n <div className=\"field-type relative\">\n {loadError ? (\n <p className=\"text-red-500\" role=\"alert\">\n {loadError}\n </p>\n ) : null}\n <SelectField\n field={{\n label: typeof field.label === \"string\" ? field.label : \"Audience\",\n name: field.name,\n options: audiences.map((a) => ({ label: a.name, value: a.id })),\n required: field.required === true,\n type: \"select\",\n }}\n path={path}\n readOnly={readOnly}\n />\n </div>\n )\n}\n\nfunction adminHref(basePath: string | undefined, segment: string): string {\n const normalized = basePath?.replace(/^\\/+|\\/+$/g, \"\")\n return [\"/admin\", normalized, segment].filter(Boolean).join(\"/\")\n}\n\nexport function MarketingMenu({ basePath = \"\" }: { basePath?: string }) {\n return (\n <NavGroup isOpen label=\"Marketing\">\n <Link className=\"nav__link\" href={adminHref(basePath, \"audience\")}>\n Audience\n </Link>\n <Link className=\"nav__link\" href={adminHref(basePath, \"broadcast\")}>\n Broadcast\n </Link>\n </NavGroup>\n )\n}\n\nexport function AudienceTable({ audiences }: { audiences: Array<{ id: string; name: string }> }) {\n return (\n <table>\n <tbody>\n {audiences.map((audience) => (\n <tr key={audience.id}>\n <td>{audience.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function ContactsTable({ contacts }: { contacts: Array<{ email: string; id: string }> }) {\n return (\n <table>\n <tbody>\n {contacts.map((contact) => (\n <tr key={contact.id}>\n <td>{contact.email}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n\nexport function BroadcastsTable({\n broadcasts,\n}: {\n broadcasts: Array<{ id: string; name: string }>\n}) {\n return (\n <table>\n <tbody>\n {broadcasts.map((broadcast) => (\n <tr key={broadcast.id}>\n <td>{broadcast.name}</td>\n </tr>\n ))}\n </tbody>\n </table>\n )\n}\n","\"use client\"\n\nimport { useConfig } from \"@payloadcms/ui\"\nimport { useCallback, useMemo } from \"react\"\n\nexport function useMarketingApi() {\n const context = useConfig() as unknown as {\n routes?: { api?: string }\n serverURL?: string\n }\n\n const base = useMemo(() => `${context.serverURL ?? \"\"}${context.routes?.api ?? \"/api\"}`, [\n context.routes?.api,\n context.serverURL,\n ])\n\n const requestJson = useCallback(\n async (pathSegment: string, init?: RequestInit): Promise<unknown> => {\n const { headers: _headersIgnored, ...restInit } = init ?? {}\n const headers = new Headers(init?.headers)\n if (\n restInit.body !== undefined &&\n restInit.body !== \"\" &&\n restInit.body !== null\n ) {\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\")\n }\n }\n\n const res = await fetch(`${base}${pathSegment}`, {\n ...restInit,\n credentials: \"include\",\n headers,\n })\n\n if (!res.ok) {\n let detail = `${res.status} ${res.statusText}`\n try {\n const parsed = (await res.json()) as { message?: string }\n if (typeof parsed.message === \"string\") detail = parsed.message\n } catch {\n //\n }\n throw new Error(detail)\n }\n\n if (res.status === 204) {\n return undefined\n }\n\n try {\n return await res.json()\n } catch {\n return undefined\n }\n },\n [base],\n )\n\n return { base, requestJson }\n}\n","import React from \"react\"\n\nexport function AudienceList() {\n return <div>Audience</div>\n}\n\nexport function AudienceDetail() {\n return <div>Audience Detail</div>\n}\n\nexport function BroadcastList() {\n return <div>Broadcasts</div>\n}\n","export const defaultAdminComponentPath = \"payload-plugin-marketing/admin\"\n\nexport {\n AudienceSelect,\n AudienceTable,\n BroadcastsTable,\n ContactsTable,\n MarketingMenu,\n} from \"./components\"\nexport { AudienceDetail, AudienceList, BroadcastList } from \"./views\"\n"],"mappings":"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","names":["React","Link","NavGroup","SelectField","useConfig","useCallback","useMemo","useMarketingApi","context","base","requestJson","pathSegment","init","_headersIgnored","restInit","headers","res","detail","parsed","jsx","jsxs","parseAudiences","payload","out","item","rec","id","name","AudienceSelect","field","path","readOnly","requestJson","useMarketingApi","audiences","setAudiences","React","loadError","setLoadError","cancelled","data","err","SelectField","a","adminHref","basePath","segment","MarketingMenu","NavGroup","Link","AudienceTable","audience","ContactsTable","contacts","contact","BroadcastsTable","broadcasts","broadcast","jsx","AudienceList","AudienceDetail","BroadcastList","defaultAdminComponentPath"]}
1
+ {"version":3,"sources":["../../src/admin/index.ts"],"sourcesContent":["export * from \"./constants\"\nexport * from \"./server\"\nexport * from \"./client\"\n"],"mappings":"AAAA,WAAc,cACd,WAAc,WACd,WAAc","names":[]}
@@ -0,0 +1,7 @@
1
+ import type { SanitizedConfig } from "payload";
2
+ /** Options for admin selects; values are locale codes from `config.localization.locales`. */
3
+ export declare function getLocaleSelectOptionsFromConfig(config: SanitizedConfig): {
4
+ label: string;
5
+ value: string;
6
+ }[];
7
+ //# sourceMappingURL=locale-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale-options.d.ts","sourceRoot":"","sources":["../../src/admin/locale-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,eAAe,EAAE,MAAM,SAAS,CAAA;AAiBtD,6FAA6F;AAC7F,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,eAAe,GACtB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAapC"}
@@ -1,2 +1,4 @@
1
1
  export declare function joinAdminSegments(adminRoute: string, ...segments: string[]): string;
2
+ /** Absolute admin hrefs for marketing custom views (`/admin`, optional plugin `basePath`, then path segments). */
3
+ export declare function marketingAdminHref(basePath: string | undefined, ...segments: string[]): string;
2
4
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/admin/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CASnF"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/admin/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CASnF;AAED,kHAAkH;AAClH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAI9F"}
@@ -0,0 +1,2 @@
1
+ "use strict";var Qe=Object.create;var X=Object.defineProperty;var Xe=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var et=Object.getPrototypeOf,tt=Object.prototype.hasOwnProperty;var at=(e,t)=>{for(var a in t)X(e,a,{get:t[a],enumerable:!0})},Re=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ze(t))!tt.call(e,o)&&o!==a&&X(e,o,{get:()=>t[o],enumerable:!(n=Xe(t,o))||n.enumerable});return e};var L=(e,t,a)=>(a=e!=null?Qe(et(e)):{},Re(t||!e||!e.__esModule?X(a,"default",{value:e,enumerable:!0}):a,e)),nt=e=>Re(X({},"__esModule",{value:!0}),e);var kt={};at(kt,{AudienceDetail:()=>oe,AudienceList:()=>re,BroadcastList:()=>se});module.exports=nt(kt);var ne=require("@payloadcms/ui"),je=require("next/navigation");function ot(e,...t){let a=e.replace(/\/+$/,"")||"",n=t.flatMap(r=>String(r).split("/")).map(r=>r.replace(/^\/+|\/+$/g,"")).filter(Boolean).join("/");return(a===""?`/${n}`:`${a}/${n}`).replace(/\/{2,}/g,"/")}function Ne(e,...t){let n=[e?.replace(/^\/+|\/+$/g,"")??"",...t].filter(Boolean);return ot("/admin",...n)}var Fe=require("@payloadcms/ui"),Z=require("react");function S(){let e=(0,Fe.useConfig)(),t=(0,Z.useMemo)(()=>`${e.serverURL??""}${e.routes?.api??"/api"}`,[e.routes?.api,e.serverURL]),a=(0,Z.useCallback)(async(n,o)=>{let{headers:r,...i}=o??{},d=new Headers(o?.headers);i.body!==void 0&&i.body!==""&&i.body!==null&&(d.has("Content-Type")||d.set("Content-Type","application/json"));let b=await fetch(`${t}${n}`,{...i,credentials:"include",headers:d});if(!b.ok){let w=`${b.status} ${b.statusText}`;try{let k=await b.json();typeof k.message=="string"&&(w=k.message)}catch{}throw new Error(w)}if(b.status!==204)try{return await b.json()}catch{return}},[t]);return{base:t,requestJson:a}}var u=require("@payloadcms/ui"),De=L(require("next/link"),1),de=require("next/navigation"),ee=L(require("react"),1);function G(e){if(!e)return"\u2014";let t=new Date(e);return Number.isNaN(t.valueOf())?String(e):new Intl.DateTimeFormat(void 0,{dateStyle:"medium"}).format(t)}var I=require("@payloadcms/ui"),W=L(require("react"),1),F=require("react/jsx-runtime");function O(...e){return e.filter(Boolean).join(" ")}var Ie=W.default.createContext({modalSlug:""});function C({children:e,className:t,slug:a,...n}){let[o,r]=W.default.useState(!1);return W.default.useEffect(()=>{r(!0)},[]),(0,F.jsx)(Ie.Provider,{value:{modalSlug:a},children:o&&(0,F.jsx)(I.Modal,{slug:a,className:O("confirmation-modal",t),...n,children:e})})}function x({children:e,className:t,...a}){return(0,F.jsx)("div",{className:O("confirmation-modal__wrapper",t),"data-slot":"payload-modal-content",...a,children:e})}function B({children:e,className:t,...a}){return(0,F.jsx)("div",{className:O("confirmation-modal__content",t),"data-slot":"payload-modal-body",...a,children:e})}function V({children:e,className:t,...a}){return(0,F.jsx)("h1",{className:O("",t),"data-slot":"payload-modal-title",...a,children:e})}function A({children:e,className:t,...a}){return(0,F.jsx)("div",{className:O("confirmation-modal__controls",t),"data-slot":"payload-modal-footer",...a,children:e})}function T({children:e,className:t,...a}){let{t:n}=(0,I.useTranslation)(),{modalSlug:o}=W.default.useContext(Ie),r=(0,I.useModal)();return(0,F.jsx)(I.Button,{className:O("",t),buttonStyle:"secondary",size:"large","data-slot":"payload-modal-close",...a,onClick:()=>r.closeModal(o),children:e??n("general:cancel")})}var s=require("react/jsx-runtime");function ce({broadcasts:e}){let[t,a]=ee.default.useState(1),[n]=ee.default.useState(100),o=ee.default.useMemo(()=>e.slice((t-1)*n,t*n),[e,n,t]);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(u.Table,{columns:[{Heading:"Campaign name",accessor:"name",active:!0,field:{name:"name",type:"text"},renderedCells:o.map(r=>(0,s.jsx)("div",{children:r.name},r.id))},{Heading:"Schedule date",accessor:"scheduledAt",active:!0,field:{name:"scheduledAt",type:"text"},renderedCells:o.map(r=>(0,s.jsx)("div",{children:G(r.scheduledAt)},r.id))},{Heading:"Sent date",accessor:"sentAt",active:!0,field:{name:"sentAt",type:"text"},renderedCells:o.map(r=>(0,s.jsx)("div",{children:G(r.sentAt)},r.id))},{Heading:"Status",accessor:"status",active:!0,field:{name:"status",type:"text"},renderedCells:o.map(r=>(0,s.jsx)("div",{children:(0,s.jsx)(rt,{status:r.status})},r.id))},{Heading:"",accessor:"",active:!0,field:{name:"_",type:"text"},renderedCells:o.map(r=>(0,s.jsxs)("div",{className:"flex items-center gap-4 flex-wrap",children:[r.externalDashboardUrl?(0,s.jsx)(De.default,{href:r.externalDashboardUrl,rel:"noreferrer noopener",target:"_blank",children:(0,s.jsx)(u.Pill,{children:"dashboard \u2197"})}):null,r.status==="draft"||r.status==="save"?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(it,{broadcastId:r.id,broadcastName:r.name}),(0,s.jsx)(st,{broadcastId:r.id,broadcastName:r.name})]}):null]},r.id))}],data:o}),(0,s.jsx)(u.Pagination,{hasNextPage:t*n<e.length,hasPrevPage:t>1,limit:n,onChange:r=>a(r),page:t,totalPages:Math.ceil(e.length/n)})]})}function rt({status:e}){switch(e){case"draft":case"save":return(0,s.jsx)(u.Pill,{pillStyle:"light-gray",children:"Draft"});case"queued":return(0,s.jsx)(u.Pill,{pillStyle:"white",children:"Queued"});case"sent":return(0,s.jsx)(u.Pill,{pillStyle:"success",children:"Sent"});default:return(0,s.jsx)(u.Pill,{children:e})}}function it({broadcastId:e,broadcastName:t}){let a=(0,u.useModal)(),{t:n}=(0,u.useTranslation)(),o=(0,de.useRouter)(),{requestJson:r}=S(),i=`delete-broadcast_${e}`;async function d(){await r(`/marketing/broadcasts/${encodeURIComponent(e)}`,{method:"DELETE"}),u.toast.success(n("general:deletedSuccessfully")),a.closeModal(i),o.refresh()}return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(C,{slug:i,children:(0,s.jsxs)(x,{children:[(0,s.jsxs)(B,{children:[(0,s.jsx)(V,{children:n("general:confirmDeletion")}),(0,s.jsx)("p",{children:`Delete draft broadcast "${t}"?`})]}),(0,s.jsxs)(A,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,s.jsx)(T,{}),(0,s.jsx)(u.Button,{buttonStyle:"error",onClick:()=>{d().catch(b=>u.toast.error(b instanceof Error?b.message:"Delete failed"))},children:n("general:confirm")})]})]})}),(0,s.jsx)("button",{onClick:()=>a.openModal(i),type:"button",children:n("general:delete")})]})}function st({broadcastId:e,broadcastName:t}){let a=(0,u.useModal)(),{t:n}=(0,u.useTranslation)(),o=(0,de.useRouter)(),{requestJson:r}=S(),i=`send-broadcast_${e}`,d=(b,w)=>{let v=w.scheduledAt,M="";typeof v=="string"?M=v:v instanceof Date&&(M=v.toISOString()),(async()=>{try{await r(`/marketing/broadcasts/${encodeURIComponent(e)}/send`,{body:JSON.stringify({...M&&M.trim()!==""?{scheduledAt:M.trim()}:{}}),method:"POST"}),a.closeModal(i),u.toast.success(n("general:success")),o.refresh()}catch(q){u.toast.error(q instanceof Error?q.message:"Send failed")}})()};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(C,{slug:i,children:(0,s.jsx)(x,{style:{width:"100%",maxWidth:"24rem"},children:(0,s.jsxs)(B,{children:[(0,s.jsx)(V,{children:`Send \u201C${t}\u201D`}),(0,s.jsxs)(u.Form,{initialState:{},onSubmit:d,waitForAutocomplete:!0,children:[(0,s.jsx)(u.DateTimeField,{field:{label:"Schedule at (optional)",name:"scheduledAt",required:!1},path:"scheduledAt"}),(0,s.jsxs)(A,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,s.jsx)(T,{}),(0,s.jsx)(u.Button,{size:"large",type:"submit",children:"Send"})]})]})]})})}),(0,s.jsx)(u.Pill,{pillStyle:"dark",onClick:()=>a.openModal(i),size:"small",children:"Send"})]})}var h=require("@payloadcms/ui"),me=require("next/navigation"),Ee=require("react");var p=require("react/jsx-runtime"),ue="create-audience";function pe(){let e=(0,h.useModal)(),{t}=(0,h.useTranslation)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(lt,{}),(0,p.jsx)(h.Button,{onClick:()=>e.openModal(ue),size:"large",type:"button",children:t("general:createNew")})]})}function lt(){let e=(0,h.useModal)(),{t}=(0,h.useTranslation)(),a=(0,me.useRouter)(),{requestJson:n}=S(),[o,r]=(0,Ee.useTransition)();return(0,p.jsx)(C,{closeOnBlur:!0,slug:ue,children:(0,p.jsx)(x,{style:{width:"100%",maxWidth:"24rem"},children:(0,p.jsx)(h.Form,{initialState:{},onSubmit:(d,b)=>{let k=b.audienceName,v=typeof k=="string"?k.trim():"";r(()=>{(async()=>{try{if(!v)throw new Error("Name is required.");await n("/marketing/audiences",{body:JSON.stringify({name:v}),method:"POST"}),e.closeModal(ue),h.toast.success(t("general:successfullyCreated")),a.refresh()}catch(M){h.toast.error(M instanceof Error?M.message:"Create failed")}})()})},waitForAutocomplete:!0,children:(0,p.jsxs)(B,{children:[(0,p.jsx)(V,{children:t("general:createNew")}),(0,p.jsx)(h.TextField,{field:{name:"audienceName",required:!0,type:"text"},path:"audienceName",validate:d=>typeof d=="string"&&d.trim().length>0?!0:"Name is required"}),(0,p.jsxs)(A,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,p.jsx)(T,{}),(0,p.jsx)(h.Button,{disabled:o,size:"large",type:"submit",children:t("general:confirm")})]})]})})})})}function fe({audienceId:e,audienceName:t}){let a=(0,h.useModal)(),{t:n}=(0,h.useTranslation)(),o=(0,me.useRouter)(),{requestJson:r}=S(),i=`delete-audience_${e}`;async function d(){await r(`/marketing/audiences/${encodeURIComponent(e)}`,{method:"DELETE"}),h.toast.success(n("general:deletedSuccessfully")),a.closeModal(i),o.refresh()}return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(C,{slug:i,children:(0,p.jsxs)(x,{children:[(0,p.jsxs)(B,{children:[(0,p.jsx)(V,{children:n("general:confirmDeletion")}),(0,p.jsx)("p",{children:`Remove audience "${t}"?`})]}),(0,p.jsxs)(A,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,p.jsx)(T,{}),(0,p.jsx)(h.Button,{buttonStyle:"error",onClick:()=>{d().catch(b=>h.toast.error(b instanceof Error?b.message:"Delete failed"))},children:n("general:confirm")})]})]})}),(0,p.jsx)("button",{onClick:()=>a.openModal(i),type:"button",children:n("general:delete")})]})}var m=require("@payloadcms/ui"),ge=require("next/navigation"),te=L(require("react"),1),qe=L(require("react"),1),Le=require("react");var l=require("react/jsx-runtime");function ye({audienceId:e,contacts:t}){let[a,n]=te.default.useState(1),[o]=te.default.useState(100),r=te.default.useMemo(()=>t.slice((a-1)*o,a*o),[t,o,a]);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(m.Table,{columns:[{Heading:"First name",accessor:"firstName",active:!0,field:{name:"firstName",type:"text"},renderedCells:r.map(i=>(0,l.jsx)("div",{children:i.firstName??"\u2014"},i.id))},{Heading:"Last name",accessor:"lastName",active:!0,field:{name:"lastName",type:"text"},renderedCells:r.map(i=>(0,l.jsx)("div",{children:i.lastName??"\u2014"},i.id))},{Heading:"Email",accessor:"email",active:!0,field:{name:"email",type:"text"},renderedCells:r.map(i=>(0,l.jsx)("div",{children:i.email},i.id))},{Heading:"Created",accessor:"createdAt",active:!0,field:{name:"createdAt",type:"text"},renderedCells:r.map(i=>(0,l.jsx)("div",{children:G(i.createdAt)},i.id))},{Heading:"Status",accessor:"subscribed",active:!0,field:{name:"subscribed",type:"text"},renderedCells:r.map(i=>(0,l.jsxs)("div",{className:"flex items-center gap-4 flex-wrap",children:[(0,l.jsx)("span",{children:i.subscribed!==!1?"\u2705 subscribed":"\u274C unsubscribed"}),(0,l.jsx)(ae,{audienceId:e,contact:i}),(0,l.jsx)(dt,{audienceId:e,contactEmail:i.email,contactId:i.id})]},i.id))}],data:r}),(0,l.jsx)(m.Pagination,{hasNextPage:a*o<t.length,hasPrevPage:a>1,limit:o,onChange:i=>{n(i)},page:a,totalPages:Math.ceil(t.length/o)})]})}function dt({audienceId:e,contactId:t,contactEmail:a}){let n=(0,m.useModal)(),{t:o}=(0,m.useTranslation)(),r=(0,ge.useRouter)(),{requestJson:i}=S(),d=`delete-contact_${t}`;async function b(){await i(`/marketing/audiences/${encodeURIComponent(e)}/contacts/${encodeURIComponent(t)}`,{method:"DELETE"}),m.toast.success(o("general:deletedSuccessfully")),n.closeModal(d),r.refresh()}return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(C,{slug:d,children:(0,l.jsxs)(x,{children:[(0,l.jsxs)(B,{children:[(0,l.jsx)("h1",{children:o("general:confirmDeletion")}),(0,l.jsx)("p",{children:`Remove contact ${a}?`})]}),(0,l.jsxs)(A,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,l.jsx)(T,{}),(0,l.jsx)(m.Button,{buttonStyle:"error",onClick:()=>{b().catch(w=>m.toast.error(w instanceof Error?w.message:"Delete failed"))},children:o("general:confirm")})]})]})}),(0,l.jsx)("button",{onClick:()=>n.openModal(d),type:"button",children:o("general:delete")})]})}function ae({audienceId:e,contact:t}){let a=(0,m.useModal)(),{t:n}=(0,m.useTranslation)(),o=qe.default.useId(),r=t?`edit-contact_${t.id}`:`create-contact_${e}_${o}`;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(ct,{audienceId:e,contact:t,modalSlug:r}),(0,l.jsx)(t?"button":m.Button,{...t?{}:{size:"large"},onClick:()=>a.openModal(r),type:"button",children:n(t?"general:edit":"general:createNew")})]})}function ct({audienceId:e,contact:t,modalSlug:a}){let n=(0,m.useModal)(),{t:o}=(0,m.useTranslation)(),r=(0,ge.useRouter)(),{requestJson:i}=S(),[,d]=(0,Le.useTransition)(),b=(w,k)=>{let v=k.email,M=String(k.firstName??""),q=String(k.lastName??""),U=!!k.subscribed;d(()=>{(async()=>{try{await i("/marketing/contacts",{body:JSON.stringify({audienceId:e,email:v,firstName:M,id:t?.id,lastName:q,subscribed:U}),method:"POST"}),m.toast.success(t?"Contact updated.":"Contact created."),n.closeModal(a),r.refresh()}catch(Y){m.toast.error(Y instanceof Error?Y.message:"Save failed")}})()})};return(0,l.jsx)(C,{slug:a,children:(0,l.jsx)(x,{style:{width:"100%",maxWidth:"32rem"},children:(0,l.jsxs)(B,{children:[(0,l.jsx)("h1",{children:o(t?"general:edit":"general:createNew")}),(0,l.jsxs)(m.Form,{className:"flex w-full flex-col gap-6",initialState:{email:{value:t?.email??""},firstName:{value:t?.firstName??""},lastName:{value:t?.lastName??""},subscribed:{value:t?.subscribed!==!1}},onSubmit:b,waitForAutocomplete:!0,children:[(0,l.jsx)(m.TextField,{field:{label:o("general:email"),name:"email",required:!0,type:"text"},path:"email",validate:w=>typeof w=="string"&&w.includes("@")?!0:"Valid email required"}),(0,l.jsx)(m.TextField,{field:{label:"First name",name:"firstName",type:"text"},path:"firstName"}),(0,l.jsx)(m.TextField,{field:{label:"Last name",name:"lastName",type:"text"},path:"lastName"}),(0,l.jsx)(m.CheckboxField,{field:{label:"Subscribed",name:"subscribed"},path:"subscribed"}),(0,l.jsxs)(A,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,l.jsx)(T,{}),(0,l.jsx)(m.Button,{size:"large",type:"submit",children:o(t?"general:save":"general:create")})]})]})]})})})}var c=require("@payloadcms/ui"),Oe=require("next/navigation"),Ve=L(require("react"),1);var f=require("react/jsx-runtime"),he="create-marketing-broadcast";function be({audiences:e,emailBroadcastTemplates:t,localeOptions:a,provider:n}){let o=(0,c.useModal)(),{t:r}=(0,c.useTranslation)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(mt,{audiences:e,emailBroadcastTemplates:t,localeOptions:a??[],provider:n}),(0,f.jsx)(c.Button,{onClick:()=>o.openModal(he),size:"large",type:"button",children:r("general:createNew")})]})}function ut({localeOptions:e,showReactEmailTemplates:t,showTemplateField:a,templateOptions:n}){let o=(0,c.useFormFields)(([r])=>{if(!t)return"html";let i=r?.broadcastFormat?.value;return typeof i=="string"&&i!==""?i:"html"});if(t){let r=o==="html";return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(c.SelectField,{field:{label:"Email content",name:"broadcastFormat",options:[{label:"<html>",value:"html"},...n.map(i=>({label:i.name,value:i.id}))],required:!0},path:"broadcastFormat"}),!r&&e.length>0?(0,f.jsx)(c.SelectField,{field:{label:"Locale",name:"locale",options:e,required:!1},path:"locale"}):null,r?(0,f.jsx)(c.TextareaField,{field:{admin:{description:"Shown when Email content is <html>."},label:"<html>",name:"htmlBody",required:!0},path:"htmlBody"}):null]})}return(0,f.jsxs)(f.Fragment,{children:[a?(0,f.jsx)(c.TextField,{field:{admin:{description:"Optional Mailchimp saved-template id (numeric string). Leave <html> empty when using templates."},label:"Template id",name:"templateId",required:!1,type:"text"},path:"templateId"}):null,(0,f.jsx)(c.TextareaField,{field:{admin:{description:a?"Optional plain HTML alternative to a Mailchimp template.":"HTML broadcast body."},label:a?"<html> (optional with Mailchimp)":"<html>",name:"htmlBody",required:!a},path:"htmlBody"})]})}function mt({audiences:e,emailBroadcastTemplates:t,localeOptions:a,provider:n}){let o=(0,Oe.useRouter)(),r=(0,c.useModal)(),{t:i}=(0,c.useTranslation)(),{requestJson:d}=S(),[b,w]=Ve.default.useState(!1),k=n==="mailchimp",v=t??[],M=n==="resend"&&v.length>0,q=(U,Y)=>{let N=Y,Me=N.audienceId,ke=N.name,ve=N.subject,Se=N.htmlBody,Ce=N.templateId,xe=N.replyTo,Be=N.broadcastFormat,Ae=N.locale,J=typeof Me=="string"?Me:"",j=typeof ke=="string"?ke.trim():"",z=typeof ve=="string"?ve.trim():"",D=typeof Se=="string"?Se.trim():"",le=typeof Ce=="string"?Ce.trim():"",K=typeof xe=="string"?xe.trim():"",Te=typeof Be=="string"?Be.trim():"html",Ye=typeof Ae=="string"?Ae.trim():"";w(!0),(async()=>{try{if(!J||!j||!z)throw new Error("Audience, name, and subject are required.");let Q=k,Ke=M&&Te!=="html";if(M)if(Ke)await d("/marketing/broadcasts",{body:JSON.stringify({audienceId:J,emailTemplateId:Te,locale:Ye||void 0,name:j,replyTo:K,subject:z}),method:"POST"});else if(D)await d("/marketing/broadcasts",{body:JSON.stringify({audienceId:J,html:D,name:j,replyTo:K,subject:z}),method:"POST"});else throw new Error("<html> is required when using the <html> content option.");else if(Q){if(!le&&!D)throw new Error("Provide <html> or a Mailchimp template id.");if(le&&D)throw new Error("Use either <html> or Mailchimp template id, not both.");await d("/marketing/broadcasts",{body:JSON.stringify({audienceId:J,html:D,name:j,replyTo:K,subject:z,templateId:le||void 0}),method:"POST"})}else if(D)await d("/marketing/broadcasts",{body:JSON.stringify({audienceId:J,html:D,name:j,replyTo:K,subject:z}),method:"POST"});else throw new Error("<html> is required for this provider.");r.closeModal(he),c.toast.success(i("general:successfullyCreated",{label:"Broadcast"})),o.refresh()}catch(Q){c.toast.error(Q instanceof Error?Q.message:"Create failed")}finally{w(!1)}})()};return(0,f.jsx)(c.Drawer,{slug:he,title:i("general:createNew"),children:(0,f.jsxs)(c.Form,{className:"flex w-full flex-col gap-8",initialState:M?{broadcastFormat:{value:"html"}}:{},onSubmit:q,waitForAutocomplete:!0,children:[(0,f.jsx)(c.SelectField,{field:{label:"Audience",name:"audienceId",options:e.map(U=>({label:U.name,value:U.id})),required:!0},path:"audienceId"}),(0,f.jsx)(c.TextField,{field:{label:"Campaign name",name:"name",required:!0,type:"text"},path:"name"}),(0,f.jsx)(c.TextField,{field:{label:"Subject",name:"subject",required:!0,type:"text"},path:"subject"}),(0,f.jsx)(c.TextField,{field:{label:"Reply-to (optional)",name:"replyTo",type:"text"},path:"replyTo"}),(0,f.jsx)(ut,{localeOptions:a,showReactEmailTemplates:M,showTemplateField:k,templateOptions:v}),(0,f.jsx)(c.Button,{className:"w-full",disabled:b,type:"submit",children:i("general:create")})]})})}var ze=require("react");var $e="payloadPluginMarketing";function Pe(e){return{read:e?.read??!0,write:e?.write??!0}}function $(e){return e?{audiences:Pe(e.audiences),contacts:Pe(e.contacts),broadcasts:Pe(e.broadcasts)}:{audiences:{read:!0,write:!0},broadcasts:{read:!0,write:!0},contacts:{read:!0,write:!0}}}function _e(e){let t=e.config.custom;if(!t||typeof t!="object")return;let a=t[$e];if(a?.adapter)return a}function R(e){let t=_e(e);if(!t)throw new Error(`${$e}: adapter missing on Payload config. Is marketingPlugin() registered?`);return t}function _(e){return _e(e)}var He=require("@payloadcms/next/templates"),Ue=require("react/jsx-runtime");function H({children:e,initPageResult:t,params:a,searchParams:n}){return(0,Ue.jsx)(He.DefaultTemplate,{i18n:t.req.i18n,locale:t.locale,params:a,payload:t.req.payload,permissions:t.permissions,searchParams:n,user:t.req.user??void 0,visibleEntities:t.visibleEntities,children:e})}function pt(e){if(typeof e=="string"&&e.trim())return e.trim();if(Array.isArray(e)&&typeof e[0]=="string"&&e[0].trim())return e[0].trim()}function Je(e){if(!e)return;let t=pt(e.id);if(t)return t;let a=e.segments,n=Array.isArray(a)?a.filter(i=>typeof i=="string"&&i.length>0):typeof a=="string"?a.split("/").filter(Boolean):[];if(n.length===0)return;let o=n.lastIndexOf("audience");if(o>=0&&n[o+1])return n[o+1];let r=n[n.length-1];if(r!=="audience")return r}var P=require("react/jsx-runtime");function oe({initPageResult:e,params:t,searchParams:a}){let n=Je(t);if(!n)throw new Error("No audience id in route params");return(0,P.jsx)(H,{initPageResult:e,params:t,searchParams:a,children:(0,P.jsx)(ne.Gutter,{children:(0,P.jsx)(ft,{audienceId:n,initPageResult:e})})})}async function ft({audienceId:e,initPageResult:t}){let a=_(t.req.payload);if(!a)return(0,P.jsx)("p",{role:"alert",children:"Marketing plugin is not configured (missing adapter on Payload config)."});let n=$(a.permissions);if(!n.audiences.read)return(0,P.jsx)("p",{role:"alert",children:"You do not have permission to view this audience."});let{adapter:o}=R(t.req.payload),r=await o.audiences.get(e);r||(0,je.notFound)();let i=o.urls?.audience?.(e);return(0,P.jsxs)(P.Fragment,{children:[(0,P.jsxs)("header",{className:"flex flex-col gap-4",children:[(0,P.jsx)("h1",{children:r.name}),i?(0,P.jsxs)(ne.Link,{href:i,rel:"noreferrer noopener",target:"_blank",children:["Open this audience in ",o.label]}):null]}),(0,P.jsxs)("div",{className:"mt-12 flex flex-col gap-6",children:[n.contacts.write?(0,P.jsx)("div",{children:(0,P.jsx)(ae,{audienceId:e,contact:null})}):null,n.contacts.read?(0,P.jsx)(ze.Suspense,{fallback:(0,P.jsx)("div",{"aria-busy":!0,style:{minHeight:"12rem"}}),children:(0,P.jsx)(gt,{audienceId:e,initPageResult:t})}):(0,P.jsx)("p",{role:"alert",children:"You do not have permission to list contacts."})]})]})}async function gt({audienceId:e,initPageResult:t}){let{adapter:a}=R(t.req.payload),n=await a.contacts.list({audienceId:e});return(0,P.jsx)(ye,{audienceId:e,contacts:n})}var E=require("@payloadcms/ui");var Ge=require("react");var g=require("react/jsx-runtime");function re({basePath:e="",initPageResult:t,params:a,searchParams:n}){return(0,g.jsx)(H,{initPageResult:t,params:a,searchParams:n,children:(0,g.jsx)(E.Gutter,{children:(0,g.jsx)(yt,{basePath:e,initPageResult:t})})})}function yt({basePath:e,initPageResult:t}){let a=_(t.req.payload);if(!a)return(0,g.jsx)("p",{role:"alert",children:"Marketing plugin is not configured (missing adapter on Payload config)."});let n=$(a.permissions);if(!n.audiences.read)return(0,g.jsx)("p",{role:"alert",children:"You do not have permission to view audiences."});let o=a.adapter.urls?.audiences;return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)("header",{className:"flex flex-col gap-4",children:[(0,g.jsx)("h1",{children:"Audiences"}),o?(0,g.jsxs)(E.Link,{href:o,rel:"noreferrer noopener",target:"_blank",children:["View audiences in ",a.adapter.label]}):null]}),(0,g.jsxs)("div",{className:"mt-4 flex flex-col gap-8",children:[n.audiences.write?(0,g.jsx)("div",{children:(0,g.jsx)(pe,{})}):null,(0,g.jsx)(Ge.Suspense,{fallback:(0,g.jsx)("div",{"aria-busy":!0,style:{minHeight:"4rem"}}),children:(0,g.jsx)(ht,{audiencesWrite:n.audiences.write,basePath:e,initPageResult:t})})]})]})}async function ht({audiencesWrite:e,basePath:t,initPageResult:a}){let{adapter:n}=R(a.req.payload),o=await n.audiences.list(),r={Heading:"Name",accessor:"name",active:!0,field:{name:"name",type:"text"},renderedCells:o.map(d=>(0,g.jsx)("div",{children:(0,g.jsx)(E.Link,{href:Ne(t,"audience",d.id),children:d.name})},d.id))},i={Heading:"",accessor:"",active:!0,field:{name:"_delete",type:"text"},renderedCells:o.map(d=>(0,g.jsx)("div",{children:(0,g.jsx)(fe,{audienceId:d.id,audienceName:d.name})},d.id))};return(0,g.jsx)(E.Table,{columns:e?[r,i]:[r],data:o})}var ie=require("@payloadcms/ui");var we=require("react");function bt(e){let{label:t,code:a}=e;if(typeof t=="string")return t;if(t&&typeof t=="object"){for(let n of Object.values(t))if(typeof n=="string")return n}return a}function We(e){let t=e.localization;if(t===!1||t===void 0)return[];let a=t.locales;return a?.length?a.map(n=>({label:bt(n),value:n.code})):[]}var y=require("react/jsx-runtime");function se({initPageResult:e,params:t,searchParams:a}){return(0,y.jsx)(H,{initPageResult:e,params:t,searchParams:a,children:(0,y.jsx)(ie.Gutter,{children:(0,y.jsx)(Pt,{initPageResult:e})})})}function Pt({initPageResult:e}){let t=_(e.req.payload);if(!t)return(0,y.jsx)("p",{role:"alert",children:"Marketing plugin is not configured (missing adapter on Payload config)."});let a=$(t.permissions);if(!a.broadcasts.read)return(0,y.jsx)("p",{role:"alert",children:"You do not have permission to view broadcasts."});let{adapter:n}=R(e.req.payload),o=n.urls?.broadcasts;return(0,y.jsxs)(y.Fragment,{children:[(0,y.jsxs)("header",{className:"flex flex-col gap-4",children:[(0,y.jsx)("h1",{children:"Campaigns"}),o?(0,y.jsxs)(ie.Link,{href:o,rel:"noreferrer noopener",target:"_blank",children:["View campaigns in ",n.label]}):null]}),(0,y.jsxs)("div",{className:"mt-4 flex flex-col gap-8",children:[a.broadcasts.write?(0,y.jsx)("div",{children:(0,y.jsx)(we.Suspense,{fallback:(0,y.jsx)("div",{"aria-busy":!0,style:{minHeight:"2.5rem"}}),children:(0,y.jsx)(wt,{initPageResult:e})})}):null,(0,y.jsx)(we.Suspense,{fallback:(0,y.jsx)("div",{"aria-busy":!0,style:{minHeight:"4rem"}}),children:(0,y.jsx)(Mt,{initPageResult:e})})]})]})}async function wt({initPageResult:e}){let t=R(e.req.payload),{adapter:a}=t,n=await a.audiences.list(),o=t.emailBroadcastTemplates?.map(({id:i,name:d})=>({id:i,name:d}))??[],r=We(e.req.payload.config);return(0,y.jsx)(be,{audiences:n,emailBroadcastTemplates:o,localeOptions:r,provider:a.provider})}async function Mt({initPageResult:e}){let{adapter:t}=R(e.req.payload),n=(await t.broadcasts.list()).map(o=>({...o,externalDashboardUrl:t.urls?.broadcast?.(o.id)}));return(0,y.jsx)(ce,{broadcasts:n})}0&&(module.exports={AudienceDetail,AudienceList,BroadcastList});
2
+ //# sourceMappingURL=server.cjs.map