@burdenoff/microfe-devportal 2026.1113.2 → 2026.1113.3

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.
@@ -19,7 +19,7 @@ var x = () => {
19
19
  let { navigate: x, basePath: S } = o(), C = s(), { t: w } = b(), T = (e, t) => {
20
20
  let n = w(e);
21
21
  return n === e ? t : n;
22
- }, E = C ? T("devportal.oauthApps.v2Title", "OAuth apps") : T("devportal.oauthApps", "OAuth Apps"), D = C ? T("devportal.oauthApps.v2Create", "Create OAuth app") : T("devportal.createOAuthApp", "Create OAuth App"), [O, k] = u(""), [A, j] = u(""), { data: M, loading: N, error: P, refetch: F } = r({ fetchPolicy: "cache-and-network" }), I = M?.currentUserApps?.apps.map((e) => ({
22
+ }, E = C ? T("devportal.oauthAppsV2Title", "OAuth apps") : T("devportal.oauthApps", "OAuth Apps"), D = C ? T("devportal.oauthAppsV2Create", "Create OAuth app") : T("devportal.createOAuthApp", "Create OAuth App"), [O, k] = u(""), [A, j] = u(""), { data: M, loading: N, error: P, refetch: F } = r({ fetchPolicy: "cache-and-network" }), I = M?.currentUserApps?.apps.map((e) => ({
23
23
  id: e.id,
24
24
  name: e.name,
25
25
  description: e.description ?? void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthClientsPage.js","names":["EmptyState","EmptyState$1","OAuthClientsPage","useDevportal","isFluidgrids","useIsFluidgridsVariant","useI18n","tr","value","t","key","fallback","oauthTitle","createLabel","searchQuery","setSearchQuery","useState","typeFilter","setTypeFilter","useCurrentUserAppsQuery","apps","data","app","handleNavigate","basePath","path","filteredApps","matchesSearch","matchesType","loading","PageLayout","Loader2","error","AlertCircle","getErrorMessage","refetch","columns","cn","Shield","scope","ActiveIndicator","stats","a","PermissionGuard","Plus","Search","EmphasisPanel","GlassCard","DataTable"],"sources":["../../../src/devportal/pages/OAuthClientsPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { Plus, Search, Shield, Loader2, AlertCircle } from \"lucide-react\";\nimport { EmphasisPanel, GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../components/PageLayout\";\nimport { DataTable } from \"../components/DataTable\";\nimport { ActiveIndicator } from \"../components/StatusBadge\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport {\n useDevportal,\n useIsFluidgridsVariant,\n} from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport type { AuthApp } from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { useCurrentUserAppsQuery, getErrorMessage } from \"../hooks\";\n\n/**\n * OAuth Apps listing page\n *\n * Displays the current user's OAuth apps from auth-svc.\n * Previously showed devportal-svc OAuthClients per application;\n * now shows all user-owned apps centrally.\n */\nexport const OAuthClientsPage: FC = () => {\n const { navigate, basePath } = useDevportal();\n const isFluidgrids = useIsFluidgridsVariant();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const oauthTitle = isFluidgrids\n ? tr(\"devportal.oauthApps.v2Title\", \"OAuth apps\")\n : tr(\"devportal.oauthApps\", \"OAuth Apps\");\n const createLabel = isFluidgrids\n ? tr(\"devportal.oauthApps.v2Create\", \"Create OAuth app\")\n : tr(\"devportal.createOAuthApp\", \"Create OAuth App\");\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState<string>(\"\");\n\n // Fetch apps from auth-svc (user-scoped, no applicationId needed)\n const { data, loading, error, refetch } = useCurrentUserAppsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n\n const apps: AuthApp[] =\n data?.currentUserApps?.apps.map(\n (app: (typeof data.currentUserApps.apps)[number]) => ({\n id: app.id,\n name: app.name,\n description: app.description ?? undefined,\n clientId: app.clientId,\n type: app.type as AuthApp[\"type\"],\n status: app.status as AuthApp[\"status\"],\n scopes: app.scopes ?? [],\n redirectUris: app.redirectUris ?? [],\n ownerUserId: app.ownerUserId,\n tenantId: app.tenantId ?? \"\",\n createdAt: app.createdAt,\n updatedAt: app.updatedAt,\n }),\n ) ?? [];\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n // Filter apps\n const filteredApps = apps.filter((app) => {\n const matchesSearch =\n !searchQuery ||\n app.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n app.clientId.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesType = !typeFilter || app.type === typeFilter;\n return matchesSearch && matchesType;\n });\n\n // Loading state\n if (loading && !data) {\n return (\n <PageLayout\n title={oauthTitle}\n description={tr(\n \"devportal.manageOAuthApps\",\n \"Manage your OAuth applications and credentials\",\n )}\n >\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-text-secondary\" />\n <span className=\"ml-2 text-text-secondary\">\n {tr(\"devportal.loadingApps\", \"Loading apps...\")}\n </span>\n </div>\n </PageLayout>\n );\n }\n\n // Error state\n if (error) {\n return (\n <PageLayout\n title={oauthTitle}\n description={tr(\n \"devportal.manageOAuthApps\",\n \"Manage your OAuth applications and credentials\",\n )}\n >\n <div className=\"rounded-lg border border-status-error-border/50 bg-status-error-bg/10 p-6 text-center\">\n <AlertCircle className=\"mx-auto h-8 w-8 text-status-error-text\" />\n <h3 className=\"mt-2 font-medium text-status-error-text\">\n {tr(\"devportal.failedToLoadApps\", \"Failed to load apps\")}\n </h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {getErrorMessage(error)}\n </p>\n <button\n onClick={() => refetch()}\n className=\"mt-4 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n {tr(\"devportal.tryAgain\", \"Try Again\")}\n </button>\n </div>\n </PageLayout>\n );\n }\n\n const columns = [\n {\n key: \"name\",\n header: \"App\",\n render: (app: AuthApp) => (\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n \"flex h-10 w-10 items-center justify-center rounded-lg\",\n app.status === \"ACTIVE\"\n ? \"bg-action-primary-bg/10 text-primary\"\n : \"bg-bg-sunken text-text-tertiary\",\n )}\n >\n <Shield size={20} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"font-medium\">{app.name}</p>\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 text-xs\",\n app.type === \"SERVICE\"\n ? \"bg-accent-purple-subtle text-accent-purple\"\n : app.type === \"INTEGRATION\" ||\n app.type === \"API_INTEGRATION\"\n ? \"bg-status-info-bg-subtle text-status-info-text\"\n : \"bg-status-success-bg-subtle text-status-success-text\",\n )}\n >\n {app.type}\n </span>\n </div>\n <code className=\"text-xs text-text-secondary\">{app.clientId}</code>\n </div>\n </div>\n ),\n },\n {\n key: \"scopes\",\n header: \"Scopes\",\n render: (app: AuthApp) => (\n <div className=\"flex flex-wrap gap-1\">\n {app.scopes.slice(0, 3).map((scope) => (\n <span\n key={scope}\n className=\"inline-flex rounded bg-bg-sunken px-1.5 py-0.5 text-xs\"\n >\n {scope}\n </span>\n ))}\n {app.scopes.length > 3 && (\n <span className=\"text-xs text-text-secondary\">\n +{app.scopes.length - 3}\n </span>\n )}\n </div>\n ),\n },\n {\n key: \"redirectUris\",\n header: \"Redirect URIs\",\n render: (app: AuthApp) => (\n <span className=\"text-sm\">\n {app.redirectUris.length} URI\n {app.redirectUris.length !== 1 ? \"s\" : \"\"}\n </span>\n ),\n },\n {\n key: \"status\",\n header: \"Status\",\n render: (app: AuthApp) => (\n <div className=\"flex items-center gap-2\">\n <ActiveIndicator active={app.status === \"ACTIVE\"} />\n <span className=\"text-sm\">{app.status}</span>\n </div>\n ),\n },\n ];\n\n // Stats\n const stats = {\n total: apps.length,\n active: apps.filter((a) => a.status === \"ACTIVE\").length,\n integration: apps.filter(\n (a) => a.type === \"INTEGRATION\" || a.type === \"API_INTEGRATION\",\n ).length,\n service: apps.filter((a) => a.type === \"SERVICE\").length,\n };\n\n return (\n <PermissionGuard authOnly>\n <PageLayout\n title={oauthTitle}\n description={tr(\n \"devportal.manageOAuthApps\",\n \"Manage your OAuth applications and credentials\",\n )}\n backLink={isFluidgrids ? \"/settings\" : undefined}\n backLabel={tr(\"devportal.developerSettings.back\", \"Developer settings\")}\n purpose={tr(\n \"devportal.oauthAppsPurpose\",\n \"OAuth apps let external services sign in users and call the API on their behalf. Register one here to get a client ID and secret, set redirect URIs, and choose the scopes your integration may request.\",\n )}\n actions={\n <button\n onClick={() => handleNavigate(\"/oauth/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Plus size={16} />\n {createLabel}\n </button>\n }\n >\n {/* Filters */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex flex-1 items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <Search\n size={16}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <input\n type=\"text\"\n placeholder={tr(\n \"devportal.searchByNameOrClientId\",\n \"Search by name or client ID...\",\n )}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border bg-bg-surface pl-9 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n />\n </div>\n <select\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value)}\n className=\"rounded-md border bg-bg-surface px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary scheme-normal dark:scheme-dark [&_option]:bg-bg-surface [&_option]:text-text-primary\"\n >\n <option value=\"\">{tr(\"devportal.allTypes\", \"All Types\")}</option>\n <option value=\"SERVICE\">\n {tr(\"devportal.service\", \"Service\")}\n </option>\n <option value=\"INTEGRATION\">\n {tr(\"devportal.integration\", \"Integration\")}\n </option>\n <option value=\"BOT\">{tr(\"devportal.bot\", \"Bot\")}</option>\n <option value=\"WEB_APP\">\n {tr(\"devportal.webApp\", \"Web App\")}\n </option>\n <option value=\"AUTOMATION\">\n {tr(\"devportal.automation\", \"Automation\")}\n </option>\n </select>\n </div>\n </div>\n\n {/* Summary Stats — primary emphasis zone */}\n <EmphasisPanel>\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.totalApps\", \"Total Apps\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.total}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-status-success-text\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.active\", \"Active\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.active}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-accent-blue\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.integration\", \"Integration\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.integration}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-accent-purple\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.service\", \"Service\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.service}\n </p>\n </GlassCard>\n </div>\n </EmphasisPanel>\n\n <p className=\"text-sm text-text-secondary\">\n {filteredApps.length}{\" \"}\n {filteredApps.length !== 1\n ? tr(\"devportal.appsFound\", \"apps found\")\n : tr(\"devportal.appFound\", \"app found\")}\n </p>\n\n {/* Apps Table */}\n {filteredApps.length > 0 ? (\n <DataTable\n data={filteredApps}\n columns={columns}\n keyField=\"id\"\n onRowClick={(app) => handleNavigate(`/oauth/${app.id}`)}\n />\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n title={tr(\"devportal.noOAuthAppsFound\", \"No OAuth apps found\")}\n description={\n searchQuery || typeFilter\n ? tr(\n \"devportal.tryAdjustingFilters\",\n \"Try adjusting your filters\",\n )\n : tr(\n \"devportal.createFirstOAuthApp\",\n \"Create your first OAuth app to enable authentication\",\n )\n }\n action={\n !searchQuery && !typeFilter ? (\n <button\n onClick={() => handleNavigate(\"/oauth/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus size={16} />\n {createLabel}\n </button>\n ) : undefined\n }\n />\n )}\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"OAuthClientsPage.js","names":["EmptyState","EmptyState$1","OAuthClientsPage","useDevportal","isFluidgrids","useIsFluidgridsVariant","useI18n","tr","value","t","key","fallback","oauthTitle","createLabel","searchQuery","setSearchQuery","useState","typeFilter","setTypeFilter","useCurrentUserAppsQuery","apps","data","app","handleNavigate","basePath","path","filteredApps","matchesSearch","matchesType","loading","PageLayout","Loader2","error","AlertCircle","getErrorMessage","refetch","columns","cn","Shield","scope","ActiveIndicator","stats","a","PermissionGuard","Plus","Search","EmphasisPanel","GlassCard","DataTable"],"sources":["../../../src/devportal/pages/OAuthClientsPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState } from \"react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { Plus, Search, Shield, Loader2, AlertCircle } from \"lucide-react\";\nimport { EmphasisPanel, GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport { PageLayout } from \"../components/PageLayout\";\nimport { DataTable } from \"../components/DataTable\";\nimport { ActiveIndicator } from \"../components/StatusBadge\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport {\n useDevportal,\n useIsFluidgridsVariant,\n} from \"../providers/DevportalProvider\";\nimport { PermissionGuard } from \"../components\";\nimport type { AuthApp } from \"../types\";\nimport { cn } from \"../utils/cn\";\nimport { useCurrentUserAppsQuery, getErrorMessage } from \"../hooks\";\n\n/**\n * OAuth Apps listing page\n *\n * Displays the current user's OAuth apps from auth-svc.\n * Previously showed devportal-svc OAuthClients per application;\n * now shows all user-owned apps centrally.\n */\nexport const OAuthClientsPage: FC = () => {\n const { navigate, basePath } = useDevportal();\n const isFluidgrids = useIsFluidgridsVariant();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const oauthTitle = isFluidgrids\n ? tr(\"devportal.oauthAppsV2Title\", \"OAuth apps\")\n : tr(\"devportal.oauthApps\", \"OAuth Apps\");\n const createLabel = isFluidgrids\n ? tr(\"devportal.oauthAppsV2Create\", \"Create OAuth app\")\n : tr(\"devportal.createOAuthApp\", \"Create OAuth App\");\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [typeFilter, setTypeFilter] = useState<string>(\"\");\n\n // Fetch apps from auth-svc (user-scoped, no applicationId needed)\n const { data, loading, error, refetch } = useCurrentUserAppsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n\n const apps: AuthApp[] =\n data?.currentUserApps?.apps.map(\n (app: (typeof data.currentUserApps.apps)[number]) => ({\n id: app.id,\n name: app.name,\n description: app.description ?? undefined,\n clientId: app.clientId,\n type: app.type as AuthApp[\"type\"],\n status: app.status as AuthApp[\"status\"],\n scopes: app.scopes ?? [],\n redirectUris: app.redirectUris ?? [],\n ownerUserId: app.ownerUserId,\n tenantId: app.tenantId ?? \"\",\n createdAt: app.createdAt,\n updatedAt: app.updatedAt,\n }),\n ) ?? [];\n\n const handleNavigate = (path: string) => {\n navigate?.(`${basePath}${path}`);\n };\n\n // Filter apps\n const filteredApps = apps.filter((app) => {\n const matchesSearch =\n !searchQuery ||\n app.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n app.clientId.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesType = !typeFilter || app.type === typeFilter;\n return matchesSearch && matchesType;\n });\n\n // Loading state\n if (loading && !data) {\n return (\n <PageLayout\n title={oauthTitle}\n description={tr(\n \"devportal.manageOAuthApps\",\n \"Manage your OAuth applications and credentials\",\n )}\n >\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-text-secondary\" />\n <span className=\"ml-2 text-text-secondary\">\n {tr(\"devportal.loadingApps\", \"Loading apps...\")}\n </span>\n </div>\n </PageLayout>\n );\n }\n\n // Error state\n if (error) {\n return (\n <PageLayout\n title={oauthTitle}\n description={tr(\n \"devportal.manageOAuthApps\",\n \"Manage your OAuth applications and credentials\",\n )}\n >\n <div className=\"rounded-lg border border-status-error-border/50 bg-status-error-bg/10 p-6 text-center\">\n <AlertCircle className=\"mx-auto h-8 w-8 text-status-error-text\" />\n <h3 className=\"mt-2 font-medium text-status-error-text\">\n {tr(\"devportal.failedToLoadApps\", \"Failed to load apps\")}\n </h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {getErrorMessage(error)}\n </p>\n <button\n onClick={() => refetch()}\n className=\"mt-4 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n {tr(\"devportal.tryAgain\", \"Try Again\")}\n </button>\n </div>\n </PageLayout>\n );\n }\n\n const columns = [\n {\n key: \"name\",\n header: \"App\",\n render: (app: AuthApp) => (\n <div className=\"flex items-center gap-3\">\n <div\n className={cn(\n \"flex h-10 w-10 items-center justify-center rounded-lg\",\n app.status === \"ACTIVE\"\n ? \"bg-action-primary-bg/10 text-primary\"\n : \"bg-bg-sunken text-text-tertiary\",\n )}\n >\n <Shield size={20} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <p className=\"font-medium\">{app.name}</p>\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 text-xs\",\n app.type === \"SERVICE\"\n ? \"bg-accent-purple-subtle text-accent-purple\"\n : app.type === \"INTEGRATION\" ||\n app.type === \"API_INTEGRATION\"\n ? \"bg-status-info-bg-subtle text-status-info-text\"\n : \"bg-status-success-bg-subtle text-status-success-text\",\n )}\n >\n {app.type}\n </span>\n </div>\n <code className=\"text-xs text-text-secondary\">{app.clientId}</code>\n </div>\n </div>\n ),\n },\n {\n key: \"scopes\",\n header: \"Scopes\",\n render: (app: AuthApp) => (\n <div className=\"flex flex-wrap gap-1\">\n {app.scopes.slice(0, 3).map((scope) => (\n <span\n key={scope}\n className=\"inline-flex rounded bg-bg-sunken px-1.5 py-0.5 text-xs\"\n >\n {scope}\n </span>\n ))}\n {app.scopes.length > 3 && (\n <span className=\"text-xs text-text-secondary\">\n +{app.scopes.length - 3}\n </span>\n )}\n </div>\n ),\n },\n {\n key: \"redirectUris\",\n header: \"Redirect URIs\",\n render: (app: AuthApp) => (\n <span className=\"text-sm\">\n {app.redirectUris.length} URI\n {app.redirectUris.length !== 1 ? \"s\" : \"\"}\n </span>\n ),\n },\n {\n key: \"status\",\n header: \"Status\",\n render: (app: AuthApp) => (\n <div className=\"flex items-center gap-2\">\n <ActiveIndicator active={app.status === \"ACTIVE\"} />\n <span className=\"text-sm\">{app.status}</span>\n </div>\n ),\n },\n ];\n\n // Stats\n const stats = {\n total: apps.length,\n active: apps.filter((a) => a.status === \"ACTIVE\").length,\n integration: apps.filter(\n (a) => a.type === \"INTEGRATION\" || a.type === \"API_INTEGRATION\",\n ).length,\n service: apps.filter((a) => a.type === \"SERVICE\").length,\n };\n\n return (\n <PermissionGuard authOnly>\n <PageLayout\n title={oauthTitle}\n description={tr(\n \"devportal.manageOAuthApps\",\n \"Manage your OAuth applications and credentials\",\n )}\n backLink={isFluidgrids ? \"/settings\" : undefined}\n backLabel={tr(\"devportal.developerSettings.back\", \"Developer settings\")}\n purpose={tr(\n \"devportal.oauthAppsPurpose\",\n \"OAuth apps let external services sign in users and call the API on their behalf. Register one here to get a client ID and secret, set redirect URIs, and choose the scopes your integration may request.\",\n )}\n actions={\n <button\n onClick={() => handleNavigate(\"/oauth/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <Plus size={16} />\n {createLabel}\n </button>\n }\n >\n {/* Filters */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex flex-1 items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <Search\n size={16}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <input\n type=\"text\"\n placeholder={tr(\n \"devportal.searchByNameOrClientId\",\n \"Search by name or client ID...\",\n )}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border bg-bg-surface pl-9 pr-4 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n />\n </div>\n <select\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value)}\n className=\"rounded-md border bg-bg-surface px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary scheme-normal dark:scheme-dark [&_option]:bg-bg-surface [&_option]:text-text-primary\"\n >\n <option value=\"\">{tr(\"devportal.allTypes\", \"All Types\")}</option>\n <option value=\"SERVICE\">\n {tr(\"devportal.service\", \"Service\")}\n </option>\n <option value=\"INTEGRATION\">\n {tr(\"devportal.integration\", \"Integration\")}\n </option>\n <option value=\"BOT\">{tr(\"devportal.bot\", \"Bot\")}</option>\n <option value=\"WEB_APP\">\n {tr(\"devportal.webApp\", \"Web App\")}\n </option>\n <option value=\"AUTOMATION\">\n {tr(\"devportal.automation\", \"Automation\")}\n </option>\n </select>\n </div>\n </div>\n\n {/* Summary Stats — primary emphasis zone */}\n <EmphasisPanel>\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.totalApps\", \"Total Apps\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.total}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-status-success-text\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.active\", \"Active\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.active}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-accent-blue\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.integration\", \"Integration\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.integration}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <div className=\"flex items-center gap-2 text-accent-purple\">\n <Shield size={16} />\n <span className=\"text-sm\">\n {tr(\"devportal.service\", \"Service\")}\n </span>\n </div>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">\n {stats.service}\n </p>\n </GlassCard>\n </div>\n </EmphasisPanel>\n\n <p className=\"text-sm text-text-secondary\">\n {filteredApps.length}{\" \"}\n {filteredApps.length !== 1\n ? tr(\"devportal.appsFound\", \"apps found\")\n : tr(\"devportal.appFound\", \"app found\")}\n </p>\n\n {/* Apps Table */}\n {filteredApps.length > 0 ? (\n <DataTable\n data={filteredApps}\n columns={columns}\n keyField=\"id\"\n onRowClick={(app) => handleNavigate(`/oauth/${app.id}`)}\n />\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n title={tr(\"devportal.noOAuthAppsFound\", \"No OAuth apps found\")}\n description={\n searchQuery || typeFilter\n ? tr(\n \"devportal.tryAdjustingFilters\",\n \"Try adjusting your filters\",\n )\n : tr(\n \"devportal.createFirstOAuthApp\",\n \"Create your first OAuth app to enable authentication\",\n )\n }\n action={\n !searchQuery && !typeFilter ? (\n <button\n onClick={() => handleNavigate(\"/oauth/new\")}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus size={16} />\n {createLabel}\n </button>\n ) : undefined\n }\n />\n )}\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-devportal",
3
- "version": "2026.1113.2",
3
+ "version": "2026.1113.3",
4
4
  "description": "Burdenoff Developer Portal Microfrontend - Complete developer operations interface",
5
5
  "type": "module",
6
6
  "files": [