hazo_connect 2.3.3 → 2.3.5

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.
@@ -5,6 +5,7 @@ import {
5
5
  type SqliteFilterOperator,
6
6
  type SqliteWhereFilter
7
7
  } from "hazo_connect/server"
8
+ import { getHazoConnectSingleton } from "hazo_connect/nextjs/setup"
8
9
 
9
10
  export const dynamic = "force-dynamic"
10
11
  const allowedOperators: SqliteFilterOperator[] = [
@@ -30,6 +31,8 @@ export async function GET(request: NextRequest) {
30
31
  }
31
32
 
32
33
  try {
34
+ // Initialize the singleton to ensure the adapter is registered with the admin service
35
+ getHazoConnectSingleton()
33
36
  const service = getSqliteAdminService()
34
37
  const options = parseRowQueryOptions(url.searchParams)
35
38
  const page = await service.getTableData(table, options)
@@ -41,6 +44,8 @@ export async function GET(request: NextRequest) {
41
44
 
42
45
  export async function POST(request: NextRequest) {
43
46
  try {
47
+ // Initialize the singleton to ensure the adapter is registered with the admin service
48
+ getHazoConnectSingleton()
44
49
  const service = getSqliteAdminService()
45
50
  const payload = await request.json()
46
51
  const table = payload?.table
@@ -62,6 +67,8 @@ export async function POST(request: NextRequest) {
62
67
 
63
68
  export async function PATCH(request: NextRequest) {
64
69
  try {
70
+ // Initialize the singleton to ensure the adapter is registered with the admin service
71
+ getHazoConnectSingleton()
65
72
  const service = getSqliteAdminService()
66
73
  const payload = await request.json()
67
74
  const table = payload?.table
@@ -94,6 +101,8 @@ export async function PATCH(request: NextRequest) {
94
101
 
95
102
  export async function DELETE(request: NextRequest) {
96
103
  try {
104
+ // Initialize the singleton to ensure the adapter is registered with the admin service
105
+ getHazoConnectSingleton()
97
106
  const service = getSqliteAdminService()
98
107
  const payload = await request.json()
99
108
  const table = payload?.table
@@ -1,9 +1,12 @@
1
1
  import { NextRequest, NextResponse } from "next/server"
2
2
  import { getSqliteAdminService } from "hazo_connect/server"
3
+ import { getHazoConnectSingleton } from "hazo_connect/nextjs/setup"
3
4
 
4
5
  export const dynamic = "force-dynamic"
5
6
 
6
7
  export async function GET(request: NextRequest) {
8
+ // Initialize the singleton to ensure the adapter is registered with the admin service
9
+ getHazoConnectSingleton()
7
10
  const service = getSqliteAdminService()
8
11
  const url = new URL(request.url)
9
12
  const table = url.searchParams.get("table")
@@ -1,10 +1,14 @@
1
1
  import { NextResponse } from "next/server"
2
2
  import { getSqliteAdminService } from "hazo_connect/server"
3
+ import { getHazoConnectSingleton } from "hazo_connect/nextjs/setup"
3
4
 
4
5
  export const dynamic = "force-dynamic"
5
6
 
6
7
  export async function GET() {
7
8
  try {
9
+ // Initialize the singleton to ensure the adapter is registered with the admin service
10
+ getHazoConnectSingleton()
11
+
8
12
  const service = getSqliteAdminService()
9
13
  const tables = await service.listTables()
10
14
  return NextResponse.json({ data: tables })
@@ -1,12 +1,14 @@
1
1
  import { getSqliteAdminService } from "hazo_connect/server"
2
- import type { TableSummary } from "hazo_connect/ui"
3
- import SqliteAdminClient from "./sqlite-admin-client"
2
+ import { getHazoConnectSingleton } from "hazo_connect/nextjs/setup"
3
+ import { SqliteAdminClient } from "hazo_connect/ui"
4
4
 
5
5
  export const dynamic = "force-dynamic"
6
6
 
7
7
  export default async function SqliteAdminPage() {
8
+ // Initialize the singleton to ensure the adapter is registered with the admin service
9
+ getHazoConnectSingleton()
8
10
  const service = getSqliteAdminService()
9
-
11
+
10
12
  try {
11
13
  const tables = await service.listTables()
12
14
  return <SqliteAdminClient initialTables={tables} />
package/app/page.tsx CHANGED
@@ -3,11 +3,11 @@ import React from "react";
3
3
 
4
4
  // HomePage introduces the component library workspace with a neutral placeholder.
5
5
  export default function HomePage() {
6
- return (
6
+ return (
7
7
  <main className="cls_home_page flex min-h-screen flex-col items-center justify-center gap-4 bg-slate-100">
8
8
  <div className="cls_home_container mx-auto max-w-3xl rounded-lg border border-slate-200 bg-white p-8 shadow-sm">
9
9
  <h1 className="text-3xl font-semibold text-slate-900">
10
- hazo_connect component workspace
10
+ hazo_connect component workspace
11
11
  </h1>
12
12
  <p className="mt-4 text-base text-slate-600">
13
13
  Start adding shared UI components inside the src/components directory to
@@ -0,0 +1,7 @@
1
+ import type { TableSummary } from "../index.js";
2
+ export interface SqliteAdminClientProps {
3
+ initialTables: TableSummary[];
4
+ baseApiPath?: string;
5
+ }
6
+ export default function SqliteAdminClient({ initialTables, baseApiPath }: SqliteAdminClientProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=sqlite-admin-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-admin-client.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/components/sqlite-admin-client.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAIV,YAAY,EACb,MAAM,aAAa,CAAA;AAGpB,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA6BD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EACxC,aAAa,EACb,WAA8B,EAC/B,EAAE,sBAAsB,2CAgsBxB"}
@@ -0,0 +1,411 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.default = SqliteAdminClient;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * Purpose: SQLite Admin Client UI Component
8
+ *
9
+ * A full-featured database management interface for SQLite databases.
10
+ * Provides table browsing, data viewing/editing, schema inspection,
11
+ * filtering, pagination, and CRUD operations.
12
+ *
13
+ * This component is exported from hazo_connect/ui for use in consuming apps.
14
+ */
15
+ const react_1 = require("react");
16
+ const lucide_react_1 = require("lucide-react");
17
+ const sonner_1 = require("sonner");
18
+ const DEFAULT_LIMIT = 20;
19
+ const DEFAULT_API_PATH = "/hazo_connect/api/sqlite";
20
+ const filterOperators = [
21
+ { label: "Equals", value: "eq" },
22
+ { label: "Not equal", value: "neq" },
23
+ { label: "Greater than", value: "gt" },
24
+ { label: "Greater or equal", value: "gte" },
25
+ { label: "Less than", value: "lt" },
26
+ { label: "Less or equal", value: "lte" },
27
+ { label: "Contains", value: "like" },
28
+ { label: "Contains (case-insensitive)", value: "ilike" },
29
+ { label: "Is / Is Not", value: "is" }
30
+ ];
31
+ function SqliteAdminClient({ initialTables, baseApiPath = DEFAULT_API_PATH }) {
32
+ const [tables, setTables] = (0, react_1.useState)(initialTables);
33
+ const [selectedTable, setSelectedTable] = (0, react_1.useState)(initialTables[0] ?? null);
34
+ const [schema, setSchema] = (0, react_1.useState)(null);
35
+ const [rows, setRows] = (0, react_1.useState)([]);
36
+ const [totalRows, setTotalRows] = (0, react_1.useState)(0);
37
+ const [limit, setLimit] = (0, react_1.useState)(DEFAULT_LIMIT);
38
+ const [offset, setOffset] = (0, react_1.useState)(0);
39
+ const [orderBy, setOrderBy] = (0, react_1.useState)();
40
+ const [orderDirection, setOrderDirection] = (0, react_1.useState)("asc");
41
+ const [filterState, setFilterState] = (0, react_1.useState)({
42
+ operator: "eq",
43
+ value: ""
44
+ });
45
+ const [isLoadingSchema, setIsLoadingSchema] = (0, react_1.useState)(false);
46
+ const [isLoadingData, setIsLoadingData] = (0, react_1.useState)(false);
47
+ const [isRefreshingTables, setIsRefreshingTables] = (0, react_1.useState)(false);
48
+ const [isCreateOpen, setIsCreateOpen] = (0, react_1.useState)(false);
49
+ const [editingRow, setEditingRow] = (0, react_1.useState)(null);
50
+ const columns = (0, react_1.useMemo)(() => schema?.columns ?? [], [schema]);
51
+ const filterColumns = (0, react_1.useMemo)(() => columns.filter(column => identifierIsFilterable(column.name)), [columns]);
52
+ (0, react_1.useEffect)(() => {
53
+ if (!selectedTable) {
54
+ return;
55
+ }
56
+ void loadSchemaAndData(selectedTable.name);
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ }, [selectedTable?.name]);
59
+ async function loadSchemaAndData(tableName) {
60
+ setIsLoadingSchema(true);
61
+ try {
62
+ const schemaResponse = await fetch(`${baseApiPath}/schema?table=${encodeURIComponent(tableName)}`);
63
+ if (!schemaResponse.ok) {
64
+ throw new Error(await schemaResponse.text());
65
+ }
66
+ const schemaJson = await schemaResponse.json();
67
+ setSchema(schemaJson.data);
68
+ const preferredFilterColumn = filterState.column && schemaJson.data?.columns?.some((col) => col.name === filterState.column)
69
+ ? filterState.column
70
+ : schemaJson.data?.columns?.[0]?.name;
71
+ setFilterState(current => ({
72
+ ...current,
73
+ column: preferredFilterColumn
74
+ }));
75
+ setLimit(DEFAULT_LIMIT);
76
+ setOffset(0);
77
+ setOrderBy(undefined);
78
+ setOrderDirection("asc");
79
+ await loadData(tableName, {
80
+ limit: DEFAULT_LIMIT,
81
+ offset: 0,
82
+ orderBy: undefined,
83
+ orderDirection: "asc",
84
+ filterOverride: {
85
+ ...filterState,
86
+ column: preferredFilterColumn
87
+ }
88
+ });
89
+ }
90
+ catch (error) {
91
+ sonner_1.toast.error(error instanceof Error
92
+ ? error.message
93
+ : `Failed to load schema for table '${tableName}'`);
94
+ }
95
+ finally {
96
+ setIsLoadingSchema(false);
97
+ }
98
+ }
99
+ async function loadData(tableName, overrides) {
100
+ setIsLoadingData(true);
101
+ const nextLimit = overrides?.limit ?? limit;
102
+ const nextOffset = overrides?.offset ?? offset;
103
+ const nextOrderBy = overrides?.orderBy ?? orderBy;
104
+ const nextOrderDirection = overrides?.orderDirection ?? orderDirection;
105
+ const nextFilter = overrides?.filterOverride ?? filterState;
106
+ try {
107
+ const params = new URLSearchParams({
108
+ table: tableName,
109
+ limit: String(nextLimit),
110
+ offset: String(nextOffset)
111
+ });
112
+ if (nextOrderBy) {
113
+ params.set("orderBy", nextOrderBy);
114
+ params.set("orderDirection", nextOrderDirection);
115
+ }
116
+ if (nextFilter.column && nextFilter.value.trim().length) {
117
+ const key = nextFilter.operator === "eq"
118
+ ? `filter[${nextFilter.column}]`
119
+ : `filter[${nextFilter.column}][${nextFilter.operator}]`;
120
+ params.set(key, nextFilter.value);
121
+ }
122
+ else if (nextFilter.operator === "is" && nextFilter.column) {
123
+ const key = `filter[${nextFilter.column}][is]`;
124
+ params.set(key, nextFilter.value || "null");
125
+ }
126
+ const response = await fetch(`${baseApiPath}/data?${params.toString()}`);
127
+ if (!response.ok) {
128
+ throw new Error(await response.text());
129
+ }
130
+ const json = (await response.json());
131
+ setRows(json.data ?? []);
132
+ setTotalRows(json.total ?? 0);
133
+ setLimit(nextLimit);
134
+ setOffset(nextOffset);
135
+ setOrderBy(nextOrderBy);
136
+ setOrderDirection(nextOrderDirection);
137
+ setFilterState(nextFilter);
138
+ }
139
+ catch (error) {
140
+ sonner_1.toast.error(error instanceof Error
141
+ ? error.message
142
+ : `Failed to load data for table '${tableName}'`);
143
+ }
144
+ finally {
145
+ setIsLoadingData(false);
146
+ }
147
+ }
148
+ async function refreshTables() {
149
+ setIsRefreshingTables(true);
150
+ try {
151
+ const response = await fetch(`${baseApiPath}/tables`);
152
+ if (!response.ok) {
153
+ throw new Error(await response.text());
154
+ }
155
+ const json = await response.json();
156
+ setTables(json.data ?? []);
157
+ sonner_1.toast.success("Tables refreshed");
158
+ }
159
+ catch (error) {
160
+ sonner_1.toast.error(error instanceof Error ? error.message : "Failed to refresh tables");
161
+ }
162
+ finally {
163
+ setIsRefreshingTables(false);
164
+ }
165
+ }
166
+ function handleSelectTable(table) {
167
+ setSelectedTable(table);
168
+ }
169
+ function handleChangePage(nextOffset) {
170
+ if (!selectedTable) {
171
+ return;
172
+ }
173
+ void loadData(selectedTable.name, { offset: Math.max(0, nextOffset) });
174
+ }
175
+ function handleChangeLimit(nextLimit) {
176
+ if (!selectedTable) {
177
+ return;
178
+ }
179
+ void loadData(selectedTable.name, { limit: nextLimit, offset: 0 });
180
+ }
181
+ function handleChangeOrder(column) {
182
+ if (!selectedTable) {
183
+ return;
184
+ }
185
+ const nextDirection = orderBy === column
186
+ ? orderDirection === "asc"
187
+ ? "desc"
188
+ : "asc"
189
+ : "asc";
190
+ void loadData(selectedTable.name, {
191
+ orderBy: column,
192
+ orderDirection: nextDirection
193
+ });
194
+ }
195
+ function handleApplyFilter() {
196
+ if (!selectedTable) {
197
+ return;
198
+ }
199
+ void loadData(selectedTable.name, { offset: 0 });
200
+ }
201
+ async function handleInsertRow(data) {
202
+ if (!selectedTable) {
203
+ return;
204
+ }
205
+ try {
206
+ const response = await fetch(`${baseApiPath}/data`, {
207
+ method: "POST",
208
+ headers: {
209
+ "Content-Type": "application/json"
210
+ },
211
+ body: JSON.stringify({ table: selectedTable.name, data })
212
+ });
213
+ if (!response.ok) {
214
+ throw new Error(await response.text());
215
+ }
216
+ sonner_1.toast.success("Row inserted");
217
+ setIsCreateOpen(false);
218
+ await Promise.all([
219
+ refreshTables(),
220
+ loadData(selectedTable.name, { offset: 0 })
221
+ ]);
222
+ }
223
+ catch (error) {
224
+ sonner_1.toast.error(error instanceof Error ? error.message : "Insert failed");
225
+ }
226
+ }
227
+ async function handleUpdateRow(row, data) {
228
+ if (!selectedTable || !schema) {
229
+ return;
230
+ }
231
+ const criteria = buildCriteriaFromRow(row, schema.columns);
232
+ try {
233
+ const response = await fetch(`${baseApiPath}/data`, {
234
+ method: "PATCH",
235
+ headers: {
236
+ "Content-Type": "application/json"
237
+ },
238
+ body: JSON.stringify({
239
+ table: selectedTable.name,
240
+ data,
241
+ criteria
242
+ })
243
+ });
244
+ if (!response.ok) {
245
+ throw new Error(await response.text());
246
+ }
247
+ sonner_1.toast.success("Row updated");
248
+ setEditingRow(null);
249
+ await loadData(selectedTable.name);
250
+ }
251
+ catch (error) {
252
+ sonner_1.toast.error(error instanceof Error ? error.message : "Update failed");
253
+ }
254
+ }
255
+ async function handleDeleteRow(row) {
256
+ if (!selectedTable || !schema) {
257
+ return;
258
+ }
259
+ const criteria = buildCriteriaFromRow(row, schema.columns);
260
+ if (!Object.keys(criteria).length) {
261
+ sonner_1.toast.error("Unable to determine primary key for row deletion");
262
+ return;
263
+ }
264
+ if (!window.confirm("Delete this row? This action cannot be undone.")) {
265
+ return;
266
+ }
267
+ try {
268
+ const response = await fetch(`${baseApiPath}/data`, {
269
+ method: "DELETE",
270
+ headers: {
271
+ "Content-Type": "application/json"
272
+ },
273
+ body: JSON.stringify({
274
+ table: selectedTable.name,
275
+ criteria
276
+ })
277
+ });
278
+ if (!response.ok) {
279
+ throw new Error(await response.text());
280
+ }
281
+ sonner_1.toast.success("Row deleted");
282
+ await loadData(selectedTable.name, { offset: 0 });
283
+ await refreshTables();
284
+ }
285
+ catch (error) {
286
+ sonner_1.toast.error(error instanceof Error ? error.message : "Delete failed");
287
+ }
288
+ }
289
+ const totalPages = Math.max(1, Math.ceil(totalRows / limit));
290
+ const currentPage = Math.min(totalPages, Math.floor(offset / limit) + 1);
291
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(sonner_1.Toaster, { position: "top-right", richColors: true }), (0, jsx_runtime_1.jsxs)("div", { className: "flex min-h-[calc(100vh-4rem)] flex-col gap-4 p-6 lg:flex-row", children: [(0, jsx_runtime_1.jsxs)("aside", { className: "w-full max-w-xs rounded-lg border border-slate-200 bg-white shadow-sm lg:sticky lg:top-6 lg:h-[calc(100vh-6rem)]", children: [(0, jsx_runtime_1.jsxs)("header", { className: "flex items-center justify-between border-b border-slate-100 px-4 py-3", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-sm font-medium text-slate-700", children: "Tables" }), (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: refreshTables, disabled: isRefreshingTables, className: "inline-flex items-center gap-1 rounded-md border border-slate-200 bg-white px-2 py-1 text-xs font-medium text-slate-600 transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50", children: [isRefreshingTables ? ((0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "h-3 w-3 animate-spin" })) : ((0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCw, { className: "h-3 w-3" })), "Refresh"] })] }), (0, jsx_runtime_1.jsx)("nav", { className: "max-h-[calc(100vh-9rem)] overflow-auto px-2 py-3 text-sm", children: tables.length === 0 ? ((0, jsx_runtime_1.jsx)("p", { className: "rounded-md bg-slate-50 p-3 text-slate-500", children: "No tables detected." })) : ((0, jsx_runtime_1.jsx)("ul", { className: "space-y-1", children: tables.map(table => {
292
+ const isActive = selectedTable?.name === table.name;
293
+ return ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => handleSelectTable(table), className: [
294
+ "flex w-full items-center justify-between rounded-md px-3 py-2 text-left transition",
295
+ isActive
296
+ ? "bg-slate-900 text-white shadow-sm"
297
+ : "bg-white text-slate-700 hover:bg-slate-100"
298
+ ].join(" "), children: [(0, jsx_runtime_1.jsx)("span", { className: "truncate font-medium", children: table.name }), typeof table.row_count === "number" && ((0, jsx_runtime_1.jsx)("span", { className: [
299
+ "ml-2 inline-flex min-w-[2rem] items-center justify-center rounded-full px-2 text-xs",
300
+ isActive
301
+ ? "bg-slate-800 text-slate-100"
302
+ : "bg-slate-100 text-slate-600"
303
+ ].join(" "), children: table.row_count }))] }) }, table.name));
304
+ }) })) })] }), (0, jsx_runtime_1.jsxs)("section", { className: "flex-1 space-y-6", children: [(0, jsx_runtime_1.jsxs)("header", { className: "flex flex-col gap-3 rounded-lg border border-slate-200 bg-white p-4 shadow-sm", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-xl font-semibold text-slate-900", children: "SQLite Admin" }), (0, jsx_runtime_1.jsx)("p", { className: "text-sm text-slate-500", children: "Browse tables, inspect schema, and edit data safely." })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => selectedTable && loadSchemaAndData(selectedTable.name), disabled: isLoadingSchema || isLoadingData, className: "inline-flex items-center gap-1 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-600 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50", children: [isLoadingSchema || isLoadingData ? ((0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "h-4 w-4 animate-spin" })) : ((0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCw, { className: "h-4 w-4" })), "Refresh"] }), (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => setIsCreateOpen(true), disabled: !selectedTable || !schema, className: "inline-flex items-center gap-1 rounded-md bg-slate-900 px-3 py-2 text-sm font-medium text-white transition hover:bg-slate-800 disabled:cursor-not-allowed disabled:bg-slate-400", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { className: "h-4 w-4" }), "Add Row"] })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-wrap items-center gap-3 rounded-md bg-slate-50 p-3 text-sm text-slate-600", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Filter, { className: "h-4 w-4 text-slate-500" }), (0, jsx_runtime_1.jsx)("select", { className: "rounded-md border border-slate-200 bg-white px-2 py-1 text-sm", value: filterState.column ?? "", onChange: event => setFilterState(current => ({
305
+ ...current,
306
+ column: event.target.value || undefined
307
+ })), children: filterColumns.length === 0 ? ((0, jsx_runtime_1.jsx)("option", { value: "", children: "No filterable columns" })) : (filterColumns.map(column => ((0, jsx_runtime_1.jsx)("option", { value: column.name, children: column.name }, column.name)))) }), (0, jsx_runtime_1.jsx)("select", { className: "rounded-md border border-slate-200 bg-white px-2 py-1 text-sm", value: filterState.operator, onChange: event => setFilterState(current => ({
308
+ ...current,
309
+ operator: event.target.value
310
+ })), children: filterOperators.map(operator => ((0, jsx_runtime_1.jsx)("option", { value: operator.value, children: operator.label }, operator.value))) }), filterState.operator === "is" ? ((0, jsx_runtime_1.jsxs)("select", { className: "rounded-md border border-slate-200 bg-white px-2 py-1 text-sm", value: filterState.value, onChange: event => setFilterState(current => ({
311
+ ...current,
312
+ value: event.target.value
313
+ })), children: [(0, jsx_runtime_1.jsx)("option", { value: "null", children: "NULL" }), (0, jsx_runtime_1.jsx)("option", { value: "not.null", children: "NOT NULL" })] })) : ((0, jsx_runtime_1.jsx)("input", { type: "text", className: "flex-1 rounded-md border border-slate-200 bg-white px-2 py-1 text-sm focus:border-slate-400 focus:outline-none", placeholder: "Filter value...", value: filterState.value, onChange: event => setFilterState(current => ({
314
+ ...current,
315
+ value: event.target.value
316
+ })) })), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: handleApplyFilter, disabled: !selectedTable || !schema, className: "inline-flex items-center gap-1 rounded-md border border-slate-200 bg-white px-3 py-1.5 text-sm font-medium text-slate-600 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50", children: "Apply" })] })] }), selectedTable ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("section", { className: "rounded-lg border border-slate-200 bg-white shadow-sm", children: [(0, jsx_runtime_1.jsxs)("header", { className: "flex items-center justify-between border-b border-slate-100 px-4 py-3", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-base font-semibold text-slate-800", children: selectedTable.name }), (0, jsx_runtime_1.jsxs)("p", { className: "text-xs text-slate-500", children: [schema?.columns.length ?? 0, " columns"] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsxs)("label", { className: "flex items-center gap-1 text-xs text-slate-500", children: ["Rows per page", (0, jsx_runtime_1.jsx)("select", { value: limit, onChange: event => handleChangeLimit(Number.parseInt(event.target.value, 10)), className: "rounded-md border border-slate-200 bg-white px-2 py-1 text-xs shadow-sm", children: [10, 20, 50, 100].map(option => ((0, jsx_runtime_1.jsx)("option", { value: option, children: option }, option))) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "inline-flex items-center gap-1 rounded-md border border-slate-200 bg-white px-2 py-1 text-xs text-slate-600 shadow-sm", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => handleChangeOrder(orderBy), className: "inline-flex items-center gap-1", disabled: !schema, children: ["Order:", " ", orderBy ? `${orderBy} - ${orderDirection}` : "not set"] }), schema && schema.columns.length > 0 && ((0, jsx_runtime_1.jsxs)("select", { value: orderBy ?? "", onChange: event => handleChangeOrder(event.target.value || undefined), className: "rounded border border-slate-200 bg-white px-1 py-0.5 text-xs", children: [(0, jsx_runtime_1.jsx)("option", { value: "", children: "None" }), schema.columns.map(column => ((0, jsx_runtime_1.jsx)("option", { value: column.name, children: column.name }, column.name)))] }))] })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "overflow-auto", children: (0, jsx_runtime_1.jsxs)("table", { className: "min-w-full divide-y divide-slate-200 text-sm", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-slate-50 text-xs uppercase tracking-wide text-slate-500", children: (0, jsx_runtime_1.jsxs)("tr", { children: [columns.map(column => ((0, jsx_runtime_1.jsx)("th", { className: "px-3 py-2 text-left", children: column.name }, column.name))), (0, jsx_runtime_1.jsx)("th", { className: "px-3 py-2 text-right text-slate-400", children: "Actions" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { className: "divide-y divide-slate-100 bg-white text-sm text-slate-700", children: isLoadingData ? ((0, jsx_runtime_1.jsx)("tr", { children: (0, jsx_runtime_1.jsx)("td", { colSpan: columns.length + 1, className: "px-3 py-8 text-center", children: (0, jsx_runtime_1.jsxs)("div", { className: "inline-flex items-center gap-2 text-slate-500", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Loader2, { className: "h-4 w-4 animate-spin" }), "Loading data..."] }) }) })) : rows.length === 0 ? ((0, jsx_runtime_1.jsx)("tr", { children: (0, jsx_runtime_1.jsx)("td", { colSpan: columns.length + 1, className: "px-3 py-8 text-center text-slate-400", children: "No rows to display." }) })) : (rows.map((row, index) => ((0, jsx_runtime_1.jsxs)("tr", { className: "hover:bg-slate-50/60", children: [columns.map(column => ((0, jsx_runtime_1.jsx)("td", { className: "max-w-[200px] truncate px-3 py-2", children: formatCellValue(row[column.name]) }, column.name))), (0, jsx_runtime_1.jsx)("td", { className: "px-3 py-2 text-right", children: (0, jsx_runtime_1.jsxs)("div", { className: "inline-flex items-center gap-1", children: [(0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => setEditingRow(row), className: "inline-flex items-center gap-1 rounded-md border border-slate-200 px-2 py-1 text-xs font-medium text-slate-600 transition hover:bg-slate-100", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Pencil, { className: "h-3 w-3" }), "Edit"] }), (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => handleDeleteRow(row), className: "inline-flex items-center gap-1 rounded-md border border-red-200 px-2 py-1 text-xs font-medium text-red-600 transition hover:bg-red-50", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Trash2, { className: "h-3 w-3" }), "Delete"] })] }) })] }, index)))) })] }) }), (0, jsx_runtime_1.jsxs)("footer", { className: "flex flex-wrap items-center justify-between gap-3 border-t border-slate-100 px-4 py-3 text-xs text-slate-500", children: [(0, jsx_runtime_1.jsxs)("span", { children: ["Page ", currentPage, " of ", totalPages, " - ", totalRows, " rows"] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => handleChangePage(Math.max(0, offset - limit)), disabled: offset === 0 || isLoadingData, className: "inline-flex items-center gap-1 rounded-md border border-slate-200 bg-white px-2 py-1 text-xs font-medium text-slate-600 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50", children: "Prev" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => handleChangePage(offset + limit), disabled: offset + limit >= totalRows || isLoadingData, className: "inline-flex items-center gap-1 rounded-md border border-slate-200 bg-white px-2 py-1 text-xs font-medium text-slate-600 transition hover:bg-slate-100 disabled:cursor-not-allowed disabled:opacity-50", children: "Next" })] })] })] }), (0, jsx_runtime_1.jsxs)("section", { className: "rounded-lg border border-slate-200 bg-white shadow-sm", children: [(0, jsx_runtime_1.jsx)("header", { className: "border-b border-slate-100 px-4 py-3", children: (0, jsx_runtime_1.jsx)("h3", { className: "text-sm font-semibold text-slate-700", children: "Schema" }) }), (0, jsx_runtime_1.jsx)("div", { className: "overflow-auto", children: (0, jsx_runtime_1.jsxs)("table", { className: "min-w-full divide-y divide-slate-200 text-sm", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-slate-50 text-xs uppercase tracking-wide text-slate-500", children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { className: "px-3 py-2 text-left", children: "Column" }), (0, jsx_runtime_1.jsx)("th", { className: "px-3 py-2 text-left", children: "Type" }), (0, jsx_runtime_1.jsx)("th", { className: "px-3 py-2 text-left", children: "Not null" }), (0, jsx_runtime_1.jsx)("th", { className: "px-3 py-2 text-left", children: "Default" }), (0, jsx_runtime_1.jsx)("th", { className: "px-3 py-2 text-left", children: "Primary key" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { className: "divide-y divide-slate-100 bg-white text-sm text-slate-700", children: columns.map(column => ((0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("td", { className: "px-3 py-2 font-medium", children: column.name }), (0, jsx_runtime_1.jsx)("td", { className: "px-3 py-2", children: column.type || "TEXT" }), (0, jsx_runtime_1.jsx)("td", { className: "px-3 py-2", children: column.notnull ? "Yes" : "No" }), (0, jsx_runtime_1.jsx)("td", { className: "px-3 py-2", children: column.default_value === null
317
+ ? "NULL"
318
+ : String(column.default_value) }), (0, jsx_runtime_1.jsx)("td", { className: "px-3 py-2", children: column.primary_key_position
319
+ ? `Yes (#${column.primary_key_position})`
320
+ : "No" })] }, column.name))) })] }) })] })] })) : ((0, jsx_runtime_1.jsx)("p", { className: "rounded-lg border border-dashed border-slate-300 bg-white p-6 text-center text-sm text-slate-500", children: "Select a table to begin." }))] })] }), schema && selectedTable && ((0, jsx_runtime_1.jsx)(RowModal, { title: `Insert into ${selectedTable.name}`, open: isCreateOpen, columns: schema.columns, onClose: () => setIsCreateOpen(false), onSubmit: handleInsertRow })), schema && selectedTable && editingRow && ((0, jsx_runtime_1.jsx)(RowModal, { title: `Edit row in ${selectedTable.name}`, open: Boolean(editingRow), columns: schema.columns, initialValues: editingRow, onClose: () => setEditingRow(null), onSubmit: data => handleUpdateRow(editingRow, data), primaryKeys: schema.columns.filter(column => column.primary_key_position > 0) }))] }));
321
+ }
322
+ // Internal modal component for row editing/creation
323
+ function RowModal({ title, open, columns, primaryKeys, initialValues, onClose, onSubmit }) {
324
+ const [formValues, setFormValues] = (0, react_1.useState)({});
325
+ (0, react_1.useEffect)(() => {
326
+ if (open) {
327
+ const nextValues = {};
328
+ columns.forEach(column => {
329
+ const rawValue = initialValues?.[column.name];
330
+ nextValues[column.name] =
331
+ rawValue === null || rawValue === undefined ? "" : String(rawValue);
332
+ });
333
+ setFormValues(nextValues);
334
+ }
335
+ }, [open, columns, initialValues]);
336
+ if (!open) {
337
+ return null;
338
+ }
339
+ function handleChange(column, value) {
340
+ setFormValues(current => ({
341
+ ...current,
342
+ [column]: value
343
+ }));
344
+ }
345
+ function handleSubmit(event) {
346
+ event.preventDefault();
347
+ const payload = {};
348
+ for (const column of columns) {
349
+ const value = formValues[column.name];
350
+ payload[column.name] = coerceValue(column, value);
351
+ }
352
+ onSubmit(payload);
353
+ }
354
+ return ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-slate-900/30 backdrop-blur", children: (0, jsx_runtime_1.jsxs)("div", { className: "relative w-full max-w-2xl rounded-lg border border-slate-200 bg-white p-6 shadow-xl", children: [(0, jsx_runtime_1.jsxs)("header", { className: "mb-4 flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold text-slate-900", children: title }), primaryKeys && primaryKeys.length === 0 && ((0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-xs text-amber-600", children: "Warning: table has no primary key defined. Updates/deletes rely on full row matching." }))] }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClose, className: "rounded-full border border-slate-200 p-1 text-slate-500 transition hover:bg-slate-100", children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { className: "h-4 w-4" }) })] }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "grid max-h-[50vh] grid-cols-1 gap-4 overflow-auto pr-2 sm:grid-cols-2", children: columns.map(column => ((0, jsx_runtime_1.jsxs)("label", { className: "flex flex-col gap-1 text-sm", children: [(0, jsx_runtime_1.jsxs)("span", { className: "font-medium text-slate-700", children: [column.name, column.notnull && ((0, jsx_runtime_1.jsx)("sup", { className: "ml-1 text-amber-600", title: "Required", children: "*" }))] }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: formValues[column.name] ?? "", onChange: event => handleChange(column.name, event.target.value), className: "rounded-md border border-slate-200 px-3 py-2 text-sm text-slate-700 shadow-sm focus:border-slate-400 focus:outline-none", placeholder: column.default_value === null
355
+ ? column.type || "TEXT"
356
+ : String(column.default_value) }), (0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-slate-400", children: [column.type || "TEXT", column.primary_key_position ? " - Primary key" : ""] })] }, column.name))) }), (0, jsx_runtime_1.jsxs)("footer", { className: "flex items-center justify-end gap-2", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClose, className: "inline-flex items-center gap-1 rounded-md border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-600 transition hover:bg-slate-100", children: "Cancel" }), (0, jsx_runtime_1.jsxs)("button", { type: "submit", className: "inline-flex items-center gap-1 rounded-md bg-slate-900 px-3 py-2 text-sm font-medium text-white transition hover:bg-slate-800", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Save, { className: "h-4 w-4" }), "Save"] })] })] })] }) }));
357
+ }
358
+ // Helper functions
359
+ function buildCriteriaFromRow(row, columns) {
360
+ const criteria = {};
361
+ const primaryKeys = columns.filter(column => column.primary_key_position > 0);
362
+ if (primaryKeys.length) {
363
+ for (const primary of primaryKeys) {
364
+ criteria[primary.name] = row[primary.name];
365
+ }
366
+ return criteria;
367
+ }
368
+ for (const column of columns) {
369
+ criteria[column.name] = row[column.name];
370
+ }
371
+ return criteria;
372
+ }
373
+ function coerceValue(column, rawValue) {
374
+ if (rawValue === "") {
375
+ return column.notnull ? "" : null;
376
+ }
377
+ const normalisedType = (column.type ?? "").toLowerCase();
378
+ if (normalisedType.includes("int")) {
379
+ const parsed = Number.parseInt(rawValue, 10);
380
+ return Number.isNaN(parsed) ? rawValue : parsed;
381
+ }
382
+ if (normalisedType.includes("real") ||
383
+ normalisedType.includes("double") ||
384
+ normalisedType.includes("float") ||
385
+ normalisedType.includes("numeric")) {
386
+ const parsed = Number.parseFloat(rawValue);
387
+ return Number.isNaN(parsed) ? rawValue : parsed;
388
+ }
389
+ if (normalisedType.includes("bool")) {
390
+ return rawValue === "true" || rawValue === "1" ? 1 : 0;
391
+ }
392
+ return rawValue;
393
+ }
394
+ function formatCellValue(value) {
395
+ if (value === null || value === undefined) {
396
+ return "NULL";
397
+ }
398
+ if (typeof value === "object") {
399
+ try {
400
+ return JSON.stringify(value);
401
+ }
402
+ catch {
403
+ return String(value);
404
+ }
405
+ }
406
+ return String(value);
407
+ }
408
+ function identifierIsFilterable(name) {
409
+ return /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);
410
+ }
411
+ //# sourceMappingURL=sqlite-admin-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-admin-client.js","sourceRoot":"","sources":["../../../src/lib/ui/components/sqlite-admin-client.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * Purpose: UI-safe entry point for Hazo Connect
3
3
  *
4
- * This file exports only types and interfaces that are safe to use in client components.
5
- * No runtime code that requires Node.js APIs is exported.
4
+ * This file exports types, interfaces, and React components that are safe to use
5
+ * in client components. Server-only functionality is NOT exported here.
6
6
  */
7
- export type { SqliteTableType, TableSummary, TableSchema, TableColumn, TableForeignKey, RowPage, RowQueryOptions, SqliteWhereFilter, SqliteFilterOperator } from '../sqlite/admin-service';
8
- export type { Logger, ConnectionType, HazoConnectConfig, HazoConnectAdapter, QueryOperator, WhereCondition, OrderDirection, JoinType, NestedSelect, HazoConnectError } from '../types';
9
- export type { ErrorCode } from '../types';
7
+ export type { SqliteTableType, TableSummary, TableSchema, TableColumn, TableForeignKey, RowPage, RowQueryOptions, SqliteWhereFilter, SqliteFilterOperator } from '../sqlite/admin-service.js';
8
+ export type { Logger, ConnectionType, HazoConnectConfig, HazoConnectAdapter, QueryOperator, WhereCondition, OrderDirection, JoinType, NestedSelect, HazoConnectError } from '../types.js';
9
+ export type { ErrorCode } from '../types.js';
10
+ export { default as SqliteAdminClient } from './components/sqlite-admin-client.js';
11
+ export type { SqliteAdminClientProps } from './components/sqlite-admin-client.js';
10
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,yBAAyB,CAAA;AAGhC,YAAY,EACV,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAEjB,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,4BAA4B,CAAA;AAGnC,YAAY,EACV,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,gBAAgB,EACjB,MAAM,aAAa,CAAA;AAEpB,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAG5C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAClF,YAAY,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA"}