@fayz-ai/plugin-marketing 0.10.1 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/MarketingBits.d.ts.map +1 -1
- package/dist/index.js +18 -36
- package/dist/index.js.map +1 -1
- package/dist/views/CampaignsView.d.ts.map +1 -1
- package/dist/views/ChannelsView.d.ts.map +1 -1
- package/dist/views/FunnelView.d.ts.map +1 -1
- package/dist/views/LandingPagesView.d.ts.map +1 -1
- package/package.json +7 -7
- package/dist/data/capability.test.d.ts +0 -2
- package/dist/data/capability.test.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketingBits.d.ts","sourceRoot":"","sources":["../../src/components/MarketingBits.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,UAAU,CAAA;AAU5D,wBAAgB,OAAO,CAAC,EACtB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,GAC9D,EAAE;IACD,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,qBA0BA;
|
|
1
|
+
{"version":3,"file":"MarketingBits.d.ts","sourceRoot":"","sources":["../../src/components/MarketingBits.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,UAAU,CAAA;AAU5D,wBAAgB,OAAO,CAAC,EACtB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,GAC9D,EAAE;IACD,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,qBA0BA;AAaD,wBAAgB,SAAS,sBAUxB;AAaD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,qBAOjE;AAMD,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,qBAS/D;AAMD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACxB,qBAaA"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React9, { useState, useEffect, useMemo, useCallback } from 'react';
|
|
2
2
|
import { connectionSettings, connectionStatus, settingsStatus, createConnectionStore, getActiveTenantId, registerTranslations, createSafeDataProvider, getSupabaseClientOptional, useTranslation, useDataChanged, resolveDataProvider } from '@fayz-ai/core';
|
|
3
3
|
import { createPluginContext, fayzConnectorOAuth, PluginSettingsPanel, useModuleNavigation, createViewRouter, ModuleActionBar, SettingsGroup, SelectRow, ToggleRow, PermissionGate, useLimitGuard, useOrganizationStore, CrudFormPage, invalidateLimit, CrudListView } from '@fayz-ai/admin';
|
|
4
|
-
import { defineKpiWidget, defineCustomWidget, defineTableWidget, ModulePage, DataTable, SubpageHeader, Button, Skeleton, ConfirmDialog, ContentSplit, ContentSplitTrigger, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, MarkdownEditor, DashboardCanvas,
|
|
4
|
+
import { defineKpiWidget, defineCustomWidget, defineTableWidget, ModulePage, PageToolbar, DataTable, SubpageHeader, PageHeaderActions, Button, Skeleton, ConfirmDialog, ContentSplit, ContentSplitTrigger, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, MarkdownEditor, DashboardCanvas, RangeControl, cn, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter, SegmentedControl, Badge, SelectSeparator, Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetBody, SheetFooter, Checkbox, toast, KpiCard as KpiCard$1, Card, CardHeader, CardTitle, CardContent, TableWidget } from '@fayz-ai/ui';
|
|
5
5
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
6
6
|
import { History, CheckCircle2, AlertCircle, ChevronRight, Users, Target, Percent, DollarSign, Trash2, Plus, ExternalLink, Sparkles, Pencil, Layers, MousePointerClick, NotebookPen, ArrowUpRight, ArrowDownRight, Settings2, Columns3, CalendarDays, List, ChevronLeft, Loader2, ImagePlus, X, Bike, Utensils, DoorOpen, MessageCircle, Instagram, Mail, Globe, Megaphone, Search, Link2, AtSign, Pin, Twitter, Linkedin, Facebook, Youtube, Music2, Repeat2, Heart, BarChart2, Share2, ThumbsUp, Send, MoreHorizontal, Bookmark, GripVertical, Image, Trophy } from 'lucide-react';
|
|
7
7
|
import { createStore } from 'zustand/vanilla';
|
|
@@ -128,12 +128,11 @@ function RangeTabs() {
|
|
|
128
128
|
const range = useMarketingStore((s) => s.range);
|
|
129
129
|
const setRange = useMarketingStore((s) => s.setRange);
|
|
130
130
|
return /* @__PURE__ */ jsx(
|
|
131
|
-
|
|
131
|
+
RangeControl,
|
|
132
132
|
{
|
|
133
|
-
options: RANGES,
|
|
133
|
+
options: RANGES.map((r) => ({ value: r, label: r })),
|
|
134
134
|
value: range,
|
|
135
|
-
onChange: (r) => void setRange(r)
|
|
136
|
-
"aria-label": "Time range"
|
|
135
|
+
onChange: (r) => void setRange(r)
|
|
137
136
|
}
|
|
138
137
|
);
|
|
139
138
|
}
|
|
@@ -192,10 +191,7 @@ function ChannelsView({ onOpen }) {
|
|
|
192
191
|
{ id: "open", header: "", enableSorting: false, cell: () => /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4 text-muted-foreground" }) }
|
|
193
192
|
], [t, conversion.labelPlural, conversion.valueLabel, currency]);
|
|
194
193
|
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl space-y-4", children: [
|
|
195
|
-
/* @__PURE__ */
|
|
196
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("marketing.channels.subtitle") }),
|
|
197
|
-
/* @__PURE__ */ jsx(RangeTabs, {})
|
|
198
|
-
] }),
|
|
194
|
+
/* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
|
|
199
195
|
/* @__PURE__ */ jsx(
|
|
200
196
|
DataTable,
|
|
201
197
|
{
|
|
@@ -355,17 +351,12 @@ function CampaignsView() {
|
|
|
355
351
|
}
|
|
356
352
|
], [t, conversion.labelPlural, currency, deleteCampaign]);
|
|
357
353
|
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl space-y-4", children: [
|
|
358
|
-
/* @__PURE__ */
|
|
359
|
-
/* @__PURE__ */ jsx(
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
" ",
|
|
365
|
-
t("marketing.campaigns.new")
|
|
366
|
-
] }) })
|
|
367
|
-
] })
|
|
368
|
-
] }),
|
|
354
|
+
/* @__PURE__ */ jsx(PageHeaderActions, { children: /* @__PURE__ */ jsx(PermissionGate, { feature: "marketing", action: "create", children: /* @__PURE__ */ jsxs(Button, { onClick: () => setComposerOpen(true), children: [
|
|
355
|
+
/* @__PURE__ */ jsx(Plus, { className: "mr-1.5 h-4 w-4" }),
|
|
356
|
+
" ",
|
|
357
|
+
t("marketing.campaigns.new")
|
|
358
|
+
] }) }) }),
|
|
359
|
+
/* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
|
|
369
360
|
/* @__PURE__ */ jsx(DataTable, { columns, data: campaigns, emptyMessage: t("marketing.campaigns.empty") }),
|
|
370
361
|
/* @__PURE__ */ jsx(CampaignComposer, { open: composerOpen, onClose: () => setComposerOpen(false) })
|
|
371
362
|
] });
|
|
@@ -376,14 +367,7 @@ function FunnelView() {
|
|
|
376
367
|
const funnel = useMarketingStore((s) => s.funnel);
|
|
377
368
|
const max = Math.max(...funnel.map((s) => s.count), 1);
|
|
378
369
|
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-4xl space-y-4", children: [
|
|
379
|
-
/* @__PURE__ */
|
|
380
|
-
/* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
381
|
-
t("marketing.funnel.subtitlePrefix"),
|
|
382
|
-
" ",
|
|
383
|
-
conversion.label.toLowerCase()
|
|
384
|
-
] }),
|
|
385
|
-
/* @__PURE__ */ jsx(RangeTabs, {})
|
|
386
|
-
] }),
|
|
370
|
+
/* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
|
|
387
371
|
/* @__PURE__ */ jsxs("div", { className: "rounded-card border border-border bg-card p-5", children: [
|
|
388
372
|
/* @__PURE__ */ jsx("div", { className: "space-y-3", children: funnel.map((stage, i) => {
|
|
389
373
|
const pct = max > 0 ? Math.max(stage.count / max * 100, 4) : 0;
|
|
@@ -710,14 +694,12 @@ function LandingPagesView() {
|
|
|
710
694
|
}
|
|
711
695
|
], [t, deleteLandingPage]);
|
|
712
696
|
return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-6xl space-y-4", children: [
|
|
713
|
-
/* @__PURE__ */
|
|
714
|
-
/* @__PURE__ */ jsx(
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
] }) })
|
|
720
|
-
] }),
|
|
697
|
+
/* @__PURE__ */ jsx(PageHeaderActions, { children: /* @__PURE__ */ jsx(PermissionGate, { feature: "marketing", action: "create", children: /* @__PURE__ */ jsxs(Button, { onClick: openNew, children: [
|
|
698
|
+
/* @__PURE__ */ jsx(Plus, { className: "mr-1.5 h-4 w-4" }),
|
|
699
|
+
" ",
|
|
700
|
+
t("marketing.landing.new")
|
|
701
|
+
] }) }) }),
|
|
702
|
+
/* @__PURE__ */ jsx(PageToolbar, { range: /* @__PURE__ */ jsx(RangeTabs, {}) }),
|
|
721
703
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-4", children: [
|
|
722
704
|
/* @__PURE__ */ jsx(KpiCard, { icon: Layers, label: t("marketing.metric.pages"), value: String(pages.length) }),
|
|
723
705
|
/* @__PURE__ */ jsx(
|