diff --git a/package-lock.json b/package-lock.json index ae56597..31ef001 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,8 @@ "@storybook/addon-docs": "^10.3.3", "@storybook/addon-vitest": "^10.3.3", "@testing-library/jest-dom": "^6.6.3", + "@types/node": "^26.1.1", + "@types/pngjs": "^6.0.5", "@vitest/browser-playwright": "^4.1.1", "@vitest/coverage-v8": "^4.1.1", "jsdom": "^25.0.1", @@ -3517,6 +3519,33 @@ "@types/braces": "*" } }, + "node_modules/@types/node": { + "version": "26.1.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", + "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/pngjs": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", + "integrity": "sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/react": { "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", diff --git a/package.json b/package.json index 13b0441..b09cbd3 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,8 @@ "@storybook/addon-docs": "^10.3.3", "@storybook/addon-vitest": "^10.3.3", "@testing-library/jest-dom": "^6.6.3", + "@types/node": "^26.1.1", + "@types/pngjs": "^6.0.5", "@vitest/browser-playwright": "^4.1.1", "@vitest/coverage-v8": "^4.1.1", "jsdom": "^25.0.1", diff --git a/src/components/admin/DashboardDesignPreview.tsx b/src/components/admin/DashboardDesignPreview.tsx index b1e2760..0a41fb4 100644 --- a/src/components/admin/DashboardDesignPreview.tsx +++ b/src/components/admin/DashboardDesignPreview.tsx @@ -2516,9 +2516,9 @@ export default function DashboardDesignPreview(props: { return (
{row.title} - {row.amount} + {row.budget} {row.status} - {row.responses} responses + {row.responseTag}
); }} diff --git a/src/components/admin/ProfessionAdminListPage.tsx b/src/components/admin/ProfessionAdminListPage.tsx index 6baac16..0dba1c9 100644 --- a/src/components/admin/ProfessionAdminListPage.tsx +++ b/src/components/admin/ProfessionAdminListPage.tsx @@ -36,6 +36,7 @@ export default function ProfessionAdminListPage(props: { emptyLabel: string; viewHref: (id: string) => string; nameField?: string; + createHref?: string; }) { const nameField = props.nameField || 'first_name'; const [items] = createResource(() => props.endpoint, fetchProfessionList); diff --git a/src/lib/admin-auth.test.ts b/src/lib/admin-auth.test.ts index d905566..fc6a399 100644 --- a/src/lib/admin-auth.test.ts +++ b/src/lib/admin-auth.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { isExternalIdentity, pickManagementLoginError } from './admin-auth.ts'; +import { isExternalIdentity, pickManagementLoginError } from './admin-auth'; describe('admin-auth', () => { it('pickManagementLoginError prefers wrong-portal message', () => { diff --git a/src/lib/admin/module-access.test.ts b/src/lib/admin/module-access.test.ts index 07944e8..d3233ed 100644 --- a/src/lib/admin/module-access.test.ts +++ b/src/lib/admin/module-access.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { normalizeAllowedModules } from './module-access.ts'; +import { normalizeAllowedModules } from './module-access'; describe('module-access', () => { it('normalizeAllowedModules reads explicit module arrays', () => { diff --git a/src/lib/api.ts b/src/lib/api.ts index 4eae36c..2965d07 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -231,8 +231,10 @@ export interface UpdatePackageInput { features?: any; } -export async function listAdminPackages() { - return api.get<{ packages: AdminPackage[] } | AdminPackage[]>(`/api/admin/tracecoin-packages`); +export async function listAdminPackages(): Promise { + const res = await api.get<{ packages: AdminPackage[] } | AdminPackage[]>(`/api/admin/tracecoin-packages`); + const raw = res.data; + return Array.isArray(raw) ? raw : (raw as { packages: AdminPackage[] }).packages ?? []; } export async function createAdminPackage(input: CreatePackageInput) { diff --git a/src/lib/runtime/storage.ts b/src/lib/runtime/storage.ts index a692eff..0fba263 100644 --- a/src/lib/runtime/storage.ts +++ b/src/lib/runtime/storage.ts @@ -83,6 +83,7 @@ export async function saveRuntimeConfig(type: RuntimeRecordType, key: string, pa role: '/api/runtime-config', // Storing the "role config wrapper" as runtime_config dashboard: '/api/admin/dashboard-config', onboarding: '/api/admin/onboarding-config', + knowledge_base: '/api/admin/knowledge-base', }; const bodyPayload: Record = { @@ -119,6 +120,7 @@ export async function listRuntimeConfigs(type: RuntimeRecordType): Promise(type: RuntimeRecordType, roleId: strin role: `/api/admin/roles/${roleId}`, // Assume roleId is key if testing dashboard: `/api/admin/dashboard-config/${roleId}?audience=EXTERNAL`, onboarding: `/api/admin/onboarding-config/${roleId}`, + knowledge_base: `/api/admin/knowledge-base/${roleId}`, }; try { diff --git a/src/lib/server/gateway.ts b/src/lib/server/gateway.ts index 83c1281..c3c1d84 100644 --- a/src/lib/server/gateway.ts +++ b/src/lib/server/gateway.ts @@ -1,5 +1,5 @@ // Server-side helper: all backend calls go through the Rust gateway -const GATEWAY_URL = (process.env.GATEWAY_URL || 'http://localhost:9100').replace(/\/+$/, ''); +const GATEWAY_URL = (import.meta.env.VITE_GATEWAY_URL || 'http://localhost:9100').replace(/\/+$/, ''); export function gatewayUrl(path: string): string { const normalized = path.startsWith('/') ? path : `/${path}`; diff --git a/src/routes/admin/coupon.tsx b/src/routes/admin/coupon.tsx index 77d02cf..a25df23 100644 --- a/src/routes/admin/coupon.tsx +++ b/src/routes/admin/coupon.tsx @@ -153,6 +153,7 @@ export default function CouponPage() { value: coupon.value, min_order_amount: coupon.min_order_amount || 0, max_uses: coupon.usage_limit != null ? String(coupon.usage_limit) : "", + applies_to: 'ALL' as "ALL" | "ROLE", role_keys: Array.isArray(coupon.role_keys) ? coupon.role_keys : [], }); setActiveTab("create"); diff --git a/src/routes/admin/employees/create.tsx b/src/routes/admin/employees/create.tsx index 06644a2..f7c1111 100644 --- a/src/routes/admin/employees/create.tsx +++ b/src/routes/admin/employees/create.tsx @@ -3,7 +3,7 @@ import { createResource, createSignal, For, onMount, Show } from "solid-js"; const API = ""; -type Role = { id: string; name: string }; +type Role = { id: string; name: string; key: string }; type Dept = { id: string; name: string }; type Desig = { id: string; name: string }; diff --git a/src/routes/admin/pricing.tsx b/src/routes/admin/pricing.tsx index b84e26a..d77a42a 100644 --- a/src/routes/admin/pricing.tsx +++ b/src/routes/admin/pricing.tsx @@ -72,8 +72,18 @@ const SORT_LABELS: Record = { coins_desc: 'TraceCoins ↓', }; +const API = ''; + +function authHeaders(): Record { + const token = typeof sessionStorage !== 'undefined' + ? sessionStorage.getItem('nxtgauge_admin_access_token') || '' + : ''; + return token ? { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' } : { 'Content-Type': 'application/json' }; +} + export default function PricingPage() { - const [rows, setRows] = createSignal([]); + const [packages, { refetch }] = createResource(listAdminPackages); + const [rows, setRows] = createSignal([]); const [loading, setLoading] = createSignal(true); const [loadError, setLoadError] = createSignal(""); const [view, setView] = createSignal<"packages" | "create" | "ai_packages">("packages"); @@ -256,7 +266,7 @@ export default function PricingPage() { } }; - onMount(() => void load()); + onMount(() => { void load(); void loadAiPackages(); }); const filteredRows = createMemo(() => { let r = packages() ?? []; @@ -924,8 +934,7 @@ export default function PricingPage() { {/* AI Credit Packages Tab */} -
loadAiPackages()}> +

AI Credit Packages