@genispace/geniapp 0.1.0 → 0.2.0
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 +5 -15
- package/dist/{CrossAppRecordPicker-BXchXcK5.js → CrossAppRecordPicker-CQVmirWD.js} +2 -2
- package/dist/CrossAppRecordPicker-CQVmirWD.js.map +1 -0
- package/dist/ai/managed-data/queryManagedDatasource.d.ts +1 -1
- package/dist/ai.js +1 -1
- package/dist/ai.js.map +1 -1
- package/dist/hooks/shell/useGenispacePlatformClient.d.ts +1 -1
- package/dist/hooks.js +1 -1
- package/dist/index.js +1 -1
- package/dist/vite.js +2 -2
- package/dist/vite.js.map +1 -1
- package/package.json +3 -3
- package/dist/CrossAppRecordPicker-BXchXcK5.js.map +0 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ Public, versioned developer contract for building a GeniApp. This package is int
|
|
|
7
7
|
```text
|
|
8
8
|
frontend/ geniapp/ applications/
|
|
9
9
|
├── apps/* └── @genispace/geniapp └── apps/*
|
|
10
|
-
└── packages/shared-* (private) ├── ui + kit ├── genispace
|
|
10
|
+
└── packages/shared-* (private) ├── ui + kit ├── @genispace/sdk
|
|
11
11
|
├── Shell bridge └── @genispace/geniapp
|
|
12
12
|
├── hooks + runtime
|
|
13
13
|
├── theme + i18n contract
|
|
@@ -16,25 +16,15 @@ frontend/ geniapp/ applications/
|
|
|
16
16
|
|
|
17
17
|
- `frontend/packages/shared-*` belongs only to the platform frontend and is never a GeniApp dependency.
|
|
18
18
|
- `@genispace/geniapp` is the public UI/runtime/build contract used by built-in, custom and Workbench-exported GeniApps.
|
|
19
|
-
- [
|
|
20
|
-
- `@genispace/geniapp@0.
|
|
19
|
+
- [`@genispace/sdk`](https://www.npmjs.com/package/@genispace/sdk) is the public platform API SDK. This package does not duplicate its HTTP/SSE clients.
|
|
20
|
+
- `@genispace/geniapp@0.2.0` requires exactly `@genispace/sdk@3.1.0`. The SDK version is part of the GeniApp runtime contract and is checked before packing or publishing.
|
|
21
21
|
|
|
22
22
|
## Install
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Install both public packages from npm. GeniApp releases pin their supported SDK version exactly, so applications should use the matching SDK version shown below.
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
pnpm add @genispace/geniapp genispace react react-dom react-router-dom i18next react-i18next
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
During local migration before the first npm release:
|
|
31
|
-
|
|
32
|
-
```json
|
|
33
|
-
{
|
|
34
|
-
"dependencies": {
|
|
35
|
-
"@genispace/geniapp": "file:../../../geniapp"
|
|
36
|
-
}
|
|
37
|
-
}
|
|
27
|
+
pnpm add @genispace/geniapp@0.2.0 @genispace/sdk@3.1.0 react react-dom react-router-dom i18next react-i18next
|
|
38
28
|
```
|
|
39
29
|
|
|
40
30
|
## Public entries
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useRef as I, useEffect as w, useState as g, useMemo as q, useCallback as F, useId as W } from "react";
|
|
2
2
|
import { useLocation as K } from "react-router-dom";
|
|
3
|
-
import Q from "genispace";
|
|
3
|
+
import Q from "@genispace/sdk";
|
|
4
4
|
import { G as C, a as H } from "./shell-DIHnXIUb.js";
|
|
5
5
|
import { jsxs as u, jsx as a, Fragment as O } from "react/jsx-runtime";
|
|
6
6
|
function M(e) {
|
|
@@ -621,4 +621,4 @@ export {
|
|
|
621
621
|
B as y,
|
|
622
622
|
ye as z
|
|
623
623
|
};
|
|
624
|
-
//# sourceMappingURL=CrossAppRecordPicker-
|
|
624
|
+
//# sourceMappingURL=CrossAppRecordPicker-CQVmirWD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossAppRecordPicker-CQVmirWD.js","sources":["../src/hooks/routing/useRefetchOnRouteMatch.ts","../src/hooks/routing/draftEntityId.ts","../src/hooks/config/currencies.ts","../src/hooks/config/businessLocale.ts","../src/hooks/shell/useGenispacePlatformClient.ts","../src/hooks/access/useAppAccess.ts","../src/hooks/access/AppAccessNotice.tsx","../src/hooks/access/AppAccessGate.tsx","../src/hooks/picker/partnerPayload.ts","../src/hooks/shell/resolveApiRoot.ts","../src/hooks/picker/managedAppPicker.ts","../src/hooks/picker/CrossAppRecordPicker.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nfunction normalizePath(p: string): string {\n const t = p.replace(/\\/$/, '');\n return t || '/';\n}\n\n/** True when pathname is exactly the list route (not `/list/new` or `/list/:id`). */\nexport function isListRoutePath(pathname: string, listPath: string): boolean {\n return normalizePath(pathname) === normalizePath(listPath);\n}\n\n/**\n * Refetch list data when the user is on the list route (including returning from a FormPage).\n */\nexport function useRefetchOnRouteMatch(\n listPath: string,\n load: () => void | Promise<void>\n): void {\n const { pathname } = useLocation();\n const loadRef = useRef(load);\n loadRef.current = load;\n const onList = isListRoutePath(pathname, listPath);\n\n useEffect(() => {\n if (!onList) return;\n void loadRef.current();\n }, [onList, pathname, listPath]);\n}\n","export const ROUTE_NEW_PLACEHOLDER = 'new';\n\nexport function isRouteNewPlaceholder(id?: string | null): boolean {\n return !id?.trim() || id === ROUTE_NEW_PLACEHOLDER;\n}\n\nexport function isRouteEditMode(id?: string | null): boolean {\n return !isRouteNewPlaceholder(id);\n}\n\n/** For transaction saves: generate a client-side UUID when route id is invalid. */\nexport function resolveDraftEntityId(id?: string | null): string {\n const trimmed = id?.trim();\n if (!trimmed || trimmed === ROUTE_NEW_PLACEHOLDER) return crypto.randomUUID();\n return trimmed;\n}\n","export const ROUTE_NEW_PLACEHOLDER = 'new';\n\nexport const COMMON_CURRENCY_OPTIONS = [\n 'USD',\n 'CNY',\n 'EUR',\n 'GBP',\n 'JPY',\n 'HKD',\n 'AUD',\n 'CAD',\n 'SGD',\n 'CHF',\n] as const;\n\nexport type CurrencyCode = (typeof COMMON_CURRENCY_OPTIONS)[number];\n\nconst displayNamesCache = new Map<string, Intl.DisplayNames>();\n\nfunction getDisplayNames(locale: string): Intl.DisplayNames {\n let dn = displayNamesCache.get(locale);\n if (!dn) {\n dn = new Intl.DisplayNames([locale], { type: 'currency' });\n displayNamesCache.set(locale, dn);\n }\n return dn;\n}\n\nexport function currencyLabel(code: string, locale = 'en'): string {\n const upper = code.trim().toUpperCase();\n try {\n return getDisplayNames(locale).of(upper) ?? upper;\n } catch {\n return upper;\n }\n}\n\nexport function parseEnabledCurrenciesJson(raw: unknown): string[] {\n if (Array.isArray(raw)) {\n return raw.filter((x): x is string => typeof x === 'string').map((x) => x.trim().toUpperCase());\n }\n if (typeof raw === 'string' && raw.trim()) {\n try {\n return parseEnabledCurrenciesJson(JSON.parse(raw));\n } catch {\n return [];\n }\n }\n return [];\n}\n\nexport function normalizeEnabledCurrencies(\n codes: string[] | null | undefined,\n options: { minOne?: string } = {}\n): string[] {\n const minOne = (options.minOne ?? 'USD').toUpperCase();\n const seen = new Set<string>();\n const out: string[] = [];\n for (const code of codes ?? []) {\n const upper = code.trim().toUpperCase();\n if (!upper || seen.has(upper)) continue;\n seen.add(upper);\n out.push(upper);\n }\n if (out.length === 0) return [minOne];\n if (!seen.has(minOne)) out.unshift(minOne);\n return out;\n}\n\nexport const DEFAULT_ENABLED_CURRENCIES = ['USD'] as const;\n","export type BusinessLocale = 'en-US' | 'zh-CN';\n\nfunction selectedApplicationLanguage(): string | null {\n if (typeof window === 'undefined') return null;\n try {\n return window.localStorage.getItem('i18nextLng') || window.localStorage.getItem('language');\n } catch {\n return null;\n }\n}\n\n/**\n * Convert the language explicitly selected in GeniSpace into the locale used\n * for business dates, numbers and currencies. Browser locale is deliberately\n * ignored so a Chinese page cannot silently render US dates (or vice versa).\n */\nexport function resolveBusinessLocale(language?: string | null): BusinessLocale {\n const selectedLanguage = language || selectedApplicationLanguage();\n return selectedLanguage?.trim().toLowerCase().replaceAll('_', '-').startsWith('zh')\n ? 'zh-CN'\n : 'en-US';\n}\n\nexport function formatBusinessTime(\n value: unknown,\n language?: string | null,\n options: Intl.DateTimeFormatOptions = { timeStyle: 'short' },\n): string {\n return formatBusinessDate(value, language, options);\n}\n\nexport function formatBusinessDate(\n value: unknown,\n language?: string | null,\n options: Intl.DateTimeFormatOptions = { dateStyle: 'medium' },\n): string {\n if (value == null || value === '') return '—';\n const date = value instanceof Date ? value : new Date(String(value));\n if (Number.isNaN(date.getTime())) return String(value);\n return new Intl.DateTimeFormat(resolveBusinessLocale(language), options).format(date);\n}\n\nexport function formatBusinessDateTime(\n value: unknown,\n language?: string | null,\n options: Intl.DateTimeFormatOptions = { dateStyle: 'medium', timeStyle: 'short' },\n): string {\n return formatBusinessDate(value, language, options);\n}\n\nexport function formatBusinessNumber(\n value: unknown,\n language?: string | null,\n options?: Intl.NumberFormatOptions,\n): string {\n const numericValue = Number(value ?? 0);\n return new Intl.NumberFormat(resolveBusinessLocale(language), options).format(\n Number.isFinite(numericValue) ? numericValue : 0,\n );\n}\n\nexport function formatBusinessCurrency(\n value: unknown,\n currency: unknown,\n language?: string | null,\n): string {\n const numericValue = Number(value ?? 0);\n return new Intl.NumberFormat(resolveBusinessLocale(language), {\n style: 'currency',\n currency: String(currency || 'USD'),\n maximumFractionDigits: 2,\n }).format(Number.isFinite(numericValue) ? numericValue : 0);\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport GeniSpace from '@genispace/sdk';\nimport { GENISPACE_SHELL_INIT_APPLIED_EVENT } from './shell';\n\nfunction readAccessToken(): string {\n try {\n return localStorage.getItem('token') ?? '';\n } catch {\n return '';\n }\n}\n\n/**\n * Platform GeniSpace client for `/teams/members`, `/users/profiles/batch`, etc.\n * Rebuilds when Shell posts GENISPACE_SHELL_INIT (API base + token).\n */\nexport function useGenispacePlatformClient(getApiRoot: () => string): GeniSpace {\n const [shellRevision, setShellRevision] = useState(0);\n\n useEffect(() => {\n const onShellInit = () => setShellRevision((n) => n + 1);\n window.addEventListener(GENISPACE_SHELL_INIT_APPLIED_EVENT, onShellInit);\n return () => window.removeEventListener(GENISPACE_SHELL_INIT_APPLIED_EVENT, onShellInit);\n }, []);\n\n return useMemo(() => {\n const token = readAccessToken();\n const baseURL = getApiRoot().replace(/\\/$/, '');\n const client = new GeniSpace({\n baseURL,\n apiKey: token,\n accessToken: token || undefined,\n });\n return client;\n }, [shellRevision, getApiRoot]);\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { GENISPACE_SHELL_INIT_APPLIED_EVENT, GENISPACE_SHELL_SESSION_API_KEY } from '../shell/shell';\n\nexport type AppAccess = {\n isUser: boolean;\n permissionCodes: string[];\n loading: boolean;\n /** Set when the access API call fails (network / server error). Distinct from zero permissions. */\n accessError: string | null;\n reloadAccess: () => void;\n};\n\nexport type UseAppAccessOptions = {\n /** Application instance id from Shell GENISPACE_SHELL_INIT (sessionStorage). */\n sessionStorageKey: string;\n /** Resolve platform API root including `/api` suffix. */\n getApiRoot: () => string;\n};\n\nexport function setAppApplicationId(sessionStorageKey: string, applicationId: string | null) {\n try {\n if (applicationId) sessionStorage.setItem(sessionStorageKey, applicationId);\n else sessionStorage.removeItem(sessionStorageKey);\n } catch {\n /* ignore */\n }\n}\n\nexport function getAppApplicationId(sessionStorageKey: string): string | null {\n try {\n return sessionStorage.getItem(sessionStorageKey);\n } catch {\n return null;\n }\n}\n\nexport function hasAppPermission(codes: string[], required: string): boolean {\n if (codes.length === 0 && !isAppRbacRelaxed()) return false;\n return codes.includes(required);\n}\n\n/** Allow-all RBAC only in dev or when explicitly relaxed (standalone local dev). */\nexport function isAppRbacRelaxed(): boolean {\n try {\n return import.meta.env.DEV === true || import.meta.env.VITE_RBAC_RELAXED === 'true';\n } catch {\n return false;\n }\n}\n\nexport function canAccessNavItem(\n loading: boolean,\n permissionCodes: string[],\n permission: string,\n accessError?: string | null,\n): boolean {\n if (loading) return false;\n if (accessError != null) return false;\n if (permissionCodes.length === 0) return isAppRbacRelaxed();\n return permissionCodes.includes(permission);\n}\n\n/** Page-level action gate — fail-closed when access fetch fails. */\nexport function canPerformAppAction(\n loading: boolean,\n permissionCodes: string[],\n required: string,\n accessError?: string | null,\n): boolean {\n if (loading) return false;\n if (accessError != null) return false;\n return hasAppPermission(permissionCodes, required);\n}\n\n/** Default API root from Shell injection or window origin. */\nexport function resolvePlatformApiRootFromShell(): string {\n try {\n if (typeof sessionStorage !== 'undefined') {\n const injected = sessionStorage.getItem(GENISPACE_SHELL_SESSION_API_KEY);\n if (injected && injected.trim() !== '') {\n const u = new URL(injected, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n return `${u.origin}/api`;\n }\n }\n } catch {\n /* ignore */\n }\n if (typeof window !== 'undefined') {\n return `${window.location.origin}/api`;\n }\n return '';\n}\n\nexport function createAppAccessHook(\n sessionStorageKey: string,\n getApiRoot: () => string\n): () => AppAccess {\n return () => useAppAccess({ sessionStorageKey, getApiRoot });\n}\n\nasync function fetchAppAccess(\n sessionStorageKey: string,\n getApiRoot: () => string\n): Promise<Pick<AppAccess, 'isUser' | 'permissionCodes' | 'accessError'>> {\n const applicationId = getAppApplicationId(sessionStorageKey);\n if (!applicationId) {\n return { isUser: true, permissionCodes: [], accessError: null };\n }\n const root = getApiRoot().replace(/\\/$/, '');\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n try {\n const token = localStorage.getItem('token');\n if (token) headers.Authorization = `Bearer ${token}`;\n } catch {\n /* ignore */\n }\n const res = await fetch(`${root}/applications/${encodeURIComponent(applicationId)}/users/me/access`, {\n headers,\n credentials: 'include',\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n if (res.status === 404) {\n try {\n const body = text ? JSON.parse(text) : null;\n if (body?.code === 'NOT_FOUND') {\n // Stale instance id after reinstall — drop cache so Shell GENISPACE_SHELL_INIT can refresh it.\n setAppApplicationId(sessionStorageKey, null);\n }\n } catch {\n /* ignore */\n }\n }\n if (res.status === 401 || res.status === 403) {\n return {\n isUser: false,\n permissionCodes: [],\n accessError: text || res.statusText || `Access denied (${res.status})`,\n };\n }\n return {\n isUser: true,\n permissionCodes: [],\n accessError: text || res.statusText || `Access check failed (${res.status})`,\n };\n }\n const body = await res.json();\n const data = body?.data ?? body;\n return {\n isUser: Boolean(data?.isUser),\n permissionCodes: Array.isArray(data?.permissionCodes) ? data.permissionCodes : [],\n accessError: null,\n };\n}\n\nexport function useAppAccess({ sessionStorageKey, getApiRoot }: UseAppAccessOptions): AppAccess {\n const [state, setState] = useState<AppAccess>({\n isUser: true,\n permissionCodes: [],\n loading: true,\n accessError: null,\n reloadAccess: () => {},\n });\n\n const reloadAccess = useCallback(() => {\n setState((prev) => ({ ...prev, loading: true, accessError: null }));\n void fetchAppAccess(sessionStorageKey, getApiRoot)\n .then((result) => {\n setState((prev) => ({\n ...prev,\n ...result,\n loading: false,\n }));\n })\n .catch((e) => {\n setState((prev) => ({\n ...prev,\n isUser: true,\n permissionCodes: [],\n loading: false,\n accessError: e instanceof Error ? e.message : String(e),\n }));\n });\n }, [sessionStorageKey, getApiRoot]);\n\n useEffect(() => {\n reloadAccess();\n }, [reloadAccess]);\n\n useEffect(() => {\n const onApplied = () => reloadAccess();\n window.addEventListener(GENISPACE_SHELL_INIT_APPLIED_EVENT, onApplied);\n return () => window.removeEventListener(GENISPACE_SHELL_INIT_APPLIED_EVENT, onApplied);\n }, [reloadAccess]);\n\n useEffect(() => {\n setState((prev) => ({ ...prev, reloadAccess }));\n }, [reloadAccess]);\n\n return state;\n}\n","import type { AppAccess } from './useAppAccess';\n\ntype Props = {\n access: Pick<AppAccess, 'loading' | 'accessError' | 'reloadAccess'>;\n};\n\n/** Shown when RBAC access fetch fails so users see an error instead of a blank sidebar. */\nexport function AppAccessNotice({ access }: Props) {\n if (access.loading || !access.accessError) return null;\n return (\n <div\n role=\"alert\"\n className=\"mb-4 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 dark:border-amber-900/50 dark:bg-amber-950/40 dark:text-amber-100\"\n >\n <p className=\"font-medium\">Unable to load permissions</p>\n <p className=\"mt-1 text-amber-800 dark:text-amber-200\">{access.accessError}</p>\n <button\n type=\"button\"\n onClick={access.reloadAccess}\n className=\"mt-2 rounded-lg border border-amber-300 bg-white px-3 py-1.5 text-xs font-medium text-amber-900 transition hover:bg-amber-100 dark:border-amber-800 dark:bg-neutral-900 dark:text-amber-100 dark:hover:bg-amber-900/30\"\n >\n Retry\n </button>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { AppAccess } from './useAppAccess';\nimport { AppAccessNotice } from './AppAccessNotice';\n\ntype Props = {\n access: Pick<AppAccess, 'loading' | 'accessError' | 'permissionCodes' | 'reloadAccess'>;\n children: ReactNode;\n /** Keep the final page geometry visible while permissions are loading. */\n showLoadingSkeleton?: boolean;\n};\n\nexport type AppContentSkeletonVariant = 'table' | 'dashboard' | 'detail';\n\n/**\n * Shared route fallback. It uses the same responsive page padding as AppPage so\n * switching from a skeleton to real content does not cause a horizontal jump.\n */\nexport function AppContentSkeleton({ variant = 'table' }: { variant?: AppContentSkeletonVariant }) {\n return (\n <div\n className=\"w-full min-w-0 max-w-full animate-pulse px-4 py-4 sm:px-6 sm:py-6 lg:px-8\"\n role=\"status\"\n aria-busy=\"true\"\n >\n <div className=\"mb-6 flex min-h-[52px] items-center justify-between gap-4 sm:min-h-[60px]\">\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"h-7 w-48 max-w-full rounded-md bg-muted\" />\n <div className=\"h-4 w-80 max-w-[70%] rounded bg-muted\" />\n </div>\n <div className=\"h-10 w-28 shrink-0 rounded-md bg-muted\" />\n </div>\n {variant === 'dashboard' ? (\n <>\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n {Array.from({ length: 4 }).map((_, index) => <div key={index} className=\"h-28 rounded-xl border border-border bg-card\" />)}\n </div>\n <div className=\"mt-6 grid gap-6 xl:grid-cols-2\">\n <div className=\"h-72 rounded-xl border border-border bg-card\" />\n <div className=\"h-72 rounded-xl border border-border bg-card\" />\n </div>\n </>\n ) : variant === 'detail' ? (\n <div className=\"grid gap-6 xl:grid-cols-[minmax(0,1fr)_22rem]\">\n <div className=\"h-[30rem] rounded-xl border border-border bg-card\" />\n <div className=\"h-72 rounded-xl border border-border bg-card\" />\n </div>\n ) : (\n <>\n <div className=\"mb-4 flex gap-3\"><div className=\"h-10 flex-1 rounded-md bg-muted\" /><div className=\"h-10 w-36 rounded-md bg-muted\" /></div>\n <div className=\"overflow-hidden rounded-xl border border-border bg-card\">\n {Array.from({ length: 7 }).map((_, row) => (\n <div key={row} className=\"grid grid-cols-[minmax(12rem,2fr)_repeat(3,minmax(7rem,1fr))] gap-4 border-b border-border px-4 py-4 last:border-b-0\">\n {Array.from({ length: 4 }).map((__, column) => <div key={column} className={`h-4 rounded bg-muted ${column === 0 ? 'w-3/4' : 'w-2/3'}`} />)}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n\n/** Blocks page content when RBAC access fetch fails; keeps loading geometry stable. */\nexport function AppAccessGate({ access, children, showLoadingSkeleton = true }: Props) {\n if (access.accessError) {\n return <AppAccessNotice access={access} />;\n }\n if (showLoadingSkeleton && access.loading && access.permissionCodes.length === 0) {\n return <AppContentSkeleton />;\n }\n return <>{children}</>;\n}\n","export type PartnerFields = {\n partner_id?: string | null;\n partner_name?: string | null;\n};\n\nfunction normalizePartnerId(partnerId: string | null | undefined): string | null {\n if (partnerId == null || partnerId === '') return null;\n return partnerId;\n}\n\n/** Weak-dependency save: persist FK only when partner picker is available. */\nexport function applyPartnerPayload<T extends PartnerFields>(\n payload: T,\n pickerAvailable: boolean,\n pickerLoading = false,\n pickerLoadError: string | null = null,\n): T {\n if (pickerLoading || pickerLoadError != null) return { ...payload };\n\n const next = { ...payload };\n\n if (pickerAvailable) {\n next.partner_id = normalizePartnerId(next.partner_id);\n if (next.partner_id == null) {\n next.partner_id = null;\n next.partner_name = null;\n }\n return next;\n }\n\n // Picker unavailable: preserve server FK — do not write partner_id.\n delete next.partner_id;\n if (next.partner_name === '') next.partner_name = null;\n return next;\n}\n","import { GENISPACE_SHELL_SESSION_API_KEY } from './shell';\n\nexport type CreateResolveApiRootOptions = {\n /** e.g. import.meta.env.VITE_HR_API_BASE */\n dedicatedEnv?: string | undefined;\n platformEnv?: string | undefined;\n};\n\n/** Platform API root (`…/api`) for GeniApp iframe + standalone dev. */\nexport function createResolveApiRoot(options: CreateResolveApiRootOptions = {}): () => string {\n return () => {\n const dedicated = options.dedicatedEnv;\n if (typeof dedicated === 'string' && dedicated.trim() !== '') {\n return dedicated.replace(/\\/$/, '');\n }\n const platform = options.platformEnv;\n if (typeof platform === 'string' && platform.trim() !== '') {\n return platform.replace(/\\/$/, '');\n }\n try {\n if (typeof sessionStorage !== 'undefined') {\n const injected = sessionStorage.getItem(GENISPACE_SHELL_SESSION_API_KEY);\n if (injected && injected.trim() !== '') {\n const u = new URL(injected, typeof window !== 'undefined' ? window.location.origin : 'http://localhost');\n return `${u.origin}/api`;\n }\n }\n } catch {\n /* ignore */\n }\n if (typeof window !== 'undefined') {\n return `${window.location.origin}/api`;\n }\n return '';\n };\n}\n\n/** Cross–dataScope table CRUD (read/patch). Documented integration exception only. */\nexport function createScopeTableClient(buildApiRoot: () => string) {\n function readToken(): string | null {\n try {\n return localStorage.getItem('token');\n } catch {\n return null;\n }\n }\n\n function authHeaders(): Record<string, string> {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n const token = readToken();\n if (token) headers.Authorization = `Bearer ${token}`;\n return headers;\n }\n\n function tableUrl(scope: string, table: string, id?: string): string {\n const root = buildApiRoot();\n const base = `${root}/data/${encodeURIComponent(scope)}/tables/${encodeURIComponent(table)}`;\n return id ? `${base}/${encodeURIComponent(id)}` : base;\n }\n\n async function scopeGet<T>(scope: string, table: string, id: string): Promise<T> {\n const res = await fetch(tableUrl(scope, table, id), { headers: authHeaders() });\n const text = await res.text();\n if (!res.ok) throw new Error(text || res.statusText);\n const body = text ? JSON.parse(text) : {};\n return ((body as { data?: T }).data ?? body) as T;\n }\n\n async function scopeList<T>(\n scope: string,\n table: string,\n filter?: Record<string, string | boolean | number | null>\n ): Promise<T[]> {\n const params = new URLSearchParams();\n if (filter) params.set('filter', JSON.stringify(filter));\n const res = await fetch(`${tableUrl(scope, table)}?${params}`, { headers: authHeaders() });\n const text = await res.text();\n if (!res.ok) throw new Error(text || res.statusText);\n const body = text ? JSON.parse(text) : {};\n const data = (body as { data?: { items?: T[] } | T[] }).data;\n if (Array.isArray(data)) return data;\n return data?.items ?? [];\n }\n\n async function scopePatch(\n scope: string,\n table: string,\n id: string,\n payload: Record<string, unknown>\n ): Promise<void> {\n const res = await fetch(tableUrl(scope, table, id), {\n method: 'PATCH',\n headers: authHeaders(),\n body: JSON.stringify(payload),\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(text || res.statusText);\n }\n }\n\n return { scopeGet, scopeList, scopePatch };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { GENISPACE_SHELL_INIT_APPLIED_EVENT } from '../shell/shell';\n\nexport type ManagedPickerOption = {\n id: string;\n label: string;\n [key: string]: unknown;\n};\n\nexport type ManagedPickerConfig = {\n providerGeniappId: string;\n datasourceIdentifier: string;\n buildApiRoot: () => string;\n readToken: () => string | null;\n probePicker: (apiRoot: string, token: string | null) => Promise<boolean>;\n loadOptions: (apiRoot: string, token: string | null, ensureIds?: string[]) => Promise<ManagedPickerOption[]>;\n};\n\nexport function createUseManagedAppPicker(config: ManagedPickerConfig) {\n return function useManagedGeniappPicker(enabled: boolean, ensureIds: string[] = []) {\n const ensureKey = ensureIds.filter(Boolean).sort().join('\\0');\n const [pickerAvailable, setPickerAvailable] = useState(false);\n const [options, setOptions] = useState<ManagedPickerOption[]>([]);\n const [loading, setLoading] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const reloadGeneration = useRef(0);\n\n const reload = useCallback(async () => {\n const generation = ++reloadGeneration.current;\n if (!enabled) {\n if (generation !== reloadGeneration.current) return;\n setPickerAvailable(false);\n setOptions([]);\n setLoadError(null);\n setLoading(false);\n return;\n }\n const apiRoot = config.buildApiRoot();\n const token = config.readToken();\n setLoading(true);\n setLoadError(null);\n try {\n const available = await config.probePicker(apiRoot, token);\n if (generation !== reloadGeneration.current) return;\n if (!available) {\n setPickerAvailable(false);\n setOptions([]);\n return;\n }\n try {\n const opts = await config.loadOptions(apiRoot, token, ensureIds.filter(Boolean));\n if (generation !== reloadGeneration.current) return;\n setPickerAvailable(true);\n setOptions(opts);\n } catch (e) {\n if (generation !== reloadGeneration.current) return;\n setLoadError(e instanceof Error ? e.message : String(e));\n setPickerAvailable(false);\n setOptions([]);\n }\n } catch (e) {\n if (generation !== reloadGeneration.current) return;\n setLoadError(e instanceof Error ? e.message : String(e));\n setPickerAvailable(false);\n setOptions([]);\n } finally {\n if (generation === reloadGeneration.current) {\n setLoading(false);\n }\n }\n }, [enabled, ensureKey]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n const onApplied = () => {\n void reload();\n };\n window.addEventListener(GENISPACE_SHELL_INIT_APPLIED_EVENT, onApplied);\n return () => window.removeEventListener(GENISPACE_SHELL_INIT_APPLIED_EVENT, onApplied);\n }, [reload]);\n\n return { pickerAvailable, options, loading, loadError, reload, providerGeniappId: config.providerGeniappId };\n };\n}\n","import { useEffect, useId, useRef, useState } from \"react\";\n\nexport type CrossAppRecordOption = {\n id: string;\n primary: string;\n secondary?: string;\n status?: string;\n snapshot?: Record<string, CrossAppSnapshotValue>;\n};\n\nexport type CrossAppSnapshotValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | CrossAppSnapshotValue[]\n | { [key: string]: CrossAppSnapshotValue };\n\nexport type CrossAppRecordPage = {\n records: CrossAppRecordOption[];\n total: number;\n};\n\nexport type CrossAppRecordPickerProps = {\n label: string;\n description?: string;\n placeholder?: string;\n emptyText: string;\n unavailableText: string;\n forbiddenText: string;\n selected?: CrossAppRecordOption | null;\n pageSize?: number;\n disabled?: boolean;\n providerState?: \"ready\" | \"unavailable\" | \"forbidden\";\n loadPage: (input: {\n search: string;\n limit: number;\n offset: number;\n }) => Promise<CrossAppRecordPage>;\n onSelect: (record: CrossAppRecordOption | null) => void;\n};\n\n/**\n * Shared cross-GeniApp record picker. The provider remains responsible for\n * row/field authorization; consumers only receive display-safe snapshots.\n */\nexport function CrossAppRecordPicker({\n label,\n description,\n placeholder = \"\",\n emptyText,\n unavailableText,\n forbiddenText,\n selected = null,\n pageSize = 10,\n disabled = false,\n providerState = \"ready\",\n loadPage,\n onSelect,\n}: CrossAppRecordPickerProps) {\n const id = useId();\n const request = useRef(0);\n const loadPageRef = useRef(loadPage);\n loadPageRef.current = loadPage;\n const [search, setSearch] = useState(\"\");\n const [appliedSearch, setAppliedSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n const [records, setRecords] = useState<CrossAppRecordOption[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n const current = ++request.current;\n if (providerState !== \"ready\") {\n setRecords([]);\n setTotal(0);\n setLoading(false);\n setError(\"\");\n return;\n }\n setLoading(true);\n setError(\"\");\n void loadPageRef\n .current({\n search: appliedSearch,\n limit: pageSize,\n offset: (page - 1) * pageSize,\n })\n .then((result) => {\n if (request.current !== current) return;\n setRecords(result.records);\n setTotal(Math.max(0, result.total));\n })\n .catch((reason: unknown) => {\n if (request.current !== current) return;\n setRecords([]);\n setTotal(0);\n setError(reason instanceof Error ? reason.message : String(reason));\n })\n .finally(() => {\n if (request.current === current) setLoading(false);\n });\n return () => {\n request.current += 1;\n };\n }, [appliedSearch, page, pageSize, providerState]);\n\n const pageCount = Math.max(1, Math.ceil(total / pageSize));\n const stateMessage =\n providerState === \"unavailable\"\n ? unavailableText\n : providerState === \"forbidden\"\n ? forbiddenText\n : error;\n\n return (\n <section\n className=\"rounded-xl border border-border p-4\"\n aria-labelledby={`${id}-label`}\n >\n <div>\n <label\n id={`${id}-label`}\n htmlFor={`${id}-search`}\n className=\"block text-sm font-medium\"\n >\n {label}\n </label>\n {description && (\n <p className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n {selected && (\n <div className=\"mt-3 flex items-start justify-between gap-3 rounded-lg border border-primary/30 bg-primary/5 p-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium\">{selected.primary}</p>\n {selected.secondary && (\n <p className=\"mt-0.5 truncate text-xs text-muted-foreground\">\n {selected.secondary}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"min-h-[44px] rounded-lg border border-border bg-background px-3 text-xs\"\n disabled={disabled}\n onClick={() => onSelect(null)}\n >\n ×\n </button>\n </div>\n )}\n <form\n className=\"mt-3 flex gap-2\"\n onSubmit={(event) => {\n event.preventDefault();\n setPage(1);\n setAppliedSearch(search.trim());\n }}\n >\n <input\n id={`${id}-search`}\n className=\"h-[44px] min-w-0 flex-1 rounded-lg border border-input bg-background px-3 text-sm outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\"\n value={search}\n disabled={disabled || providerState !== \"ready\"}\n onChange={(event) => setSearch(event.target.value)}\n placeholder={placeholder}\n />\n <button\n type=\"submit\"\n className=\"min-h-[44px] rounded-lg border border-border bg-background px-4 text-sm font-medium disabled:opacity-50\"\n disabled={disabled || providerState !== \"ready\" || loading}\n >\n ⌕\n </button>\n </form>\n {stateMessage && (\n <p\n role=\"alert\"\n className=\"mt-3 rounded-lg bg-muted px-3 py-2 text-xs text-muted-foreground\"\n >\n {stateMessage}\n </p>\n )}\n {providerState === \"ready\" && !stateMessage && (\n <div className=\"mt-3 space-y-2\" aria-busy={loading}>\n {loading && (\n <p className=\"py-4 text-center text-xs text-muted-foreground\">…</p>\n )}\n {!loading &&\n records.map((record) => (\n <button\n key={record.id}\n type=\"button\"\n disabled={disabled}\n onClick={() => onSelect(record)}\n className=\"flex min-h-[48px] w-full items-center justify-between gap-3 rounded-lg border border-border px-3 py-2 text-left hover:bg-accent disabled:opacity-50\"\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium\">\n {record.primary}\n </span>\n {record.secondary && (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">\n {record.secondary}\n </span>\n )}\n </span>\n {record.status && (\n <span className=\"shrink-0 rounded-full bg-muted px-2 py-1 text-[11px] text-muted-foreground\">\n {record.status}\n </span>\n )}\n </button>\n ))}\n {!loading && !records.length && (\n <p className=\"py-4 text-center text-xs text-muted-foreground\">\n {emptyText}\n </p>\n )}\n </div>\n )}\n {providerState === \"ready\" &&\n !loading &&\n !stateMessage &&\n total > pageSize && (\n <div className=\"mt-3 flex items-center justify-between gap-3 text-xs text-muted-foreground\">\n <span>\n {page}/{pageCount} · {total}\n </span>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n className=\"min-h-[44px] rounded-lg border border-border px-3 disabled:opacity-40\"\n disabled={page <= 1}\n onClick={() => setPage((value) => Math.max(1, value - 1))}\n >\n ‹\n </button>\n <button\n type=\"button\"\n className=\"min-h-[44px] rounded-lg border border-border px-3 disabled:opacity-40\"\n disabled={page >= pageCount}\n onClick={() =>\n setPage((value) => Math.min(pageCount, value + 1))\n }\n >\n ›\n </button>\n </div>\n </div>\n )}\n </section>\n );\n}\n"],"names":["normalizePath","p","isListRoutePath","pathname","listPath","useRefetchOnRouteMatch","load","useLocation","loadRef","useRef","onList","useEffect","ROUTE_NEW_PLACEHOLDER","isRouteNewPlaceholder","id","isRouteEditMode","resolveDraftEntityId","trimmed","COMMON_CURRENCY_OPTIONS","displayNamesCache","getDisplayNames","locale","dn","currencyLabel","code","upper","parseEnabledCurrenciesJson","raw","x","normalizeEnabledCurrencies","codes","options","minOne","seen","out","DEFAULT_ENABLED_CURRENCIES","selectedApplicationLanguage","resolveBusinessLocale","language","formatBusinessTime","value","formatBusinessDate","date","formatBusinessDateTime","formatBusinessNumber","numericValue","formatBusinessCurrency","currency","readAccessToken","useGenispacePlatformClient","getApiRoot","shellRevision","setShellRevision","useState","onShellInit","n","GENISPACE_SHELL_INIT_APPLIED_EVENT","useMemo","token","baseURL","GeniSpace","setAppApplicationId","sessionStorageKey","applicationId","getAppApplicationId","hasAppPermission","required","isAppRbacRelaxed","canAccessNavItem","loading","permissionCodes","permission","accessError","canPerformAppAction","resolvePlatformApiRootFromShell","injected","GENISPACE_SHELL_SESSION_API_KEY","createAppAccessHook","useAppAccess","fetchAppAccess","root","headers","res","text","body","data","state","setState","reloadAccess","useCallback","prev","result","e","onApplied","AppAccessNotice","access","jsxs","jsx","AppContentSkeleton","variant","Fragment","_","index","row","__","column","AppAccessGate","children","showLoadingSkeleton","normalizePartnerId","partnerId","applyPartnerPayload","payload","pickerAvailable","pickerLoading","pickerLoadError","next","createResolveApiRoot","dedicated","platform","createScopeTableClient","buildApiRoot","readToken","authHeaders","tableUrl","scope","table","base","scopeGet","scopeList","filter","params","scopePatch","createUseManagedAppPicker","config","enabled","ensureIds","ensureKey","setPickerAvailable","setOptions","setLoading","loadError","setLoadError","reloadGeneration","reload","generation","apiRoot","available","opts","CrossAppRecordPicker","label","description","placeholder","emptyText","unavailableText","forbiddenText","selected","pageSize","disabled","providerState","loadPage","onSelect","useId","request","loadPageRef","search","setSearch","appliedSearch","setAppliedSearch","page","setPage","records","setRecords","total","setTotal","error","setError","current","reason","pageCount","stateMessage","event","record"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GeniSpace } from 'genispace';
|
|
1
|
+
import { GeniSpace } from '@genispace/sdk';
|
|
2
2
|
|
|
3
3
|
export declare function findManagedAppDataSourceId(client: GeniSpace, seedIdentifier: string, geniappIdentifier: string): Promise<string | null>;
|
|
4
4
|
export declare function createGeniSpaceClient(apiRoot: string, accessToken: string | null): GeniSpace;
|
package/dist/ai.js
CHANGED
|
@@ -4,7 +4,7 @@ import { Loader2 as xe, Check as $e, Circle as Qe, Lightbulb as Le, RefreshCw as
|
|
|
4
4
|
import { Card as oe, CardHeader as le, CardTitle as ce, CardDescription as de, CardContent as ue, Table as Oe, TableHeader as je, TableRow as me, TableHead as Ne, TableBody as ze, TableCell as we, useIsMobile as rt, Button as H, Checkbox as se, Popover as nt, PopoverTrigger as st, PopoverContent as at, Input as it, ScrollArea as ot, Progress as lt, TooltipProvider as ct, Toaster as dt, Skeleton as fe, AlertDialog as ut, Badge as Ge, toast as Ce } from "@genispace/geniapp/kit";
|
|
5
5
|
import { useTranslation as Se } from "react-i18next";
|
|
6
6
|
import { cn as Be } from "@genispace/geniapp/utils";
|
|
7
|
-
import { GeniSpace as mt } from "genispace";
|
|
7
|
+
import { GeniSpace as mt } from "@genispace/sdk";
|
|
8
8
|
import { UserFacingError as Br, classifyUserFacingError as Vr, diagnosticErrorText as Ur, toUserFacingError as qr } from "./ai/errors/userFacingError.js";
|
|
9
9
|
import { createUseManagedAppPicker as ft } from "@genispace/geniapp/hooks";
|
|
10
10
|
function ar(e) {
|