@lambda-development/erp-core 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 (67) hide show
  1. package/dist/App.d.ts +1 -0
  2. package/dist/api/client.d.ts +256 -0
  3. package/dist/assets/report-runtime.worker-DrBTCfV6.js +5 -0
  4. package/dist/assets/report-runtime.worker-DrBTCfV6.js.map +1 -0
  5. package/dist/bootstrap.d.ts +16 -0
  6. package/dist/components/auth/protected-route.d.ts +3 -0
  7. package/dist/components/chat/chat-provider.d.ts +62 -0
  8. package/dist/components/document/child-table-editor.d.ts +9 -0
  9. package/dist/components/document/document-actions.d.ts +14 -0
  10. package/dist/components/document/link-field.d.ts +9 -0
  11. package/dist/components/document/status-badge.d.ts +5 -0
  12. package/dist/components/layout/app-shell.d.ts +1 -0
  13. package/dist/components/layout/sidebar.d.ts +7 -0
  14. package/dist/components/ui/badge.d.ts +10 -0
  15. package/dist/components/ui/button.d.ts +11 -0
  16. package/dist/components/ui/card.d.ts +10 -0
  17. package/dist/components/ui/date-range-presets.d.ts +9 -0
  18. package/dist/components/ui/hint-tooltip.d.ts +3 -0
  19. package/dist/components/ui/input.d.ts +9 -0
  20. package/dist/components/ui/language-select.d.ts +8 -0
  21. package/dist/components/ui/select.d.ts +15 -0
  22. package/dist/contexts/auth-context.d.ts +19 -0
  23. package/dist/hooks/use-base-currency.d.ts +7 -0
  24. package/dist/hooks/use-currencies.d.ts +10 -0
  25. package/dist/hooks/use-document-list.d.ts +16 -0
  26. package/dist/hooks/use-document.d.ts +14 -0
  27. package/dist/hooks/use-report.d.ts +139 -0
  28. package/dist/hooks/use-url-state.d.ts +23 -0
  29. package/dist/i18n/index.d.ts +15 -0
  30. package/dist/i18n/locales/de.json.d.ts +542 -0
  31. package/dist/i18n/locales/en.json.d.ts +602 -0
  32. package/dist/i18n/locales/fr.json.d.ts +542 -0
  33. package/dist/index.d.ts +31 -0
  34. package/dist/index.js +6583 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/lib/branding.d.ts +28 -0
  37. package/dist/lib/component-registry.d.ts +4 -0
  38. package/dist/lib/doctypes.d.ts +56 -0
  39. package/dist/lib/nav.d.ts +21 -0
  40. package/dist/lib/utils.d.ts +10 -0
  41. package/dist/main.d.ts +0 -0
  42. package/dist/pages/admin/settings.d.ts +1 -0
  43. package/dist/pages/admin/users.d.ts +1 -0
  44. package/dist/pages/chat.d.ts +1 -0
  45. package/dist/pages/dashboard.d.ts +1 -0
  46. package/dist/pages/demo.d.ts +6 -0
  47. package/dist/pages/documents/document-form.d.ts +2 -0
  48. package/dist/pages/documents/document-list.d.ts +1 -0
  49. package/dist/pages/login.d.ts +1 -0
  50. package/dist/pages/masters/master-form.d.ts +1 -0
  51. package/dist/pages/masters/master-list.d.ts +1 -0
  52. package/dist/pages/opening-balances.d.ts +1 -0
  53. package/dist/pages/reports/analytics.d.ts +1 -0
  54. package/dist/pages/reports/ap-aging.d.ts +1 -0
  55. package/dist/pages/reports/ar-aging.d.ts +1 -0
  56. package/dist/pages/reports/balance-sheet.d.ts +1 -0
  57. package/dist/pages/reports/general-ledger.d.ts +1 -0
  58. package/dist/pages/reports/profit-loss.d.ts +1 -0
  59. package/dist/pages/reports/stock-balance.d.ts +1 -0
  60. package/dist/pages/reports/trial-balance.d.ts +1 -0
  61. package/dist/pages/setup.d.ts +1 -0
  62. package/dist/pages/tutorial.d.ts +1 -0
  63. package/dist/routes.d.ts +19 -0
  64. package/dist/workers/report-runtime.worker.d.ts +1 -0
  65. package/package.json +61 -0
  66. package/src/index.css +105 -0
  67. package/tailwind.preset.ts +70 -0
