@growth-labs/cms 0.5.5 → 0.5.6
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 +36 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integration/index.d.ts.map +1 -1
- package/dist/integration/index.js +9 -0
- package/dist/integration/index.js.map +1 -1
- package/dist/integration/options.d.ts +19 -0
- package/dist/integration/options.d.ts.map +1 -1
- package/dist/integration/options.js +7 -0
- package/dist/integration/options.js.map +1 -1
- package/dist/providers/null.d.ts +2 -1
- package/dist/providers/null.d.ts.map +1 -1
- package/dist/providers/null.js +9 -0
- package/dist/providers/null.js.map +1 -1
- package/dist/providers/types.d.ts +10 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/routes/authz-matrix.d.ts.map +1 -1
- package/dist/routes/authz-matrix.js +2 -0
- package/dist/routes/authz-matrix.js.map +1 -1
- package/dist/routes/context.d.ts +1 -1
- package/dist/routes/context.d.ts.map +1 -1
- package/dist/routes/context.js.map +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +2 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/surveys.d.ts +12 -0
- package/dist/routes/surveys.d.ts.map +1 -0
- package/dist/routes/surveys.js +109 -0
- package/dist/routes/surveys.js.map +1 -0
- package/dist/schema/insights-ingest.d.ts +46 -46
- package/dist/surveys/access.d.ts +4 -0
- package/dist/surveys/access.d.ts.map +1 -0
- package/dist/surveys/access.js +9 -0
- package/dist/surveys/access.js.map +1 -0
- package/dist/surveys/errors.d.ts +43 -0
- package/dist/surveys/errors.d.ts.map +1 -0
- package/dist/surveys/errors.js +42 -0
- package/dist/surveys/errors.js.map +1 -0
- package/dist/surveys/schema.d.ts +939 -0
- package/dist/surveys/schema.d.ts.map +1 -0
- package/dist/surveys/schema.js +385 -0
- package/dist/surveys/schema.js.map +1 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.d.ts +3 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.d.ts.map +1 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.js +17 -0
- package/dist/ui/api/surveys/[surveyId]/responses.csv.js.map +1 -0
- package/dist/ui/api/surveys/[surveyId].d.ts +3 -0
- package/dist/ui/api/surveys/[surveyId].d.ts.map +1 -0
- package/dist/ui/api/surveys/[surveyId].js +17 -0
- package/dist/ui/api/surveys/[surveyId].js.map +1 -0
- package/dist/ui/client/mount.d.ts.map +1 -1
- package/dist/ui/client/mount.js +1 -0
- package/dist/ui/client/mount.js.map +1 -1
- package/dist/ui/commands.d.ts +5 -1
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +7 -0
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/components/CmsApp.d.ts +2 -0
- package/dist/ui/components/CmsApp.d.ts.map +1 -1
- package/dist/ui/components/CmsApp.js +14 -3
- package/dist/ui/components/CmsApp.js.map +1 -1
- package/dist/ui/components/CommandPalette.d.ts +2 -0
- package/dist/ui/components/CommandPalette.d.ts.map +1 -1
- package/dist/ui/components/CommandPalette.js +1 -1
- package/dist/ui/components/CommandPalette.js.map +1 -1
- package/dist/ui/components/Sidebar.d.ts +1 -0
- package/dist/ui/components/Sidebar.d.ts.map +1 -1
- package/dist/ui/components/Sidebar.js +1 -1
- package/dist/ui/components/Sidebar.js.map +1 -1
- package/dist/ui/hash-router.d.ts +1 -1
- package/dist/ui/hash-router.d.ts.map +1 -1
- package/dist/ui/hash-router.js +1 -0
- package/dist/ui/hash-router.js.map +1 -1
- package/dist/ui/nav.d.ts +5 -1
- package/dist/ui/nav.d.ts.map +1 -1
- package/dist/ui/nav.js +10 -2
- package/dist/ui/nav.js.map +1 -1
- package/dist/ui/screens/SurveyResponsesScreen.d.ts +28 -0
- package/dist/ui/screens/SurveyResponsesScreen.d.ts.map +1 -0
- package/dist/ui/screens/SurveyResponsesScreen.js +110 -0
- package/dist/ui/screens/SurveyResponsesScreen.js.map +1 -0
- package/dist/ui/screens/registry.d.ts +2 -1
- package/dist/ui/screens/registry.d.ts.map +1 -1
- package/dist/ui/screens/registry.js +5 -1
- package/dist/ui/screens/registry.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -2
- package/src/integration/index.ts +9 -0
- package/src/integration/options.ts +8 -0
- package/src/providers/null.ts +19 -0
- package/src/providers/types.ts +7 -0
- package/src/routes/authz-matrix.ts +2 -0
- package/src/routes/context.ts +2 -0
- package/src/routes/index.ts +6 -0
- package/src/routes/surveys.ts +130 -0
- package/src/surveys/access.ts +11 -0
- package/src/surveys/errors.ts +51 -0
- package/src/surveys/schema.ts +435 -0
- package/src/ui/api/surveys/[surveyId]/responses.csv.ts +23 -0
- package/src/ui/api/surveys/[surveyId].ts +23 -0
- package/src/ui/client/mount.tsx +1 -0
- package/src/ui/commands.ts +14 -1
- package/src/ui/components/CmsApp.tsx +25 -3
- package/src/ui/components/CommandPalette.tsx +2 -1
- package/src/ui/components/Sidebar.tsx +10 -2
- package/src/ui/hash-router.ts +1 -0
- package/src/ui/nav.ts +15 -2
- package/src/ui/screens/SurveyResponsesScreen.tsx +271 -0
- package/src/ui/screens/registry.tsx +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CmsApp.js","sourceRoot":"","sources":["../../../src/ui/components/CmsApp.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAkB,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"CmsApp.js","sourceRoot":"","sources":["../../../src/ui/components/CmsApp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { type Command } from '../commands.js';
|
|
1
2
|
import type { Route } from '../hash-router.js';
|
|
2
3
|
export declare function CommandPalette(props: {
|
|
3
4
|
onClose: () => void;
|
|
4
5
|
navigate: (r: Route) => void;
|
|
5
6
|
openDoc: (id: string | null, type?: string) => void;
|
|
7
|
+
commands?: Command[];
|
|
6
8
|
}): import("react").JSX.Element;
|
|
7
9
|
//# sourceMappingURL=CommandPalette.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../../src/ui/components/CommandPalette.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../../src/ui/components/CommandPalette.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,OAAO,EAAkB,MAAM,gBAAgB,CAAA;AAC3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAQ9C,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACrC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IAC5B,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACpB,+BAuGA"}
|
|
@@ -27,7 +27,7 @@ export function CommandPalette(props) {
|
|
|
27
27
|
.catch(() => { });
|
|
28
28
|
return () => ctrl.abort();
|
|
29
29
|
}, [q]);
|
|
30
|
-
const all = [...baseCommands, ...docs];
|
|
30
|
+
const all = [...(props.commands ?? baseCommands), ...docs];
|
|
31
31
|
const filtered = filterCommands(q, all);
|
|
32
32
|
function run(c) {
|
|
33
33
|
if (c.kind === 'jump')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../../../src/ui/components/CommandPalette.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,YAAY,EAAgB,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG3E,SAAS,UAAU,CAAC,CAAU,EAAE,CAAS;IACxC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC,CAAC,EAAE,EAAE,CAAA;IAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAA;IAC/C,OAAO,UAAU,CAAC,CAAC,WAAW,IAAI,CAAC,EAAE,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../../../src/ui/components/CommandPalette.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAO9C,wBAAgB,OAAO,CAAC,KAAK,EAAE;
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAO9C,wBAAgB,OAAO,CAAC,KAAK,EAAE;IAC9B,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IAC5B,SAAS,EAAE,OAAO,CAAA;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC9B,+BAiFA"}
|
|
@@ -5,8 +5,8 @@ import { useWorkspace } from '../workspace-context.js';
|
|
|
5
5
|
import { SiteSwitcher } from './SiteSwitcher.js';
|
|
6
6
|
export function Sidebar(props) {
|
|
7
7
|
const { state } = useWorkspace();
|
|
8
|
-
const groups = navItems();
|
|
9
8
|
const user = state.user;
|
|
9
|
+
const groups = navItems({}, { surveyResultsEnabled: props.surveyResultsEnabled, role: user?.role });
|
|
10
10
|
const initial = user?.name?.[0]?.toUpperCase() ?? user?.email?.[0]?.toUpperCase() ?? '?';
|
|
11
11
|
return (_jsxs("aside", { className: "sidebar", "aria-label": "Main navigation", "data-collapsed": props.collapsed, children: [_jsxs("div", { className: "sb-brand", children: [_jsx("div", { className: "sb-mark", children: _jsx(BrandMark, { size: 18, color: "#fff" }) }), !props.collapsed && (_jsxs("div", { className: "sb-wordmark", children: ["Masthead", _jsx("span", { className: "dot", children: "." })] }))] }), _jsx(SiteSwitcher, { collapsed: props.collapsed }), _jsx("nav", { className: "scroll", style: { flex: 1, paddingBottom: 8 }, children: groups.map((g) => (_jsxs("div", { className: "nav-section", children: [!props.collapsed && _jsx("div", { className: "nav-label", children: g.group }), g.items.map((item) => (_jsxs("button", { type: "button", className: `nav-item${props.route === item.id ? ' active' : ''}`, onClick: () => props.navigate(item.id), "aria-current": props.route === item.id ? 'page' : undefined, title: item.label, children: [_jsx(Icon, { name: item.icon, size: 18, className: "ni-icon" }), !props.collapsed && _jsx("span", { className: "ni-label", children: item.label }), !props.collapsed && item.count != null && (_jsx("span", { className: "ni-count tnum", children: item.count }))] }, item.id)))] }, g.group))) }), _jsx("div", { className: "sb-foot", children: _jsxs("div", { className: "sb-user", children: [_jsx("div", { className: "avatar", style: { background: 'var(--accent)' }, children: initial }), !props.collapsed && (_jsxs(_Fragment, { children: [_jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [_jsx("div", { style: {
|
|
12
12
|
fontSize: 13,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/ui/components/Sidebar.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,MAAM,UAAU,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/ui/components/Sidebar.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/hash-router.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const ROUTES: readonly ["dashboard", "content", "calendar", "media", "analytics", "authors", "topics", "content-insights", "subscriptions", "social-share", "settings"];
|
|
1
|
+
export declare const ROUTES: readonly ["dashboard", "content", "calendar", "media", "analytics", "authors", "topics", "content-insights", "subscriptions", "survey-responses", "social-share", "settings"];
|
|
2
2
|
export type Route = (typeof ROUTES)[number];
|
|
3
3
|
export declare function parseHash(hash: string): Route;
|
|
4
4
|
export declare function hashFor(route: Route): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-router.d.ts","sourceRoot":"","sources":["../../src/ui/hash-router.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"hash-router.d.ts","sourceRoot":"","sources":["../../src/ui/hash-router.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,+KAaT,CAAA;AAEV,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAI3C,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAI7C;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE5C"}
|
package/dist/ui/hash-router.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-router.js","sourceRoot":"","sources":["../../src/ui/hash-router.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAE/E,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,WAAW;IACX,SAAS;IACT,UAAU;IACV,OAAO;IACP,WAAW;IACX,SAAS;IACT,QAAQ;IACR,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,UAAU;CACD,CAAA;AAIV,MAAM,OAAO,GAAU,WAAW,CAAA;AAElC,MAAM,UAAU,SAAS,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAA;IACzC,OAAQ,MAA4B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAc,CAAC,CAAC,CAAC,OAAO,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAY;IACnC,OAAO,KAAK,KAAK,EAAE,CAAA;AACpB,CAAC"}
|
|
1
|
+
{"version":3,"file":"hash-router.js","sourceRoot":"","sources":["../../src/ui/hash-router.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAE/E,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,WAAW;IACX,SAAS;IACT,UAAU;IACV,OAAO;IACP,WAAW;IACX,SAAS;IACT,QAAQ;IACR,kBAAkB;IAClB,eAAe;IACf,kBAAkB;IAClB,cAAc;IACd,UAAU;CACD,CAAA;AAIV,MAAM,OAAO,GAAU,WAAW,CAAA;AAElC,MAAM,UAAU,SAAS,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAA;IACzC,OAAQ,MAA4B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAc,CAAC,CAAC,CAAC,OAAO,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAY;IACnC,OAAO,KAAK,KAAK,EAAE,CAAA;AACpB,CAAC"}
|
package/dist/ui/nav.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CmsRole } from '../schema/types.js';
|
|
1
2
|
import type { Route } from './hash-router.js';
|
|
2
3
|
import type { IconName } from './icons.js';
|
|
3
4
|
export interface NavItem {
|
|
@@ -12,5 +13,8 @@ export interface NavGroup {
|
|
|
12
13
|
}
|
|
13
14
|
export declare const NAV_MODEL: NavGroup[];
|
|
14
15
|
/** Build the nav with live counts merged onto matching item ids. */
|
|
15
|
-
export declare function navItems(counts?: Partial<Record<Route, number
|
|
16
|
+
export declare function navItems(counts?: Partial<Record<Route, number>>, options?: {
|
|
17
|
+
surveyResultsEnabled?: boolean;
|
|
18
|
+
role?: CmsRole | null;
|
|
19
|
+
}): NavGroup[];
|
|
16
20
|
//# sourceMappingURL=nav.d.ts.map
|
package/dist/ui/nav.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../../src/ui/nav.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,WAAW,OAAO;IACvB,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AACD,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../../src/ui/nav.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,WAAW,OAAO;IACvB,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AACD,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,EAAE,CAAA;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,QAAQ,EAuB/B,CAAA;AAED,oEAAoE;AACpE,wBAAgB,QAAQ,CACvB,MAAM,GAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAM,EAC3C,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CAG/D,GACC,QAAQ,EAAE,CASZ"}
|
package/dist/ui/nav.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/ui/nav.ts — the Masthead sidebar nav model. Two groups, 11 items
|
|
2
2
|
// (spec §6: Social Share added between Subscriptions and Settings).
|
|
3
|
+
import { canViewSurveyResponses } from '../surveys/access.js';
|
|
3
4
|
export const NAV_MODEL = [
|
|
4
5
|
{
|
|
5
6
|
group: 'Workspace',
|
|
@@ -18,16 +19,23 @@ export const NAV_MODEL = [
|
|
|
18
19
|
{ id: 'topics', label: 'Topics & tags', icon: 'tag' },
|
|
19
20
|
{ id: 'content-insights', label: 'Content Insights', icon: 'sparkle' },
|
|
20
21
|
{ id: 'subscriptions', label: 'Subscriptions', icon: 'inbox' },
|
|
22
|
+
{ id: 'survey-responses', label: 'Survey responses', icon: 'chart' },
|
|
21
23
|
{ id: 'social-share', label: 'Social Share', icon: 'share' },
|
|
22
24
|
{ id: 'settings', label: 'Settings', icon: 'settings' },
|
|
23
25
|
],
|
|
24
26
|
},
|
|
25
27
|
];
|
|
26
28
|
/** Build the nav with live counts merged onto matching item ids. */
|
|
27
|
-
export function navItems(counts = {}
|
|
29
|
+
export function navItems(counts = {}, options = {
|
|
30
|
+
surveyResultsEnabled: true,
|
|
31
|
+
role: 'owner',
|
|
32
|
+
}) {
|
|
33
|
+
const canViewSurvey = options.surveyResultsEnabled !== false && canViewSurveyResponses(options.role);
|
|
28
34
|
return NAV_MODEL.map((g) => ({
|
|
29
35
|
group: g.group,
|
|
30
|
-
items: g.items
|
|
36
|
+
items: g.items
|
|
37
|
+
.filter((item) => item.id !== 'survey-responses' || canViewSurvey)
|
|
38
|
+
.map((i) => (counts[i.id] != null ? { ...i, count: counts[i.id] } : { ...i })),
|
|
31
39
|
}));
|
|
32
40
|
}
|
|
33
41
|
//# sourceMappingURL=nav.js.map
|
package/dist/ui/nav.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav.js","sourceRoot":"","sources":["../../src/ui/nav.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;
|
|
1
|
+
{"version":3,"file":"nav.js","sourceRoot":"","sources":["../../src/ui/nav.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AAGpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAe7D,MAAM,CAAC,MAAM,SAAS,GAAe;IACpC;QACC,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE;YACN,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE;YAC1D,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpD,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE;YACvD,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;YAC9C,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE;SACtD;KACD;IACD;QACC,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE;YACN,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE;YAC5D,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE;YACrD,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE;YACtE,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;YAC9D,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE;YACpE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE;YAC5D,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE;SACvD;KACD;CACD,CAAA;AAED,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CACvB,SAAyC,EAAE,EAC3C,UAAqE;IACpE,oBAAoB,EAAE,IAAI;IAC1B,IAAI,EAAE,OAAO;CACb;IAED,MAAM,aAAa,GAClB,OAAO,CAAC,oBAAoB,KAAK,KAAK,IAAI,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/E,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,KAAK;aACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,kBAAkB,IAAI,aAAa,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;KAC/E,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type SurveyResults } from '../../surveys/schema.js';
|
|
2
|
+
export type SurveyResponsesState = {
|
|
3
|
+
kind: 'loading';
|
|
4
|
+
} | {
|
|
5
|
+
kind: 'ready';
|
|
6
|
+
data: SurveyResults;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'forbidden';
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'unavailable';
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'malformed';
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'not_found';
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'retryable';
|
|
17
|
+
};
|
|
18
|
+
export declare function parseSurveyResultsPayload(value: unknown): SurveyResults | null;
|
|
19
|
+
export declare function classifySurveyResultsResponse(response: Response): Promise<SurveyResponsesState>;
|
|
20
|
+
export declare function SurveyResponsesScreen({ surveyId }: {
|
|
21
|
+
surveyId: string;
|
|
22
|
+
}): import("react").JSX.Element;
|
|
23
|
+
export declare function SurveyResponsesBody({ surveyId, state, onRetry, }: {
|
|
24
|
+
surveyId: string;
|
|
25
|
+
state: SurveyResponsesState;
|
|
26
|
+
onRetry?: () => void;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=SurveyResponsesScreen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SurveyResponsesScreen.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/SurveyResponsesScreen.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,yBAAyB,CAAA;AAEjF,MAAM,MAAM,oBAAoB,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAExB,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAG9E;AAED,wBAAsB,6BAA6B,CAClD,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,oBAAoB,CAAC,CAkB/B;AAED,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,+BAiBvE;AAED,wBAAgB,mBAAmB,CAAC,EACnC,QAAQ,EACR,KAAK,EACL,OAAO,GACP,EAAE;IACF,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,oBAAoB,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACpB,+BA8HA"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { isSurveyErrorCode, SURVEY_ERROR_CODE_HEADER, SURVEY_ERROR_DEFINITIONS, } from '../../surveys/errors.js';
|
|
4
|
+
import { SurveyResultsSchema } from '../../surveys/schema.js';
|
|
5
|
+
export function parseSurveyResultsPayload(value) {
|
|
6
|
+
const parsed = SurveyResultsSchema.safeParse(value);
|
|
7
|
+
return parsed.success ? parsed.data : null;
|
|
8
|
+
}
|
|
9
|
+
export async function classifySurveyResultsResponse(response) {
|
|
10
|
+
if (response.ok) {
|
|
11
|
+
const data = parseSurveyResultsPayload(await response.json().catch(() => null));
|
|
12
|
+
return data ? { kind: 'ready', data } : { kind: 'malformed' };
|
|
13
|
+
}
|
|
14
|
+
const code = await readSurveyErrorCode(response);
|
|
15
|
+
if ((response.status === 401 || response.status === 403) && code === 'survey_forbidden') {
|
|
16
|
+
return { kind: 'forbidden' };
|
|
17
|
+
}
|
|
18
|
+
if (response.status === 404 && code === 'survey_not_found')
|
|
19
|
+
return { kind: 'not_found' };
|
|
20
|
+
if (response.status === 502 && code === 'survey_provider_malformed') {
|
|
21
|
+
return { kind: 'malformed' };
|
|
22
|
+
}
|
|
23
|
+
if (response.status === 503 && code === 'survey_provider_unavailable') {
|
|
24
|
+
return { kind: 'unavailable' };
|
|
25
|
+
}
|
|
26
|
+
return { kind: 'retryable' };
|
|
27
|
+
}
|
|
28
|
+
export function SurveyResponsesScreen({ surveyId }) {
|
|
29
|
+
const [state, setState] = useState({ kind: 'loading' });
|
|
30
|
+
const load = useCallback(async () => {
|
|
31
|
+
setState({ kind: 'loading' });
|
|
32
|
+
try {
|
|
33
|
+
const response = await fetch(`/admin/api/surveys/${encodeURIComponent(surveyId)}`);
|
|
34
|
+
setState(await classifySurveyResultsResponse(response));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
setState({ kind: 'retryable' });
|
|
38
|
+
}
|
|
39
|
+
}, [surveyId]);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
void load();
|
|
42
|
+
}, [load]);
|
|
43
|
+
return _jsx(SurveyResponsesBody, { surveyId: surveyId, state: state, onRetry: load });
|
|
44
|
+
}
|
|
45
|
+
export function SurveyResponsesBody({ surveyId, state, onRetry, }) {
|
|
46
|
+
if (state.kind === 'loading')
|
|
47
|
+
return _jsx(StatusPage, { title: "Loading survey responses\u2026" });
|
|
48
|
+
if (state.kind === 'forbidden')
|
|
49
|
+
return _jsx(StatusPage, { title: "You do not have permission to view survey responses." });
|
|
50
|
+
if (state.kind === 'unavailable')
|
|
51
|
+
return _jsx(StatusPage, { title: "Survey reporting is not configured for this site." });
|
|
52
|
+
if (state.kind === 'malformed')
|
|
53
|
+
return _jsx(StatusPage, { title: "Masthead received invalid survey data.", retry: onRetry });
|
|
54
|
+
if (state.kind === 'not_found')
|
|
55
|
+
return _jsx(StatusPage, { title: "The configured survey could not be found." });
|
|
56
|
+
if (state.kind === 'retryable')
|
|
57
|
+
return _jsx(StatusPage, { title: "Survey responses could not be loaded.", retry: onRetry });
|
|
58
|
+
const { data } = state;
|
|
59
|
+
const freeTextByQuestion = new Map();
|
|
60
|
+
for (const entry of data.freeText) {
|
|
61
|
+
const entries = freeTextByQuestion.get(entry.questionId) ?? [];
|
|
62
|
+
entries.push(entry);
|
|
63
|
+
freeTextByQuestion.set(entry.questionId, entries);
|
|
64
|
+
}
|
|
65
|
+
return (_jsxs("div", { className: "page page-wide fade-in", style: { maxWidth: 1340 }, children: [_jsxs("div", { className: "page-head", children: [_jsxs("div", { children: [_jsx("h1", { className: "page-title", children: data.survey.title }), _jsxs("div", { className: "page-sub", children: [data.survey.responseCount, " ", data.survey.responseCount === 1 ? 'response' : 'responses', ' ', "\u00B7 ", data.survey.status] })] }), _jsx("a", { className: "btn", href: `/admin/api/surveys/${encodeURIComponent(surveyId)}/responses.csv`, children: "Export CSV" })] }), data.survey.responseCount === 0 ? (_jsxs("div", { className: "card", role: "status", children: [_jsx("h2", { className: "card-title", children: "No responses yet" }), _jsx("p", { className: "page-sub", children: "Aggregates and free-text answers will appear after submission." })] })) : (_jsxs("section", { className: "card", "aria-labelledby": "survey-response-list", children: [_jsx("h2", { className: "card-title", id: "survey-response-list", children: "Recent responses" }), _jsx("div", { className: "masthead-rule" }), _jsxs("table", { className: "tbl", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Submitted" }), _jsx("th", { children: "Channel" }), _jsx("th", { children: "Audience" }), _jsx("th", { children: "Attribution" })] }) }), _jsx("tbody", { children: data.responses.map((response) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx("time", { dateTime: response.submittedAt, children: formatTime(response.submittedAt) }) }), _jsx("td", { children: response.channel }), _jsx("td", { children: segmentLabel(response.respondentSegment) }), _jsx("td", { children: response.anonymous ? 'Anonymous' : 'Known respondent' })] }, response.id))) })] })] })), _jsxs("section", { "aria-labelledby": "survey-aggregates", style: { marginTop: 24 }, children: [_jsx("h2", { className: "page-title", id: "survey-aggregates", style: { fontSize: 22 }, children: "Question aggregates" }), _jsx("div", { className: "grid-split-wide", style: { alignItems: 'start', marginTop: 12 }, children: data.questions.map((question) => (_jsxs("article", { className: "card", children: [_jsxs("div", { className: "kicker", children: ["Q", question.position + 1, " \u00B7 ", questionAudienceLabel(question.audience)] }), _jsx("h3", { className: "card-title", children: question.prompt }), question.counts && _jsx(CountTable, { values: question.counts }), question.distribution && (_jsxs(_Fragment, { children: [_jsxs("p", { className: "page-sub", children: ["Average: ", question.average === null ? '—' : question.average.toFixed(2)] }), _jsx(CountTable, { values: question.distribution })] })), question.kind === 'text' && (_jsxs("p", { className: "page-sub", children: [question.responseCount ?? 0, " free-text responses"] }))] }, question.id))) })] }), _jsxs("section", { "aria-labelledby": "survey-free-text", style: { marginTop: 24 }, children: [_jsx("h2", { className: "page-title", id: "survey-free-text", style: { fontSize: 22 }, children: "Free-text responses" }), data.questions
|
|
66
|
+
.filter((question) => question.kind === 'text')
|
|
67
|
+
.map((question) => (_jsxs("div", { className: "card", style: { marginTop: 12 }, children: [_jsx("h3", { className: "card-title", children: question.prompt }), (freeTextByQuestion.get(question.id) ?? []).length === 0 ? (_jsx("p", { className: "page-sub", children: "No free-text responses." })) : (_jsx("ul", { children: (freeTextByQuestion.get(question.id) ?? []).map((entry) => (_jsx("li", { children: entry.value }, `${entry.responseId}:${entry.submittedAt}`))) }))] }, question.id)))] })] }));
|
|
68
|
+
}
|
|
69
|
+
async function readSurveyErrorCode(response) {
|
|
70
|
+
const headerCode = response.headers.get(SURVEY_ERROR_CODE_HEADER);
|
|
71
|
+
if (!isSurveyErrorCode(headerCode))
|
|
72
|
+
return null;
|
|
73
|
+
if (headerCode === 'survey_forbidden' && (response.status === 401 || response.status === 403)) {
|
|
74
|
+
return headerCode;
|
|
75
|
+
}
|
|
76
|
+
const body = await response.json().catch(() => null);
|
|
77
|
+
if (!isPlainRecord(body) || Object.keys(body).length !== 2)
|
|
78
|
+
return null;
|
|
79
|
+
if (!isSurveyErrorCode(body.code) || body.code !== headerCode)
|
|
80
|
+
return null;
|
|
81
|
+
return body.error === SURVEY_ERROR_DEFINITIONS[body.code].error ? body.code : null;
|
|
82
|
+
}
|
|
83
|
+
function isPlainRecord(value) {
|
|
84
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
85
|
+
}
|
|
86
|
+
function StatusPage({ title, detail, retry, }) {
|
|
87
|
+
return (_jsxs("div", { className: "page", role: "status", children: [_jsx("h1", { className: "page-title", children: "Survey responses" }), _jsx("p", { className: "page-sub", children: title }), detail && _jsx("p", { className: "page-sub", children: detail }), retry && (_jsx("button", { type: "button", className: "btn", onClick: retry, children: "Retry" }))] }));
|
|
88
|
+
}
|
|
89
|
+
function CountTable({ values }) {
|
|
90
|
+
return (_jsx("table", { className: "tbl", children: _jsx("tbody", { children: Object.entries(values).map(([label, count]) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: label }), _jsx("td", { className: "tnum", children: count })] }, label))) }) }));
|
|
91
|
+
}
|
|
92
|
+
function formatTime(value) {
|
|
93
|
+
const date = new Date(value);
|
|
94
|
+
return Number.isNaN(date.getTime()) ? value : date.toLocaleString();
|
|
95
|
+
}
|
|
96
|
+
function segmentLabel(value) {
|
|
97
|
+
if (value === 'member')
|
|
98
|
+
return 'Member';
|
|
99
|
+
if (value === 'non_member')
|
|
100
|
+
return 'Non-member';
|
|
101
|
+
return 'Unknown';
|
|
102
|
+
}
|
|
103
|
+
function questionAudienceLabel(value) {
|
|
104
|
+
if (value === 'member')
|
|
105
|
+
return 'Members only';
|
|
106
|
+
if (value === 'non_member')
|
|
107
|
+
return 'Non-members only';
|
|
108
|
+
return 'All respondents';
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=SurveyResponsesScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SurveyResponsesScreen.js","sourceRoot":"","sources":["../../../src/ui/screens/SurveyResponsesScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ScreenRegistry } from '../components/CmsApp.js';
|
|
2
|
-
export declare function createCmsScreens({ allowInlineAuthorCreation, }?: {
|
|
2
|
+
export declare function createCmsScreens({ allowInlineAuthorCreation, surveyId, }?: {
|
|
3
3
|
allowInlineAuthorCreation?: boolean;
|
|
4
|
+
surveyId?: string;
|
|
4
5
|
}): ScreenRegistry;
|
|
5
6
|
export declare const cmsScreens: ScreenRegistry;
|
|
6
7
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AA4B7D,wBAAgB,gBAAgB,CAAC,EAChC,yBAAgC,EAChC,QAAQ,GACR,GAAE;IACF,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,cAAc,CAmBtB;AAED,eAAO,MAAM,UAAU,EAAE,cAAmC,CAAA"}
|
|
@@ -10,6 +10,7 @@ import { MediaScreen } from './MediaScreen.js';
|
|
|
10
10
|
import { SettingsScreen } from './SettingsScreen.js';
|
|
11
11
|
import { SocialShareScreen } from './SocialShareScreen.js';
|
|
12
12
|
import { SubscriptionsScreen } from './SubscriptionsScreen.js';
|
|
13
|
+
import { SurveyResponsesScreen } from './SurveyResponsesScreen.js';
|
|
13
14
|
import { TopicsScreen } from './TopicsScreen.js';
|
|
14
15
|
// Thin wrappers that supply the openDoc seam for screens that need it.
|
|
15
16
|
// On click, we navigate to the content route; the ContentRoute will handle
|
|
@@ -22,7 +23,7 @@ function CalendarRoute() {
|
|
|
22
23
|
const { navigate } = useHashRouter();
|
|
23
24
|
return _jsx(CalendarScreen, { openDoc: () => navigate('content') });
|
|
24
25
|
}
|
|
25
|
-
export function createCmsScreens({ allowInlineAuthorCreation = true, } = {}) {
|
|
26
|
+
export function createCmsScreens({ allowInlineAuthorCreation = true, surveyId, } = {}) {
|
|
26
27
|
return {
|
|
27
28
|
content: () => _jsx(ContentRoute, { allowInlineAuthorCreation: allowInlineAuthorCreation }),
|
|
28
29
|
'content-insights': () => _jsx(ContentInsightsScreen, {}),
|
|
@@ -33,6 +34,9 @@ export function createCmsScreens({ allowInlineAuthorCreation = true, } = {}) {
|
|
|
33
34
|
authors: () => _jsx(AuthorsScreen, {}),
|
|
34
35
|
topics: () => _jsx(TopicsScreen, {}),
|
|
35
36
|
subscriptions: () => _jsx(SubscriptionsScreen, {}),
|
|
37
|
+
...(surveyId
|
|
38
|
+
? { 'survey-responses': () => _jsx(SurveyResponsesScreen, { surveyId: surveyId }) }
|
|
39
|
+
: {}),
|
|
36
40
|
'social-share': () => (_jsx(SocialShareScreen, { allowInlineAuthorCreation: allowInlineAuthorCreation })),
|
|
37
41
|
settings: () => _jsx(SettingsScreen, {}),
|
|
38
42
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":";AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,uEAAuE;AACvE,2EAA2E;AAC3E,+EAA+E;AAC/E,SAAS,cAAc;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAA;IACpC,OAAO,KAAC,eAAe,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAI,CAAA;AAC/D,CAAC;AAED,SAAS,aAAa;IACrB,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAA;IACpC,OAAO,KAAC,cAAc,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAI,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAChC,yBAAyB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/ui/screens/registry.tsx"],"names":[],"mappings":";AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,uEAAuE;AACvE,2EAA2E;AAC3E,+EAA+E;AAC/E,SAAS,cAAc;IACtB,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAA;IACpC,OAAO,KAAC,eAAe,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAI,CAAA;AAC/D,CAAC;AAED,SAAS,aAAa;IACrB,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAA;IACpC,OAAO,KAAC,cAAc,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAI,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAChC,yBAAyB,GAAG,IAAI,EAChC,QAAQ,MAIL,EAAE;IACL,OAAO;QACN,OAAO,EAAE,GAAG,EAAE,CAAC,KAAC,YAAY,IAAC,yBAAyB,EAAE,yBAAyB,GAAI;QACrF,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAC,qBAAqB,KAAG;QACnD,SAAS,EAAE,GAAG,EAAE,CAAC,KAAC,cAAc,KAAG;QACnC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAC,aAAa,KAAG;QACjC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAC,WAAW,KAAG;QAC5B,SAAS,EAAE,GAAG,EAAE,CAAC,KAAC,eAAe,KAAG;QACpC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAC,aAAa,KAAG;QAChC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,YAAY,KAAG;QAC9B,aAAa,EAAE,GAAG,EAAE,CAAC,KAAC,mBAAmB,KAAG;QAC5C,GAAG,CAAC,QAAQ;YACX,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAC,qBAAqB,IAAC,QAAQ,EAAE,QAAQ,GAAI,EAAE;YAC7E,CAAC,CAAC,EAAE,CAAC;QACN,cAAc,EAAE,GAAG,EAAE,CAAC,CACrB,KAAC,iBAAiB,IAAC,yBAAyB,EAAE,yBAAyB,GAAI,CAC3E;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAC,cAAc,KAAG;KAClC,CAAA;AACF,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAmB,gBAAgB,EAAE,CAAA"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -34,10 +34,8 @@ export * from './engine/index.js'
|
|
|
34
34
|
|
|
35
35
|
// Injected-provider interfaces + null implementations (spec §3.3).
|
|
36
36
|
export * from './providers/index.js'
|
|
37
|
-
|
|
38
37
|
// Route-layer user types (exported at root for convenience; full routes surface at @growth-labs/cms/routes).
|
|
39
38
|
export type { CmsUser } from './routes/context.js'
|
|
40
|
-
|
|
41
39
|
export {
|
|
42
40
|
type ArticleContentRow,
|
|
43
41
|
type AuthorRow,
|
|
@@ -82,3 +80,5 @@ export {
|
|
|
82
80
|
type WorkspaceMembershipRow,
|
|
83
81
|
type WorkspaceSettingsRow,
|
|
84
82
|
} from './schema/index.js'
|
|
83
|
+
export * from './surveys/errors.js'
|
|
84
|
+
export * from './surveys/schema.js'
|
package/src/integration/index.ts
CHANGED
|
@@ -229,6 +229,15 @@ export default function growthLabsCms(userOptions: CmsIntegrationOptions): Astro
|
|
|
229
229
|
pattern: `${base}/api/analytics`,
|
|
230
230
|
entrypoint: resolveEntrypoint('../ui/api/analytics'),
|
|
231
231
|
})
|
|
232
|
+
// Survey reporting — protected JSON plus CSV, backed by the optional host provider.
|
|
233
|
+
injectRoute({
|
|
234
|
+
pattern: `${base}/api/surveys/[surveyId]`,
|
|
235
|
+
entrypoint: resolveEntrypoint('../ui/api/surveys/[surveyId]'),
|
|
236
|
+
})
|
|
237
|
+
injectRoute({
|
|
238
|
+
pattern: `${base}/api/surveys/[surveyId]/responses.csv`,
|
|
239
|
+
entrypoint: resolveEntrypoint('../ui/api/surveys/[surveyId]/responses.csv'),
|
|
240
|
+
})
|
|
232
241
|
// Calendar
|
|
233
242
|
injectRoute({
|
|
234
243
|
pattern: `${base}/api/calendar`,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
+
import { SurveyIdSchema } from '../surveys/schema.js'
|
|
2
3
|
|
|
3
4
|
const workspaceSchema = z.object({
|
|
4
5
|
id: z.string(),
|
|
@@ -22,6 +23,12 @@ const socialSharingSchema = z
|
|
|
22
23
|
})
|
|
23
24
|
.default({})
|
|
24
25
|
|
|
26
|
+
const surveyResultsSchema = z
|
|
27
|
+
.object({
|
|
28
|
+
surveyId: SurveyIdSchema,
|
|
29
|
+
})
|
|
30
|
+
.strict()
|
|
31
|
+
|
|
25
32
|
export const cmsIntegrationOptionsSchema = z
|
|
26
33
|
.object({
|
|
27
34
|
workspaces: z.array(workspaceSchema).min(1, 'at least one workspace is required'),
|
|
@@ -30,6 +37,7 @@ export const cmsIntegrationOptionsSchema = z
|
|
|
30
37
|
searchEnabled: z.boolean().default(true),
|
|
31
38
|
theme: themeSchema,
|
|
32
39
|
socialSharing: socialSharingSchema,
|
|
40
|
+
surveyResults: surveyResultsSchema.optional(),
|
|
33
41
|
})
|
|
34
42
|
.transform((o) => ({ ...o, activeWorkspaceId: o.activeWorkspaceId ?? o.workspaces[0].id }))
|
|
35
43
|
|
package/src/providers/null.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
SeoProvider,
|
|
8
8
|
SettingsProvider,
|
|
9
9
|
SubscriptionsProvider,
|
|
10
|
+
SurveyProvider,
|
|
10
11
|
} from './types.js'
|
|
11
12
|
import { ProviderHttpError } from './types.js'
|
|
12
13
|
|
|
@@ -179,6 +180,23 @@ export const nullSettings: SettingsProvider = {
|
|
|
179
180
|
},
|
|
180
181
|
}
|
|
181
182
|
|
|
183
|
+
export const nullSurveys: SurveyProvider = {
|
|
184
|
+
async getResults() {
|
|
185
|
+
throw new ProviderHttpError(
|
|
186
|
+
503,
|
|
187
|
+
'survey_provider_unavailable',
|
|
188
|
+
'Survey provider not configured',
|
|
189
|
+
)
|
|
190
|
+
},
|
|
191
|
+
async getCsv() {
|
|
192
|
+
throw new ProviderHttpError(
|
|
193
|
+
503,
|
|
194
|
+
'survey_provider_unavailable',
|
|
195
|
+
'Survey provider not configured',
|
|
196
|
+
)
|
|
197
|
+
},
|
|
198
|
+
}
|
|
199
|
+
|
|
182
200
|
export const nullProviders: CmsProviders = {
|
|
183
201
|
analytics: nullAnalytics,
|
|
184
202
|
subscriptions: nullSubscriptions,
|
|
@@ -186,4 +204,5 @@ export const nullProviders: CmsProviders = {
|
|
|
186
204
|
seo: defaultSeo,
|
|
187
205
|
search: nullSearch,
|
|
188
206
|
settings: nullSettings,
|
|
207
|
+
surveys: nullSurveys,
|
|
189
208
|
}
|
package/src/providers/types.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SeoScoreInput, SeoScoreResult } from '../engine/seo.js'
|
|
2
|
+
import type { SurveyCsvResult, SurveyResults } from '../surveys/schema.js'
|
|
2
3
|
|
|
3
4
|
export type ProviderStatus = 'live' | 'partial' | 'empty'
|
|
4
5
|
export interface ProviderResult<T> {
|
|
@@ -402,6 +403,11 @@ export interface SettingsProvider {
|
|
|
402
403
|
getIntegrations(): Promise<ProviderResult<Record<string, CmsIntegrationStatus | null>>>
|
|
403
404
|
}
|
|
404
405
|
|
|
406
|
+
export interface SurveyProvider {
|
|
407
|
+
getResults(input: { surveyId: string }): Promise<SurveyResults>
|
|
408
|
+
getCsv(input: { surveyId: string }): Promise<SurveyCsvResult>
|
|
409
|
+
}
|
|
410
|
+
|
|
405
411
|
export interface CmsProviders {
|
|
406
412
|
analytics: AnalyticsProvider
|
|
407
413
|
subscriptions: SubscriptionsProvider
|
|
@@ -409,4 +415,5 @@ export interface CmsProviders {
|
|
|
409
415
|
seo: SeoProvider
|
|
410
416
|
search: SearchProvider
|
|
411
417
|
settings: SettingsProvider
|
|
418
|
+
surveys?: SurveyProvider
|
|
412
419
|
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
import type { MembershipRecord } from '../engine/members.js'
|
|
22
22
|
import type { CmsRole } from '../schema/types.js'
|
|
23
|
+
import { SURVEY_RESPONSE_ROLES } from '../surveys/access.js'
|
|
23
24
|
import type { Capability, CmsUser, RouteContext } from './context.js'
|
|
24
25
|
import { json } from './context.js'
|
|
25
26
|
|
|
@@ -75,6 +76,7 @@ export const CAPABILITY_MATRIX: Record<Capability, ReadonlySet<CmsRole>> = {
|
|
|
75
76
|
// Complimentary access is an editorial admin action by explicit operator
|
|
76
77
|
// decision; it is not subscriber-PII export or owner-only settings.
|
|
77
78
|
manage_complimentary_access: new Set<CmsRole>(['owner', 'senior_editor', 'editor']),
|
|
79
|
+
view_survey_responses: SURVEY_RESPONSE_ROLES,
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
// ---------------------------------------------------------------------------
|
package/src/routes/context.ts
CHANGED
|
@@ -38,6 +38,8 @@ export type Capability =
|
|
|
38
38
|
// Complimentary access administration. Explicit operator decision: owner,
|
|
39
39
|
// senior_editor, and editor may grant/revoke/retry; contributor/producer may not.
|
|
40
40
|
| 'manage_complimentary_access'
|
|
41
|
+
// Read-only survey reporting. No raw respondent identity is exposed in the screen contract.
|
|
42
|
+
| 'view_survey_responses'
|
|
41
43
|
|
|
42
44
|
export interface CmsUser {
|
|
43
45
|
subject: string
|
package/src/routes/index.ts
CHANGED
|
@@ -163,6 +163,12 @@ export {
|
|
|
163
163
|
type SubscriptionsRouteConfig,
|
|
164
164
|
type SubscriptionsRouteHandlers,
|
|
165
165
|
} from './subscriptions.js'
|
|
166
|
+
// Survey reporting routes — optional storage-neutral provider, protected by role capability.
|
|
167
|
+
export {
|
|
168
|
+
createSurveyRoutes,
|
|
169
|
+
type SurveyRouteConfig,
|
|
170
|
+
type SurveyRouteHandlers,
|
|
171
|
+
} from './surveys.js'
|
|
166
172
|
// Tag management routes — GET /tags, GET /tags?q=, DELETE /tags/:id (P3 Task 9).
|
|
167
173
|
export { createTagRoutes, type TagRouteHandlers } from './tags.js'
|
|
168
174
|
// Topic management over content_items.primary_topic.
|