payload-plugin-marketing 0.9.3 → 0.9.5

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 (62) hide show
  1. package/README.md +68 -19
  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 -1
  9. package/dist/admin/components/broadcast-list.d.ts.map +1 -1
  10. package/dist/admin/components/broadcasts-table.d.ts.map +1 -1
  11. package/dist/admin/components/contacts-table.d.ts.map +1 -1
  12. package/dist/admin/components/create-broadcast-button.d.ts +9 -1
  13. package/dist/admin/components/create-broadcast-button.d.ts.map +1 -1
  14. package/dist/admin/components/marketing-components.d.ts +0 -6
  15. package/dist/admin/components/marketing-components.d.ts.map +1 -1
  16. package/dist/admin/components/marketing-view-shell.d.ts.map +1 -1
  17. package/dist/admin/components/payload-modal.d.ts +8 -8
  18. package/dist/admin/components/payload-modal.d.ts.map +1 -1
  19. package/dist/admin/constants.cjs +2 -0
  20. package/dist/admin/constants.cjs.map +1 -0
  21. package/dist/admin/constants.d.ts +2 -0
  22. package/dist/admin/constants.d.ts.map +1 -0
  23. package/dist/admin/constants.js +2 -0
  24. package/dist/admin/constants.js.map +1 -0
  25. package/dist/admin/index.cjs +1 -1
  26. package/dist/admin/index.cjs.map +1 -1
  27. package/dist/admin/index.d.ts +3 -3
  28. package/dist/admin/index.d.ts.map +1 -1
  29. package/dist/admin/index.js +1 -1
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/locale-options.d.ts +7 -0
  32. package/dist/admin/locale-options.d.ts.map +1 -0
  33. package/dist/admin/server.cjs +2 -0
  34. package/dist/admin/server.cjs.map +1 -0
  35. package/dist/admin/server.d.ts +2 -0
  36. package/dist/admin/server.d.ts.map +1 -0
  37. package/dist/admin/server.js +2 -0
  38. package/dist/admin/server.js.map +1 -0
  39. package/dist/admin/use-marketing-api.d.ts.map +1 -1
  40. package/dist/{chunk-S2EABBIN.js → chunk-G6DIJ7B2.js} +1 -1
  41. package/dist/chunk-G6DIJ7B2.js.map +1 -0
  42. package/dist/email-broadcast-template.d.ts +15 -0
  43. package/dist/email-broadcast-template.d.ts.map +1 -0
  44. package/dist/endpoints/marketing-endpoints.d.ts.map +1 -1
  45. package/dist/form-builder/index.cjs.map +1 -1
  46. package/dist/form-builder/index.js +1 -1
  47. package/dist/form-builder/normalize-placeholder-rows.d.ts.map +1 -1
  48. package/dist/index.cjs +1 -1
  49. package/dist/index.cjs.map +1 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/marketing-integration.d.ts +2 -1
  55. package/dist/marketing-integration.d.ts.map +1 -1
  56. package/dist/plugin.d.ts.map +1 -1
  57. package/dist/types.d.ts +31 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/package.json +10 -2
  60. package/dist/chunk-S2EABBIN.js.map +0 -1
  61. package/dist/chunk-SX3OTOU2.js +0 -2
  62. package/dist/chunk-SX3OTOU2.js.map +0 -1
