@declarion/react 0.1.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.
Files changed (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/dist-lib/JsonEditor-C5NOzsey.js +71 -0
  4. package/dist-lib/JsonEditor-C5NOzsey.js.map +1 -0
  5. package/dist-lib/api/auth.d.ts +11 -0
  6. package/dist-lib/api/client.d.ts +3 -0
  7. package/dist-lib/api/data.d.ts +28 -0
  8. package/dist-lib/api/entities.d.ts +75 -0
  9. package/dist-lib/api/events.d.ts +9 -0
  10. package/dist-lib/api/params.d.ts +3 -0
  11. package/dist-lib/api/properties.d.ts +3 -0
  12. package/dist-lib/api/schema.d.ts +2 -0
  13. package/dist-lib/api/status.d.ts +2 -0
  14. package/dist-lib/app.d.ts +1 -0
  15. package/dist-lib/components/columns/ColumnPicker.d.ts +15 -0
  16. package/dist-lib/components/detail-layout/AssociatedBlock.d.ts +8 -0
  17. package/dist-lib/components/detail-layout/AssociatedToolbar.d.ts +13 -0
  18. package/dist-lib/components/detail-layout/ChildrenBlock.d.ts +15 -0
  19. package/dist-lib/components/detail-layout/ChildrenCards.d.ts +2 -0
  20. package/dist-lib/components/detail-layout/ChildrenList.d.ts +2 -0
  21. package/dist-lib/components/detail-layout/ChildrenTable.d.ts +2 -0
  22. package/dist-lib/components/detail-layout/ChildrenTimeline.d.ts +2 -0
  23. package/dist-lib/components/detail-layout/DraggableChildrenTable.d.ts +15 -0
  24. package/dist-lib/components/detail-layout/EditableChildrenTable.d.ts +15 -0
  25. package/dist-lib/components/detail-layout/FieldsBlock.d.ts +7 -0
  26. package/dist-lib/components/detail-layout/LayoutColumn.d.ts +9 -0
  27. package/dist-lib/components/detail-layout/LayoutRenderer.d.ts +42 -0
  28. package/dist-lib/components/detail-layout/LayoutRow.d.ts +8 -0
  29. package/dist-lib/components/detail-layout/LayoutTabs.d.ts +8 -0
  30. package/dist-lib/components/detail-layout/PropertiesBlock.d.ts +8 -0
  31. package/dist-lib/components/detail-layout/QuickAddForm.d.ts +10 -0
  32. package/dist-lib/components/detail-layout/SectionBlock.d.ts +8 -0
  33. package/dist-lib/components/detail-layout/StatusesBlock.d.ts +8 -0
  34. package/dist-lib/components/detail-layout/TimelineComposer.d.ts +10 -0
  35. package/dist-lib/components/detail-layout/index.d.ts +18 -0
  36. package/dist-lib/components/detail-layout/useQuickAdd.d.ts +17 -0
  37. package/dist-lib/components/fields/BoolField.d.ts +2 -0
  38. package/dist-lib/components/fields/EmailField.d.ts +2 -0
  39. package/dist-lib/components/fields/EnumField.d.ts +2 -0
  40. package/dist-lib/components/fields/IntArrayField.d.ts +2 -0
  41. package/dist-lib/components/fields/JsonEditor.d.ts +9 -0
  42. package/dist-lib/components/fields/JsonField.d.ts +2 -0
  43. package/dist-lib/components/fields/MultilangField.d.ts +2 -0
  44. package/dist-lib/components/fields/MultilangTextField.d.ts +2 -0
  45. package/dist-lib/components/fields/NumberField.d.ts +2 -0
  46. package/dist-lib/components/fields/PasswordField.d.ts +2 -0
  47. package/dist-lib/components/fields/RefField.d.ts +2 -0
  48. package/dist-lib/components/fields/SecretField.d.ts +2 -0
  49. package/dist-lib/components/fields/StringArrayField.d.ts +2 -0
  50. package/dist-lib/components/fields/StringField.d.ts +2 -0
  51. package/dist-lib/components/fields/StructureField.d.ts +2 -0
  52. package/dist-lib/components/fields/TextField.d.ts +2 -0
  53. package/dist-lib/components/fields/TimestampField.d.ts +2 -0
  54. package/dist-lib/components/fields/UrlField.d.ts +2 -0
  55. package/dist-lib/components/fields/index.d.ts +16 -0
  56. package/dist-lib/components/filters/FilterChips.d.ts +16 -0
  57. package/dist-lib/components/filters/FilterDrawer.d.ts +27 -0
  58. package/dist-lib/components/layout/Layout.d.ts +1 -0
  59. package/dist-lib/components/layout/Sidebar.d.ts +1 -0
  60. package/dist-lib/components/layout/TabBar.d.ts +1 -0
  61. package/dist-lib/components/layout/ThemeToggle.d.ts +1 -0
  62. package/dist-lib/components/layout/TopBar.d.ts +1 -0
  63. package/dist-lib/components/pages/AdminCatalogPage.d.ts +1 -0
  64. package/dist-lib/components/pages/LoginPage.d.ts +1 -0
  65. package/dist-lib/components/pages/NotFoundPage.d.ts +1 -0
  66. package/dist-lib/components/pages/SSOCallbackPage.d.ts +1 -0
  67. package/dist-lib/components/pages/SignupPage.d.ts +1 -0
  68. package/dist-lib/components/pages/SmartDetailPage.d.ts +5 -0
  69. package/dist-lib/components/pages/SmartListPage.d.ts +5 -0
  70. package/dist-lib/components/pages/SmartRecordListPage.d.ts +5 -0
  71. package/dist-lib/components/shared/ActionButton.d.ts +24 -0
  72. package/dist-lib/components/shared/ActionConfirmDialog.d.ts +10 -0
  73. package/dist-lib/components/shared/ActionDialog.d.ts +22 -0
  74. package/dist-lib/components/shared/ActionResultDialog.d.ts +18 -0
  75. package/dist-lib/components/shared/AssociationTabs.d.ts +9 -0
  76. package/dist-lib/components/shared/BatchActionProgress.d.ts +18 -0
  77. package/dist-lib/components/shared/ConfirmDialog.d.ts +11 -0
  78. package/dist-lib/components/shared/DynamicIcon.d.ts +6 -0
  79. package/dist-lib/components/shared/EmptyState.d.ts +9 -0
  80. package/dist-lib/components/shared/ErrorBoundary.d.ts +22 -0
  81. package/dist-lib/components/shared/LoadingSkeleton.d.ts +5 -0
  82. package/dist-lib/components/shared/PageHeader.d.ts +8 -0
  83. package/dist-lib/components/shared/RowActionItem.d.ts +11 -0
  84. package/dist-lib/components/shared/StatusGroupsDisplay.d.ts +11 -0
  85. package/dist-lib/components/ui/alert-dialog.d.ts +14 -0
  86. package/dist-lib/components/ui/badge.d.ts +9 -0
  87. package/dist-lib/components/ui/button.d.ts +11 -0
  88. package/dist-lib/components/ui/card.d.ts +8 -0
  89. package/dist-lib/components/ui/dialog.d.ts +13 -0
  90. package/dist-lib/components/ui/dropdown-menu.d.ts +24 -0
  91. package/dist-lib/components/ui/input.d.ts +3 -0
  92. package/dist-lib/components/ui/label.d.ts +5 -0
  93. package/dist-lib/components/ui/select.d.ts +13 -0
  94. package/dist-lib/components/ui/separator.d.ts +4 -0
  95. package/dist-lib/components/ui/skeleton.d.ts +2 -0
  96. package/dist-lib/components/ui/table.d.ts +10 -0
  97. package/dist-lib/components/ui/textarea.d.ts +3 -0
  98. package/dist-lib/components/views/ViewSwitcher.d.ts +27 -0
  99. package/dist-lib/hooks/useAssociatedData.d.ts +10 -0
  100. package/dist-lib/hooks/useAuth.d.ts +21 -0
  101. package/dist-lib/hooks/useChildrenData.d.ts +3 -0
  102. package/dist-lib/hooks/useColumns.d.ts +13 -0
  103. package/dist-lib/hooks/useDebounce.d.ts +1 -0
  104. package/dist-lib/hooks/useEntity.d.ts +2 -0
  105. package/dist-lib/hooks/useEntityData.d.ts +2 -0
  106. package/dist-lib/hooks/useEntityItem.d.ts +2 -0
  107. package/dist-lib/hooks/useFilters.d.ts +11 -0
  108. package/dist-lib/hooks/useMutations.d.ts +13 -0
  109. package/dist-lib/hooks/useObjectStatus.d.ts +5 -0
  110. package/dist-lib/hooks/useParams.d.ts +2 -0
  111. package/dist-lib/hooks/useProperties.d.ts +5 -0
  112. package/dist-lib/hooks/useSSE.d.ts +1 -0
  113. package/dist-lib/hooks/useSchema.d.ts +1 -0
  114. package/dist-lib/hooks/useScreen.d.ts +2 -0
  115. package/dist-lib/hooks/useTabNavigate.d.ts +8 -0
  116. package/dist-lib/hooks/useViews.d.ts +6 -0
  117. package/dist-lib/index.d.ts +37 -0
  118. package/dist-lib/index.js +8424 -0
  119. package/dist-lib/index.js.map +1 -0
  120. package/dist-lib/lib/actions.d.ts +43 -0
  121. package/dist-lib/lib/child-config.d.ts +23 -0
  122. package/dist-lib/lib/children-validation.d.ts +3 -0
  123. package/dist-lib/lib/filters.d.ts +42 -0
  124. package/dist-lib/lib/quick-add.d.ts +2 -0
  125. package/dist-lib/lib/size-value.d.ts +16 -0
  126. package/dist-lib/lib/theme-utils.d.ts +3 -0
  127. package/dist-lib/lib/timestamp.d.ts +8 -0
  128. package/dist-lib/lib/utils.d.ts +2 -0
  129. package/dist-lib/main.d.ts +1 -0
  130. package/dist-lib/stores/auth.d.ts +15 -0
  131. package/dist-lib/stores/screen-registry.d.ts +3 -0
  132. package/dist-lib/stores/tabs.d.ts +21 -0
  133. package/dist-lib/stores/theme.d.ts +10 -0
  134. package/dist-lib/types/api.d.ts +178 -0
  135. package/dist-lib/types/schema.d.ts +380 -0
  136. package/package.json +85 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Disciplinedware LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @declarion/react
2
+
3
+ React SDK for [Declarion](https://declarion.io), the schema-driven business apps platform.
4
+
5
+ Declarion lets you build production business apps from YAML schemas: entities, screens, navigation, actions, and handlers. This package is the React client that renders those schemas into working UIs against a Declarion API backend.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add @declarion/react
11
+ # peer deps:
12
+ pnpm add react react-dom
13
+ ```
14
+
15
+ ## License
16
+
17
+ MIT. See `LICENSE`.
18
+
19
+ ## Runtime
20
+
21
+ The SDK talks to a Declarion runtime server. The runtime is proprietary commercial software - contact konstantin@trunin.com for licensing.
@@ -0,0 +1,71 @@
1
+ import { jsx as b } from "react/jsx-runtime";
2
+ import { useRef as i, useEffect as a } from "react";
3
+ import { Mode as d, createJSONEditor as E } from "vanilla-jsoneditor";
4
+ import "vanilla-jsoneditor/themes/jse-theme-dark.css";
5
+ function p(t) {
6
+ if (t == null) return { text: "" };
7
+ if (typeof t == "string")
8
+ try {
9
+ return { json: JSON.parse(t) };
10
+ } catch {
11
+ return { text: t };
12
+ }
13
+ return { json: t };
14
+ }
15
+ function R({ value: t, onChange: c, readOnly: r }) {
16
+ const o = i(null), s = i(null), n = i(c);
17
+ return a(() => {
18
+ n.current = c;
19
+ }, [c]), a(() => {
20
+ if (!o.current) return;
21
+ const j = {
22
+ content: p(t),
23
+ readOnly: r ?? !1,
24
+ mode: r ? d.tree : d.text,
25
+ mainMenuBar: !r,
26
+ navigationBar: !1,
27
+ statusBar: !1,
28
+ onChange: (e, u, x) => {
29
+ if (!(r || !n.current) && !x.contentErrors) {
30
+ if ("json" in e)
31
+ n.current(e.json);
32
+ else if ("text" in e)
33
+ try {
34
+ n.current(JSON.parse(e.text));
35
+ } catch {
36
+ n.current(e.text);
37
+ }
38
+ }
39
+ }
40
+ }, f = () => {
41
+ var u;
42
+ const e = document.documentElement.classList.contains("dark");
43
+ (u = o.current) == null || u.classList.toggle("jse-theme-dark", e);
44
+ };
45
+ f();
46
+ const m = new MutationObserver(f);
47
+ m.observe(document.documentElement, {
48
+ attributes: !0,
49
+ attributeFilter: ["class"]
50
+ });
51
+ const l = E({
52
+ target: o.current,
53
+ props: j
54
+ });
55
+ return s.current = l, () => {
56
+ m.disconnect(), l.destroy(), s.current = null;
57
+ };
58
+ }, [r]), a(() => {
59
+ !s.current || !r || s.current.updateProps({ content: p(t) });
60
+ }, [t, r]), /* @__PURE__ */ b(
61
+ "div",
62
+ {
63
+ ref: o,
64
+ className: r ? "json-editor-readonly" : "json-editor-editable"
65
+ }
66
+ );
67
+ }
68
+ export {
69
+ R as JsonEditor
70
+ };
71
+ //# sourceMappingURL=JsonEditor-C5NOzsey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonEditor-C5NOzsey.js","sources":["../src/components/fields/JsonEditor.tsx"],"sourcesContent":["import { useRef, useEffect } from \"react\";\nimport {\n createJSONEditor,\n Mode,\n type Content,\n type OnChangeStatus,\n type JSONEditorPropsOptional,\n} from \"vanilla-jsoneditor\";\n// Dark theme CSS vars for vanilla-jsoneditor (sets --jse-* custom properties)\nimport \"vanilla-jsoneditor/themes/jse-theme-dark.css\";\n\ninterface JsonEditorProps {\n value: unknown;\n onChange?: (value: unknown) => void;\n readOnly?: boolean;\n // Future: JSON Schema for in-editor validation (Ajv). Accept now, wire later.\n schema?: Record<string, unknown>;\n}\n\nfunction toContent(v: unknown): Content {\n if (v == null) return { text: \"\" };\n if (typeof v === \"string\") {\n try {\n return { json: JSON.parse(v) };\n } catch {\n return { text: v };\n }\n }\n return { json: v };\n}\n\nexport function JsonEditor({ value, onChange, readOnly }: JsonEditorProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const editorRef = useRef<ReturnType<typeof createJSONEditor> | null>(null);\n const onChangeRef = useRef(onChange);\n useEffect(() => { onChangeRef.current = onChange; }, [onChange]);\n\n // Create / recreate editor when readOnly changes\n useEffect(() => {\n if (!containerRef.current) return;\n\n const props: JSONEditorPropsOptional = {\n content: toContent(value),\n readOnly: readOnly ?? false,\n mode: readOnly ? Mode.tree : Mode.text,\n mainMenuBar: !readOnly,\n navigationBar: false,\n statusBar: false,\n onChange: (content: Content, _prev: Content, status: OnChangeStatus) => {\n if (readOnly || !onChangeRef.current) return;\n if (status.contentErrors) return;\n if (\"json\" in content) {\n onChangeRef.current(content.json);\n } else if (\"text\" in content) {\n try {\n onChangeRef.current(JSON.parse(content.text));\n } catch {\n onChangeRef.current(content.text);\n }\n }\n },\n };\n\n const syncDarkClass = () => {\n const isDark = document.documentElement.classList.contains(\"dark\");\n containerRef.current?.classList.toggle(\"jse-theme-dark\", isDark);\n };\n syncDarkClass();\n\n // Watch for dark mode toggles\n const observer = new MutationObserver(syncDarkClass);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n const editor = createJSONEditor({\n target: containerRef.current,\n props,\n });\n editorRef.current = editor;\n\n return () => {\n observer.disconnect();\n editor.destroy();\n editorRef.current = null;\n };\n }, [readOnly]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Update content when value changes externally (read-only mode only)\n useEffect(() => {\n if (!editorRef.current || !readOnly) return;\n editorRef.current.updateProps({ content: toContent(value) });\n }, [value, readOnly]);\n\n return (\n <div\n ref={containerRef}\n className={readOnly ? \"json-editor-readonly\" : \"json-editor-editable\"}\n />\n );\n}\n"],"names":["toContent","v","JsonEditor","value","onChange","readOnly","containerRef","useRef","editorRef","onChangeRef","useEffect","props","Mode","content","_prev","status","syncDarkClass","isDark","_a","observer","editor","createJSONEditor","jsx"],"mappings":";;;;AAmBA,SAASA,EAAUC,GAAqB;AACtC,MAAIA,KAAK,KAAM,QAAO,EAAE,MAAM,GAAA;AAC9B,MAAI,OAAOA,KAAM;AACf,QAAI;AACF,aAAO,EAAE,MAAM,KAAK,MAAMA,CAAC,EAAA;AAAA,IAC7B,QAAQ;AACN,aAAO,EAAE,MAAMA,EAAA;AAAA,IACjB;AAEF,SAAO,EAAE,MAAMA,EAAA;AACjB;AAEO,SAASC,EAAW,EAAE,OAAAC,GAAO,UAAAC,GAAU,UAAAC,KAA6B;AACzE,QAAMC,IAAeC,EAAuB,IAAI,GAC1CC,IAAYD,EAAmD,IAAI,GACnEE,IAAcF,EAAOH,CAAQ;AACnC,SAAAM,EAAU,MAAM;AAAE,IAAAD,EAAY,UAAUL;AAAA,EAAU,GAAG,CAACA,CAAQ,CAAC,GAG/DM,EAAU,MAAM;AACd,QAAI,CAACJ,EAAa,QAAS;AAE3B,UAAMK,IAAiC;AAAA,MACrC,SAASX,EAAUG,CAAK;AAAA,MACxB,UAAUE,KAAY;AAAA,MACtB,MAAMA,IAAWO,EAAK,OAAOA,EAAK;AAAA,MAClC,aAAa,CAACP;AAAA,MACd,eAAe;AAAA,MACf,WAAW;AAAA,MACX,UAAU,CAACQ,GAAkBC,GAAgBC,MAA2B;AACtE,YAAI,EAAAV,KAAY,CAACI,EAAY,YACzB,CAAAM,EAAO;AACX,cAAI,UAAUF;AACZ,YAAAJ,EAAY,QAAQI,EAAQ,IAAI;AAAA,mBACvB,UAAUA;AACnB,gBAAI;AACF,cAAAJ,EAAY,QAAQ,KAAK,MAAMI,EAAQ,IAAI,CAAC;AAAA,YAC9C,QAAQ;AACN,cAAAJ,EAAY,QAAQI,EAAQ,IAAI;AAAA,YAClC;AAAA;AAAA,MAEJ;AAAA,IAAA,GAGIG,IAAgB,MAAM;;AAC1B,YAAMC,IAAS,SAAS,gBAAgB,UAAU,SAAS,MAAM;AACjE,OAAAC,IAAAZ,EAAa,YAAb,QAAAY,EAAsB,UAAU,OAAO,kBAAkBD;AAAA,IAC3D;AACA,IAAAD,EAAA;AAGA,UAAMG,IAAW,IAAI,iBAAiBH,CAAa;AACnD,IAAAG,EAAS,QAAQ,SAAS,iBAAiB;AAAA,MACzC,YAAY;AAAA,MACZ,iBAAiB,CAAC,OAAO;AAAA,IAAA,CAC1B;AAED,UAAMC,IAASC,EAAiB;AAAA,MAC9B,QAAQf,EAAa;AAAA,MACrB,OAAAK;AAAA,IAAA,CACD;AACD,WAAAH,EAAU,UAAUY,GAEb,MAAM;AACX,MAAAD,EAAS,WAAA,GACTC,EAAO,QAAA,GACPZ,EAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAACH,CAAQ,CAAC,GAGbK,EAAU,MAAM;AACd,IAAI,CAACF,EAAU,WAAW,CAACH,KAC3BG,EAAU,QAAQ,YAAY,EAAE,SAASR,EAAUG,CAAK,GAAG;AAAA,EAC7D,GAAG,CAACA,GAAOE,CAAQ,CAAC,GAGlB,gBAAAiB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKhB;AAAA,MACL,WAAWD,IAAW,yBAAyB;AAAA,IAAA;AAAA,EAAA;AAGrD;"}
@@ -0,0 +1,11 @@
1
+ import type { CheckSetupResponse, LoginResponse, AuthUser, Tenant, SSOProvider } from "@/types/api";
2
+ export declare function checkSetup(): Promise<CheckSetupResponse>;
3
+ export declare function login(email: string, password: string): Promise<LoginResponse>;
4
+ export declare function signup(email: string, password: string, displayName: string): Promise<LoginResponse>;
5
+ export declare function getMe(): Promise<AuthUser>;
6
+ export declare function listTenants(): Promise<Tenant[]>;
7
+ export declare function switchTenant(tenantId: string): Promise<LoginResponse>;
8
+ export declare function createTenant(code: string, name: string): Promise<Tenant>;
9
+ export declare function logout(): Promise<void>;
10
+ export declare function listSSOProviders(tenantCode?: string): Promise<SSOProvider[]>;
11
+ export declare function ssoAuthorizeUrl(slug: string, tenantCode?: string, redirect?: string): string;
@@ -0,0 +1,3 @@
1
+ export declare function ensureRefresh(): Promise<void>;
2
+ export declare function apiFetch<T>(path: string, options?: RequestInit): Promise<T>;
3
+ export declare function callHandler<R = unknown>(code: string, args?: unknown): Promise<R>;
@@ -0,0 +1,28 @@
1
+ import type { ListParams, ListResponse, DataResponse } from "@/types/api";
2
+ import type { PkValues } from "@/types/schema";
3
+ export declare function listEntities(entity: string, params?: ListParams): Promise<ListResponse>;
4
+ export declare function getEntity(entity: string, pkValues: PkValues | string): Promise<DataResponse>;
5
+ export declare function createEntity(entity: string, data: Record<string, unknown>): Promise<DataResponse>;
6
+ export declare function updateEntity(entity: string, pkValues: PkValues | string, data: Record<string, unknown>): Promise<DataResponse>;
7
+ export declare function deleteEntity(entity: string, pkValues: PkValues | string): Promise<void>;
8
+ export declare function restoreEntity(entity: string, pkValues: PkValues | string): Promise<void>;
9
+ export interface ActionExecuteRequest {
10
+ entity?: string;
11
+ ids?: string[];
12
+ args?: Record<string, unknown>;
13
+ }
14
+ export interface ActionExecuteResponse {
15
+ status: string;
16
+ result?: unknown;
17
+ audit_operation_id?: string;
18
+ object_count?: number;
19
+ /** IDs that succeeded (batch_mode: each responses). */
20
+ success?: string[];
21
+ }
22
+ export declare function executeAction(code: string, body: ActionExecuteRequest): Promise<ActionExecuteResponse>;
23
+ export interface AssociationResponse {
24
+ target_entity: string;
25
+ ids: string[];
26
+ count: number;
27
+ }
28
+ export declare function resolveAssociation(code: string, ids: string[]): Promise<AssociationResponse>;
@@ -0,0 +1,75 @@
1
+ import type { Refs, V2ListParams, V2Meta, V2StatusInstance, V2PropertyInstance, EnrichedRow } from "@/types/api";
2
+ /** Helper methods injected onto enriched rows. */
3
+ export interface RowHelpers {
4
+ $status(groupCode: string): V2StatusInstance | undefined;
5
+ $property(propertyCode: string): V2PropertyInstance | undefined;
6
+ }
7
+ /** Normalized ref cache that merges $refs across multiple responses. */
8
+ export declare class RefCache {
9
+ private cache;
10
+ /** Merge incoming refs into the cache. */
11
+ merge(refs: Refs | undefined): void;
12
+ /** Get a snapshot of all cached refs. */
13
+ all(): Refs;
14
+ /** Look up a single ref by entity code and id. */
15
+ get(entityCode: string, id: string): Record<string, unknown> | undefined;
16
+ /** Clear the cache. */
17
+ clear(): void;
18
+ }
19
+ /**
20
+ * Generic, type-safe client for a single entity's v2 API.
21
+ *
22
+ * Single-item methods wrap arrays and unwrap the first result.
23
+ * Bulk methods pass arrays through directly.
24
+ *
25
+ * All write responses return enriched rows with $refs, $statuses, etc.
26
+ */
27
+ export declare class EntityClient<T extends Record<string, unknown> = Record<string, unknown>> {
28
+ readonly entity: string;
29
+ readonly refs: RefCache;
30
+ constructor(entity: string, refCache?: RefCache);
31
+ /** Get a single record by ID. Returns the full object with all sub-resources. */
32
+ get(id: string): Promise<T & EnrichedRow & RowHelpers>;
33
+ /** List records with cursor-based pagination, field selection, and expansion. */
34
+ list(params?: V2ListParams): Promise<{
35
+ data: (T & RowHelpers)[];
36
+ meta: V2Meta;
37
+ $refs: Refs;
38
+ }>;
39
+ /** Create a single record. Wraps in array, returns unwrapped result. */
40
+ create(item: Partial<T> & Record<string, unknown>): Promise<T & EnrichedRow & RowHelpers>;
41
+ /** Create multiple records in one request. */
42
+ createMany(items: (Partial<T> & Record<string, unknown>)[]): Promise<(T & EnrichedRow & RowHelpers)[]>;
43
+ /** Update a single record. Wraps in array, returns unwrapped result. */
44
+ update(id: string, data: Partial<T> & Record<string, unknown>): Promise<T & EnrichedRow & RowHelpers>;
45
+ /** Update multiple records in one request. Each item must include its id. */
46
+ updateMany(items: (Partial<T> & Record<string, unknown> & {
47
+ id: string;
48
+ })[]): Promise<(T & EnrichedRow & RowHelpers)[]>;
49
+ /** Delete a single record by ID. */
50
+ delete(id: string): Promise<void>;
51
+ /** Delete multiple records in one request. Returns the count of deleted records. */
52
+ deleteMany(ids: string[]): Promise<{
53
+ count: number;
54
+ }>;
55
+ /** Restore a single soft-deleted record by ID. */
56
+ restore(id: string): Promise<void>;
57
+ /** Restore multiple soft-deleted records. Returns the count of restored records. */
58
+ restoreMany(ids: string[]): Promise<{
59
+ count: number;
60
+ }>;
61
+ /** Upsert a single record. Wraps in array, returns unwrapped result. */
62
+ upsert(item: Partial<T> & Record<string, unknown>, uniqueFields: string[]): Promise<T & EnrichedRow & RowHelpers>;
63
+ /** Upsert multiple records. Existing matches (by unique_fields) are updated. */
64
+ upsertMany(items: (Partial<T> & Record<string, unknown>)[], uniqueFields: string[]): Promise<(T & EnrichedRow & RowHelpers)[]>;
65
+ }
66
+ /**
67
+ * Create an EntityClient for the given entity code.
68
+ * Optionally share a RefCache across multiple clients.
69
+ *
70
+ * NOTE(T5): Each call creates a new EntityClient (and a new RefCache if none is
71
+ * provided). For cross-page ref accumulation, callers should create a persistent
72
+ * RefCache instance and pass it to every entityClient() call, e.g. via React
73
+ * context or a module-level singleton.
74
+ */
75
+ export declare function entityClient<T extends Record<string, unknown> = Record<string, unknown>>(entity: string, refCache?: RefCache): EntityClient<T>;
@@ -0,0 +1,9 @@
1
+ export type SSEEvent = {
2
+ type: "entity_changed";
3
+ entity: string;
4
+ ids: string[];
5
+ action: "created" | "updated" | "deleted" | "restored";
6
+ } | {
7
+ type: "session_refresh";
8
+ };
9
+ export declare function streamEvents(signal?: AbortSignal): AsyncGenerator<SSEEvent>;
@@ -0,0 +1,3 @@
1
+ import type { PublicParam, ResolvedParam } from "@/types/api";
2
+ export declare function fetchPublicParams(): Promise<PublicParam[]>;
3
+ export declare function fetchParam(code: string): Promise<ResolvedParam>;
@@ -0,0 +1,3 @@
1
+ import type { PropertyValue } from "@/types/api";
2
+ export declare function setObjectProperty(entity: string, id: string, propertyCode: string, value: unknown): Promise<PropertyValue>;
3
+ export declare function deleteObjectProperty(entity: string, id: string, propertyCode: string): Promise<void>;
@@ -0,0 +1,2 @@
1
+ import type { Schema } from "@/types/schema";
2
+ export declare function fetchSchema(): Promise<Schema>;
@@ -0,0 +1,2 @@
1
+ import type { StatusInfo } from "@/types/api";
2
+ export declare function setObjectStatus(entity: string, id: string, groupCode: string, statusCode: string, note?: string): Promise<StatusInfo>;
@@ -0,0 +1 @@
1
+ export declare function App(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ interface ColumnPickerProps {
2
+ availableColumns: string[];
3
+ visibleColumns: string[];
4
+ onToggle: (col: string) => void;
5
+ onReset: () => void;
6
+ onShowAll: () => void;
7
+ /** Resolve column code to display label */
8
+ columnLabel?: (code: string) => string;
9
+ }
10
+ /**
11
+ * ColumnPicker - popover-style checklist for toggling column visibility.
12
+ * Drag-reorder deferred to later phase (using @dnd-kit).
13
+ */
14
+ export declare function ColumnPicker({ availableColumns, visibleColumns, onToggle, onReset, onShowAll, columnLabel, }: ColumnPickerProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { LayoutNode } from "@/types/schema";
2
+ import type { LayoutContext } from "./LayoutRenderer";
3
+ interface AssociatedBlockProps {
4
+ node: LayoutNode;
5
+ ctx: LayoutContext;
6
+ }
7
+ export declare function AssociatedBlock({ node, ctx }: AssociatedBlockProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { Entity } from "@/types/schema";
2
+ interface AssociatedToolbarProps {
3
+ entity: Entity;
4
+ searchable?: boolean;
5
+ filterFields?: string[];
6
+ searchValue: string;
7
+ onSearchChange: (value: string) => void;
8
+ filters: Record<string, string>;
9
+ onFilterChange: (field: string, value: string) => void;
10
+ allEntities?: Record<string, Entity>;
11
+ }
12
+ export declare function AssociatedToolbar({ entity, searchable, filterFields, searchValue, onSearchChange, filters, onFilterChange, allEntities, }: AssociatedToolbarProps): import("react/jsx-runtime").JSX.Element | null;
13
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { LayoutNode, Schema } from "@/types/schema";
2
+ import { type ResolvedChildConfig } from "@/lib/child-config";
3
+ import type { LayoutContext } from "./LayoutRenderer";
4
+ interface ChildrenBlockProps {
5
+ node: LayoutNode;
6
+ ctx: LayoutContext;
7
+ }
8
+ export interface ChildDisplayProps {
9
+ config: ResolvedChildConfig;
10
+ parentEntity: string;
11
+ parentId: string;
12
+ schema: Schema;
13
+ }
14
+ export declare function ChildrenBlock({ node, ctx }: ChildrenBlockProps): import("react/jsx-runtime").JSX.Element | null;
15
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ChildDisplayProps } from "./ChildrenBlock";
2
+ export declare function ChildrenCards({ config, parentEntity, parentId, schema }: ChildDisplayProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { ChildDisplayProps } from "./ChildrenBlock";
2
+ export declare function ChildrenList({ config, parentEntity, parentId, schema }: ChildDisplayProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { ChildDisplayProps } from "./ChildrenBlock";
2
+ export declare function ChildrenTable({ config, parentEntity, parentId, schema }: ChildDisplayProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { ChildDisplayProps } from "./ChildrenBlock";
2
+ export declare function ChildrenTimeline({ config, parentEntity, parentId, schema }: ChildDisplayProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ import type { Entity, Schema } from "@/types/schema";
2
+ import type { RefsMap } from "@/components/fields";
3
+ import type { PendingChildRow } from "./LayoutRenderer";
4
+ import type { ResolvedChildConfig } from "@/lib/child-config";
5
+ interface DraggableChildrenTableProps {
6
+ config: ResolvedChildConfig;
7
+ childEntity: Entity;
8
+ schema: Schema;
9
+ rows: PendingChildRow[];
10
+ onChange: (rows: PendingChildRow[]) => void;
11
+ validationErrors?: Record<string, string[]>;
12
+ refs?: RefsMap;
13
+ }
14
+ export declare function DraggableChildrenTable({ config, childEntity, schema, rows, onChange, validationErrors, refs, }: DraggableChildrenTableProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { Entity, Schema } from "@/types/schema";
2
+ import type { RefsMap } from "@/components/fields";
3
+ import type { PendingChildRow } from "./LayoutRenderer";
4
+ import type { ResolvedChildConfig } from "@/lib/child-config";
5
+ interface EditableChildrenTableProps {
6
+ config: ResolvedChildConfig;
7
+ childEntity: Entity;
8
+ schema: Schema;
9
+ rows: PendingChildRow[];
10
+ onChange: (rows: PendingChildRow[]) => void;
11
+ validationErrors?: Record<string, string[]>;
12
+ refs?: RefsMap;
13
+ }
14
+ export declare function EditableChildrenTable({ config, childEntity, schema, rows, onChange, validationErrors, refs, }: EditableChildrenTableProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { LayoutContext } from "./LayoutRenderer";
2
+ interface FieldsBlockProps {
3
+ fields: string[];
4
+ ctx: LayoutContext;
5
+ }
6
+ export declare function FieldsBlock({ fields, ctx }: FieldsBlockProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { ColumnConfig, LayoutNode } from "@/types/schema";
2
+ import { type LayoutContext } from "./LayoutRenderer";
3
+ interface LayoutColumnProps {
4
+ config: ColumnConfig;
5
+ node: LayoutNode;
6
+ ctx: LayoutContext;
7
+ }
8
+ export declare function LayoutColumn({ config, ctx }: LayoutColumnProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,42 @@
1
+ import type { Entity, LayoutNode, Schema } from "@/types/schema";
2
+ import type { StatusInfo, PropertyValue } from "@/types/api";
3
+ import type { RefsMap } from "@/components/fields";
4
+ export interface PendingChildRow {
5
+ _key: string;
6
+ _deleted?: boolean;
7
+ _dirty?: boolean;
8
+ [field: string]: unknown;
9
+ }
10
+ export interface LayoutContext {
11
+ schema: Schema;
12
+ entity: Entity;
13
+ entityCode: string;
14
+ recordId: string;
15
+ record: Record<string, unknown>;
16
+ isNew: boolean;
17
+ mode: "display" | "edit";
18
+ onFieldChange?: (field: string, value: unknown) => void;
19
+ refs?: RefsMap;
20
+ columns?: number;
21
+ objectProperties?: PropertyValue[];
22
+ onSetProperty?: (propertyCode: string, value: unknown) => void;
23
+ isPropertyPending?: boolean;
24
+ objectStatuses?: StatusInfo[];
25
+ onSetStatus?: (groupCode: string, statusCode: string) => void;
26
+ isStatusPending?: boolean;
27
+ pendingChildren?: Record<string, PendingChildRow[]>;
28
+ onChildrenChange?: (childCode: string, rows: PendingChildRow[]) => void;
29
+ childValidationErrors?: Record<string, Record<string, string[]>>;
30
+ }
31
+ interface LayoutRendererProps {
32
+ nodes: LayoutNode[];
33
+ ctx: LayoutContext;
34
+ }
35
+ export declare function LayoutRenderer({ nodes, ctx }: LayoutRendererProps): import("react/jsx-runtime").JSX.Element;
36
+ interface LayoutNodeRendererProps {
37
+ node: LayoutNode;
38
+ ctx: LayoutContext;
39
+ }
40
+ export declare function LayoutNodeRenderer({ node, ctx }: LayoutNodeRendererProps): import("react/jsx-runtime").JSX.Element | null;
41
+ export declare function getNodeKind(node: LayoutNode): string | null;
42
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { RowConfig } from "@/types/schema";
2
+ import { type LayoutContext } from "./LayoutRenderer";
3
+ interface LayoutRowProps {
4
+ config: RowConfig;
5
+ ctx: LayoutContext;
6
+ }
7
+ export declare function LayoutRow({ config, ctx }: LayoutRowProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { TabsConfig } from "@/types/schema";
2
+ import { type LayoutContext } from "./LayoutRenderer";
3
+ interface LayoutTabsProps {
4
+ config: TabsConfig;
5
+ ctx: LayoutContext;
6
+ }
7
+ export declare function LayoutTabs({ config, ctx }: LayoutTabsProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { LayoutNode } from "@/types/schema";
2
+ import type { LayoutContext } from "./LayoutRenderer";
3
+ interface PropertiesBlockProps {
4
+ node: LayoutNode;
5
+ ctx: LayoutContext;
6
+ }
7
+ export declare function PropertiesBlock({ node, ctx }: PropertiesBlockProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { ResolvedChildConfig } from "@/lib/child-config";
2
+ import type { Schema } from "@/types/schema";
3
+ interface QuickAddFormProps {
4
+ config: ResolvedChildConfig;
5
+ parentEntity: string;
6
+ parentId: string | string[];
7
+ schema: Schema;
8
+ }
9
+ export declare function QuickAddForm({ config, parentEntity, parentId, schema }: QuickAddFormProps): import("react/jsx-runtime").JSX.Element | null;
10
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { SectionNode } from "@/types/schema";
2
+ import type { LayoutContext } from "./LayoutRenderer";
3
+ interface SectionBlockProps {
4
+ config: SectionNode;
5
+ ctx: LayoutContext;
6
+ }
7
+ export declare function SectionBlock({ config, ctx }: SectionBlockProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { LayoutNode } from "@/types/schema";
2
+ import type { LayoutContext } from "./LayoutRenderer";
3
+ interface StatusesBlockProps {
4
+ node: LayoutNode;
5
+ ctx: LayoutContext;
6
+ }
7
+ export declare function StatusesBlock({ node, ctx }: StatusesBlockProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { ResolvedChildConfig } from "@/lib/child-config";
2
+ import type { Schema } from "@/types/schema";
3
+ interface TimelineComposerProps {
4
+ config: ResolvedChildConfig;
5
+ parentEntity: string;
6
+ parentId: string | string[];
7
+ schema: Schema;
8
+ }
9
+ export declare function TimelineComposer({ config, parentEntity, parentId, schema }: TimelineComposerProps): import("react/jsx-runtime").JSX.Element | null;
10
+ export {};
@@ -0,0 +1,18 @@
1
+ export { LayoutRenderer, LayoutNodeRenderer, getNodeKind, type LayoutContext, type PendingChildRow } from "./LayoutRenderer";
2
+ export { LayoutRow } from "./LayoutRow";
3
+ export { LayoutColumn } from "./LayoutColumn";
4
+ export { LayoutTabs } from "./LayoutTabs";
5
+ export { SectionBlock } from "./SectionBlock";
6
+ export { FieldsBlock } from "./FieldsBlock";
7
+ export { ChildrenBlock, type ChildDisplayProps } from "./ChildrenBlock";
8
+ export { ChildrenTable } from "./ChildrenTable";
9
+ export { EditableChildrenTable } from "./EditableChildrenTable";
10
+ export { DraggableChildrenTable } from "./DraggableChildrenTable";
11
+ export { ChildrenList } from "./ChildrenList";
12
+ export { ChildrenCards } from "./ChildrenCards";
13
+ export { ChildrenTimeline } from "./ChildrenTimeline";
14
+ export { PropertiesBlock } from "./PropertiesBlock";
15
+ export { StatusesBlock } from "./StatusesBlock";
16
+ export { QuickAddForm } from "./QuickAddForm";
17
+ export { TimelineComposer } from "./TimelineComposer";
18
+ export { useQuickAdd } from "./useQuickAdd";
@@ -0,0 +1,17 @@
1
+ import { type FormEvent } from "react";
2
+ import type { ResolvedChildConfig } from "@/lib/child-config";
3
+ import type { Schema } from "@/types/schema";
4
+ export interface UseQuickAddResult {
5
+ values: Record<string, unknown>;
6
+ quickAdd: ResolvedChildConfig["quick_add"];
7
+ childEntity: ReturnType<typeof getChildEntity>;
8
+ isPending: boolean;
9
+ error: Error | null;
10
+ isReady: boolean;
11
+ handleSubmit: (e: FormEvent) => void;
12
+ handleFieldChange: (fieldName: string, val: unknown) => void;
13
+ }
14
+ type ChildEntity = Schema["entities"][string] | undefined;
15
+ declare function getChildEntity(schema: Schema, entityCode: string): ChildEntity;
16
+ export declare function useQuickAdd(config: ResolvedChildConfig, parentEntity: string, parentId: string | string[], schema: Schema): UseQuickAddResult;
17
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function BoolField({ value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function EmailField({ value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function EnumField({ field, value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function IntArrayField({ value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import "vanilla-jsoneditor/themes/jse-theme-dark.css";
2
+ interface JsonEditorProps {
3
+ value: unknown;
4
+ onChange?: (value: unknown) => void;
5
+ readOnly?: boolean;
6
+ schema?: Record<string, unknown>;
7
+ }
8
+ export declare function JsonEditor({ value, onChange, readOnly }: JsonEditorProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function JsonField({ value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function MultilangField({ value, mode, onChange, }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function MultilangTextField({ value, mode, onChange, }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function NumberField({ field, fieldName, value, mode, onChange, record }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function PasswordField({ value, mode, onChange, record }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function RefField({ field, value, mode, onChange, refs, }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function SecretField({ value, mode, onChange, record }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { FieldRendererProps } from "./index";
2
+ export declare function StringArrayField({ value, mode, onChange }: FieldRendererProps): import("react/jsx-runtime").JSX.Element;