admindb 2.2.1 → 2.3.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 +368 -364
- package/dist/app.js +6 -9
- package/dist/auth/config.d.ts +1 -1
- package/dist/auth/config.js +18 -30
- package/dist/auth/crypto.js +11 -21
- package/dist/auth/middleware.js +9 -16
- package/dist/auth/routes.js +9 -15
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.js +15 -26
- package/dist/cli/config.js +6 -16
- package/dist/cli/runner.js +4 -7
- package/dist/data/chain.d.ts +1 -1
- package/dist/data/chain.js +40 -617
- package/dist/data/datasets.d.ts +1 -1
- package/dist/data/datasets.js +43 -1
- package/dist/data/detector.js +45 -21
- package/dist/data/engine.d.ts +1 -1
- package/dist/data/engine.js +483 -142
- package/dist/data/index.d.ts +1 -1
- package/dist/data/index.js +8 -0
- package/dist/data/prng.d.ts +1 -0
- package/dist/data/prng.js +73 -0
- package/dist/data/registry.d.ts +1 -0
- package/dist/data/registry.js +805 -0
- package/dist/data/schema-graph.d.ts +1 -0
- package/dist/data/schema-graph.js +210 -0
- package/dist/data/strategies.d.ts +1 -1
- package/dist/data/strategies.js +44 -283
- package/dist/data/templates.d.ts +1 -0
- package/dist/data/templates.js +134 -0
- package/dist/data/types.d.ts +1 -1
- package/dist/data/validator.d.ts +1 -0
- package/dist/data/validator.js +160 -0
- package/dist/db/database.js +9 -14
- package/dist/db/export.js +32 -55
- package/dist/db/filters.d.ts +1 -1
- package/dist/db/filters.js +15 -38
- package/dist/db/introspection.js +4 -7
- package/dist/db/manager.js +27 -51
- package/dist/db/migrations.js +7 -14
- package/dist/db/postgres.js +30 -78
- package/dist/index.d.ts +1 -1
- package/dist/public/css/app.css +1 -1
- package/dist/public/js/browse.js +1 -1
- package/dist/public/js/inspector.js +1 -1
- package/dist/public/js/query.js +1 -1
- package/dist/public/js/seed.js +1 -1
- package/dist/routes/api/erd.js +3 -8
- package/dist/routes/api/helpers.d.ts +1 -1
- package/dist/routes/api/helpers.js +75 -25
- package/dist/routes/api/import-export.js +1 -2
- package/dist/routes/api/query.js +2 -6
- package/dist/routes/api/rows.js +4 -8
- package/dist/routes/api/seed.js +35 -21
- package/dist/routes/api/tables.js +15 -30
- package/dist/routes/databases.js +8 -26
- package/dist/routes/pages.js +67 -18
- package/dist/serverless.js +15 -40
- package/dist/sql/generator.d.ts +1 -1
- package/dist/sql/generator.js +35 -109
- package/dist/types/api.d.ts +1 -1
- package/dist/utils/common.d.ts +1 -1
- package/dist/utils/common.js +45 -85
- package/dist/utils/csv.d.ts +1 -1
- package/dist/utils/csv.js +11 -17
- package/dist/utils/datatype.js +46 -60
- package/dist/utils/icons.js +8 -8
- package/dist/views/layouts/main.hbs +1 -87
- package/dist/views/pages/databases.hbs +1 -233
- package/dist/views/pages/designer.hbs +1 -89
- package/dist/views/pages/erd.hbs +1 -1241
- package/dist/views/pages/error.hbs +1 -10
- package/dist/views/pages/form.hbs +1 -59
- package/dist/views/pages/home.hbs +1 -220
- package/dist/views/pages/info.hbs +1 -107
- package/dist/views/pages/login.hbs +1 -98
- package/dist/views/pages/query.hbs +1 -129
- package/dist/views/pages/schema.hbs +1 -298
- package/dist/views/pages/seed-select.hbs +251 -0
- package/dist/views/pages/seed.hbs +256 -414
- package/dist/views/pages/table.hbs +1 -327
- package/dist/views/partials/navbar.hbs +1 -83
- package/dist/views/partials/sidebar.hbs +1 -129
- package/docs/API.md +149 -149
- package/docs/EXAMPLES.md +579 -579
- package/docs/SECURITY.md +265 -265
- package/package.json +79 -79
|
@@ -1,83 +1 @@
|
|
|
1
|
-
<div class="sticky top-0 z-30 border-b border-base-300/80 bg-base-100/85 backdrop-blur-md">
|
|
2
|
-
<div class="navbar mx-auto w-full max-w-[1500px] px-4 sm:px-6 lg:px-8">
|
|
3
|
-
<div class="flex-none lg:hidden">
|
|
4
|
-
<label for="sidebar-toggle" class="btn btn-square btn-ghost" aria-label="open sidebar">
|
|
5
|
-
{{{icon "menu" class="h-5 w-5"}}}
|
|
6
|
-
</label>
|
|
7
|
-
</div>
|
|
8
|
-
<div class="flex flex-1 items-center gap-3">
|
|
9
|
-
<a href="{{basePath}}/" class="flex items-center gap-2.5">
|
|
10
|
-
<span class="text-lg font-bold tracking-tight">Admin<span class="text-primary">DB</span></span>
|
|
11
|
-
</a>
|
|
12
|
-
{{#unless databasesMode}}
|
|
13
|
-
{{#if isPostgres}}
|
|
14
|
-
<span class="inline-flex items-center gap-1.5 rounded-lg border border-info/40 bg-info/10 px-2.5 py-0.5 text-xs font-semibold text-info" title="Engine: PostgreSQL ({{dbPath}})">
|
|
15
|
-
<span class="h-2 w-2 rounded-full bg-info animate-pulse"></span>
|
|
16
|
-
PostgreSQL
|
|
17
|
-
</span>
|
|
18
|
-
{{else}}
|
|
19
|
-
<span class="inline-flex items-center gap-1.5 rounded-lg border border-emerald-500/40 bg-emerald-500/10 px-2.5 py-0.5 text-xs font-semibold text-emerald-600 dark:text-emerald-400" title="Engine: SQLite ({{dbPath}})">
|
|
20
|
-
<span class="h-2 w-2 rounded-full bg-emerald-500 animate-pulse"></span>
|
|
21
|
-
SQLite
|
|
22
|
-
</span>
|
|
23
|
-
{{/if}}
|
|
24
|
-
{{/unless}}
|
|
25
|
-
</div>
|
|
26
|
-
<div class="flex items-center gap-1.5">
|
|
27
|
-
{{#unless noSidebar}}
|
|
28
|
-
{{#unless databasesMode}}
|
|
29
|
-
{{#if databasesUrl}}
|
|
30
|
-
<a href="{{databasesUrl}}" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
|
|
31
|
-
{{{icon "database" class="h-4 w-4"}}}
|
|
32
|
-
Databases
|
|
33
|
-
</a>
|
|
34
|
-
{{/if}}
|
|
35
|
-
<a href="{{basePath}}/query" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
|
|
36
|
-
{{{icon "query" class="h-4 w-4"}}}
|
|
37
|
-
Query
|
|
38
|
-
</a>
|
|
39
|
-
{{#unless readonly}}
|
|
40
|
-
<a href="{{basePath}}/designer" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
|
|
41
|
-
{{{icon "plus" class="h-4 w-4"}}}
|
|
42
|
-
New table
|
|
43
|
-
</a>
|
|
44
|
-
{{/unless}}
|
|
45
|
-
<a href="{{basePath}}/export" class="btn btn-ghost btn-sm hidden gap-1.5 md:inline-flex">
|
|
46
|
-
{{{icon "export" class="h-4 w-4"}}}
|
|
47
|
-
Export
|
|
48
|
-
</a>
|
|
49
|
-
{{/unless}}
|
|
50
|
-
{{/unless}}
|
|
51
|
-
{{#if authEnabled}}
|
|
52
|
-
{{#if authUser}}
|
|
53
|
-
{{#if isDefaultPassword}}
|
|
54
|
-
<span class="badge badge-warning badge-sm gap-1 hidden sm:inline-flex font-mono text-[11px]" title="Using default password (admin). Set ADMINDB_PASSWORD in production.">
|
|
55
|
-
{{{icon "warning" class="h-3.5 w-3.5"}}}
|
|
56
|
-
default pass
|
|
57
|
-
</span>
|
|
58
|
-
{{/if}}
|
|
59
|
-
<div class="dropdown dropdown-end">
|
|
60
|
-
<label tabindex="0" class="btn btn-ghost btn-sm gap-1.5 normal-case font-medium">
|
|
61
|
-
{{{icon "user" class="h-4 w-4 text-base-content/70"}}}
|
|
62
|
-
<span class="max-w-[120px] truncate text-xs">{{authUser}}</span>
|
|
63
|
-
</label>
|
|
64
|
-
<ul tabindex="0" class="dropdown-content menu p-2 shadow-soft bg-base-100 rounded-xl w-48 border border-base-300 z-50 mt-1 text-sm">
|
|
65
|
-
<li class="menu-title px-2 py-1 text-xs text-base-content/50">Signed in as <strong class="text-base-content">{{authUser}}</strong></li>
|
|
66
|
-
<li>
|
|
67
|
-
<form method="POST" action="{{basePath}}/logout" class="p-0">
|
|
68
|
-
<button type="submit" class="w-full text-left flex items-center gap-2 px-3 py-2 text-error hover:bg-error/10 rounded-lg">
|
|
69
|
-
{{{icon "logout" class="h-4 w-4"}}}
|
|
70
|
-
Sign out
|
|
71
|
-
</button>
|
|
72
|
-
</form>
|
|
73
|
-
</li>
|
|
74
|
-
</ul>
|
|
75
|
-
</div>
|
|
76
|
-
{{/if}}
|
|
77
|
-
{{/if}}
|
|
78
|
-
<button id="theme-toggle" type="button" class="btn btn-square btn-ghost btn-sm" aria-label="Toggle dark mode" title="Toggle dark mode">
|
|
79
|
-
{{{icon "moon" class="h-5 w-5"}}}
|
|
80
|
-
</button>
|
|
81
|
-
</div>
|
|
82
|
-
</div>
|
|
83
|
-
</div>
|
|
1
|
+
<div class="sticky top-0 z-30 border-b border-base-300/80 bg-base-100/85 backdrop-blur-md">
|
|
84
2
|
<div class="navbar mx-auto w-full max-w-[1500px] px-4 sm:px-6 lg:px-8">
|
|
85
3
|
<div class="flex-none lg:hidden">
|
|
86
4
|
<label for="sidebar-toggle" class="btn btn-square btn-ghost" aria-label="open sidebar">
|
|
87
5
|
{{{icon "menu" class="h-5 w-5"}}}
|
|
88
6
|
</label>
|
|
89
7
|
</div>
|
|
90
8
|
<div class="flex flex-1 items-center gap-3">
|
|
91
9
|
<a href="{{basePath}}/" class="flex items-center gap-2.5">
|
|
92
10
|
<span class="font-headings text-lg font-bold tracking-tight text-base-content">Admin<span class="text-primary">DB</span></span>
|
|
93
11
|
</a>
|
|
94
12
|
{{#unless databasesMode}}
|
|
95
13
|
{{#if isPostgres}}
|
|
96
14
|
<span class="inline-flex items-center gap-1.5 rounded-lg border border-info/40 bg-info/10 px-2.5 py-0.5 text-xs font-semibold text-info" title="Engine: PostgreSQL ({{dbPath}})">
|
|
97
15
|
<span class="h-2 w-2 rounded-full bg-info animate-pulse"></span>
|
|
98
16
|
PostgreSQL
|
|
99
17
|
</span>
|
|
100
18
|
{{else}}
|
|
101
19
|
<span class="inline-flex items-center gap-1.5 rounded-lg border border-emerald-500/40 bg-emerald-500/10 px-2.5 py-0.5 text-xs font-semibold text-emerald-600 dark:text-emerald-400" title="Engine: SQLite ({{dbPath}})">
|
|
102
20
|
<span class="h-2 w-2 rounded-full bg-emerald-500 animate-pulse"></span>
|
|
103
21
|
SQLite
|
|
104
22
|
</span>
|
|
105
23
|
{{/if}}
|
|
106
24
|
{{/unless}}
|
|
107
25
|
</div>
|
|
108
26
|
<div class="flex items-center gap-1.5">
|
|
109
27
|
{{#unless noSidebar}}
|
|
110
28
|
{{#unless databasesMode}}
|
|
111
29
|
{{#if databasesUrl}}
|
|
112
30
|
<a href="{{databasesUrl}}" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
|
|
113
31
|
{{{icon "database" class="h-4 w-4"}}}
|
|
114
32
|
Databases
|
|
115
33
|
</a>
|
|
116
34
|
{{/if}}
|
|
117
35
|
<a href="{{basePath}}/query" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
|
|
118
36
|
{{{icon "query" class="h-4 w-4"}}}
|
|
119
37
|
Query
|
|
120
38
|
</a>
|
|
121
39
|
{{#unless readonly}}
|
|
122
40
|
<a href="{{basePath}}/designer" class="btn btn-ghost btn-sm hidden gap-1.5 sm:inline-flex">
|
|
123
41
|
{{{icon "plus" class="h-4 w-4"}}}
|
|
124
42
|
New table
|
|
125
43
|
</a>
|
|
126
44
|
{{/unless}}
|
|
127
45
|
<a href="{{basePath}}/export" class="btn btn-ghost btn-sm hidden gap-1.5 md:inline-flex">
|
|
128
46
|
{{{icon "export" class="h-4 w-4"}}}
|
|
129
47
|
Export
|
|
130
48
|
</a>
|
|
131
49
|
{{/unless}}
|
|
132
50
|
{{/unless}}
|
|
133
51
|
{{#if authEnabled}}
|
|
134
52
|
{{#if authUser}}
|
|
135
53
|
<div class="dropdown dropdown-end">
|
|
136
54
|
<label tabindex="0" class="btn btn-ghost btn-sm gap-1.5 normal-case font-medium">
|
|
137
55
|
{{{icon "user" class="h-4 w-4 text-base-content/70"}}}
|
|
138
56
|
<span class="max-w-[120px] truncate text-xs">{{authUser}}</span>
|
|
139
57
|
</label>
|
|
140
58
|
<ul tabindex="0" class="dropdown-content menu p-2 shadow-soft bg-base-100 rounded-xl w-56 border border-base-300 z-50 mt-1 text-sm space-y-1">
|
|
141
59
|
<li class="menu-title px-2 py-1 text-xs text-base-content/50">Signed in as <strong class="text-base-content">{{authUser}}</strong></li>
|
|
142
60
|
{{#if isDefaultPassword}}
|
|
143
61
|
<li class="rounded-lg bg-warning/10 p-2 text-[11px] text-warning border border-warning/20">
|
|
144
62
|
<div class="flex items-center gap-1.5 font-semibold p-0">
|
|
145
63
|
{{{icon "warning" class="h-3.5 w-3.5 shrink-0"}}}
|
|
146
64
|
<span>Default pass active (admin)</span>
|
|
147
65
|
</div>
|
|
148
66
|
</li>
|
|
149
67
|
{{/if}}
|
|
150
68
|
<li>
|
|
151
69
|
<form method="POST" action="{{basePath}}/logout" class="p-0">
|
|
152
70
|
<button type="submit" class="w-full text-left flex items-center gap-2 px-3 py-2 text-error hover:bg-error/10 rounded-lg">
|
|
153
71
|
{{{icon "logout" class="h-4 w-4"}}}
|
|
154
72
|
Sign out
|
|
155
73
|
</button>
|
|
156
74
|
</form>
|
|
157
75
|
</li>
|
|
158
76
|
</ul>
|
|
159
77
|
</div>
|
|
160
78
|
{{/if}}
|
|
161
79
|
{{/if}}
|
|
162
80
|
<button id="theme-toggle" type="button" class="btn btn-square btn-ghost btn-sm" aria-label="Toggle dark mode" title="Toggle dark mode">
|
|
163
81
|
{{{icon "moon" class="h-5 w-5"}}}
|
|
164
82
|
</button>
|
|
165
83
|
</div>
|
|
166
84
|
</div>
|
|
@@ -1,129 +1 @@
|
|
|
1
|
-
<aside class="flex h-full min-h-full w-72 flex-col bg-neutral text-neutral-content">
|
|
2
|
-
<div class="flex items-center gap-2.5 px-5 pb-4 pt-5">
|
|
3
|
-
<div class="w-full">
|
|
4
|
-
<div class="flex items-center justify-between">
|
|
5
|
-
<div class="text-base font-bold leading-tight">AdminDB <span style="font-size: x-small">{{#if version}}v{{version}}{{/if}}</span></div>
|
|
6
|
-
{{#unless databasesMode}}
|
|
7
|
-
{{#if isPostgres}}
|
|
8
|
-
<span class="rounded bg-info/20 px-1.5 py-0.5 text-[10px] font-bold text-info">PostgreSQL</span>
|
|
9
|
-
{{else}}
|
|
10
|
-
<span class="rounded bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-bold text-emerald-400">SQLite</span>
|
|
11
|
-
{{/if}}
|
|
12
|
-
{{/unless}}
|
|
13
|
-
</div>
|
|
14
|
-
<div class="mt-0.5 text-[11px] text-neutral-content/50 truncate">{{#if databasesMode}}Database manager{{else}}{{dbId}}{{/if}}</div>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
{{#if databasesMode}}
|
|
18
|
-
<nav class="flex-1 overflow-y-auto px-3 py-2">
|
|
19
|
-
<ul class="space-y-0.5">
|
|
20
|
-
<li>
|
|
21
|
-
<a href="{{basePath}}/" class="side-link active">
|
|
22
|
-
{{{icon "database" class="h-4 w-4"}}}
|
|
23
|
-
Databases
|
|
24
|
-
</a>
|
|
25
|
-
</li>
|
|
26
|
-
</ul>
|
|
27
|
-
</nav>
|
|
28
|
-
{{else}}
|
|
29
|
-
<div class="px-4 pb-2">
|
|
30
|
-
<label class="relative block">
|
|
31
|
-
<span class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-neutral-content/40">
|
|
32
|
-
{{{icon "search" class="h-4 w-4"}}}
|
|
33
|
-
</span>
|
|
34
|
-
<input id="table-search" type="search" placeholder="Filter tables…" autocomplete="off"
|
|
35
|
-
class="w-full rounded-lg border border-white/10 bg-white/[0.06] py-2 pl-9 pr-3 text-sm text-neutral-content outline-none transition placeholder:text-neutral-content/40 focus:border-primary/70 focus:ring-4 focus:ring-primary/20" />
|
|
36
|
-
</label>
|
|
37
|
-
</div>
|
|
38
|
-
<nav class="flex-1 overflow-y-auto px-3 py-2">
|
|
39
|
-
<ul class="space-y-0.5">
|
|
40
|
-
{{#if databasesUrl}}
|
|
41
|
-
<li>
|
|
42
|
-
<a href="{{databasesUrl}}" class="side-link">
|
|
43
|
-
{{{icon "database" class="h-4 w-4"}}}
|
|
44
|
-
Databases
|
|
45
|
-
</a>
|
|
46
|
-
</li>
|
|
47
|
-
{{/if}}
|
|
48
|
-
<li>
|
|
49
|
-
<a href="{{basePath}}/" class="side-link {{#if (eq currentPath '/')}}active{{/if}}">
|
|
50
|
-
{{{icon "home" class="h-4 w-4"}}}
|
|
51
|
-
Home
|
|
52
|
-
</a>
|
|
53
|
-
</li>
|
|
54
|
-
<li>
|
|
55
|
-
<a href="{{basePath}}/query" class="side-link {{#if (startsWith currentPath '/query')}}active{{/if}}">
|
|
56
|
-
{{{icon "query" class="h-4 w-4"}}}
|
|
57
|
-
Query editor
|
|
58
|
-
</a>
|
|
59
|
-
</li>
|
|
60
|
-
<li>
|
|
61
|
-
<a href="{{basePath}}/erd" class="side-link {{#if (startsWith currentPath '/erd')}}active{{/if}}">
|
|
62
|
-
{{{icon "diagram" class="h-4 w-4"}}}
|
|
63
|
-
ER Diagram
|
|
64
|
-
</a>
|
|
65
|
-
</li>
|
|
66
|
-
<li>
|
|
67
|
-
<a href="{{basePath}}/info" class="side-link {{#if (startsWith currentPath '/info')}}active{{/if}}">
|
|
68
|
-
{{{icon "settings" class="h-4 w-4"}}}
|
|
69
|
-
Info & Settings
|
|
70
|
-
</a>
|
|
71
|
-
</li>
|
|
72
|
-
{{#unless readonly}}
|
|
73
|
-
<li>
|
|
74
|
-
<a href="{{basePath}}/designer" class="side-link {{#if (startsWith currentPath '/designer')}}active{{/if}}">
|
|
75
|
-
{{{icon "plus" class="h-4 w-4"}}}
|
|
76
|
-
New table
|
|
77
|
-
</a>
|
|
78
|
-
</li>
|
|
79
|
-
{{/unless}}
|
|
80
|
-
</ul>
|
|
81
|
-
<div class="mb-2 mt-6 flex items-center justify-between px-3">
|
|
82
|
-
<span class="text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Tables</span>
|
|
83
|
-
<span id="table-count" class="rounded-md bg-white/[0.06] px-1.5 py-0.5 text-[10px] font-semibold text-neutral-content/50">{{tables.length}}</span>
|
|
84
|
-
</div>
|
|
85
|
-
<ul id="table-list" class="space-y-0.5">
|
|
86
|
-
{{#each tables}}
|
|
87
|
-
<li class="table-item" data-name="{{this}}">
|
|
88
|
-
<a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
|
|
89
|
-
<span class="table-icon">
|
|
90
|
-
{{{icon "table" class="h-4 w-4"}}}
|
|
91
|
-
</span>
|
|
92
|
-
<span class="truncate">{{this}}</span>
|
|
93
|
-
</a>
|
|
94
|
-
</li>
|
|
95
|
-
{{else}}
|
|
96
|
-
<li class="px-3 py-2 text-xs text-neutral-content/40">No tables yet</li>
|
|
97
|
-
{{/each}}
|
|
98
|
-
</ul>
|
|
99
|
-
{{#if internalTables.length}}
|
|
100
|
-
<div class="mb-2 mt-6 px-3 text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Internal</div>
|
|
101
|
-
<ul class="space-y-0.5">
|
|
102
|
-
{{#each internalTables}}
|
|
103
|
-
<li>
|
|
104
|
-
<a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
|
|
105
|
-
<span class="table-icon">
|
|
106
|
-
{{{icon "book" class="h-4 w-4"}}}
|
|
107
|
-
</span>
|
|
108
|
-
<span class="truncate">{{this}}</span>
|
|
109
|
-
</a>
|
|
110
|
-
</li>
|
|
111
|
-
{{/each}}
|
|
112
|
-
</ul>
|
|
113
|
-
{{/if}}
|
|
114
|
-
</nav>
|
|
115
|
-
{{/if}}
|
|
116
|
-
<div class="border-t border-white/10 px-5 py-3">
|
|
117
|
-
<div class="flex items-center justify-between">
|
|
118
|
-
<div class="text-[11px] font-medium uppercase tracking-wider text-neutral-content/40">{{#if databasesMode}}Directory{{else}}Engine: {{dialectName}}{{/if}}</div>
|
|
119
|
-
{{#unless databasesMode}}
|
|
120
|
-
{{#if readonly}}
|
|
121
|
-
<span class="rounded bg-warning/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-warning">Read-only</span>
|
|
122
|
-
{{else}}
|
|
123
|
-
<span class="rounded bg-success/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-success">Writable</span>
|
|
124
|
-
{{/if}}
|
|
125
|
-
{{/unless}}
|
|
126
|
-
</div>
|
|
127
|
-
<div class="mt-0.5 truncate font-mono text-[11px] text-neutral-content/60" title="{{dbPath}}">{{dbPath}}</div>
|
|
128
|
-
</div>
|
|
129
|
-
</aside>
|
|
1
|
+
<aside class="flex h-full min-h-full w-72 flex-col bg-neutral text-neutral-content">
|
|
130
2
|
<div class="flex items-center gap-2.5 px-5 pb-4 pt-5">
|
|
131
3
|
<div class="w-full">
|
|
132
4
|
<div class="flex items-center justify-between">
|
|
133
5
|
<div class="font-headings text-base font-bold leading-tight">AdminDB <span style="font-size: x-small" class="font-sans font-normal opacity-70">{{#if version}}v{{version}}{{/if}}</span></div>
|
|
134
6
|
{{#unless databasesMode}}
|
|
135
7
|
{{#if isPostgres}}
|
|
136
8
|
<span class="rounded bg-info/20 px-1.5 py-0.5 text-[10px] font-bold text-info">PostgreSQL</span>
|
|
137
9
|
{{else}}
|
|
138
10
|
<span class="rounded bg-emerald-500/20 px-1.5 py-0.5 text-[10px] font-bold text-emerald-400">SQLite</span>
|
|
139
11
|
{{/if}}
|
|
140
12
|
{{/unless}}
|
|
141
13
|
</div>
|
|
142
14
|
<div class="mt-0.5 text-[11px] text-neutral-content/50 truncate">{{#if databasesMode}}Database manager{{else}}{{dbId}}{{/if}}</div>
|
|
143
15
|
</div>
|
|
144
16
|
</div>
|
|
145
17
|
{{#if databasesMode}}
|
|
146
18
|
<nav class="flex-1 overflow-y-auto px-3 py-2">
|
|
147
19
|
<ul class="space-y-0.5">
|
|
148
20
|
<li>
|
|
149
21
|
<a href="{{basePath}}/" class="side-link active">
|
|
150
22
|
{{{icon "database" class="h-4 w-4"}}}
|
|
151
23
|
Databases
|
|
152
24
|
</a>
|
|
153
25
|
</li>
|
|
154
26
|
</ul>
|
|
155
27
|
</nav>
|
|
156
28
|
{{else}}
|
|
157
29
|
<div class="px-4 pb-2">
|
|
158
30
|
<label class="relative block">
|
|
159
31
|
<span class="pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-neutral-content/40">
|
|
160
32
|
{{{icon "search" class="h-4 w-4"}}}
|
|
161
33
|
</span>
|
|
162
34
|
<input id="table-search" type="search" placeholder="Filter tables…" autocomplete="off"
|
|
163
35
|
class="w-full rounded-lg border border-white/10 bg-white/[0.06] py-2 pl-9 pr-3 text-sm text-neutral-content outline-none transition placeholder:text-neutral-content/40 focus:border-primary/70 focus:ring-4 focus:ring-primary/20" />
|
|
164
36
|
</label>
|
|
165
37
|
</div>
|
|
166
38
|
<nav class="flex-1 overflow-y-auto px-3 py-2">
|
|
167
39
|
<ul class="space-y-0.5">
|
|
168
40
|
{{#if databasesUrl}}
|
|
169
41
|
<li>
|
|
170
42
|
<a href="{{databasesUrl}}" class="side-link">
|
|
171
43
|
{{{icon "database" class="h-4 w-4"}}}
|
|
172
44
|
Databases
|
|
173
45
|
</a>
|
|
174
46
|
</li>
|
|
175
47
|
{{/if}}
|
|
176
48
|
<li>
|
|
177
49
|
<a href="{{basePath}}/" class="side-link {{#if (eq currentPath '/')}}active{{/if}}">
|
|
178
50
|
{{{icon "home" class="h-4 w-4"}}}
|
|
179
51
|
Home
|
|
180
52
|
</a>
|
|
181
53
|
</li>
|
|
182
54
|
<li>
|
|
183
55
|
<a href="{{basePath}}/query" class="side-link {{#if (startsWith currentPath '/query')}}active{{/if}}">
|
|
184
56
|
{{{icon "query" class="h-4 w-4"}}}
|
|
185
57
|
Query editor
|
|
186
58
|
</a>
|
|
187
59
|
</li>
|
|
188
60
|
<li>
|
|
189
61
|
<a href="{{basePath}}/erd" class="side-link {{#if (startsWith currentPath '/erd')}}active{{/if}}">
|
|
190
62
|
{{{icon "diagram" class="h-4 w-4"}}}
|
|
191
63
|
ER Diagram
|
|
192
64
|
</a>
|
|
193
65
|
</li>
|
|
194
66
|
<li>
|
|
195
67
|
<a href="{{basePath}}/seed" class="side-link {{#if (startsWith currentPath '/seed')}}active{{/if}}">
|
|
196
68
|
{{{icon "seed" class="h-4 w-4"}}}
|
|
197
69
|
Seed generator
|
|
198
70
|
</a>
|
|
199
71
|
</li>
|
|
200
72
|
<li>
|
|
201
73
|
<a href="{{basePath}}/info" class="side-link {{#if (startsWith currentPath '/info')}}active{{/if}}">
|
|
202
74
|
{{{icon "settings" class="h-4 w-4"}}}
|
|
203
75
|
Info & Settings
|
|
204
76
|
</a>
|
|
205
77
|
</li>
|
|
206
78
|
{{#unless readonly}}
|
|
207
79
|
<li>
|
|
208
80
|
<a href="{{basePath}}/designer" class="side-link {{#if (startsWith currentPath '/designer')}}active{{/if}}">
|
|
209
81
|
{{{icon "plus" class="h-4 w-4"}}}
|
|
210
82
|
New table
|
|
211
83
|
</a>
|
|
212
84
|
</li>
|
|
213
85
|
{{/unless}}
|
|
214
86
|
</ul>
|
|
215
87
|
<div class="mb-2 mt-6 flex items-center justify-between px-3">
|
|
216
88
|
<span class="text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Tables</span>
|
|
217
89
|
<span id="table-count" class="rounded-md bg-white/[0.06] px-1.5 py-0.5 text-[10px] font-semibold text-neutral-content/50">{{tables.length}}</span>
|
|
218
90
|
</div>
|
|
219
91
|
<ul id="table-list" class="space-y-0.5">
|
|
220
92
|
{{#each tables}}
|
|
221
93
|
<li class="table-item" data-name="{{this}}">
|
|
222
94
|
<a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
|
|
223
95
|
<span class="table-icon">
|
|
224
96
|
{{{icon "table" class="h-4 w-4"}}}
|
|
225
97
|
</span>
|
|
226
98
|
<span class="truncate">{{this}}</span>
|
|
227
99
|
</a>
|
|
228
100
|
</li>
|
|
229
101
|
{{else}}
|
|
230
102
|
<li class="px-3 py-2 text-xs text-neutral-content/40">No tables yet</li>
|
|
231
103
|
{{/each}}
|
|
232
104
|
</ul>
|
|
233
105
|
{{#if internalTables.length}}
|
|
234
106
|
<div class="mb-2 mt-6 px-3 text-[11px] font-semibold uppercase tracking-wider text-neutral-content/40">Internal</div>
|
|
235
107
|
<ul class="space-y-0.5">
|
|
236
108
|
{{#each internalTables}}
|
|
237
109
|
<li>
|
|
238
110
|
<a href="{{../basePath}}/tables/{{this}}" class="side-link {{#if (eq ../currentTable this)}}active{{/if}}">
|
|
239
111
|
<span class="table-icon">
|
|
240
112
|
{{{icon "book" class="h-4 w-4"}}}
|
|
241
113
|
</span>
|
|
242
114
|
<span class="truncate">{{this}}</span>
|
|
243
115
|
</a>
|
|
244
116
|
</li>
|
|
245
117
|
{{/each}}
|
|
246
118
|
</ul>
|
|
247
119
|
{{/if}}
|
|
248
120
|
</nav>
|
|
249
121
|
{{/if}}
|
|
250
122
|
{{#if isDefaultPassword}}
|
|
251
123
|
<div class="border-t border-white/10 px-4 py-2 bg-warning/10">
|
|
252
124
|
<div class="flex items-center justify-between text-warning text-xs font-semibold">
|
|
253
125
|
<span class="flex items-center gap-1.5 font-mono text-[11px]">
|
|
254
126
|
{{{icon "warning" class="h-3.5 w-3.5 shrink-0"}}}
|
|
255
127
|
default pass active
|
|
256
128
|
</span>
|
|
257
129
|
<span class="badge badge-warning badge-xs font-mono font-bold">admin</span>
|
|
258
130
|
</div>
|
|
259
131
|
</div>
|
|
260
132
|
{{/if}}
|
|
261
133
|
<div class="border-t border-white/10 px-5 py-3">
|
|
262
134
|
<div class="flex items-center justify-between">
|
|
263
135
|
<div class="text-[11px] font-medium uppercase tracking-wider text-neutral-content/40">{{#if databasesMode}}Directory{{else}}Engine: {{dialectName}}{{/if}}</div>
|
|
264
136
|
{{#unless databasesMode}}
|
|
265
137
|
{{#if readonly}}
|
|
266
138
|
<span class="rounded bg-warning/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-warning">Read-only</span>
|
|
267
139
|
{{else}}
|
|
268
140
|
<span class="rounded bg-success/20 px-1.5 py-0.5 text-[9px] font-bold uppercase text-success">Writable</span>
|
|
269
141
|
{{/if}}
|
|
270
142
|
{{/unless}}
|
|
271
143
|
</div>
|
|
272
144
|
<div class="mt-0.5 truncate font-mono text-[11px] text-neutral-content/60" title="{{dbPath}}">{{dbPath}}</div>
|
|
273
145
|
</div>
|