@@ -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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"audience-buttons.d.ts","sourceRoot":"","sources":["../../../src/admin/components/audience-buttons.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,oBAAoB,4CAYnC;AA6DD,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,YAAY,GACb,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;CACrB,2CA4CA"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast-list.d.ts","sourceRoot":"","sources":["../../../src/admin/components/broadcast-list.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAGnD,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
+ {"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 +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,2CAgFnE;AAsED,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,aAAa,GACd,EAAE;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;CACtB,2CAkEA"}
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 +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;AAInD,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;AAwDD,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,OAAO,GACR,EAAE;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAA;CACjC,2CAgBA"}
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"}
@@ -1,6 +1,14 @@
1
1
  import type { MarketingAudience } from "../../types";
2
- export declare function CreateBroadcastButton({ audiences, provider, }: {
2
+ export declare function CreateBroadcastButton({ audiences, emailBroadcastTemplates, localeOptions, provider, }: {
3
3
  audiences: MarketingAudience[];
4
+ emailBroadcastTemplates?: {
5
+ id: string;
6
+ name: string;
7
+ }[];
8
+ localeOptions?: {
9
+ label: string;
10
+ value: string;
11
+ }[];
4
12
  provider: string;
5
13
  }): import("react/jsx-runtime").JSX.Element;
6
14
  //# sourceMappingURL=create-broadcast-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-broadcast-button.d.ts","sourceRoot":"","sources":["../../../src/admin/components/create-broadcast-button.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAMpD,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAA;CACjB,2CAYA"}
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
18
  //# sourceMappingURL=marketing-components.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"marketing-components.d.ts","sourceRoot":"","sources":["../../../src/admin/components/marketing-components.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAkBvD,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;AAED,wBAAgB,eAAe,CAAC,EAC9B,UAAU,GACX,EAAE;IACD,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChD,2CAYA"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"marketing-view-shell.d.ts","sourceRoot":"","sources":["../../../src/admin/components/marketing-view-shell.tsx"],"names":[],"mappings":"AACA,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"}
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"}
@@ -1,13 +1,13 @@
1
- import React from "react";
2
1
  import { Button, Modal } from "@payloadcms/ui";
2
+ import React from "react";
3
3
  interface PayloadModalProps extends React.ComponentProps<typeof Modal> {
4
4
  children: React.ReactNode;
5
5
  }
6
- declare function PayloadModal({ children, className: _className, slug: modalSlug, ...props }: PayloadModalProps): import("react/jsx-runtime").JSX.Element;
7
- declare function PayloadModalContent({ children, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
8
- declare function PayloadModalBody({ children, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
9
- declare function PayloadModalTitle({ children, ...props }: React.ComponentProps<"h1">): import("react/jsx-runtime").JSX.Element;
10
- declare function PayloadModalFooter({ children, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
11
- declare function PayloadModalClose({ children, className: _className, ...props }: React.ComponentProps<typeof Button>): import("react/jsx-runtime").JSX.Element;
12
- export { PayloadModal, PayloadModalBody, PayloadModalClose, PayloadModalContent, PayloadModalFooter, PayloadModalTitle, };
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
13
  //# sourceMappingURL=payload-modal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"payload-modal.d.ts","sourceRoot":"","sources":["../../../src/admin/components/payload-modal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,EAAE,KAAK,EAA4B,MAAM,gBAAgB,CAAA;AAIxE,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,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,2CAgBtG;AAED,iBAAS,mBAAmB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAM/E;AAED,iBAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAM5E;AAED,iBAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,2CAM5E;AAED,iBAAS,kBAAkB,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAM9E;AAED,iBAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,2CAmB5G;AAED,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,GAClB,CAAA"}
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,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 We=Object.create;var W=Object.defineProperty;var Ye=Object.getOwnPropertyDescriptor;var Ke=Object.getOwnPropertyNames;var Qe=Object.getPrototypeOf,Xe=Object.prototype.hasOwnProperty;var Ze=(e,t)=>{for(var a in t)W(e,a,{get:t[a],enumerable:!0})},Me=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ke(t))!Xe.call(e,r)&&r!==a&&W(e,r,{get:()=>t[r],enumerable:!(n=Ye(t,r))||n.enumerable});return e};var L=(e,t,a)=>(a=e!=null?We(Qe(e)):{},Me(t||!e||!e.__esModule?W(a,"default",{value:e,enumerable:!0}):a,e)),et=e=>Me(W({},"__esModule",{value:!0}),e);var ht={};Ze(ht,{AudienceDetail:()=>Z,AudienceList:()=>ee,AudienceSelect:()=>we,AudienceTable:()=>Se,BroadcastList:()=>ne,BroadcastsTable:()=>Ce,ContactsTable:()=>xe,MarketingMenu:()=>ve,defaultAdminComponentPath:()=>bt});module.exports=et(ht);var K=L(require("react"),1),E=require("@payloadcms/ui");var ke=require("@payloadcms/ui"),Y=require("react");function S(){let e=(0,ke.useConfig)(),t=(0,Y.useMemo)(()=>`${e.serverURL??""}${e.routes?.api??"/api"}`,[e.routes?.api,e.serverURL]),a=(0,Y.useCallback)(async(n,r)=>{let{headers:o,...i}=r??{},d=new Headers(r?.headers);i.body!==void 0&&i.body!==""&&i.body!==null&&(d.has("Content-Type")||d.set("Content-Type","application/json"));let c=await fetch(`${t}${n}`,{...i,credentials:"include",headers:d});if(!c.ok){let M=`${c.status} ${c.statusText}`;try{let v=await c.json();typeof v.message=="string"&&(M=v.message)}catch{}throw new Error(M)}if(c.status!==204)try{return await c.json()}catch{return}},[t]);return{base:t,requestJson:a}}function tt(e,...t){let a=e.replace(/\/+$/,"")||"",n=t.flatMap(o=>String(o).split("/")).map(o=>o.replace(/^\/+|\/+$/g,"")).filter(Boolean).join("/");return(a===""?`/${n}`:`${a}/${n}`).replace(/\/{2,}/g,"/")}function U(e,...t){let n=[e?.replace(/^\/+|\/+$/g,"")??"",...t].filter(Boolean);return tt("/admin",...n)}var h=require("react/jsx-runtime");function at(e){if(!Array.isArray(e))return[];let t=[];for(let a of e){if(!a||typeof a!="object")continue;let n=a,r=n.id,o=n.name;typeof r=="string"&&typeof o=="string"&&t.push({id:r,name:o})}return t}var we=({field:e,path:t,readOnly:a})=>{let{requestJson:n}=S(),[r,o]=K.default.useState([]),[i,d]=K.default.useState(null);return K.default.useEffect(()=>{let c=!1;return(async()=>{try{let M=await n("/marketing/audiences");c||(o(at(M)),d(null))}catch(M){c||d(M instanceof Error?M.message:"Failed to load audiences")}})(),()=>{c=!0}},[n]),(0,h.jsxs)("div",{className:"field-type relative",children:[i?(0,h.jsx)("p",{className:"text-red-500",role:"alert",children:i}):null,(0,h.jsx)(E.SelectField,{field:{label:typeof e.label=="string"?e.label:"Audience",name:e.name,options:r.map(c=>({label:c.name,value:c.id})),required:e.required===!0,type:"select"},path:t,readOnly:a})]})};function ve({basePath:e=""}){return(0,h.jsxs)(E.NavGroup,{isOpen:!0,label:"Marketing",children:[(0,h.jsx)(E.Link,{className:"nav__link",href:U(e,"audience"),children:"Audience"}),(0,h.jsx)(E.Link,{className:"nav__link",href:U(e,"broadcast"),children:"Broadcast"})]})}function Se({audiences:e}){return(0,h.jsx)("table",{children:(0,h.jsx)("tbody",{children:e.map(t=>(0,h.jsx)("tr",{children:(0,h.jsx)("td",{children:t.name})},t.id))})})}function xe({contacts:e}){return(0,h.jsx)("table",{children:(0,h.jsx)("tbody",{children:e.map(t=>(0,h.jsx)("tr",{children:(0,h.jsx)("td",{children:t.email})},t.id))})})}function Ce({broadcasts:e}){return(0,h.jsx)("table",{children:(0,h.jsx)("tbody",{children:e.map(t=>(0,h.jsx)("tr",{children:(0,h.jsx)("td",{children:t.name})},t.id))})})}var Ee=require("react"),qe=require("next/navigation"),X=require("@payloadcms/ui");var Ae="payloadPluginMarketing";function oe(e){return{read:e?.read??!0,write:e?.write??!0}}function V(e){return e?{audiences:oe(e.audiences),contacts:oe(e.contacts),broadcasts:oe(e.broadcasts)}:{audiences:{read:!0,write:!0},broadcasts:{read:!0,write:!0},contacts:{read:!0,write:!0}}}function Be(e){let t=e.config.custom;if(!t||typeof t!="object")return;let a=t[Ae];if(a?.adapter)return a}function C(e){let t=Be(e);if(!t)throw new Error(`${Ae}: adapter missing on Payload config. Is marketingPlugin() registered?`);return t}function $(e){return Be(e)}var Q=L(require("react"),1),u=require("@payloadcms/ui"),ie=require("next/navigation"),Ne=L(require("react"),1),Te=require("react");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 J=L(require("react"),1),F=require("@payloadcms/ui"),I=require("react/jsx-runtime"),Re=J.default.createContext({modalSlug:""});function A({children:e,className:t,slug:a,...n}){let[r,o]=J.default.useState(!1);return J.default.useEffect(()=>{o(!0)},[]),(0,I.jsx)(Re.Provider,{value:{modalSlug:a},children:r&&(0,I.jsx)(F.Modal,{slug:a,...n,children:e})})}function B({children:e,...t}){return(0,I.jsx)("div",{"data-slot":"payload-modal-content",...t,children:e})}function R({children:e,...t}){return(0,I.jsx)("div",{"data-slot":"payload-modal-body",...t,children:e})}function H({children:e,...t}){return(0,I.jsx)("h1",{"data-slot":"payload-modal-title",...t,children:e})}function N({children:e,...t}){return(0,I.jsx)("div",{"data-slot":"payload-modal-footer",...t,children:e})}function T({children:e,className:t,...a}){let{t:n}=(0,F.useTranslation)(),{modalSlug:r}=J.default.useContext(Re),o=(0,F.useModal)();return(0,I.jsx)(F.Button,{buttonStyle:"secondary","data-slot":"payload-modal-close",size:"large",...a,onClick:i=>{o.closeModal(r),a.onClick?.(i)},children:e??n("general:cancel")})}var l=require("react/jsx-runtime");function Ie({audienceId:e,contacts:t}){let[a,n]=Q.default.useState(1),[r]=Q.default.useState(100),o=Q.default.useMemo(()=>t.slice((a-1)*r,a*r),[t,r,a]);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(u.Table,{columns:[{Heading:"First name",accessor:"firstName",active:!0,field:{name:"firstName",type:"text"},renderedCells:o.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:o.map(i=>(0,l.jsx)("div",{children:i.lastName??"\u2014"},i.id))},{Heading:"Email",accessor:"email",active:!0,field:{name:"email",type:"text"},renderedCells:o.map(i=>(0,l.jsx)("div",{children:i.email},i.id))},{Heading:"Created",accessor:"createdAt",active:!0,field:{name:"createdAt",type:"text"},renderedCells:o.map(i=>(0,l.jsx)("div",{children:G(i.createdAt)},i.id))},{Heading:"Status",accessor:"subscribed",active:!0,field:{name:"subscribed",type:"text"},renderedCells:o.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)(se,{audienceId:e,contact:i}),(0,l.jsx)(nt,{audienceId:e,contactEmail:i.email,contactId:i.id})]},i.id))}],data:o}),(0,l.jsx)(u.Pagination,{hasNextPage:a*r<t.length,hasPrevPage:a>1,limit:r,onChange:i=>{n(i)},page:a,totalPages:Math.ceil(t.length/r)})]})}function nt({audienceId:e,contactId:t,contactEmail:a}){let n=(0,u.useModal)(),{t:r}=(0,u.useTranslation)(),o=(0,ie.useRouter)(),{requestJson:i}=S(),d=`delete-contact_${t}`;async function c(){await i(`/marketing/audiences/${encodeURIComponent(e)}/contacts/${encodeURIComponent(t)}`,{method:"DELETE"}),u.toast.success(r("general:deletedSuccessfully")),n.closeModal(d),o.refresh()}return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(A,{slug:d,children:(0,l.jsxs)(B,{children:[(0,l.jsxs)(R,{children:[(0,l.jsx)("h1",{children:r("general:confirmDeletion")}),(0,l.jsx)("p",{children:`Remove contact ${a}?`})]}),(0,l.jsxs)(N,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,l.jsx)(T,{}),(0,l.jsx)(u.Button,{buttonStyle:"error",onClick:()=>{c().catch(M=>u.toast.error(M instanceof Error?M.message:"Delete failed"))},children:r("general:confirm")})]})]})}),(0,l.jsx)("button",{onClick:()=>n.openModal(d),type:"button",children:r("general:delete")})]})}function se({audienceId:e,contact:t}){let a=(0,u.useModal)(),{t:n}=(0,u.useTranslation)(),r=Ne.default.useId(),o=t?`edit-contact_${t.id}`:`create-contact_${e}_${r}`;return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(rt,{audienceId:e,contact:t,modalSlug:o}),(0,l.jsx)(t?"button":u.Button,{...t?{}:{size:"large"},onClick:()=>a.openModal(o),type:"button",children:n(t?"general:edit":"general:createNew")})]})}function rt({audienceId:e,contact:t,modalSlug:a}){let n=(0,u.useModal)(),{t:r}=(0,u.useTranslation)(),o=(0,ie.useRouter)(),{requestJson:i}=S(),[,d]=(0,Te.useTransition)(),c=(M,v)=>{let x=v.email,k=String(v.firstName??""),D=String(v.lastName??""),j=!!v.subscribed;d(()=>{(async()=>{try{await i("/marketing/contacts",{body:JSON.stringify({audienceId:e,email:x,firstName:k,id:t?.id,lastName:D,subscribed:j}),method:"POST"}),u.toast.success(t?"Contact updated.":"Contact created."),n.closeModal(a),o.refresh()}catch(O){u.toast.error(O instanceof Error?O.message:"Save failed")}})()})};return(0,l.jsx)(A,{slug:a,children:(0,l.jsx)(B,{style:{width:"100%",maxWidth:"32rem"},children:(0,l.jsxs)(R,{children:[(0,l.jsx)("h1",{children:r(t?"general:edit":"general:createNew")}),(0,l.jsxs)(u.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:c,waitForAutocomplete:!0,children:[(0,l.jsx)(u.TextField,{field:{label:r("general:email"),name:"email",required:!0,type:"text"},path:"email",validate:M=>typeof M=="string"&&M.includes("@")?!0:"Valid email required"}),(0,l.jsx)(u.TextField,{field:{label:"First name",name:"firstName",type:"text"},path:"firstName"}),(0,l.jsx)(u.TextField,{field:{label:"Last name",name:"lastName",type:"text"},path:"lastName"}),(0,l.jsx)(u.CheckboxField,{field:{label:"Subscribed",name:"subscribed"},path:"subscribed"}),(0,l.jsxs)(N,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,l.jsx)(T,{}),(0,l.jsx)(u.Button,{size:"large",type:"submit",children:r(t?"general:save":"general:create")})]})]})]})})})}var Fe=require("@payloadcms/next/templates"),De=require("react/jsx-runtime");function _({children:e,initPageResult:t,params:a,searchParams:n}){return(0,De.jsx)(Fe.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 ot(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 Le(e){if(!e)return;let t=ot(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 r=n.lastIndexOf("audience");if(r>=0&&n[r+1])return n[r+1];let o=n[n.length-1];if(o!=="audience")return o}var b=require("react/jsx-runtime");function Z({initPageResult:e,params:t,searchParams:a}){let n=Le(t);if(!n)throw new Error("No audience id in route params");return(0,b.jsx)(_,{initPageResult:e,params:t,searchParams:a,children:(0,b.jsx)(X.Gutter,{children:(0,b.jsx)(it,{audienceId:n,initPageResult:e})})})}async function it({audienceId:e,initPageResult:t}){let a=$(t.req.payload);if(!a)return(0,b.jsx)("p",{role:"alert",children:"Marketing plugin is not configured (missing adapter on Payload config)."});let n=V(a.permissions);if(!n.audiences.read)return(0,b.jsx)("p",{role:"alert",children:"You do not have permission to view this audience."});let{adapter:r}=C(t.req.payload),o=await r.audiences.get(e);o||(0,qe.notFound)();let i=r.urls?.audience?.(e);return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("header",{className:"flex flex-col gap-4",children:[(0,b.jsx)("h1",{children:o.name}),i?(0,b.jsxs)(X.Link,{href:i,rel:"noreferrer noopener",target:"_blank",children:["Open this audience in ",r.label]}):null]}),(0,b.jsxs)("div",{className:"mt-12 flex flex-col gap-6",children:[n.contacts.write?(0,b.jsx)("div",{children:(0,b.jsx)(se,{audienceId:e,contact:null})}):null,n.contacts.read?(0,b.jsx)(Ee.Suspense,{fallback:(0,b.jsx)("div",{"aria-busy":!0,style:{minHeight:"12rem"}}),children:(0,b.jsx)(st,{audienceId:e,initPageResult:t})}):(0,b.jsx)("p",{role:"alert",children:"You do not have permission to list contacts."})]})]})}async function st({audienceId:e,initPageResult:t}){let{adapter:a}=C(t.req.payload),n=await a.contacts.list({audienceId:e});return(0,b.jsx)(Ie,{audienceId:e,contacts:n})}var _e=require("react"),q=require("@payloadcms/ui");var Ve=require("react"),P=require("@payloadcms/ui"),de=require("next/navigation");var p=require("react/jsx-runtime"),le="create-audience";function $e(){let e=(0,P.useModal)(),{t}=(0,P.useTranslation)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(lt,{}),(0,p.jsx)(P.Button,{onClick:()=>e.openModal(le),size:"large",type:"button",children:t("general:createNew")})]})}function lt(){let e=(0,P.useModal)(),{t}=(0,P.useTranslation)(),a=(0,de.useRouter)(),{requestJson:n}=S(),[r,o]=(0,Ve.useTransition)();return(0,p.jsx)(A,{closeOnBlur:!0,slug:le,children:(0,p.jsx)(B,{style:{width:"100%",maxWidth:"24rem"},children:(0,p.jsx)(P.Form,{initialState:{},onSubmit:(d,c)=>{let v=c.audienceName,x=typeof v=="string"?v.trim():"";o(()=>{(async()=>{try{if(!x)throw new Error("Name is required.");await n("/marketing/audiences",{body:JSON.stringify({name:x}),method:"POST"}),e.closeModal(le),P.toast.success(t("general:successfullyCreated")),a.refresh()}catch(k){P.toast.error(k instanceof Error?k.message:"Create failed")}})()})},waitForAutocomplete:!0,children:(0,p.jsxs)(R,{children:[(0,p.jsx)(H,{children:t("general:createNew")}),(0,p.jsx)(P.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)(N,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,p.jsx)(T,{}),(0,p.jsx)(P.Button,{disabled:r,size:"large",type:"submit",children:t("general:confirm")})]})]})})})})}function He({audienceId:e,audienceName:t}){let a=(0,P.useModal)(),{t:n}=(0,P.useTranslation)(),r=(0,de.useRouter)(),{requestJson:o}=S(),i=`delete-audience_${e}`;async function d(){await o(`/marketing/audiences/${encodeURIComponent(e)}`,{method:"DELETE"}),P.toast.success(n("general:deletedSuccessfully")),a.closeModal(i),r.refresh()}return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(A,{slug:i,children:(0,p.jsxs)(B,{children:[(0,p.jsxs)(R,{children:[(0,p.jsx)(H,{children:n("general:confirmDeletion")}),(0,p.jsx)("p",{children:`Remove audience "${t}"?`})]}),(0,p.jsxs)(N,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,p.jsx)(T,{}),(0,p.jsx)(P.Button,{buttonStyle:"error",onClick:()=>{d().catch(c=>P.toast.error(c instanceof Error?c.message:"Delete failed"))},children:n("general:confirm")})]})]})}),(0,p.jsx)("button",{onClick:()=>a.openModal(i),type:"button",children:n("general:delete")})]})}var g=require("react/jsx-runtime");function ee({basePath:e="",initPageResult:t,params:a,searchParams:n}){return(0,g.jsx)(_,{initPageResult:t,params:a,searchParams:n,children:(0,g.jsx)(q.Gutter,{children:(0,g.jsx)(dt,{basePath:e,initPageResult:t})})})}function dt({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=V(a.permissions);if(!n.audiences.read)return(0,g.jsx)("p",{role:"alert",children:"You do not have permission to view audiences."});let r=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"}),r?(0,g.jsxs)(q.Link,{href:r,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)($e,{})}):null,(0,g.jsx)(_e.Suspense,{fallback:(0,g.jsx)("div",{"aria-busy":!0,style:{minHeight:"4rem"}}),children:(0,g.jsx)(ct,{audiencesWrite:n.audiences.write,basePath:e,initPageResult:t})})]})]})}async function ct({audiencesWrite:e,basePath:t,initPageResult:a}){let{adapter:n}=C(a.req.payload),r=await n.audiences.list(),o={Heading:"Name",accessor:"name",active:!0,field:{name:"name",type:"text"},renderedCells:r.map(d=>(0,g.jsx)("div",{children:(0,g.jsx)(q.Link,{href:U(t,"audience",d.id),children:d.name})},d.id))},i={Heading:"",accessor:"",active:!0,field:{name:"_delete",type:"text"},renderedCells:r.map(d=>(0,g.jsx)("div",{children:(0,g.jsx)(He,{audienceId:d.id,audienceName:d.name})},d.id))};return(0,g.jsx)(q.Table,{columns:e?[o,i]:[o],data:r})}var me=require("react"),ae=require("@payloadcms/ui");var te=L(require("react"),1),m=require("@payloadcms/ui"),Oe=L(require("next/link"),1),ce=require("next/navigation");var s=require("react/jsx-runtime");function Ue({broadcasts:e}){let[t,a]=te.default.useState(1),[n]=te.default.useState(100),r=te.default.useMemo(()=>e.slice((t-1)*n,t*n),[e,n,t]);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(m.Table,{columns:[{Heading:"Campaign name",accessor:"name",active:!0,field:{name:"name",type:"text"},renderedCells:r.map(o=>(0,s.jsx)("div",{children:o.name},o.id))},{Heading:"Schedule date",accessor:"scheduledAt",active:!0,field:{name:"scheduledAt",type:"text"},renderedCells:r.map(o=>(0,s.jsx)("div",{children:G(o.scheduledAt)},o.id))},{Heading:"Sent date",accessor:"sentAt",active:!0,field:{name:"sentAt",type:"text"},renderedCells:r.map(o=>(0,s.jsx)("div",{children:G(o.sentAt)},o.id))},{Heading:"Status",accessor:"status",active:!0,field:{name:"status",type:"text"},renderedCells:r.map(o=>(0,s.jsx)("div",{children:(0,s.jsx)(ut,{status:o.status})},o.id))},{Heading:"",accessor:"",active:!0,field:{name:"_",type:"text"},renderedCells:r.map(o=>(0,s.jsxs)("div",{className:"flex items-center gap-4 flex-wrap",children:[o.externalDashboardUrl?(0,s.jsx)(Oe.default,{href:o.externalDashboardUrl,rel:"noreferrer noopener",target:"_blank",children:(0,s.jsx)(m.Pill,{children:"dashboard \u2197"})}):null,o.status==="draft"||o.status==="save"?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(mt,{broadcastId:o.id,broadcastName:o.name}),(0,s.jsx)(pt,{broadcastId:o.id,broadcastName:o.name})]}):null]},o.id))}],data:r}),(0,s.jsx)(m.Pagination,{hasNextPage:t*n<e.length,hasPrevPage:t>1,limit:n,onChange:o=>a(o),page:t,totalPages:Math.ceil(e.length/n)})]})}function ut({status:e}){switch(e){case"draft":case"save":return(0,s.jsx)(m.Pill,{pillStyle:"light-gray",children:"Draft"});case"queued":return(0,s.jsx)(m.Pill,{pillStyle:"white",children:"Queued"});case"sent":return(0,s.jsx)(m.Pill,{pillStyle:"success",children:"Sent"});default:return(0,s.jsx)(m.Pill,{children:e})}}function mt({broadcastId:e,broadcastName:t}){let a=(0,m.useModal)(),{t:n}=(0,m.useTranslation)(),r=(0,ce.useRouter)(),{requestJson:o}=S(),i=`delete-broadcast_${e}`;async function d(){await o(`/marketing/broadcasts/${encodeURIComponent(e)}`,{method:"DELETE"}),m.toast.success(n("general:deletedSuccessfully")),a.closeModal(i),r.refresh()}return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(A,{slug:i,children:(0,s.jsxs)(B,{children:[(0,s.jsxs)(R,{children:[(0,s.jsx)(H,{children:n("general:confirmDeletion")}),(0,s.jsx)("p",{children:`Delete draft broadcast "${t}"?`})]}),(0,s.jsxs)(N,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,s.jsx)(T,{}),(0,s.jsx)(m.Button,{buttonStyle:"error",onClick:()=>{d().catch(c=>m.toast.error(c instanceof Error?c.message:"Delete failed"))},children:n("general:confirm")})]})]})}),(0,s.jsx)("button",{onClick:()=>a.openModal(i),type:"button",children:n("general:delete")})]})}function pt({broadcastId:e,broadcastName:t}){let a=(0,m.useModal)(),{t:n}=(0,m.useTranslation)(),r=(0,ce.useRouter)(),{requestJson:o}=S(),i=`send-broadcast_${e}`,d=(c,M)=>{let x=M.scheduledAt,k="";typeof x=="string"?k=x:x instanceof Date&&(k=x.toISOString()),(async()=>{try{await o(`/marketing/broadcasts/${encodeURIComponent(e)}/send`,{body:JSON.stringify({...k&&k.trim()!==""?{scheduledAt:k.trim()}:{}}),method:"POST"}),a.closeModal(i),m.toast.success(n("general:success")),r.refresh()}catch(D){m.toast.error(D instanceof Error?D.message:"Send failed")}})()};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(A,{slug:i,children:(0,s.jsx)(B,{style:{width:"100%",maxWidth:"24rem"},children:(0,s.jsxs)(R,{children:[(0,s.jsx)(H,{children:`Send \u201C${t}\u201D`}),(0,s.jsxs)(m.Form,{initialState:{},onSubmit:d,waitForAutocomplete:!0,children:[(0,s.jsx)(m.DateTimeField,{field:{label:"Schedule at (optional)",name:"scheduledAt",required:!1},path:"scheduledAt"}),(0,s.jsxs)(N,{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[(0,s.jsx)(T,{}),(0,s.jsx)(m.Button,{size:"large",type:"submit",children:"Send"})]})]})]})})}),(0,s.jsx)(m.Pill,{pillStyle:"dark",onClick:()=>a.openModal(i),size:"small",children:"Send"})]})}var Ge=L(require("react"),1),f=require("@payloadcms/ui"),Je=require("next/navigation");var w=require("react/jsx-runtime"),ue="create-marketing-broadcast";function je({audiences:e,provider:t}){let a=(0,f.useModal)(),{t:n}=(0,f.useTranslation)();return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(ft,{audiences:e,provider:t}),(0,w.jsx)(f.Button,{onClick:()=>a.openModal(ue),size:"large",type:"button",children:n("general:createNew")})]})}function ft({audiences:e,provider:t}){let a=(0,Je.useRouter)(),n=(0,f.useModal)(),{t:r}=(0,f.useTranslation)(),{requestJson:o}=S(),[i,d]=Ge.default.useState(!1),c=t==="mailchimp",M=(v,x)=>{let k=x,D=k.audienceId,j=k.name,O=k.subject,pe=k.htmlBody,fe=k.templateId,ge=k.replyTo,ye=typeof D=="string"?D:"",Pe=typeof j=="string"?j.trim():"",be=typeof O=="string"?O.trim():"",z=typeof pe=="string"?pe.trim():"",re=typeof fe=="string"?fe.trim():"",ze=typeof ge=="string"?ge.trim():"";d(!0),(async()=>{try{if(!ye||!Pe||!be)throw new Error("Audience, name, and subject are required.");if(c){if(!re&&!z)throw new Error("Provide an HTML body or Mailchimp template id.");if(re&&z)throw new Error("Use either HTML body or Mailchimp template id, not both.")}else if(!z)throw new Error("HTML body is required for this provider.");await o("/marketing/broadcasts",{body:JSON.stringify({audienceId:ye,html:z,name:Pe,replyTo:ze,subject:be,templateId:re||void 0}),method:"POST"}),n.closeModal(ue),f.toast.success(r("general:successfullyCreated",{label:"Broadcast"})),a.refresh()}catch(he){f.toast.error(he instanceof Error?he.message:"Create failed")}finally{d(!1)}})()};return(0,w.jsx)(f.Drawer,{slug:ue,title:r("general:createNew"),children:(0,w.jsxs)(f.Form,{className:"flex w-full flex-col gap-8",initialState:{},onSubmit:M,waitForAutocomplete:!0,children:[(0,w.jsx)(f.SelectField,{field:{label:"Audience",name:"audienceId",options:e.map(v=>({label:v.name,value:v.id})),required:!0},path:"audienceId"}),(0,w.jsx)(f.TextField,{field:{label:"Campaign name",name:"name",required:!0,type:"text"},path:"name"}),(0,w.jsx)(f.TextField,{field:{label:"Subject",name:"subject",required:!0,type:"text"},path:"subject"}),(0,w.jsx)(f.TextField,{field:{label:"Reply-to (optional)",name:"replyTo",type:"text"},path:"replyTo"}),c?(0,w.jsx)(f.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,w.jsx)(f.TextareaField,{field:{admin:{description:c?"Optional plain HTML alternative to a Mailchimp template.":"HTML broadcast body."},label:c?"HTML body (optional with Mailchimp)":"HTML body",name:"htmlBody",required:!c},path:"htmlBody"}),(0,w.jsx)(f.Button,{className:"w-full",disabled:i,type:"submit",children:r("general:create")})]})})}var y=require("react/jsx-runtime");function ne({initPageResult:e,params:t,searchParams:a}){return(0,y.jsx)(_,{initPageResult:e,params:t,searchParams:a,children:(0,y.jsx)(ae.Gutter,{children:(0,y.jsx)(gt,{initPageResult:e})})})}function gt({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=V(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}=C(e.req.payload),r=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"}),r?(0,y.jsxs)(ae.Link,{href:r,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)(me.Suspense,{fallback:(0,y.jsx)("div",{"aria-busy":!0,style:{minHeight:"2.5rem"}}),children:(0,y.jsx)(yt,{initPageResult:e})})}):null,(0,y.jsx)(me.Suspense,{fallback:(0,y.jsx)("div",{"aria-busy":!0,style:{minHeight:"4rem"}}),children:(0,y.jsx)(Pt,{initPageResult:e})})]})]})}async function yt({initPageResult:e}){let{adapter:t}=C(e.req.payload),a=await t.audiences.list();return(0,y.jsx)(je,{audiences:a,provider:t.provider})}async function Pt({initPageResult:e}){let{adapter:t}=C(e.req.payload),n=(await t.broadcasts.list()).map(r=>({...r,externalDashboardUrl:t.urls?.broadcast?.(r.id)}));return(0,y.jsx)(Ue,{broadcasts:n})}var bt="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