@fayz-ai/plugin-marketing 0.9.0 → 0.9.1
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/README.md +3 -3
- package/dist/{MarketingContext.d.ts → context.d.ts} +5 -3
- package/dist/context.d.ts.map +1 -0
- package/dist/data/mock.d.ts +1 -1
- package/dist/data/mock.d.ts.map +1 -1
- package/dist/{registries.d.ts → data/registries.d.ts} +1 -1
- package/dist/data/registries.d.ts.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -22
- package/dist/index.js.map +1 -1
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/{presets.d.ts → lib/presets.d.ts} +1 -1
- package/dist/lib/presets.d.ts.map +1 -0
- package/dist/{MarketingPage.d.ts → views/MarketingPage.d.ts} +5 -5
- package/dist/views/MarketingPage.d.ts.map +1 -0
- package/dist/views/blog/BlogAdminView.d.ts.map +1 -1
- package/dist/views/content/ContentPlannerContext.d.ts +1 -1
- package/dist/views/content/ContentPlannerContext.d.ts.map +1 -1
- package/dist/views/dashboardWidgets.d.ts +1 -1
- package/dist/views/dashboardWidgets.d.ts.map +1 -1
- package/package.json +6 -9
- package/dist/MarketingContext.d.ts.map +0 -1
- package/dist/MarketingPage.d.ts.map +0 -1
- package/dist/format.d.ts.map +0 -1
- package/dist/presets.d.ts.map +0 -1
- package/dist/registries.d.ts.map +0 -1
- package/src/MarketingContext.tsx +0 -42
- package/src/MarketingPage.tsx +0 -139
- package/src/components/MarketingBits.tsx +0 -131
- package/src/components/icons.tsx +0 -36
- package/src/data/blogEntities.tsx +0 -91
- package/src/data/capability.test.ts +0 -92
- package/src/data/contentMedia.ts +0 -25
- package/src/data/contentMock.ts +0 -253
- package/src/data/contentSupabase.ts +0 -263
- package/src/data/contentTypes.ts +0 -138
- package/src/data/mock.ts +0 -308
- package/src/data/supabase.ts +0 -613
- package/src/data/tables.ts +0 -33
- package/src/data/types.ts +0 -97
- package/src/format.ts +0 -40
- package/src/index.ts +0 -457
- package/src/integrations/ranklayer/RANKLAYER.md +0 -40
- package/src/integrations/ranklayer/connectorDef.tsx +0 -102
- package/src/integrations/ranklayer/data/supabase.ts +0 -106
- package/src/integrations/ranklayer/types.ts +0 -16
- package/src/locales/en.ts +0 -192
- package/src/locales/index.ts +0 -7
- package/src/locales/pt-BR.ts +0 -192
- package/src/migrations/000_plg_rename.sql +0 -15
- package/src/migrations/001_content_planner.sql +0 -94
- package/src/migrations/002_multi_platform.sql +0 -25
- package/src/migrations/003_recording_ops.sql +0 -25
- package/src/migrations/004_ranklayer.sql +0 -50
- package/src/migrations/005_analytics_base.sql +0 -60
- package/src/migrations/006_analytics_views.sql +0 -68
- package/src/migrations/007_agent_rpcs.sql +0 -119
- package/src/migrations/008_landing_pages.sql +0 -112
- package/src/migrations/index.ts +0 -601
- package/src/presets.ts +0 -119
- package/src/registries.ts +0 -62
- package/src/schema/index.ts +0 -106
- package/src/store.ts +0 -102
- package/src/types.ts +0 -153
- package/src/views/CampaignComposer.tsx +0 -89
- package/src/views/CampaignsView.tsx +0 -59
- package/src/views/ChannelDetailView.tsx +0 -59
- package/src/views/ChannelsView.tsx +0 -46
- package/src/views/FunnelView.tsx +0 -56
- package/src/views/LandingPageComposer.tsx +0 -201
- package/src/views/LandingPagesView.tsx +0 -172
- package/src/views/OverviewView.tsx +0 -24
- package/src/views/SettingsView.tsx +0 -72
- package/src/views/blog/BlogAdminView.tsx +0 -99
- package/src/views/blog/BlogEntityForm.tsx +0 -101
- package/src/views/blog/useEntityCrud.ts +0 -50
- package/src/views/content/ContentPlannerContext.tsx +0 -13
- package/src/views/content/ContentView.tsx +0 -908
- package/src/views/content/PlanBriefView.tsx +0 -268
- package/src/views/content/PostPage.tsx +0 -370
- package/src/views/content/PostSocialPreview.tsx +0 -212
- package/src/views/content/RecordingChecklist.tsx +0 -145
- package/src/views/content/contentBits.tsx +0 -114
- package/src/views/content/contentStore.ts +0 -160
- package/src/views/content/templates.ts +0 -172
- package/src/views/dashboardWidgets.tsx +0 -173
- /package/dist/{format.d.ts → lib/format.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -25,11 +25,11 @@ It ships a vertical-flavored mock today so the surface is real from the first in
|
|
|
25
25
|
```bash
|
|
26
26
|
npm install @fayz-ai/plugin-marketing
|
|
27
27
|
```
|
|
28
|
-
Peer deps: `@fayz-ai/core`, `@fayz-ai/ui`, `@fayz-ai/
|
|
28
|
+
Peer deps: `@fayz-ai/core`, `@fayz-ai/ui`, `@fayz-ai/admin`, plus `react` / `react-dom`.
|
|
29
29
|
|
|
30
30
|
## Usage
|
|
31
31
|
```tsx
|
|
32
|
-
import { defineSaas } from '@fayz-ai/
|
|
32
|
+
import { defineSaas } from '@fayz-ai/admin'
|
|
33
33
|
import { createMarketingPlugin } from '@fayz-ai/plugin-marketing'
|
|
34
34
|
|
|
35
35
|
export const app = defineSaas({
|
|
@@ -48,4 +48,4 @@ export const app = defineSaas({
|
|
|
48
48
|
The acquisition half of growth. Pairs with `plugin-crm` (the leads and deals it converts into), `plugin-conversations` (broadcast replies land in the inbox), and `plugin-reputation` (social proof that lifts CVR).
|
|
49
49
|
|
|
50
50
|
## Roadmap & contributing
|
|
51
|
-
Built and evolving in the open. See the [Fayz SDK roadmap](../../docs/ROADMAP.md#plugin-marketing) for current gaps, missing features, and good first issues.
|
|
51
|
+
Built and evolving in the open. See the [Fayz SDK roadmap](../../docs/platform/ROADMAP.md#plugin-marketing) for current gaps, missing features, and good first issues.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { AcquisitionChannel, ConversionModel } from './types';
|
|
3
|
-
import type { MarketingCurrency } from './format';
|
|
4
|
-
import type { MarketingDomainModules } from './presets';
|
|
3
|
+
import type { MarketingCurrency } from './lib/format';
|
|
4
|
+
import type { MarketingDomainModules } from './lib/presets';
|
|
5
5
|
import type { MarketingDataProvider } from './data/types';
|
|
6
6
|
import type { MarketingUIState } from './store';
|
|
7
7
|
export interface MarketingLabels {
|
|
@@ -23,6 +23,8 @@ export interface ResolvedMarketingConfig {
|
|
|
23
23
|
modules: MarketingDomainModules;
|
|
24
24
|
currency: MarketingCurrency;
|
|
25
25
|
labels: MarketingLabels;
|
|
26
|
+
/** Ver MarketingPluginOptions.moduleNav. */
|
|
27
|
+
moduleNav?: 'rail' | 'tabs' | 'sidebar';
|
|
26
28
|
}
|
|
27
29
|
export declare const MarketingContextProvider: React.FC<{
|
|
28
30
|
config: ResolvedMarketingConfig;
|
|
@@ -35,4 +37,4 @@ export declare const useMarketingProvider: () => MarketingDataProvider;
|
|
|
35
37
|
export declare const useMarketingStore: <T>(selector: (state: MarketingUIState) => T) => T;
|
|
36
38
|
/** Convenience: look up a channel definition by id. */
|
|
37
39
|
export declare function useChannelLookup(): Map<string, AcquisitionChannel>;
|
|
38
|
-
//# sourceMappingURL=
|
|
40
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,kBAAkB,EAAE,CAAA;IAC9B,OAAO,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,MAAM,EAAE,eAAe,CAAA;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CACxC;AAID,eAAO,MAAM,wBAAwB;;;;;EAAsB,CAAA;AAC3D,eAAO,MAAM,kBAAkB,+BAAgB,CAAA;AAC/C,eAAO,MAAM,oBAAoB,6BAAkB,CAAA;AACnD,eAAO,MAAM,iBAAiB,oDAAe,CAAA;AAE7C,uDAAuD;AACvD,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAGlE"}
|
package/dist/data/mock.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { MarketingDataProvider } from './types';
|
|
2
2
|
import type { AcquisitionChannel, ConversionModel } from '../types';
|
|
3
|
-
import { type MarketingDomain } from '../presets';
|
|
3
|
+
import { type MarketingDomain } from '../lib/presets';
|
|
4
4
|
export interface MockMarketingConfig {
|
|
5
5
|
channels: AcquisitionChannel[];
|
|
6
6
|
conversion: ConversionModel;
|
package/dist/data/mock.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/data/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAA2C,MAAM,SAAS,CAAA;AAC7F,OAAO,KAAK,EACV,kBAAkB,EAIlB,eAAe,EAQhB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/data/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAA2C,MAAM,SAAS,CAAA;AAC7F,OAAO,KAAK,EACV,kBAAkB,EAIlB,eAAe,EAQhB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AA6B1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,kBAAkB,EAAE,CAAA;IAC9B,UAAU,EAAE,eAAe,CAAA;IAC3B,MAAM,EAAE,eAAe,CAAA;CACxB;AAyGD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,mBAAmB,GAAG,qBAAqB,CA0J3F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PluginRegistryDef } from '@fayz-ai/core';
|
|
2
|
-
import type { AcquisitionChannel } from '
|
|
2
|
+
import type { AcquisitionChannel } from '../types';
|
|
3
3
|
/** Build the marketing settings registries. Channels are tenant-editable rows
|
|
4
4
|
* in plg_marketing_channels; the Supabase provider lazily seeds them from the
|
|
5
5
|
* resolved domain preset (seedData doubles as walkable mock data). Sites are
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registries.d.ts","sourceRoot":"","sources":["../../src/data/registries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAa,MAAM,eAAe,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAwClD;;;;0EAI0E;AAC1E,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,EAAE,CAe5F"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { PluginManifest, PluginRegistryDef, PluginScope, VerticalId } from '@fayz-ai/core';
|
|
2
|
-
import { type MarketingLabels } from './
|
|
2
|
+
import { type MarketingLabels } from './context';
|
|
3
3
|
import type { AttributionBridge, MarketingDataProvider, SitesPerformanceBridge } from './data/types';
|
|
4
4
|
import type { ContentPlannerProvider } from './data/contentTypes';
|
|
5
|
-
import { type MarketingCurrency } from './format';
|
|
6
|
-
import { type MarketingDomain, type MarketingDomainModules } from './presets';
|
|
5
|
+
import { type MarketingCurrency } from './lib/format';
|
|
6
|
+
import { type MarketingDomain, type MarketingDomainModules } from './lib/presets';
|
|
7
7
|
import type { AcquisitionChannel, ConversionModel } from './types';
|
|
8
8
|
export interface MarketingPluginOptions {
|
|
9
9
|
/** Vertical preset for conversion model + channels + module defaults. */
|
|
@@ -42,7 +42,7 @@ export interface MarketingPluginOptions {
|
|
|
42
42
|
export declare function createMarketingPlugin(options?: MarketingPluginOptions): PluginManifest;
|
|
43
43
|
export type { MarketingDataProvider, AttributionBridge, SitesPerformanceBridge, } from './data/types';
|
|
44
44
|
export type { AcquisitionChannel, ConversionModel, Campaign, ChannelPerformance, LandingPagePerf, } from './types';
|
|
45
|
-
export { MARKETING_PRESETS, type MarketingDomain } from './presets';
|
|
45
|
+
export { MARKETING_PRESETS, type MarketingDomain } from './lib/presets';
|
|
46
46
|
export { createMockMarketingProvider } from './data/mock';
|
|
47
47
|
export { createSupabaseMarketingProvider } from './data/supabase';
|
|
48
48
|
export type { ContentPlannerProvider, ContentPlan, ContentPost, SocialAccount, PostFormat, PostStatus, SaveContentPlanInput, SaveContentPostInput, SaveSocialAccountInput, } from './data/contentTypes';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAO/F,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAO/F,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,WAAW,CAAA;AAClB,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,cAAc,CAAA;AAIrB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAOjE,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACvE,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAclE,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,yEAAyE;IACzE,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,6EAA6E;IAC7E,cAAc,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAA;IAC1D,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACxC,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,oEAAoE;IACpE,WAAW,CAAC,EAAE,sBAAsB,CAAA;IACpC;6DACyD;IACzD,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACxE;AA8CD,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,cAAc,CAsTtF;AAED,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,eAAe,GAChB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAA;AACjE,YAAY,EACV,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,aAAa,EACb,UAAU,EACV,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAAE,oCAAoC,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React9, { useState, useEffect, useMemo, useCallback } from 'react';
|
|
2
2
|
import { getActiveTenantId, registerTranslations, createSafeDataProvider, getSupabaseClientOptional, useTranslation, useDataChanged, resolveDataProvider } from '@fayz-ai/core';
|
|
3
|
-
import { createPluginContext, PluginSettingsPanel, useModuleNavigation, createViewRouter, ModuleActionBar, SettingsGroup, SelectRow, ToggleRow, PermissionGate, useLimitGuard, useOrganizationStore, CrudFormPage, invalidateLimit, CrudListView } from '@fayz-ai/
|
|
4
|
-
import { defineKpiWidget, defineCustomWidget, defineTableWidget, ModulePage, DataTable, SubpageHeader, Button, Skeleton, ConfirmDialog, ContentSplit, ContentSplitTrigger, Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, MarkdownEditor,
|
|
3
|
+
import { createPluginContext, 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, SegmentedControl, cn, Modal, ModalContent, ModalHeader, ModalTitle, ModalBody, ModalFooter, 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 { Sparkles, History, CheckCircle2, AlertCircle, ChevronRight, Users, Target, Percent, DollarSign, Trash2, Plus, ExternalLink, 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';
|
|
@@ -31,7 +31,7 @@ function OverviewView() {
|
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
// src/format.ts
|
|
34
|
+
// src/lib/format.ts
|
|
35
35
|
var DEFAULT_CURRENCY = { code: "USD", locale: "en-US", symbol: "$" };
|
|
36
36
|
function formatCurrency(value, currency) {
|
|
37
37
|
try {
|
|
@@ -2543,7 +2543,7 @@ function useEntityCrud(entity) {
|
|
|
2543
2543
|
const remove = useCallback((id) => provider2.remove(id), [provider2]);
|
|
2544
2544
|
return { items, total, fetch, getById, create, update, remove };
|
|
2545
2545
|
}
|
|
2546
|
-
function PostsList({ navigate }) {
|
|
2546
|
+
function PostsList({ navigate, navTabs }) {
|
|
2547
2547
|
const entity = useMemo(() => buildBlogPostEntity(), []);
|
|
2548
2548
|
const { items, total, fetch } = useEntityCrud(entity);
|
|
2549
2549
|
const [search, setSearch] = useState("");
|
|
@@ -2577,13 +2577,15 @@ function PostsList({ navigate }) {
|
|
|
2577
2577
|
facets,
|
|
2578
2578
|
activeFilters: { status: statusFilter },
|
|
2579
2579
|
onFacetChange: (_field, value) => setStatusFilter(value),
|
|
2580
|
+
navTabs,
|
|
2581
|
+
activeNavTab: "posts",
|
|
2580
2582
|
onNew: () => navigate("blog-new"),
|
|
2581
2583
|
addLabel: "New post",
|
|
2582
2584
|
onRowClick: (row) => navigate(`blog-post:${row.id}`)
|
|
2583
2585
|
}
|
|
2584
2586
|
);
|
|
2585
2587
|
}
|
|
2586
|
-
function CategoriesList({ navigate }) {
|
|
2588
|
+
function CategoriesList({ navigate, navTabs }) {
|
|
2587
2589
|
const entity = useMemo(() => buildBlogCategoryEntity(), []);
|
|
2588
2590
|
const { items, total, fetch } = useEntityCrud(entity);
|
|
2589
2591
|
const [search, setSearch] = useState("");
|
|
@@ -2606,6 +2608,8 @@ function CategoriesList({ navigate }) {
|
|
|
2606
2608
|
search,
|
|
2607
2609
|
onSearchChange: setSearch,
|
|
2608
2610
|
searchPlaceholder: "Search categories\u2026",
|
|
2611
|
+
navTabs,
|
|
2612
|
+
activeNavTab: "categories",
|
|
2609
2613
|
onNew: () => navigate("blog-cat-new"),
|
|
2610
2614
|
addLabel: "New category",
|
|
2611
2615
|
onRowClick: (row) => navigate(`blog-cat:${row.id}`)
|
|
@@ -2615,21 +2619,11 @@ function CategoriesList({ navigate }) {
|
|
|
2615
2619
|
function BlogAdminView({ navigate }) {
|
|
2616
2620
|
const { labels } = useMarketingConfig();
|
|
2617
2621
|
const [lens, setLens] = useState("posts");
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
options: [
|
|
2624
|
-
{ value: "posts", label: labels.blog },
|
|
2625
|
-
{ value: "categories", label: labels.blogCategories }
|
|
2626
|
-
],
|
|
2627
|
-
value: lens,
|
|
2628
|
-
onChange: (v) => setLens(v)
|
|
2629
|
-
}
|
|
2630
|
-
),
|
|
2631
|
-
lens === "posts" ? /* @__PURE__ */ jsx(PostsList, { navigate }) : /* @__PURE__ */ jsx(CategoriesList, { navigate })
|
|
2632
|
-
] });
|
|
2622
|
+
const navTabs = useMemo(() => [
|
|
2623
|
+
{ id: "posts", label: labels.blog, onSelect: () => setLens("posts") },
|
|
2624
|
+
{ id: "categories", label: labels.blogCategories, onSelect: () => setLens("categories") }
|
|
2625
|
+
], [labels.blog, labels.blogCategories]);
|
|
2626
|
+
return lens === "posts" ? /* @__PURE__ */ jsx(PostsList, { navigate, navTabs }) : /* @__PURE__ */ jsx(CategoriesList, { navigate, navTabs });
|
|
2633
2627
|
}
|
|
2634
2628
|
function BlogEntityForm({
|
|
2635
2629
|
entity,
|
|
@@ -2799,6 +2793,7 @@ function MarketingPage({ config, provider: provider2, store, contentProvider, co
|
|
|
2799
2793
|
title: config.labels.pageTitle,
|
|
2800
2794
|
subtitle: config.labels.pageSubtitle,
|
|
2801
2795
|
nav,
|
|
2796
|
+
navVariant: config.moduleNav,
|
|
2802
2797
|
showHeader: isOverview,
|
|
2803
2798
|
viewKey: view,
|
|
2804
2799
|
direction,
|
|
@@ -2908,7 +2903,7 @@ var V = {
|
|
|
2908
2903
|
leadTagEvents: "v_marketing_lead_tag_events"
|
|
2909
2904
|
};
|
|
2910
2905
|
|
|
2911
|
-
// src/registries.ts
|
|
2906
|
+
// src/data/registries.ts
|
|
2912
2907
|
var KIND_OPTIONS = [
|
|
2913
2908
|
{ value: "paid", label: "Paid" },
|
|
2914
2909
|
{ value: "organic", label: "Organic" },
|
|
@@ -3090,7 +3085,7 @@ function createMarketingDashboardWidgets(ctx3) {
|
|
|
3090
3085
|
];
|
|
3091
3086
|
}
|
|
3092
3087
|
|
|
3093
|
-
// src/presets.ts
|
|
3088
|
+
// src/lib/presets.ts
|
|
3094
3089
|
var AGENCY = {
|
|
3095
3090
|
conversion: {
|
|
3096
3091
|
id: "won-deal",
|