package/dist/App.d.ts ADDED
@@ -0,0 +1 @@
1
+ export default function App(): import('react').ReactElement<unknown, string | import('react').JSXElementConstructor<any>> | null;
@@ -0,0 +1,256 @@
1
+ export declare function configureApiBase(base: string): void;
2
+ export declare class ApiError extends Error {
3
+ status: number;
4
+ constructor(status: number, message: string);
5
+ }
6
+ export declare function request<T>(path: string, options?: RequestInit): Promise<T>;
7
+ export declare const api: {
8
+ request: typeof request;
9
+ uploadChatAttachment: (sessionId: string, file: File) => Promise<{
10
+ id: string;
11
+ filename: string;
12
+ mime_type: string;
13
+ size_bytes: number;
14
+ created_at: string;
15
+ }>;
16
+ getChatAttachmentUrl: (id: string) => string;
17
+ createChatSession: () => Promise<{
18
+ id: string;
19
+ title: string;
20
+ created_at: string;
21
+ updated_at: string;
22
+ last_message_at?: string | null;
23
+ }>;
24
+ getChatSession: (id: string) => Promise<{
25
+ id: string;
26
+ title: string;
27
+ created_at: string;
28
+ updated_at: string;
29
+ last_message_at?: string | null;
30
+ detail?: string;
31
+ }>;
32
+ listDocuments: (doctype: string, params?: Record<string, string | number | undefined>) => Promise<{
33
+ rows: any[];
34
+ total: number;
35
+ limit: number;
36
+ offset: number;
37
+ }>;
38
+ getDocument: (doctype: string, name: string) => Promise<any>;
39
+ createDocument: (doctype: string, data: any) => Promise<any>;
40
+ updateDocument: (doctype: string, name: string, data: any) => Promise<any>;
41
+ submitDocument: (doctype: string, name: string) => Promise<any>;
42
+ cancelDocument: (doctype: string, name: string) => Promise<any>;
43
+ convertDocument: (doctype: string, name: string, targetDoctype: string) => Promise<any>;
44
+ listMasters: (type: string, params?: Record<string, string | number | undefined>) => Promise<{
45
+ rows: any[];
46
+ total: number;
47
+ limit: number;
48
+ offset: number;
49
+ }>;
50
+ searchMasters: (type: string, q: string) => Promise<any[]>;
51
+ searchDocuments: (doctype: string, q: string) => Promise<any[]>;
52
+ searchLink: (type: string, q: string) => Promise<any[]>;
53
+ getMaster: (type: string, name: string) => Promise<any>;
54
+ currencies: (company?: string) => Promise<{
55
+ base_currency: string;
56
+ currencies: string[];
57
+ }>;
58
+ createMaster: (type: string, data: any) => Promise<any>;
59
+ updateMaster: (type: string, name: string, data: any) => Promise<any>;
60
+ deleteMaster: (type: string, name: string) => Promise<any>;
61
+ trialBalance: (params?: Record<string, string>) => Promise<{
62
+ rows: any[];
63
+ total_debit: number;
64
+ total_credit: number;
65
+ difference: number;
66
+ }>;
67
+ generalLedger: (params?: Record<string, string>) => Promise<{
68
+ rows: any[];
69
+ total: number;
70
+ limit: number;
71
+ offset: number;
72
+ opening_balance: number;
73
+ }>;
74
+ stockBalance: (params?: Record<string, string>) => Promise<{
75
+ rows: any[];
76
+ }>;
77
+ dashboardSummary: (company?: string) => Promise<any>;
78
+ profitAndLoss: (params?: Record<string, string>) => Promise<any>;
79
+ balanceSheet: (params?: Record<string, string>) => Promise<any>;
80
+ arAging: (params?: Record<string, string>) => Promise<any>;
81
+ apAging: (params?: Record<string, string>) => Promise<any>;
82
+ analyticsMetrics: () => Promise<{
83
+ metrics: Array<{
84
+ metric: string;
85
+ label: string;
86
+ group_by: string[];
87
+ time_based: boolean;
88
+ }>;
89
+ }>;
90
+ analytics: (params: Record<string, string>) => Promise<{
91
+ metric: string;
92
+ metric_label: string;
93
+ group_by: string;
94
+ chart_type: "bar" | "line";
95
+ time_based: boolean;
96
+ from_date: string | null;
97
+ to_date: string | null;
98
+ company: string | null;
99
+ rows: Array<{
100
+ label: string;
101
+ value: number;
102
+ }>;
103
+ total: number;
104
+ }>;
105
+ runtimeDatasets: () => Promise<{
106
+ datasets: Array<{
107
+ dataset: string;
108
+ label: string;
109
+ description: string;
110
+ fields: Record<string, string>;
111
+ filter_fields: string[];
112
+ default_limit: number;
113
+ max_limit: number;
114
+ }>;
115
+ }>;
116
+ runtimeData: (data: {
117
+ requests: Array<{
118
+ name?: string;
119
+ dataset: string;
120
+ fields?: string[];
121
+ filters?: Record<string, unknown>;
122
+ limit?: number;
123
+ }>;
124
+ }) => Promise<{
125
+ datasets: Array<{
126
+ name: string;
127
+ dataset: string;
128
+ rows: Array<Record<string, unknown>>;
129
+ fields: Record<string, string>;
130
+ row_count: number;
131
+ truncated: boolean;
132
+ limit: number;
133
+ }>;
134
+ }>;
135
+ createRuntimeDraft: (data: {
136
+ title: string;
137
+ description?: string;
138
+ data_requests: Array<{
139
+ name?: string;
140
+ dataset: string;
141
+ fields?: string[];
142
+ filters?: Record<string, unknown>;
143
+ limit?: number;
144
+ }>;
145
+ transform_js: string;
146
+ }) => Promise<{
147
+ id: string;
148
+ title: string;
149
+ description?: string;
150
+ definition: Record<string, unknown>;
151
+ url: string;
152
+ created_by?: string;
153
+ }>;
154
+ getRuntimeDraft: (id: string) => Promise<{
155
+ id: string;
156
+ title: string;
157
+ description?: string;
158
+ definition: Record<string, unknown>;
159
+ url: string;
160
+ created_by?: string;
161
+ source_chat_session_id?: string;
162
+ created_at?: string;
163
+ updated_at?: string;
164
+ }>;
165
+ listRuntimeDrafts: () => Promise<{
166
+ drafts: Array<{
167
+ id: string;
168
+ title: string;
169
+ description?: string;
170
+ created_by?: string;
171
+ source_chat_session_id?: string;
172
+ created_at?: string;
173
+ updated_at?: string;
174
+ url: string;
175
+ }>;
176
+ }>;
177
+ deleteRuntimeDraft: (id: string) => Promise<{
178
+ deleted: string;
179
+ }>;
180
+ setupStatus: () => Promise<{
181
+ setup_complete: boolean;
182
+ companies: any[];
183
+ }>;
184
+ createCompany: (data: {
185
+ name: string;
186
+ currency?: string;
187
+ }) => Promise<any>;
188
+ seedDemo: () => Promise<any>;
189
+ seedHistory: (data?: {
190
+ start_date?: string;
191
+ end_date?: string;
192
+ seed?: number;
193
+ intensity?: number;
194
+ }) => Promise<{
195
+ ok: boolean;
196
+ company: string;
197
+ start_date: string;
198
+ end_date: string;
199
+ stats: Record<string, number>;
200
+ }>;
201
+ importAccountBalances: (data: any) => Promise<any>;
202
+ importStockBalances: (data: any) => Promise<any>;
203
+ importOutstandingInvoices: (data: any) => Promise<any>;
204
+ authSetupStatus: () => Promise<{
205
+ has_users: boolean;
206
+ registration_open: boolean;
207
+ }>;
208
+ authRegister: (data: {
209
+ email: string;
210
+ full_name: string;
211
+ password: string;
212
+ invite_token?: string;
213
+ }) => Promise<any>;
214
+ authLogin: (email: string, password: string) => Promise<any>;
215
+ authLogout: () => Promise<any>;
216
+ authMe: () => Promise<any>;
217
+ authInvite: (email: string, role: string) => Promise<any>;
218
+ authListUsers: () => Promise<any[]>;
219
+ authChangeRole: (userName: string, role: string) => Promise<any>;
220
+ authDisableUser: (userName: string) => Promise<any>;
221
+ authListInvites: () => Promise<any[]>;
222
+ getPublicManagerStatus: () => Promise<{
223
+ active: boolean;
224
+ user?: any;
225
+ }>;
226
+ createPublicManager: () => Promise<any>;
227
+ removePublicManager: () => Promise<any>;
228
+ getSettings: () => Promise<Record<string, string>>;
229
+ updateSettings: (data: Record<string, string>) => Promise<Record<string, string>>;
230
+ getDemoSpend: () => Promise<{
231
+ caps: {
232
+ global_hourly_usd: number;
233
+ per_ip_hourly_usd: number;
234
+ };
235
+ windows: Record<string, {
236
+ total_usd: number;
237
+ demo_usd: number;
238
+ prompt_tokens: number;
239
+ completion_tokens: number;
240
+ call_count: number;
241
+ unique_ips: number;
242
+ by_provider: Record<string, {
243
+ cost_usd: number;
244
+ call_count: number;
245
+ prompt_tokens: number;
246
+ completion_tokens: number;
247
+ }>;
248
+ }>;
249
+ top_ips_24h: Array<{
250
+ ip: string;
251
+ role: string | null;
252
+ cost_usd: number;
253
+ call_count: number;
254
+ }>;
255
+ }>;
256
+ };
@@ -0,0 +1,5 @@
1
+ (function(){"use strict";function u(r,t){const e=Number(r??0)||0;return t==null?e:Number(e.toFixed(t))}const p={flt:u,sum(r,t){return r.reduce((e,a)=>typeof t=="function"?e+u(t(a)):typeof t=="string"?e+u(a[t]):e+u(a),0)},count(r){return r.length},sortBy(r,t,e="asc"){const n=(e===!0?"desc":e===!1?"asc":e)==="desc"?-1:1;return[...r].sort((s,i)=>{const c=s[t],o=i[t];return c==null&&o==null?0:c==null?1:o==null?-1:c<o?-1*n:c>o?1*n:0})},topN(r,t,e=10){return typeof t=="number"?r.slice(0,t):p.sortBy(r,t,"desc").slice(0,e)},group(r,t,e){if(typeof t=="function"){const s=new Map;for(const i of r){const c=t(i),o=JSON.stringify(c);s.has(o)||s.set(o,{key:c,rows:[]}),s.get(o).rows.push(i)}return Array.from(s.values())}const a=t,n=new Map;for(const s of r){const i=a.map(f=>s[f]),c=JSON.stringify(i);if(!n.has(c)){const f={};a.forEach((l,m)=>{f[l]=i[m]});for(const[l,[m]]of Object.entries(e||{}))f[l]=0;n.set(c,f)}const o=n.get(c);for(const[f,[l,m]]of Object.entries(e||{}))l==="count"?o[f]=u(o[f])+1:o[f]=u(o[f])+u(s[m||f])}return Array.from(n.values())},leftJoin(r,t,e,a=e){const n=new Map(t.map(s=>[s[a],s]));return r.map(s=>({...s,...n.get(s[e])||{}}))},monthKey(r){return String(r??"").slice(0,7)},quarterKey(r){const t=String(r??""),e=t.slice(0,4),a=Number(t.slice(5,7));return!e||!a?"":`${e}-Q${Math.floor((a+2)/3)}`},yearKey(r){return String(r??"").slice(0,4)},pivot(r,t,e,a){const n=new Map;for(const s of r){const i=String(s[t]??"—"),c=String(s[e]??"—");n.has(i)||n.set(i,{[t]:i});const o=n.get(i);o[c]=u(o[c])+u(s[a])}return Array.from(n.values())}};function y(r){if(!r||typeof r!="object")throw new Error("Transform must return an object");if(r.tables&&!Array.isArray(r.tables))throw new Error("tables must be an array");if(r.charts&&!Array.isArray(r.charts))throw new Error("charts must be an array");if(r.kpis&&!Array.isArray(r.kpis))throw new Error("kpis must be an array");return r}self.onmessage=r=>{try{const t=Object.fromEntries(r.data.datasets.map(s=>[s.name,s.rows])),e=r.data.datasets.map(s=>s.name).filter(s=>/^[$A-Z_][0-9A-Z_$]*$/i.test(s)).map(s=>`const ${s} = datasets[${JSON.stringify(s)}];`).join(`
2
+ `),n=new Function("datasets","params","helpers",`"use strict";
3
+ ${e}
4
+ ${r.data.transformJs}`)(t,r.data.params||{},p);self.postMessage({ok:!0,output:y(n)})}catch(t){self.postMessage({ok:!1,error:t instanceof Error?t.message:String(t)})}}})();
5
+ //# sourceMappingURL=report-runtime.worker-DrBTCfV6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-runtime.worker-DrBTCfV6.js","sources":["../src/workers/report-runtime.worker.ts"],"sourcesContent":["type RuntimeDataset = {\n name: string;\n dataset: string;\n rows: Array<Record<string, unknown>>;\n fields: Record<string, string>;\n};\n\ntype RuntimeMessage = {\n datasets: RuntimeDataset[];\n params?: Record<string, unknown>;\n transformJs: string;\n};\n\nfunction flt(value: unknown, precision?: number) {\n const n = Number(value ?? 0) || 0;\n return precision == null ? n : Number(n.toFixed(precision));\n}\n\nconst helpers = {\n flt,\n sum<T extends Record<string, unknown>>(rows: T[], fieldOrFn?: string | ((row: T) => unknown)) {\n return rows.reduce((acc, row) => {\n if (typeof fieldOrFn === \"function\") return acc + flt(fieldOrFn(row));\n if (typeof fieldOrFn === \"string\") return acc + flt(row[fieldOrFn]);\n return acc + flt(row as unknown);\n }, 0);\n },\n count<T>(rows: T[]) {\n return rows.length;\n },\n sortBy<T extends Record<string, unknown>>(rows: T[], field: string, dir: \"asc\" | \"desc\" | boolean = \"asc\") {\n const normalizedDir = dir === true ? \"desc\" : dir === false ? \"asc\" : dir;\n const factor = normalizedDir === \"desc\" ? -1 : 1;\n return [...rows].sort((a, b) => {\n const av = a[field];\n const bv = b[field];\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n if (av < bv) return -1 * factor;\n if (av > bv) return 1 * factor;\n return 0;\n });\n },\n topN<T extends Record<string, unknown>>(rows: T[], fieldOrN: string | number, n = 10) {\n if (typeof fieldOrN === \"number\") return rows.slice(0, fieldOrN);\n return helpers.sortBy(rows, fieldOrN, \"desc\").slice(0, n);\n },\n group<T extends Record<string, unknown>>(\n rows: T[],\n keysOrFn: string[] | ((row: T) => unknown),\n measures?: Record<string, [\"sum\" | \"count\", string?]>,\n ) {\n if (typeof keysOrFn === \"function\") {\n const map = new Map<string, { key: unknown; rows: T[] }>();\n for (const row of rows) {\n const key = keysOrFn(row);\n const mapKey = JSON.stringify(key);\n if (!map.has(mapKey)) {\n map.set(mapKey, { key, rows: [] });\n }\n map.get(mapKey)!.rows.push(row);\n }\n return Array.from(map.values());\n }\n\n const keys = keysOrFn;\n const map = new Map<string, Record<string, unknown>>();\n for (const row of rows) {\n const keyValues = keys.map((key) => row[key]);\n const mapKey = JSON.stringify(keyValues);\n if (!map.has(mapKey)) {\n const seed: Record<string, unknown> = {};\n keys.forEach((key, idx) => {\n seed[key] = keyValues[idx];\n });\n for (const [alias, [op]] of Object.entries(measures || {})) {\n seed[alias] = op === \"count\" ? 0 : 0;\n }\n map.set(mapKey, seed);\n }\n const bucket = map.get(mapKey)!;\n for (const [alias, [op, field]] of Object.entries(measures || {})) {\n if (op === \"count\") {\n bucket[alias] = flt(bucket[alias]) + 1;\n } else {\n bucket[alias] = flt(bucket[alias]) + flt(row[field || alias]);\n }\n }\n }\n return Array.from(map.values());\n },\n leftJoin<\n TLeft extends Record<string, unknown>,\n TRight extends Record<string, unknown>,\n >(left: TLeft[], right: TRight[], leftKey: string, rightKey = leftKey) {\n const index = new Map(right.map((row) => [row[rightKey], row]));\n return left.map((row) => ({\n ...row,\n ...(index.get(row[leftKey]) || {}),\n }));\n },\n monthKey(value: unknown) {\n return String(value ?? \"\").slice(0, 7);\n },\n quarterKey(value: unknown) {\n const s = String(value ?? \"\");\n const year = s.slice(0, 4);\n const month = Number(s.slice(5, 7));\n if (!year || !month) return \"\";\n return `${year}-Q${Math.floor((month + 2) / 3)}`;\n },\n yearKey(value: unknown) {\n return String(value ?? \"\").slice(0, 4);\n },\n pivot(\n rows: Array<Record<string, unknown>>,\n indexField: string,\n columnField: string,\n valueField: string,\n ) {\n const buckets = new Map<string, Record<string, unknown>>();\n for (const row of rows) {\n const index = String(row[indexField] ?? \"—\");\n const column = String(row[columnField] ?? \"—\");\n if (!buckets.has(index)) {\n buckets.set(index, { [indexField]: index });\n }\n const bucket = buckets.get(index)!;\n bucket[column] = flt(bucket[column]) + flt(row[valueField]);\n }\n return Array.from(buckets.values());\n },\n};\n\nfunction validateOutput(output: any) {\n if (!output || typeof output !== \"object\") {\n throw new Error(\"Transform must return an object\");\n }\n if (output.tables && !Array.isArray(output.tables)) {\n throw new Error(\"tables must be an array\");\n }\n if (output.charts && !Array.isArray(output.charts)) {\n throw new Error(\"charts must be an array\");\n }\n if (output.kpis && !Array.isArray(output.kpis)) {\n throw new Error(\"kpis must be an array\");\n }\n return output;\n}\n\nself.onmessage = (event: MessageEvent<RuntimeMessage>) => {\n try {\n const datasetMap = Object.fromEntries(event.data.datasets.map((d) => [d.name, d.rows]));\n const scopeDecl = event.data.datasets\n .map((d) => d.name)\n .filter((name) => /^[$A-Z_][0-9A-Z_$]*$/i.test(name))\n .map((name) => `const ${name} = datasets[${JSON.stringify(name)}];`)\n .join(\"\\n\");\n const transform = new Function(\n \"datasets\",\n \"params\",\n \"helpers\",\n `\"use strict\";\\n${scopeDecl}\\n${event.data.transformJs}`,\n );\n const output = transform(datasetMap, event.data.params || {}, helpers);\n self.postMessage({ ok: true, output: validateOutput(output) });\n } catch (error) {\n self.postMessage({\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n};\n"],"names":["flt","value","precision","n","helpers","rows","fieldOrFn","acc","row","field","dir","factor","a","b","av","bv","fieldOrN","keysOrFn","measures","map","key","mapKey","keys","keyValues","seed","idx","alias","op","bucket","left","right","leftKey","rightKey","index","s","year","month","indexField","columnField","valueField","buckets","column","validateOutput","output","event","datasetMap","d","scopeDecl","name","error"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { QueryClient } from '@tanstack/react-query';
2
+ export declare function createAppQueryClient(): QueryClient;
3
+ export interface BootstrapOptions {
4
+ /** Mount target. Defaults to the element with id "root". */
5
+ rootElement?: HTMLElement;
6
+ /** Provide a custom QueryClient (e.g. to tune caching). */
7
+ queryClient?: QueryClient;
8
+ }
9
+ /**
10
+ * Render the full app (providers + router) into the DOM. The demo app and a
11
+ * customer deployment both call this from their entry module — the customer
12
+ * imports its plugin (which registers overrides/routes/doctypes) and the
13
+ * stylesheet first, then calls bootstrap(). Routes are built here, after
14
+ * registration, so overrides take effect.
15
+ */
16
+ export declare function bootstrap(opts?: BootstrapOptions): void;
@@ -0,0 +1,3 @@
1
+ export declare function ProtectedRoute({ children }: {
2
+ children: React.ReactNode;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,62 @@
1
+ import { ReactNode } from 'react';
2
+ export interface ChatSession {
3
+ id: string;
4
+ title: string;
5
+ created_at: string;
6
+ updated_at: string;
7
+ last_message_at?: string | null;
8
+ }
9
+ export interface ChatAttachment {
10
+ id: string;
11
+ filename: string;
12
+ mime_type: string;
13
+ }
14
+ export interface ChatMessage {
15
+ id?: number;
16
+ type: "user" | "assistant" | "thinking" | "tool_call" | "tool_result" | "error";
17
+ content: string;
18
+ tool?: string;
19
+ args?: Record<string, unknown>;
20
+ success?: boolean;
21
+ iteration?: number;
22
+ timestamp?: string;
23
+ attachments?: ChatAttachment[];
24
+ provider?: string;
25
+ model?: string;
26
+ }
27
+ type ConnectionStatus = "connecting" | "connected" | "disconnected";
28
+ interface NavigationFlash {
29
+ group: string;
30
+ item?: string;
31
+ key: number;
32
+ }
33
+ interface ChatContextValue {
34
+ sessions: ChatSession[];
35
+ connectionStatus: ConnectionStatus;
36
+ connectionVersion: number;
37
+ navigationFlash: NavigationFlash | null;
38
+ createSession: () => Promise<ChatSession>;
39
+ startDemo: (sessionId: string) => Promise<void>;
40
+ completeDemoTyping: (sessionId: string, seq: number) => void;
41
+ deleteSession: (sessionId: string) => Promise<void>;
42
+ loadHistory: (sessionId: string) => Promise<void>;
43
+ loadMoreHistory: (sessionId: string) => Promise<void>;
44
+ clearHistory: (sessionId: string) => Promise<void>;
45
+ sendMessage: (sessionId: string, content: string, attachmentIds?: string[]) => boolean;
46
+ getMessages: (sessionId?: string) => ChatMessage[];
47
+ hasMoreHistory: (sessionId?: string) => boolean;
48
+ isLoadingOlder: (sessionId?: string) => boolean;
49
+ isThinking: (sessionId?: string) => boolean;
50
+ getDemoStatus: (sessionId?: string) => "idle" | "running" | "complete";
51
+ getDemoTypingCue: (sessionId?: string) => {
52
+ content: string;
53
+ seq: number;
54
+ typingMs: number;
55
+ } | null;
56
+ }
57
+ export declare function rememberSessionId(id: string): void;
58
+ export declare function ChatProvider({ children }: {
59
+ children: ReactNode;
60
+ }): import("react/jsx-runtime").JSX.Element;
61
+ export declare function useChat(): ChatContextValue;
62
+ export {};
@@ -0,0 +1,9 @@
1
+ import { FieldDef } from '../../lib/doctypes';
2
+ interface ChildTableEditorProps {
3
+ fields: FieldDef[];
4
+ rows: any[];
5
+ onChange: (rows: any[]) => void;
6
+ readOnly: boolean;
7
+ }
8
+ export declare function ChildTableEditor({ fields, rows, onChange, readOnly, }: ChildTableEditorProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,14 @@
1
+ interface ConversionAction {
2
+ label: string;
3
+ onClick: () => void;
4
+ }
5
+ interface DocumentActionsProps {
6
+ docstatus: number;
7
+ onSave: () => void;
8
+ onSubmit: () => void;
9
+ onCancel: () => void;
10
+ conversions?: ConversionAction[];
11
+ saving: boolean;
12
+ }
13
+ export declare function DocumentActions({ docstatus, onSave, onSubmit, onCancel, conversions, saving, }: DocumentActionsProps): import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1,9 @@
1
+ interface LinkFieldProps {
2
+ label: string;
3
+ value: string;
4
+ onChange: (value: string) => void;
5
+ linkDoctype: string;
6
+ readOnly: boolean;
7
+ }
8
+ export declare function LinkField({ label, value, onChange, linkDoctype, readOnly, }: LinkFieldProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,5 @@
1
+ interface StatusBadgeProps {
2
+ status: string;
3
+ }
4
+ export declare function StatusBadge({ status }: StatusBadgeProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -0,0 +1 @@
1
+ export declare function AppShell(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ export declare const FLASH_STYLES: Record<string, string>;
2
+ interface SidebarProps {
3
+ isMobileOpen?: boolean;
4
+ onClose?: () => void;
5
+ }
6
+ export declare function Sidebar({ isMobileOpen, onClose }: SidebarProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,10 @@
1
+ interface BadgeProps {
2
+ variant?: "default" | "success" | "warning" | "danger" | "secondary";
3
+ /** Show a leading status dot. Off by default; turn on for status
4
+ * pills (Draft / Submitted / Cancelled etc.). */
5
+ dot?: boolean;
6
+ children: React.ReactNode;
7
+ className?: string;
8
+ }
9
+ export declare function Badge({ variant, dot, children, className }: BadgeProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,11 @@
1
+ interface ButtonProps {
2
+ variant?: "primary" | "secondary" | "danger" | "ghost";
3
+ size?: "sm" | "md" | "lg";
4
+ disabled?: boolean;
5
+ onClick?: React.MouseEventHandler<HTMLButtonElement>;
6
+ children: React.ReactNode;
7
+ className?: string;
8
+ type?: "button" | "submit" | "reset";
9
+ }
10
+ export declare function Button({ variant, size, disabled, onClick, children, className, type, }: ButtonProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,10 @@
1
+ interface CardProps {
2
+ title?: string;
3
+ children: React.ReactNode;
4
+ className?: string;
5
+ /** When true, renders the hover-elevation shadow + cursor pointer.
6
+ * Use for cards that the whole tile is clickable. */
7
+ interactive?: boolean;
8
+ }
9
+ export declare function Card({ title, children, className, interactive }: CardProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,9 @@
1
+ interface DateRangePresetsProps {
2
+ onSelect: (from: string, to: string) => void;
3
+ }
4
+ export declare function DateRangePresets({ onSelect }: DateRangePresetsProps): import("react/jsx-runtime").JSX.Element;
5
+ interface SingleDatePresetsProps {
6
+ onSelect: (date: string) => void;
7
+ }
8
+ export declare function SingleDatePresets({ onSelect }: SingleDatePresetsProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare function HintTooltip({ text }: {
2
+ text: string;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,9 @@
1
+ interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
2
+ label?: string;
3
+ /** Optional helper text below the input. */
4
+ hint?: string;
5
+ /** Error text — when set, overrides hint and shows a red border. */
6
+ error?: string;
7
+ }
8
+ export declare function Input({ label, hint, error, className, id, ...props }: InputProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Language dropdown. Reads the active language from i18next and switches it on
3
+ * change; the i18n layer persists the choice to localStorage. `label` defaults
4
+ * to the translated "Language" string but can be suppressed (e.g. in a header).
5
+ */
6
+ export declare function LanguageSelect({ label }: {
7
+ label?: string | null;
8
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,15 @@
1
+ export type SelectOption = string | {
2
+ value: string;
3
+ label: string;
4
+ };
5
+ interface SelectProps {
6
+ label?: string;
7
+ options: SelectOption[];
8
+ value?: string;
9
+ onChange?: React.ChangeEventHandler<HTMLSelectElement>;
10
+ className?: string;
11
+ required?: boolean;
12
+ disabled?: boolean;
13
+ }
14
+ export declare function Select({ label, options, value, onChange, className, required, disabled }: SelectProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,19 @@
1
+ import { ReactNode } from 'react';
2
+ export interface User {
3
+ name: string;
4
+ email: string;
5
+ full_name: string;
6
+ role: "admin" | "manager" | "viewer" | "public_manager";
7
+ }
8
+ interface AuthContextValue {
9
+ user: User | null;
10
+ loading: boolean;
11
+ login: (email: string, password: string) => Promise<User>;
12
+ register: (email: string, fullName: string, password: string, inviteToken?: string) => Promise<User>;
13
+ logout: () => Promise<void>;
14
+ }
15
+ export declare function AuthProvider({ children }: {
16
+ children: ReactNode;
17
+ }): import("react/jsx-runtime").JSX.Element;
18
+ export declare function useAuth(): AuthContextValue;
19
+ export {};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The company's base/functional currency — what the ledger and all financial
3
+ * statements are expressed in. Reports show this (not per-document currencies).
4
+ * Falls back to USD until the company list loads. Pass a company name to pick
5
+ * its currency in a multi-company setup; otherwise the first company is used.
6
+ */
7
+ export declare function useBaseCurrency(company?: string): string;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Currencies the ERP can transact in — the company base currency plus any
3
+ * currency that has an exchange rate on file or is set as a party/company
4
+ * default. Used to populate the document currency dropdown, so a document can
5
+ * only be denominated in a currency the books can convert back to base.
6
+ *
7
+ * Pass `enabled=false` to skip the fetch (e.g. from fields that aren't currency
8
+ * pickers, keeping React Query's request count down).
9
+ */
10
+ export declare function useCurrencies(company?: string, enabled?: boolean): string[];
@@ -0,0 +1,16 @@
1
+ export declare function useDocumentList(doctype: string, filters?: Record<string, string | number | undefined>): {
2
+ data: {
3
+ rows: any[];
4
+ total: number;
5
+ limit: number;
6
+ offset: number;
7
+ } | undefined;
8
+ isLoading: boolean;
9
+ error: Error | null;
10
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<import('@tanstack/query-core').QueryObserverResult<{
11
+ rows: any[];
12
+ total: number;
13
+ limit: number;
14
+ offset: number;
15
+ }, Error>>;
16
+ };
@@ -0,0 +1,14 @@
1
+ export declare function useDocument(doctype: string, name: string): {
2
+ data: any;
3
+ isLoading: boolean;
4
+ error: Error | null;
5
+ refetch: (options?: import('@tanstack/query-core').RefetchOptions) => Promise<import('@tanstack/query-core').QueryObserverResult<any, Error>>;
6
+ };
7
+ export declare function useDocumentMutations(doctype: string): {
8
+ save: import('@tanstack/react-query').UseMutationResult<any, Error, {
9
+ name: string;
10
+ data: any;
11
+ }, unknown>;
12
+ submit: import('@tanstack/react-query').UseMutationResult<any, Error, string, unknown>;
13
+ cancel: import('@tanstack/react-query').UseMutationResult<any, Error, string, unknown>;
14
+ };