admindb 1.2.1 → 2.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.
- package/README.md +262 -329
- package/dist/app.d.ts +25 -4
- package/dist/app.js +79 -15
- package/dist/app.js.map +1 -1
- package/dist/auth/config.d.ts +19 -0
- package/dist/auth/config.js +147 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/crypto.d.ts +27 -0
- package/dist/auth/crypto.js +133 -0
- package/dist/auth/crypto.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.js +22 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +14 -0
- package/dist/auth/middleware.js +100 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/routes.d.ts +7 -0
- package/dist/auth/routes.js +78 -0
- package/dist/auth/routes.js.map +1 -0
- package/dist/auth/types.d.ts +35 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/args.d.ts +45 -0
- package/dist/cli/args.js +328 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config.d.ts +56 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/runner.d.ts +1 -0
- package/dist/cli/runner.js +222 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli.js +2 -127
- package/dist/cli.js.map +1 -1
- package/dist/data/datasets.d.ts +17 -0
- package/dist/data/datasets.js +133 -0
- package/dist/data/datasets.js.map +1 -0
- package/dist/data/detector.d.ts +30 -0
- package/dist/data/detector.js +472 -0
- package/dist/data/detector.js.map +1 -0
- package/dist/data/engine.d.ts +10 -0
- package/dist/data/engine.js +211 -0
- package/dist/data/engine.js.map +1 -0
- package/dist/data/index.d.ts +5 -0
- package/dist/data/index.js +22 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/strategies.d.ts +30 -0
- package/dist/data/strategies.js +343 -0
- package/dist/data/strategies.js.map +1 -0
- package/dist/data/types.d.ts +73 -0
- package/dist/data/types.js +8 -0
- package/dist/data/types.js.map +1 -0
- package/dist/db/database.d.ts +14 -146
- package/dist/db/database.js +208 -461
- package/dist/db/database.js.map +1 -1
- package/dist/db/export.d.ts +2 -2
- package/dist/db/export.js +7 -2
- package/dist/db/export.js.map +1 -1
- package/dist/db/filters.d.ts +22 -0
- package/dist/db/filters.js +158 -0
- package/dist/db/filters.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.js +25 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/introspection.d.ts +6 -0
- package/dist/db/introspection.js +172 -0
- package/dist/db/introspection.js.map +1 -0
- package/dist/db/manager.d.ts +32 -19
- package/dist/db/manager.js +203 -44
- package/dist/db/manager.js.map +1 -1
- package/dist/db/migrations.d.ts +5 -0
- package/dist/db/migrations.js +110 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/postgres.d.ts +85 -0
- package/dist/db/postgres.js +745 -0
- package/dist/db/postgres.js.map +1 -0
- package/dist/db/types.d.ts +206 -0
- package/dist/db/types.js +7 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.js +46 -4
- package/dist/index.js.map +1 -1
- package/dist/public/css/app.css +1 -1
- package/dist/public/css/input.css +74 -11
- package/dist/public/js/app.js +142 -0
- package/dist/public/js/browse.js +591 -104
- package/dist/public/js/databases.js +105 -13
- package/dist/public/js/designer.js +55 -2
- package/dist/public/js/forms.js +610 -28
- package/dist/public/js/icons.js +51 -0
- package/dist/public/js/inspector.js +638 -0
- package/dist/public/js/query.js +93 -3
- package/dist/public/js/schema.js +185 -52
- package/dist/public/js/seed.js +865 -152
- package/dist/routes/api/helpers.d.ts +42 -0
- package/dist/routes/api/helpers.js +133 -0
- package/dist/routes/api/helpers.js.map +1 -0
- package/dist/routes/api/import-export.d.ts +3 -0
- package/dist/routes/api/import-export.js +85 -0
- package/dist/routes/api/import-export.js.map +1 -0
- package/dist/routes/api/index.d.ts +4 -0
- package/dist/routes/api/index.js +37 -0
- package/dist/routes/api/index.js.map +1 -0
- package/dist/routes/api/query.d.ts +3 -0
- package/dist/routes/api/query.js +76 -0
- package/dist/routes/api/query.js.map +1 -0
- package/dist/routes/api/rows.d.ts +3 -0
- package/dist/routes/api/rows.js +373 -0
- package/dist/routes/api/rows.js.map +1 -0
- package/dist/routes/api/seed.d.ts +3 -0
- package/dist/routes/api/seed.js +82 -0
- package/dist/routes/api/seed.js.map +1 -0
- package/dist/routes/api/tables.d.ts +3 -0
- package/dist/routes/api/tables.js +160 -0
- package/dist/routes/api/tables.js.map +1 -0
- package/dist/routes/databases.d.ts +8 -11
- package/dist/routes/databases.js +100 -66
- package/dist/routes/databases.js.map +1 -1
- package/dist/routes/index.d.ts +3 -0
- package/dist/routes/index.js +20 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/pages.d.ts +3 -3
- package/dist/routes/pages.js +157 -64
- package/dist/routes/pages.js.map +1 -1
- package/dist/serverless.d.ts +40 -0
- package/dist/serverless.js +210 -0
- package/dist/serverless.js.map +1 -0
- package/dist/sql/generator.d.ts +7 -3
- package/dist/sql/generator.js +144 -7
- package/dist/sql/generator.js.map +1 -1
- package/dist/sql/index.d.ts +2 -0
- package/dist/sql/index.js +19 -0
- package/dist/sql/index.js.map +1 -0
- package/dist/types/api.d.ts +412 -0
- package/dist/types/api.js +9 -0
- package/dist/types/api.js.map +1 -0
- package/dist/utils/colors.d.ts +40 -0
- package/dist/utils/colors.js +64 -0
- package/dist/utils/colors.js.map +1 -0
- package/dist/{util.d.ts → utils/common.d.ts} +10 -6
- package/dist/{util.js → utils/common.js} +80 -13
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/csv.js.map +1 -0
- package/dist/utils/datatype.d.ts +49 -0
- package/dist/utils/datatype.js +222 -0
- package/dist/utils/datatype.js.map +1 -0
- package/dist/utils/icons.d.ts +11 -0
- package/dist/utils/icons.js +72 -0
- package/dist/utils/icons.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/{logger.d.ts → utils/logger.d.ts} +1 -1
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/views/layouts/main.hbs +40 -11
- package/dist/views/pages/databases.hbs +182 -74
- package/dist/views/pages/designer.hbs +29 -11
- package/dist/views/pages/error.hbs +3 -3
- package/dist/views/pages/form.hbs +5 -3
- package/dist/views/pages/home.hbs +22 -13
- package/dist/views/pages/login.hbs +111 -0
- package/dist/views/pages/query.hbs +8 -6
- package/dist/views/pages/schema.hbs +41 -13
- package/dist/views/pages/seed.hbs +200 -54
- package/dist/views/pages/table.hbs +152 -72
- package/dist/views/partials/icon.hbs +2 -0
- package/dist/views/partials/navbar.hbs +69 -25
- package/dist/views/partials/sidebar.hbs +108 -94
- package/docs/API.md +144 -0
- package/docs/EXAMPLES.md +576 -0
- package/docs/SECURITY.md +265 -0
- package/package.json +15 -4
- package/dist/args.d.ts +0 -28
- package/dist/args.js +0 -187
- package/dist/args.js.map +0 -1
- package/dist/config.d.ts +0 -17
- package/dist/config.js +0 -23
- package/dist/config.js.map +0 -1
- package/dist/csv.js.map +0 -1
- package/dist/data/generator.d.ts +0 -86
- package/dist/data/generator.js +0 -1031
- package/dist/data/generator.js.map +0 -1
- package/dist/logger.js +0 -25
- package/dist/logger.js.map +0 -1
- package/dist/routes/api.d.ts +0 -9
- package/dist/routes/api.js +0 -848
- package/dist/routes/api.js.map +0 -1
- package/dist/test/classifier.test.d.ts +0 -1
- package/dist/test/classifier.test.js +0 -44
- package/dist/test/classifier.test.js.map +0 -1
- package/dist/test/csv.test.d.ts +0 -1
- package/dist/test/csv.test.js +0 -64
- package/dist/test/csv.test.js.map +0 -1
- package/dist/test/database.test.d.ts +0 -1
- package/dist/test/database.test.js +0 -402
- package/dist/test/database.test.js.map +0 -1
- package/dist/test/generator.test.d.ts +0 -1
- package/dist/test/generator.test.js +0 -132
- package/dist/test/generator.test.js.map +0 -1
- package/dist/test/manager.test.d.ts +0 -1
- package/dist/test/manager.test.js +0 -146
- package/dist/test/manager.test.js.map +0 -1
- package/dist/util.js.map +0 -1
- /package/dist/{csv.d.ts → utils/csv.d.ts} +0 -0
- /package/dist/{csv.js → utils/csv.js} +0 -0
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
{{!-- Page: Database Overview Dashboard · URL: / (or /{basePath}/) --}}
|
|
1
2
|
<div class="space-y-8">
|
|
3
|
+
|
|
2
4
|
<!-- Header -->
|
|
3
5
|
<div class="flex flex-wrap items-end justify-between gap-4">
|
|
4
6
|
<div>
|
|
5
7
|
<p class="text-sm font-semibold uppercase tracking-wider text-primary">Overview</p>
|
|
6
8
|
<h1 class="mt-1 text-3xl font-extrabold tracking-tight">Database</h1>
|
|
7
|
-
<p class="mt-1.5 text-sm text-base-content/55">Browse, edit, and query the connected
|
|
9
|
+
<p class="mt-1.5 text-sm text-base-content/55">Browse, edit, and query the connected database from your browser.</p>
|
|
8
10
|
</div>
|
|
9
11
|
<div class="flex gap-2">
|
|
10
12
|
<a href="{{basePath}}/query" class="btn btn-ghost btn-sm gap-1.5">
|
|
11
|
-
|
|
13
|
+
{{{icon "query" class="h-4 w-4"}}}
|
|
12
14
|
Query
|
|
13
15
|
</a>
|
|
14
16
|
{{#unless readonly}}
|
|
15
17
|
<a href="{{basePath}}/designer" class="btn btn-primary btn-sm gap-1.5">
|
|
16
|
-
|
|
18
|
+
{{{icon "plus" class="h-4 w-4"}}}
|
|
17
19
|
New table
|
|
18
20
|
</a>
|
|
19
21
|
{{/unless}}
|
|
@@ -24,7 +26,7 @@
|
|
|
24
26
|
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-4">
|
|
25
27
|
<div class="stat-card">
|
|
26
28
|
<span class="stat-icon bg-primary/10 text-primary">
|
|
27
|
-
|
|
29
|
+
{{{icon "table" class="h-6 w-6"}}}
|
|
28
30
|
</span>
|
|
29
31
|
<div>
|
|
30
32
|
<div class="text-2xl font-extrabold tabular-nums">{{tables.length}}</div>
|
|
@@ -33,7 +35,7 @@
|
|
|
33
35
|
</div>
|
|
34
36
|
<div class="stat-card">
|
|
35
37
|
<span class="stat-icon bg-secondary/10 text-secondary">
|
|
36
|
-
|
|
38
|
+
{{{icon "stats" class="h-6 w-6"}}}
|
|
37
39
|
</span>
|
|
38
40
|
<div>
|
|
39
41
|
<div class="text-2xl font-extrabold tabular-nums">{{totalRows}}</div>
|
|
@@ -42,7 +44,7 @@
|
|
|
42
44
|
</div>
|
|
43
45
|
<div class="stat-card">
|
|
44
46
|
<span class="stat-icon bg-accent/10 text-accent">
|
|
45
|
-
|
|
47
|
+
{{{icon "seed" class="h-6 w-6"}}}
|
|
46
48
|
</span>
|
|
47
49
|
<div>
|
|
48
50
|
<div class="text-2xl font-extrabold tabular-nums">{{savedQueries}}</div>
|
|
@@ -50,12 +52,19 @@
|
|
|
50
52
|
</div>
|
|
51
53
|
</div>
|
|
52
54
|
<div class="stat-card">
|
|
53
|
-
<span class="stat-icon bg-
|
|
54
|
-
|
|
55
|
+
<span class="stat-icon {{#if isPostgres}}bg-info/10 text-info{{else}}bg-emerald-500/10 text-emerald-500{{/if}}">
|
|
56
|
+
{{{icon "database" class="h-6 w-6"}}}
|
|
55
57
|
</span>
|
|
56
58
|
<div>
|
|
57
|
-
<div class="
|
|
58
|
-
|
|
59
|
+
<div class="flex items-center gap-1.5">
|
|
60
|
+
<span class="text-xl font-extrabold">{{dialectName}}</span>
|
|
61
|
+
{{#if readonly}}
|
|
62
|
+
<span class="rounded bg-warning/20 px-1.5 py-0.5 text-[10px] font-bold uppercase text-warning">Read-only</span>
|
|
63
|
+
{{else}}
|
|
64
|
+
<span class="rounded bg-success/20 px-1.5 py-0.5 text-[10px] font-bold uppercase text-success">Writable</span>
|
|
65
|
+
{{/if}}
|
|
66
|
+
</div>
|
|
67
|
+
<div class="truncate font-mono text-xs text-base-content/50" title="{{dbPath}}">{{dbPath}}</div>
|
|
59
68
|
</div>
|
|
60
69
|
</div>
|
|
61
70
|
</div>
|
|
@@ -85,7 +94,7 @@
|
|
|
85
94
|
<td>
|
|
86
95
|
<a href="{{../basePath}}/tables/{{this}}" class="inline-flex items-center gap-2.5 font-medium">
|
|
87
96
|
<span class="grid h-8 w-8 place-items-center rounded-lg bg-primary/10 text-primary transition-colors group-hover:bg-primary/20">
|
|
88
|
-
|
|
97
|
+
{{{icon "table" class="h-4 w-4"}}}
|
|
89
98
|
</span>
|
|
90
99
|
<span class="font-mono text-[13.5px]">{{this}}</span>
|
|
91
100
|
</a>
|
|
@@ -95,7 +104,7 @@
|
|
|
95
104
|
<td class="text-right">
|
|
96
105
|
<a href="{{../basePath}}/tables/{{this}}" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary">
|
|
97
106
|
Browse
|
|
98
|
-
|
|
107
|
+
{{{icon "arrowRight" class="h-3.5 w-3.5"}}}
|
|
99
108
|
</a>
|
|
100
109
|
</td>
|
|
101
110
|
</tr>
|
|
@@ -107,7 +116,7 @@
|
|
|
107
116
|
{{else}}
|
|
108
117
|
<div class="empty-state">
|
|
109
118
|
<span class="empty-icon">
|
|
110
|
-
|
|
119
|
+
{{{icon "table" class="h-7 w-7"}}}
|
|
111
120
|
</span>
|
|
112
121
|
<p class="text-sm font-medium text-base-content/70">No tables yet</p>
|
|
113
122
|
<p class="max-w-sm text-sm text-base-content/45">Create one with the table designer, or run a SQL statement in the query editor to get started.</p>
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{{!-- Page: Authentication & Login · URL: /login --}}
|
|
2
|
+
<div class="flex min-h-[75vh] items-center justify-center py-6 px-4">
|
|
3
|
+
|
|
4
|
+
<div class="w-full max-w-md">
|
|
5
|
+
<!-- Brand Header -->
|
|
6
|
+
<div class="mb-8 text-center">
|
|
7
|
+
<div class="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-2xl bg-primary/10 text-primary shadow-soft">
|
|
8
|
+
{{{icon "database" class="h-8 w-8"}}}
|
|
9
|
+
</div>
|
|
10
|
+
<h1 class="text-2xl font-extrabold tracking-tight text-base-content sm:text-3xl">
|
|
11
|
+
Admin<span class="text-primary">DB</span>
|
|
12
|
+
</h1>
|
|
13
|
+
<p class="mt-1 text-sm text-base-content/60">
|
|
14
|
+
Sign in to access your database administration console
|
|
15
|
+
</p>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<!-- Login Card -->
|
|
19
|
+
<div class="app-card border border-base-300/80 bg-base-100 p-6 sm:p-8 shadow-soft">
|
|
20
|
+
{{#if error}}
|
|
21
|
+
<div class="mb-6 flex items-start gap-3 rounded-xl bg-error/10 p-4 text-sm text-error border border-error/20" role="alert">
|
|
22
|
+
<span class="shrink-0 mt-0.5">
|
|
23
|
+
{{{icon "warning" class="h-5 w-5"}}}
|
|
24
|
+
</span>
|
|
25
|
+
<div class="font-medium">{{error}}</div>
|
|
26
|
+
</div>
|
|
27
|
+
{{/if}}
|
|
28
|
+
|
|
29
|
+
{{#if isDefaultPassword}}
|
|
30
|
+
<div class="mb-6 rounded-xl bg-info/10 p-3.5 text-xs text-info border border-info/20">
|
|
31
|
+
<div class="font-semibold flex items-center gap-1.5 mb-1">
|
|
32
|
+
{{{icon "warning" class="h-4 w-4 shrink-0"}}}
|
|
33
|
+
Default Credentials Active
|
|
34
|
+
</div>
|
|
35
|
+
<p class="text-base-content/70">
|
|
36
|
+
Username: <code class="font-mono font-semibold text-primary">admin</code> · Password: <code class="font-mono font-semibold text-primary">admin</code>
|
|
37
|
+
</p>
|
|
38
|
+
<p class="mt-1 text-[11px] text-base-content/50">
|
|
39
|
+
Set <code class="font-mono">ADMINDB_PASSWORD</code> in production to secure your console.
|
|
40
|
+
</p>
|
|
41
|
+
</div>
|
|
42
|
+
{{/if}}
|
|
43
|
+
|
|
44
|
+
<form method="POST" action="{{basePath}}/login" class="space-y-4">
|
|
45
|
+
{{#if next}}
|
|
46
|
+
<input type="hidden" name="next" value="{{next}}" />
|
|
47
|
+
{{/if}}
|
|
48
|
+
|
|
49
|
+
<div>
|
|
50
|
+
<label class="field-label" for="login-username">
|
|
51
|
+
<span>Username</span>
|
|
52
|
+
</label>
|
|
53
|
+
<div class="relative">
|
|
54
|
+
<input
|
|
55
|
+
id="login-username"
|
|
56
|
+
type="text"
|
|
57
|
+
name="username"
|
|
58
|
+
value="{{#if username}}{{username}}{{else}}admin{{/if}}"
|
|
59
|
+
required
|
|
60
|
+
autofocus
|
|
61
|
+
placeholder="Username"
|
|
62
|
+
class="field-input pl-10"
|
|
63
|
+
autocomplete="username"
|
|
64
|
+
/>
|
|
65
|
+
<div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-base-content/40">
|
|
66
|
+
{{{icon "user" class="h-5 w-5"}}}
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<div>
|
|
72
|
+
<label class="field-label" for="login-password">
|
|
73
|
+
<span>Password</span>
|
|
74
|
+
</label>
|
|
75
|
+
<div class="relative">
|
|
76
|
+
<input
|
|
77
|
+
id="login-password"
|
|
78
|
+
type="password"
|
|
79
|
+
name="password"
|
|
80
|
+
required
|
|
81
|
+
placeholder="••••••••"
|
|
82
|
+
class="field-input pl-10"
|
|
83
|
+
autocomplete="current-password"
|
|
84
|
+
/>
|
|
85
|
+
<div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3 text-base-content/40">
|
|
86
|
+
{{{icon "lock" class="h-5 w-5"}}}
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<div class="pt-2">
|
|
92
|
+
<button type="submit" class="btn btn-primary w-full gap-2 font-semibold shadow-soft">
|
|
93
|
+
{{{icon "logout" class="h-4 w-4 rotate-180"}}}
|
|
94
|
+
Sign In
|
|
95
|
+
</button>
|
|
96
|
+
</div>
|
|
97
|
+
</form>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<!-- Security & Auth Control Note -->
|
|
101
|
+
<div class="mt-6 space-y-2 text-center text-xs text-base-content/55">
|
|
102
|
+
<p class="leading-relaxed">
|
|
103
|
+
<span class="font-semibold text-base-content/80">Security Notice:</span> Built-in auth provides basic access control. For production, protect your admin routes using your own application authentication, VPN, or reverse proxy.
|
|
104
|
+
</p>
|
|
105
|
+
<p class="text-base-content/40">
|
|
106
|
+
Native authentication can be disabled via <code class="font-mono">--no-auth</code> or <code class="font-mono">auth: false</code>.
|
|
107
|
+
</p>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
{{!-- Page: SQL Query Console & Workbench · URL: /query --}}
|
|
1
2
|
<div class="space-y-6">
|
|
3
|
+
|
|
2
4
|
<!-- Header -->
|
|
3
5
|
<div class="flex flex-wrap items-center justify-between gap-3">
|
|
4
6
|
<div>
|
|
@@ -9,12 +11,12 @@
|
|
|
9
11
|
<div class="flex flex-wrap gap-2">
|
|
10
12
|
{{#unless readonly}}
|
|
11
13
|
<button id="save-query" type="button" class="btn btn-outline btn-sm gap-1.5">
|
|
12
|
-
|
|
14
|
+
{{{icon "save" class="h-4 w-4"}}}
|
|
13
15
|
Save query
|
|
14
16
|
</button>
|
|
15
17
|
{{/unless}}
|
|
16
18
|
<button id="run-query" type="button" class="btn btn-primary btn-sm gap-1.5">
|
|
17
|
-
|
|
19
|
+
{{{icon "run" class="h-4 w-4"}}}
|
|
18
20
|
Run
|
|
19
21
|
</button>
|
|
20
22
|
</div>
|
|
@@ -48,7 +50,7 @@
|
|
|
48
50
|
<div class="flex items-center justify-between border-b border-base-200 bg-base-200/40 px-4 py-2.5">
|
|
49
51
|
<span class="flex items-center gap-2 text-sm font-semibold text-base-content/60">
|
|
50
52
|
<span class="grid h-5 w-5 place-items-center rounded-md bg-primary/10 text-primary">
|
|
51
|
-
|
|
53
|
+
{{{icon "query" class="h-3.5 w-3.5"}}}
|
|
52
54
|
</span>
|
|
53
55
|
query.sql
|
|
54
56
|
</span>
|
|
@@ -68,16 +70,16 @@
|
|
|
68
70
|
<div class="app-card overflow-hidden">
|
|
69
71
|
<div class="flex items-center gap-2 border-b border-base-200 px-4 py-3">
|
|
70
72
|
<span id="result-kind" class="grid h-6 w-6 place-items-center rounded-md bg-success/10 text-success">
|
|
71
|
-
|
|
73
|
+
{{{icon "check" class="h-4 w-4"}}}
|
|
72
74
|
</span>
|
|
73
75
|
<span id="result-summary" class="text-sm font-medium text-base-content/60"></span>
|
|
74
76
|
<div class="ml-auto flex items-center gap-1.5">
|
|
75
77
|
<button id="export-csv" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
|
|
76
|
-
|
|
78
|
+
{{{icon "export" class="h-3.5 w-3.5"}}}
|
|
77
79
|
CSV
|
|
78
80
|
</button>
|
|
79
81
|
<button id="export-json" type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary" disabled>
|
|
80
|
-
|
|
82
|
+
{{{icon "export" class="h-3.5 w-3.5"}}}
|
|
81
83
|
JSON
|
|
82
84
|
</button>
|
|
83
85
|
</div>
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
{{!-- Page: Table Schema & Structure Inspector · URL: /tables/:table/schema --}}
|
|
1
2
|
<div class="space-y-6">
|
|
3
|
+
|
|
2
4
|
<!-- Header -->
|
|
3
5
|
<div class="flex flex-wrap items-center justify-between gap-3">
|
|
4
6
|
<div class="flex items-center gap-3.5">
|
|
5
7
|
<a href="{{basePath}}/tables/{{table}}" class="btn btn-circle btn-ghost btn-sm" aria-label="Back to table">
|
|
6
|
-
|
|
8
|
+
{{{icon "arrowLeft" class="h-5 w-5"}}}
|
|
7
9
|
</a>
|
|
8
10
|
<div>
|
|
9
11
|
<p class="text-sm font-semibold uppercase tracking-wider text-primary">Schema editor</p>
|
|
@@ -12,11 +14,11 @@
|
|
|
12
14
|
</div>
|
|
13
15
|
<div class="flex flex-wrap gap-2">
|
|
14
16
|
<a href="{{basePath}}/tables/{{table}}" class="btn btn-ghost btn-sm gap-1.5">
|
|
15
|
-
|
|
17
|
+
{{{icon "table" class="h-4 w-4"}}}
|
|
16
18
|
View data
|
|
17
19
|
</a>
|
|
18
20
|
<a href="{{basePath}}/query" class="btn btn-outline btn-sm gap-1.5">
|
|
19
|
-
|
|
21
|
+
{{{icon "query" class="h-4 w-4"}}}
|
|
20
22
|
Query
|
|
21
23
|
</a>
|
|
22
24
|
</div>
|
|
@@ -30,7 +32,7 @@
|
|
|
30
32
|
<input id="table-rename-input" class="field-input font-mono" value="{{table}}" spellcheck="false" autocomplete="off" {{#if isInternal}}disabled{{/if}} {{#if readonly}}disabled{{/if}} />
|
|
31
33
|
</div>
|
|
32
34
|
<button id="rename-table" type="button" class="btn btn-primary btn-sm mb-0.5" {{#if isInternal}}disabled{{/if}} {{#if readonly}}disabled{{/if}}>
|
|
33
|
-
|
|
35
|
+
{{{icon "edit" class="h-4 w-4"}}}
|
|
34
36
|
Rename table
|
|
35
37
|
</button>
|
|
36
38
|
{{#if isInternal}}<span class="mb-1 text-xs text-base-content/45">Internal tables cannot be renamed.</span>{{/if}}
|
|
@@ -45,20 +47,37 @@
|
|
|
45
47
|
<span class="ml-1 rounded-md bg-base-200 px-1.5 py-0.5 text-[10px] text-base-content/50">{{schema.columns.length}}</span>
|
|
46
48
|
</h2>
|
|
47
49
|
<button id="add-column" type="button" class="btn btn-outline btn-sm gap-1.5" {{#if readonly}}disabled{{/if}}>
|
|
48
|
-
|
|
50
|
+
{{{icon "plus" class="h-4 w-4"}}}
|
|
49
51
|
Add column
|
|
50
52
|
</button>
|
|
51
53
|
</div>
|
|
52
54
|
|
|
53
55
|
<div id="add-column-panel" class="hidden border-b border-base-200 p-4">
|
|
56
|
+
<div class="mb-2 text-xs font-bold uppercase tracking-wider text-primary">Add New Column</div>
|
|
54
57
|
<div id="add-column-form" class="grid grid-cols-2 items-end gap-2.5 sm:grid-cols-12"></div>
|
|
55
58
|
<div id="add-column-error" class="hidden mt-3"></div>
|
|
56
|
-
<div class="mt-3 flex gap-2">
|
|
59
|
+
<div class="mt-3.5 flex gap-2">
|
|
57
60
|
<button id="add-column-submit" type="button" class="btn btn-primary btn-sm">Add column</button>
|
|
58
61
|
<button id="add-column-cancel" type="button" class="btn btn-ghost btn-sm">Cancel</button>
|
|
59
62
|
</div>
|
|
60
63
|
</div>
|
|
61
64
|
|
|
65
|
+
<div id="edit-column-panel" class="hidden border-b border-base-200 bg-base-200/30 p-4">
|
|
66
|
+
<div class="mb-2.5 flex items-center justify-between">
|
|
67
|
+
<div class="flex items-center gap-2">
|
|
68
|
+
<span class="text-xs font-bold uppercase tracking-wider text-primary">Edit Column:</span>
|
|
69
|
+
<span id="edit-column-target" class="font-mono text-sm font-bold text-base-content"></span>
|
|
70
|
+
</div>
|
|
71
|
+
<span class="text-[11px] text-base-content/45">Change data type, default value, primary key, nullability, uniqueness, or foreign key.</span>
|
|
72
|
+
</div>
|
|
73
|
+
<div id="edit-column-form" class="grid grid-cols-2 items-end gap-2.5 sm:grid-cols-12"></div>
|
|
74
|
+
<div id="edit-column-error" class="hidden mt-3"></div>
|
|
75
|
+
<div class="mt-3.5 flex gap-2">
|
|
76
|
+
<button id="edit-column-submit" type="button" class="btn btn-primary btn-sm">Save Changes</button>
|
|
77
|
+
<button id="edit-column-cancel" type="button" class="btn btn-ghost btn-sm">Cancel</button>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
62
81
|
<div class="overflow-x-auto">
|
|
63
82
|
<table class="table table-sm">
|
|
64
83
|
<thead>
|
|
@@ -92,12 +111,21 @@
|
|
|
92
111
|
</td>
|
|
93
112
|
<td class="whitespace-nowrap text-right align-middle">
|
|
94
113
|
<div class="flex items-center justify-end gap-1">
|
|
95
|
-
<button type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary col-
|
|
96
|
-
|
|
97
|
-
|
|
114
|
+
<button type="button" class="btn btn-ghost btn-xs gap-1 text-base-content/70 hover:text-primary col-edit"
|
|
115
|
+
data-column="{{this.name}}"
|
|
116
|
+
data-type="{{this.type}}"
|
|
117
|
+
data-pk="{{#if (gt this.pk 0)}}true{{else}}false{{/if}}"
|
|
118
|
+
data-notnull="{{#if this.notnull}}true{{else}}false{{/if}}"
|
|
119
|
+
data-unique="{{#if this.unique}}true{{else}}false{{/if}}"
|
|
120
|
+
data-default="{{this.dflt_value}}"
|
|
121
|
+
data-fk-table="{{this.fk.table}}"
|
|
122
|
+
data-fk-to="{{this.fk.to}}"
|
|
123
|
+
{{#if ../readonly}}disabled{{/if}}>
|
|
124
|
+
{{{icon "edit" class="h-3.5 w-3.5"}}}
|
|
125
|
+
Edit
|
|
98
126
|
</button>
|
|
99
127
|
<button type="button" class="btn btn-ghost btn-xs gap-1 text-error col-drop" {{#if ../readonly}}disabled{{/if}} {{#unless this.canDrop}}disabled title="{{join this.dropBlockers "; "}}"{{/unless}}>
|
|
100
|
-
|
|
128
|
+
{{{icon "trash" class="h-3.5 w-3.5"}}}
|
|
101
129
|
Delete
|
|
102
130
|
</button>
|
|
103
131
|
</div>
|
|
@@ -148,7 +176,7 @@
|
|
|
148
176
|
<span class="ml-1 rounded-md bg-base-200 px-1.5 py-0.5 text-[10px] text-base-content/50">{{schema.indexes.length}}</span>
|
|
149
177
|
</h2>
|
|
150
178
|
<button id="add-index" type="button" class="btn btn-outline btn-sm gap-1.5" {{#if readonly}}disabled{{/if}}>
|
|
151
|
-
|
|
179
|
+
{{{icon "plus" class="h-4 w-4"}}}
|
|
152
180
|
Add index
|
|
153
181
|
</button>
|
|
154
182
|
</div>
|
|
@@ -225,7 +253,7 @@
|
|
|
225
253
|
<td class="whitespace-nowrap text-right align-middle">
|
|
226
254
|
<button type="button" class="btn btn-ghost btn-xs gap-1 text-error index-drop"
|
|
227
255
|
data-index="{{this.name}}" {{#if ../readonly}}disabled{{/if}} {{#unless (eq this.origin 'c')}}disabled title="Automatic index — cannot be dropped"{{/unless}}>
|
|
228
|
-
|
|
256
|
+
{{{icon "trash" class="h-3.5 w-3.5"}}}
|
|
229
257
|
Drop
|
|
230
258
|
</button>
|
|
231
259
|
</td>
|
|
@@ -270,7 +298,7 @@
|
|
|
270
298
|
{{#unless isInternal}}
|
|
271
299
|
<div class="rounded-2xl border border-error/25 bg-error/[0.03] p-5">
|
|
272
300
|
<h2 class="flex items-center gap-2 text-sm font-semibold uppercase tracking-wide text-error">
|
|
273
|
-
|
|
301
|
+
{{{icon "warning" class="h-4 w-4"}}}
|
|
274
302
|
Danger zone
|
|
275
303
|
</h2>
|
|
276
304
|
<p class="mt-1 text-sm text-base-content/55">Dropping this table permanently removes its schema and all of its data.</p>
|