fdb2 1.0.6 → 1.0.7

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 (192) hide show
  1. package/.vscodeignore +45 -0
  2. package/README.md +24 -85
  3. package/dist/package.json +115 -0
  4. package/dist/pnpm-lock.yaml +7447 -0
  5. package/dist/public/explorer.css +244 -111
  6. package/dist/public/explorer.js +518 -275
  7. package/dist/scripts/preinstall.js +112 -0
  8. package/dist/server/index.d.ts.map +1 -1
  9. package/dist/server/index.js +4 -9
  10. package/dist/server/index.js.map +1 -1
  11. package/dist/server/index.ts +5 -10
  12. package/dist/server/service/connection.service.d.ts.map +1 -1
  13. package/dist/server/service/connection.service.js +1 -0
  14. package/dist/server/service/connection.service.js.map +1 -1
  15. package/dist/server/service/connection.service.ts +1 -0
  16. package/dist/server/service/database/base.service.d.ts +4 -0
  17. package/dist/server/service/database/base.service.d.ts.map +1 -1
  18. package/dist/server/service/database/base.service.js +3 -3
  19. package/dist/server/service/database/base.service.js.map +1 -1
  20. package/dist/server/service/database/base.service.ts +8 -3
  21. package/dist/server/service/database/cockroachdb.service.d.ts +5 -0
  22. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  23. package/dist/server/service/database/cockroachdb.service.js +112 -0
  24. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  25. package/dist/server/service/database/cockroachdb.service.ts +123 -0
  26. package/dist/server/service/database/database.service.d.ts +4 -0
  27. package/dist/server/service/database/database.service.d.ts.map +1 -1
  28. package/dist/server/service/database/database.service.js +8 -0
  29. package/dist/server/service/database/database.service.js.map +1 -1
  30. package/dist/server/service/database/database.service.ts +9 -0
  31. package/dist/server/service/database/mongodb.service.d.ts +6 -0
  32. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  33. package/dist/server/service/database/mongodb.service.js +8 -0
  34. package/dist/server/service/database/mongodb.service.js.map +1 -1
  35. package/dist/server/service/database/mongodb.service.ts +9 -0
  36. package/dist/server/service/database/mssql.service.d.ts +4 -0
  37. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  38. package/dist/server/service/database/mssql.service.js +105 -0
  39. package/dist/server/service/database/mssql.service.js.map +1 -1
  40. package/dist/server/service/database/mssql.service.ts +118 -0
  41. package/dist/server/service/database/mysql.service.d.ts +4 -0
  42. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  43. package/dist/server/service/database/mysql.service.js +116 -0
  44. package/dist/server/service/database/mysql.service.js.map +1 -1
  45. package/dist/server/service/database/mysql.service.ts +130 -0
  46. package/dist/server/service/database/oracle.service.d.ts +4 -0
  47. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  48. package/dist/server/service/database/oracle.service.js +114 -0
  49. package/dist/server/service/database/oracle.service.js.map +1 -1
  50. package/dist/server/service/database/oracle.service.ts +128 -0
  51. package/dist/server/service/database/postgres.service.d.ts +4 -0
  52. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  53. package/dist/server/service/database/postgres.service.js +120 -0
  54. package/dist/server/service/database/postgres.service.js.map +1 -1
  55. package/dist/server/service/database/postgres.service.ts +131 -0
  56. package/dist/server/service/database/sap.service.d.ts +4 -0
  57. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  58. package/dist/server/service/database/sap.service.js +107 -0
  59. package/dist/server/service/database/sap.service.js.map +1 -1
  60. package/dist/server/service/database/sap.service.ts +120 -0
  61. package/dist/server/service/database/sqlite.service.d.ts +5 -0
  62. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  63. package/dist/server/service/database/sqlite.service.js +133 -0
  64. package/dist/server/service/database/sqlite.service.js.map +1 -1
  65. package/dist/server/service/database/sqlite.service.ts +150 -0
  66. package/package.json +18 -9
  67. package/packages/vscode/.vscodeignore +44 -0
  68. package/packages/vscode/README.md +62 -0
  69. package/packages/vscode/out/database-services/base.service.js +236 -0
  70. package/packages/vscode/out/database-services/base.service.js.map +1 -0
  71. package/packages/vscode/out/database-services/cockroachdb.service.js +634 -0
  72. package/packages/vscode/out/database-services/cockroachdb.service.js.map +1 -0
  73. package/packages/vscode/out/database-services/connection.service.js +346 -0
  74. package/packages/vscode/out/database-services/connection.service.js.map +1 -0
  75. package/packages/vscode/out/database-services/database.service.js +571 -0
  76. package/packages/vscode/out/database-services/database.service.js.map +1 -0
  77. package/packages/vscode/out/database-services/index.js +18 -0
  78. package/packages/vscode/out/database-services/index.js.map +1 -0
  79. package/packages/vscode/out/database-services/model/connection.entity.js +11 -0
  80. package/packages/vscode/out/database-services/model/connection.entity.js.map +1 -0
  81. package/packages/vscode/out/database-services/model/database.entity.js +35 -0
  82. package/packages/vscode/out/database-services/model/database.entity.js.map +1 -0
  83. package/packages/vscode/out/database-services/mongodb.service.js +458 -0
  84. package/packages/vscode/out/database-services/mongodb.service.js.map +1 -0
  85. package/packages/vscode/out/database-services/mssql.service.js +694 -0
  86. package/packages/vscode/out/database-services/mssql.service.js.map +1 -0
  87. package/packages/vscode/out/database-services/mysql.service.js +735 -0
  88. package/packages/vscode/out/database-services/mysql.service.js.map +1 -0
  89. package/packages/vscode/out/database-services/oracle.service.js +787 -0
  90. package/packages/vscode/out/database-services/oracle.service.js.map +1 -0
  91. package/packages/vscode/out/database-services/postgres.service.js +696 -0
  92. package/packages/vscode/out/database-services/postgres.service.js.map +1 -0
  93. package/packages/vscode/out/database-services/sap.service.js +695 -0
  94. package/packages/vscode/out/database-services/sap.service.js.map +1 -0
  95. package/packages/vscode/out/database-services/sqlite.service.js +532 -0
  96. package/packages/vscode/out/database-services/sqlite.service.js.map +1 -0
  97. package/packages/vscode/out/extension.js +93 -0
  98. package/packages/vscode/out/extension.js.map +1 -0
  99. package/packages/vscode/out/provider/DatabaseTreeProvider.js +159 -0
  100. package/packages/vscode/out/provider/DatabaseTreeProvider.js.map +1 -0
  101. package/packages/vscode/out/provider/WebViewProvider.js +259 -0
  102. package/packages/vscode/out/provider/WebViewProvider.js.map +1 -0
  103. package/packages/vscode/out/service/ConnectionManager.js +105 -0
  104. package/packages/vscode/out/service/ConnectionManager.js.map +1 -0
  105. package/packages/vscode/out/service/DatabaseServiceBridge.js +395 -0
  106. package/packages/vscode/out/service/DatabaseServiceBridge.js.map +1 -0
  107. package/packages/vscode/out/typings/connection.js +3 -0
  108. package/packages/vscode/out/typings/connection.js.map +1 -0
  109. package/packages/vscode/package.json +142 -0
  110. package/packages/vscode/resources/icon.svg +5 -0
  111. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js +6529 -0
  112. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js.map +1 -0
  113. package/packages/vscode/resources/webview/connection.css +69 -0
  114. package/packages/vscode/resources/webview/connection.js +228 -0
  115. package/packages/vscode/resources/webview/connection.js.map +1 -0
  116. package/packages/vscode/resources/webview/database.css +259 -0
  117. package/packages/vscode/resources/webview/database.js +275 -0
  118. package/packages/vscode/resources/webview/database.js.map +1 -0
  119. package/packages/vscode/resources/webview/favicon.ico +0 -0
  120. package/packages/vscode/resources/webview/index.html +9 -0
  121. package/packages/vscode/resources/webview/modules/header.tpl +14 -0
  122. package/packages/vscode/resources/webview/modules/initial_state.tpl +55 -0
  123. package/packages/vscode/resources/webview/query.css +162 -0
  124. package/packages/vscode/resources/webview/query.js +198 -0
  125. package/packages/vscode/resources/webview/query.js.map +1 -0
  126. package/packages/vscode/src/database-services/base.service.js.map +1 -0
  127. package/packages/vscode/src/database-services/base.service.ts +363 -0
  128. package/packages/vscode/src/database-services/cockroachdb.service.js.map +1 -0
  129. package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -0
  130. package/packages/vscode/src/database-services/connection.service.ts +341 -0
  131. package/packages/vscode/src/database-services/database.service.ts +630 -0
  132. package/packages/vscode/src/database-services/index.ts +7 -0
  133. package/packages/vscode/src/database-services/model/connection.entity.js +11 -0
  134. package/packages/vscode/src/database-services/model/connection.entity.js.map +1 -0
  135. package/packages/vscode/src/database-services/model/connection.entity.ts +66 -0
  136. package/packages/vscode/src/database-services/model/database.entity.js +35 -0
  137. package/packages/vscode/src/database-services/model/database.entity.js.map +1 -0
  138. package/packages/vscode/src/database-services/model/database.entity.ts +246 -0
  139. package/packages/vscode/src/database-services/mongodb.service.js.map +1 -0
  140. package/packages/vscode/src/database-services/mongodb.service.ts +454 -0
  141. package/packages/vscode/src/database-services/mssql.service.js.map +1 -0
  142. package/packages/vscode/src/database-services/mssql.service.ts +723 -0
  143. package/packages/vscode/src/database-services/mysql.service.js.map +1 -0
  144. package/packages/vscode/src/database-services/mysql.service.ts +761 -0
  145. package/packages/vscode/src/database-services/oracle.service.js.map +1 -0
  146. package/packages/vscode/src/database-services/oracle.service.ts +832 -0
  147. package/packages/vscode/src/database-services/postgres.service.js.map +1 -0
  148. package/packages/vscode/src/database-services/postgres.service.ts +741 -0
  149. package/packages/vscode/src/database-services/sap.service.js.map +1 -0
  150. package/packages/vscode/src/database-services/sap.service.ts +713 -0
  151. package/packages/vscode/src/database-services/sqlite.service.js.map +1 -0
  152. package/packages/vscode/src/database-services/sqlite.service.ts +559 -0
  153. package/packages/vscode/src/extension.ts +76 -0
  154. package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -0
  155. package/packages/vscode/src/provider/WebViewProvider.ts +277 -0
  156. package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -0
  157. package/packages/vscode/src/typings/connection.ts +90 -0
  158. package/packages/vscode/tsconfig.json +21 -0
  159. package/public/fdb2.png +0 -0
  160. package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
  161. package/server/index.ts +5 -10
  162. package/server/model/connection.entity.js +11 -0
  163. package/server/model/connection.entity.js.map +1 -0
  164. package/server/model/database.entity.js +35 -0
  165. package/server/model/database.entity.js.map +1 -0
  166. package/server/service/connection.service.ts +1 -0
  167. package/server/service/database/base.service.ts +8 -3
  168. package/server/service/database/cockroachdb.service.ts +123 -0
  169. package/server/service/database/database.service.ts +9 -0
  170. package/server/service/database/mongodb.service.ts +9 -0
  171. package/server/service/database/mssql.service.ts +118 -0
  172. package/server/service/database/mysql.service.ts +130 -0
  173. package/server/service/database/oracle.service.ts +128 -0
  174. package/server/service/database/postgres.service.ts +131 -0
  175. package/server/service/database/sap.service.ts +120 -0
  176. package/server/service/database/sqlite.service.ts +150 -0
  177. package/server/tsconfig.json +20 -0
  178. package/src/components/connection-editor/index.vue +0 -1
  179. package/src/platform/database/components/db-tools.vue +414 -174
  180. package/src/platform/database/components/table-detail.vue +1 -0
  181. package/src/platform/database/components/table-editor.vue +245 -18
  182. package/src/platform/vscode/bridge.ts +121 -0
  183. package/src/platform/vscode/components/ConnectionPanel.vue +272 -0
  184. package/src/platform/vscode/components/DatabasePanel.vue +532 -0
  185. package/src/platform/vscode/components/QueryPanel.vue +371 -0
  186. package/src/platform/vscode/entry/connection.ts +13 -0
  187. package/src/platform/vscode/entry/database.ts +13 -0
  188. package/src/platform/vscode/entry/query.ts +13 -0
  189. package/src/platform/vscode/index.ts +5 -0
  190. package/src/service/database.ts +2 -6
  191. package/vite.config.ts +46 -6
  192. package/vite.config.vscode.ts +47 -0
@@ -0,0 +1,275 @@
1
+ import { d as defineComponent, g as getVSCodeBridge, o as onMounted, a as openBlock, c as createElementBlock, b as createBaseVNode, w as withDirectives, e as vModelSelect, F as Fragment, r as renderList, t as toDisplayString, n as normalizeClass, m as vShow, f as createCommentVNode, h as withModifiers, i as ref, _ as _export_sfc, k as createApp } from "./_plugin-vue_export-helper.js";
2
+ const _hoisted_1 = { class: "database-panel" };
3
+ const _hoisted_2 = { style: { "margin-bottom": "20px" } };
4
+ const _hoisted_3 = ["value"];
5
+ const _hoisted_4 = { id: "contentArea" };
6
+ const _hoisted_5 = {
7
+ key: 0,
8
+ class: "loading"
9
+ };
10
+ const _hoisted_6 = {
11
+ key: 1,
12
+ class: "empty-state"
13
+ };
14
+ const _hoisted_7 = { key: 2 };
15
+ const _hoisted_8 = { class: "tabs" };
16
+ const _hoisted_9 = ["onClick"];
17
+ const _hoisted_10 = { class: "tab-content active" };
18
+ const _hoisted_11 = { class: "database-grid" };
19
+ const _hoisted_12 = ["onClick"];
20
+ const _hoisted_13 = { class: "database-header" };
21
+ const _hoisted_14 = { class: "database-name" };
22
+ const _hoisted_15 = { class: "database-info" };
23
+ const _hoisted_16 = { class: "database-stat" };
24
+ const _hoisted_17 = { class: "database-stat" };
25
+ const _hoisted_18 = { class: "tab-content" };
26
+ const _hoisted_19 = { class: "database-grid" };
27
+ const _hoisted_20 = ["onClick"];
28
+ const _hoisted_21 = { class: "database-header" };
29
+ const _hoisted_22 = { class: "database-name" };
30
+ const _hoisted_23 = { class: "database-info" };
31
+ const _hoisted_24 = { class: "database-stat" };
32
+ const _hoisted_25 = { class: "database-stat" };
33
+ const _hoisted_26 = { class: "tab-content" };
34
+ const _hoisted_27 = { class: "table-list" };
35
+ const _hoisted_28 = { class: "table-icon" };
36
+ const _hoisted_29 = { class: "table-info" };
37
+ const _hoisted_30 = { class: "table-name" };
38
+ const _hoisted_31 = {
39
+ key: 0,
40
+ class: "table-comment"
41
+ };
42
+ const _hoisted_32 = {
43
+ key: 1,
44
+ class: "table-meta"
45
+ };
46
+ const _hoisted_33 = { class: "table-actions" };
47
+ const _hoisted_34 = ["onClick"];
48
+ const _hoisted_35 = ["onClick"];
49
+ const _sfc_main = /* @__PURE__ */ defineComponent({
50
+ __name: "DatabasePanel",
51
+ setup(__props) {
52
+ const vscode = getVSCodeBridge();
53
+ const connections = ref([]);
54
+ const selectedConnectionId = ref("");
55
+ const databases = ref([]);
56
+ const tables = ref([]);
57
+ const loading = ref(false);
58
+ const currentTab = ref("overview");
59
+ const tabs = [
60
+ { id: "overview", name: "概览" },
61
+ { id: "databases", name: "数据库" },
62
+ { id: "tables", name: "表" }
63
+ ];
64
+ onMounted(() => {
65
+ vscode.postMessage({ command: "getConnections" });
66
+ vscode.onMessage((message) => {
67
+ if (message.command === "connections") {
68
+ connections.value = message.data;
69
+ } else if (message.command === "selectConnection") {
70
+ selectConnection(message.data);
71
+ } else if (message.command === "databases") {
72
+ databases.value = message.data;
73
+ loading.value = false;
74
+ } else if (message.command === "tables") {
75
+ tables.value = message.data;
76
+ loading.value = false;
77
+ } else if (message.command === "error") {
78
+ handleError(message.data);
79
+ }
80
+ });
81
+ });
82
+ function handleAddConnection() {
83
+ vscode.postMessage({ command: "addConnection" });
84
+ }
85
+ function handleConnectionChange() {
86
+ if (selectedConnectionId.value) {
87
+ const connection = connections.value.find((c) => c.id === selectedConnectionId.value);
88
+ selectConnection(connection);
89
+ } else {
90
+ databases.value = [];
91
+ tables.value = [];
92
+ }
93
+ }
94
+ function selectConnection(connection) {
95
+ if (!connection) return;
96
+ selectedConnectionId.value = connection.id;
97
+ loading.value = true;
98
+ vscode.postMessage({
99
+ command: "getDatabases",
100
+ data: { connectionId: connection.id }
101
+ });
102
+ }
103
+ function selectDatabase(database) {
104
+ loading.value = true;
105
+ currentTab.value = "tables";
106
+ vscode.postMessage({
107
+ command: "getTables",
108
+ data: {
109
+ connectionId: selectedConnectionId.value,
110
+ databaseName: database.name
111
+ }
112
+ });
113
+ }
114
+ function handleViewData(table) {
115
+ vscode.postMessage({
116
+ command: "openTableData",
117
+ data: {
118
+ connectionId: selectedConnectionId.value,
119
+ tableName: table.name
120
+ }
121
+ });
122
+ }
123
+ function handleViewStructure(table) {
124
+ vscode.postMessage({
125
+ command: "openTableStructure",
126
+ data: {
127
+ connectionId: selectedConnectionId.value,
128
+ tableName: table.name
129
+ }
130
+ });
131
+ }
132
+ function handleError(error) {
133
+ loading.value = false;
134
+ console.error("Error:", error);
135
+ alert(`操作失败: ${error}`);
136
+ }
137
+ return (_ctx, _cache) => {
138
+ return openBlock(), createElementBlock("div", _hoisted_1, [
139
+ createBaseVNode("div", { class: "panel-header" }, [
140
+ _cache[1] || (_cache[1] = createBaseVNode("h1", { class: "panel-title" }, "数据库管理", -1)),
141
+ createBaseVNode("div", { class: "panel-actions" }, [
142
+ createBaseVNode("button", {
143
+ onClick: handleAddConnection,
144
+ class: "btn btn-secondary"
145
+ }, "添加连接")
146
+ ])
147
+ ]),
148
+ createBaseVNode("div", _hoisted_2, [
149
+ withDirectives(createBaseVNode("select", {
150
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedConnectionId.value = $event),
151
+ class: "connection-selector",
152
+ onChange: handleConnectionChange
153
+ }, [
154
+ _cache[2] || (_cache[2] = createBaseVNode("option", { value: "" }, "选择数据库连接", -1)),
155
+ (openBlock(true), createElementBlock(Fragment, null, renderList(connections.value, (conn) => {
156
+ return openBlock(), createElementBlock("option", {
157
+ key: conn.id,
158
+ value: conn.id
159
+ }, toDisplayString(conn.name) + " (" + toDisplayString(conn.host) + ":" + toDisplayString(conn.port) + ") ", 9, _hoisted_3);
160
+ }), 128))
161
+ ], 544), [
162
+ [vModelSelect, selectedConnectionId.value]
163
+ ])
164
+ ]),
165
+ createBaseVNode("div", _hoisted_4, [
166
+ loading.value ? (openBlock(), createElementBlock("div", _hoisted_5, [..._cache[3] || (_cache[3] = [
167
+ createBaseVNode("div", { class: "spinner" }, null, -1),
168
+ createBaseVNode("div", null, "加载中...", -1)
169
+ ])])) : !selectedConnectionId.value ? (openBlock(), createElementBlock("div", _hoisted_6, [..._cache[4] || (_cache[4] = [
170
+ createBaseVNode("div", { class: "empty-icon" }, "🗄️", -1),
171
+ createBaseVNode("div", { class: "empty-title" }, "未选择连接", -1),
172
+ createBaseVNode("div", { class: "empty-text" }, "请从下拉列表中选择一个数据库连接", -1)
173
+ ])])) : (openBlock(), createElementBlock("div", _hoisted_7, [
174
+ createBaseVNode("div", _hoisted_8, [
175
+ (openBlock(), createElementBlock(Fragment, null, renderList(tabs, (tab) => {
176
+ return createBaseVNode("button", {
177
+ key: tab.id,
178
+ class: normalizeClass(["tab", { active: currentTab.value === tab.id }]),
179
+ onClick: ($event) => currentTab.value = tab.id
180
+ }, toDisplayString(tab.name), 11, _hoisted_9);
181
+ }), 64))
182
+ ]),
183
+ withDirectives(createBaseVNode("div", _hoisted_10, [
184
+ _cache[6] || (_cache[6] = createBaseVNode("h3", { class: "section-title" }, "数据库概览", -1)),
185
+ createBaseVNode("div", _hoisted_11, [
186
+ (openBlock(true), createElementBlock(Fragment, null, renderList(databases.value, (db) => {
187
+ return openBlock(), createElementBlock("div", {
188
+ key: db.name,
189
+ class: "database-card",
190
+ onClick: ($event) => selectDatabase(db)
191
+ }, [
192
+ createBaseVNode("div", _hoisted_13, [
193
+ _cache[5] || (_cache[5] = createBaseVNode("div", { class: "database-icon" }, "🗄️", -1)),
194
+ createBaseVNode("div", _hoisted_14, toDisplayString(db.name), 1)
195
+ ]),
196
+ createBaseVNode("div", _hoisted_15, [
197
+ createBaseVNode("span", _hoisted_16, "📊 " + toDisplayString(db.tables) + " 表", 1),
198
+ createBaseVNode("span", _hoisted_17, "💾 " + toDisplayString(db.size), 1)
199
+ ])
200
+ ], 8, _hoisted_12);
201
+ }), 128))
202
+ ])
203
+ ], 512), [
204
+ [vShow, currentTab.value === "overview"]
205
+ ]),
206
+ withDirectives(createBaseVNode("div", _hoisted_18, [
207
+ _cache[8] || (_cache[8] = createBaseVNode("h3", { class: "section-title" }, "数据库列表", -1)),
208
+ createBaseVNode("div", _hoisted_19, [
209
+ (openBlock(true), createElementBlock(Fragment, null, renderList(databases.value, (db) => {
210
+ return openBlock(), createElementBlock("div", {
211
+ key: db.name,
212
+ class: "database-card",
213
+ onClick: ($event) => selectDatabase(db)
214
+ }, [
215
+ createBaseVNode("div", _hoisted_21, [
216
+ _cache[7] || (_cache[7] = createBaseVNode("div", { class: "database-icon" }, "🗄️", -1)),
217
+ createBaseVNode("div", _hoisted_22, toDisplayString(db.name), 1)
218
+ ]),
219
+ createBaseVNode("div", _hoisted_23, [
220
+ createBaseVNode("span", _hoisted_24, "📊 " + toDisplayString(db.tables) + " 表", 1),
221
+ createBaseVNode("span", _hoisted_25, "💾 " + toDisplayString(db.size), 1)
222
+ ])
223
+ ], 8, _hoisted_20);
224
+ }), 128))
225
+ ])
226
+ ], 512), [
227
+ [vShow, currentTab.value === "databases"]
228
+ ]),
229
+ withDirectives(createBaseVNode("div", _hoisted_26, [
230
+ _cache[9] || (_cache[9] = createBaseVNode("h3", { class: "section-title" }, "表列表", -1)),
231
+ createBaseVNode("div", _hoisted_27, [
232
+ (openBlock(true), createElementBlock(Fragment, null, renderList(tables.value, (table) => {
233
+ return openBlock(), createElementBlock("div", {
234
+ key: table.name,
235
+ class: "table-item"
236
+ }, [
237
+ createBaseVNode("div", _hoisted_28, toDisplayString(table.type === "table" ? "📋" : "👁️"), 1),
238
+ createBaseVNode("div", _hoisted_29, [
239
+ createBaseVNode("div", _hoisted_30, toDisplayString(table.name), 1),
240
+ table.comment ? (openBlock(), createElementBlock("div", _hoisted_31, toDisplayString(table.comment), 1)) : createCommentVNode("", true),
241
+ table.rows !== null ? (openBlock(), createElementBlock("div", _hoisted_32, [
242
+ createBaseVNode("span", null, toDisplayString(table.rows.toLocaleString()) + " 行", 1),
243
+ createBaseVNode("span", null, toDisplayString(table.engine || ""), 1),
244
+ createBaseVNode("span", null, toDisplayString(table.size || ""), 1)
245
+ ])) : createCommentVNode("", true)
246
+ ]),
247
+ createBaseVNode("span", {
248
+ class: normalizeClass(["table-type", table.type])
249
+ }, toDisplayString(table.type === "table" ? "TABLE" : "VIEW"), 3),
250
+ createBaseVNode("div", _hoisted_33, [
251
+ createBaseVNode("button", {
252
+ class: "action-btn",
253
+ onClick: withModifiers(($event) => handleViewData(table), ["stop"])
254
+ }, "数据", 8, _hoisted_34),
255
+ createBaseVNode("button", {
256
+ class: "action-btn",
257
+ onClick: withModifiers(($event) => handleViewStructure(table), ["stop"])
258
+ }, "结构", 8, _hoisted_35)
259
+ ])
260
+ ]);
261
+ }), 128))
262
+ ])
263
+ ], 512), [
264
+ [vShow, currentTab.value === "tables"]
265
+ ])
266
+ ]))
267
+ ])
268
+ ]);
269
+ };
270
+ }
271
+ });
272
+ const DatabasePanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-974a0a17"]]);
273
+ const app = createApp(DatabasePanel);
274
+ app.mount("#app");
275
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sources":["../../../../src/platform/vscode/components/DatabasePanel.vue","../../../../src/platform/vscode/entry/database.ts"],"sourcesContent":["<template>\r\n <div class=\"database-panel\">\r\n <div class=\"panel-header\">\r\n <h1 class=\"panel-title\">数据库管理</h1>\r\n <div class=\"panel-actions\">\r\n <button @click=\"handleAddConnection\" class=\"btn btn-secondary\">添加连接</button>\r\n </div>\r\n </div>\r\n\r\n <div style=\"margin-bottom: 20px;\">\r\n <select v-model=\"selectedConnectionId\" class=\"connection-selector\" @change=\"handleConnectionChange\">\r\n <option value=\"\">选择数据库连接</option>\r\n <option v-for=\"conn in connections\" :key=\"conn.id\" :value=\"conn.id\">\r\n {{ conn.name }} ({{ conn.host }}:{{ conn.port }})\r\n </option>\r\n </select>\r\n </div>\r\n\r\n <div id=\"contentArea\">\r\n <div v-if=\"loading\" class=\"loading\">\r\n <div class=\"spinner\"></div>\r\n <div>加载中...</div>\r\n </div>\r\n <div v-else-if=\"!selectedConnectionId\" class=\"empty-state\">\r\n <div class=\"empty-icon\">🗄️</div>\r\n <div class=\"empty-title\">未选择连接</div>\r\n <div class=\"empty-text\">请从下拉列表中选择一个数据库连接</div>\r\n </div>\r\n <div v-else>\r\n <div class=\"tabs\">\r\n <button\r\n v-for=\"tab in tabs\"\r\n :key=\"tab.id\"\r\n :class=\"['tab', { active: currentTab === tab.id }]\"\r\n @click=\"currentTab = tab.id\"\r\n >\r\n {{ tab.name }}\r\n </button>\r\n </div>\r\n\r\n <div v-show=\"currentTab === 'overview'\" class=\"tab-content active\">\r\n <h3 class=\"section-title\">数据库概览</h3>\r\n <div class=\"database-grid\">\r\n <div\r\n v-for=\"db in databases\"\r\n :key=\"db.name\"\r\n class=\"database-card\"\r\n @click=\"selectDatabase(db)\"\r\n >\r\n <div class=\"database-header\">\r\n <div class=\"database-icon\">🗄️</div>\r\n <div class=\"database-name\">{{ db.name }}</div>\r\n </div>\r\n <div class=\"database-info\">\r\n <span class=\"database-stat\">📊 {{ db.tables }} 表</span>\r\n <span class=\"database-stat\">💾 {{ db.size }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-show=\"currentTab === 'databases'\" class=\"tab-content\">\r\n <h3 class=\"section-title\">数据库列表</h3>\r\n <div class=\"database-grid\">\r\n <div\r\n v-for=\"db in databases\"\r\n :key=\"db.name\"\r\n class=\"database-card\"\r\n @click=\"selectDatabase(db)\"\r\n >\r\n <div class=\"database-header\">\r\n <div class=\"database-icon\">🗄️</div>\r\n <div class=\"database-name\">{{ db.name }}</div>\r\n </div>\r\n <div class=\"database-info\">\r\n <span class=\"database-stat\">📊 {{ db.tables }} 表</span>\r\n <span class=\"database-stat\">💾 {{ db.size }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-show=\"currentTab === 'tables'\" class=\"tab-content\">\r\n <h3 class=\"section-title\">表列表</h3>\r\n <div class=\"table-list\">\r\n <div\r\n v-for=\"table in tables\"\r\n :key=\"table.name\"\r\n class=\"table-item\"\r\n >\r\n <div class=\"table-icon\">{{ table.type === 'table' ? '📋' : '👁️' }}</div>\r\n <div class=\"table-info\">\r\n <div class=\"table-name\">{{ table.name }}</div>\r\n <div v-if=\"table.comment\" class=\"table-comment\">{{ table.comment }}</div>\r\n <div v-if=\"table.rows !== null\" class=\"table-meta\">\r\n <span>{{ table.rows.toLocaleString() }} 行</span>\r\n <span>{{ table.engine || '' }}</span>\r\n <span>{{ table.size || '' }}</span>\r\n </div>\r\n </div>\r\n <span :class=\"['table-type', table.type]\">{{ table.type === 'table' ? 'TABLE' : 'VIEW' }}</span>\r\n <div class=\"table-actions\">\r\n <button class=\"action-btn\" @click.stop=\"handleViewData(table)\">数据</button>\r\n <button class=\"action-btn\" @click.stop=\"handleViewStructure(table)\">结构</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, reactive, computed, onMounted } from 'vue';\r\nimport { getVSCodeBridge } from '../bridge';\r\n\r\nconst vscode = getVSCodeBridge();\r\n\r\nconst connections = ref<any[]>([]);\r\nconst selectedConnectionId = ref('');\r\nconst databases = ref<any[]>([]);\r\nconst tables = ref<any[]>([]);\r\nconst loading = ref(false);\r\nconst currentTab = ref('overview');\r\n\r\nconst selectedConnection = computed(() => {\r\n return connections.value.find(c => c.id === selectedConnectionId.value);\r\n});\r\n\r\nconst tabs = [\r\n { id: 'overview', name: '概览' },\r\n { id: 'databases', name: '数据库' },\r\n { id: 'tables', name: '表' }\r\n];\r\n\r\nonMounted(() => {\r\n // 请求连接列表\r\n vscode.postMessage({ command: 'getConnections' });\r\n\r\n // 监听来自扩展的消息\r\n vscode.onMessage((message: any) => {\r\n if (message.command === 'connections') {\r\n connections.value = message.data;\r\n } else if (message.command === 'selectConnection') {\r\n selectConnection(message.data);\r\n } else if (message.command === 'databases') {\r\n databases.value = message.data;\r\n loading.value = false;\r\n } else if (message.command === 'tables') {\r\n tables.value = message.data;\r\n loading.value = false;\r\n } else if (message.command === 'error') {\r\n handleError(message.data);\r\n }\r\n });\r\n});\r\n\r\nfunction handleAddConnection() {\r\n vscode.postMessage({ command: 'addConnection' });\r\n}\r\n\r\nfunction handleConnectionChange() {\r\n if (selectedConnectionId.value) {\r\n const connection = connections.value.find(c => c.id === selectedConnectionId.value);\r\n selectConnection(connection);\r\n } else {\r\n databases.value = [];\r\n tables.value = [];\r\n }\r\n}\r\n\r\nfunction selectConnection(connection: any) {\r\n if (!connection) return;\r\n\r\n selectedConnectionId.value = connection.id;\r\n loading.value = true;\r\n\r\n // 请求数据库列表\r\n vscode.postMessage({\r\n command: 'getDatabases',\r\n data: { connectionId: connection.id }\r\n });\r\n}\r\n\r\nfunction selectDatabase(database: any) {\r\n loading.value = true;\r\n currentTab.value = 'tables';\r\n\r\n // 请求表列表\r\n vscode.postMessage({\r\n command: 'getTables',\r\n data: {\r\n connectionId: selectedConnectionId.value,\r\n databaseName: database.name\r\n }\r\n });\r\n}\r\n\r\nfunction handleViewData(table: any) {\r\n vscode.postMessage({\r\n command: 'openTableData',\r\n data: {\r\n connectionId: selectedConnectionId.value,\r\n tableName: table.name\r\n }\r\n });\r\n}\r\n\r\nfunction handleViewStructure(table: any) {\r\n vscode.postMessage({\r\n command: 'openTableStructure',\r\n data: {\r\n connectionId: selectedConnectionId.value,\r\n tableName: table.name\r\n }\r\n });\r\n}\r\n\r\nfunction handleError(error: string) {\r\n loading.value = false;\r\n console.error('Error:', error);\r\n alert(`操作失败: ${error}`);\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.database-panel {\r\n padding: 16px;\r\n height: 100vh;\r\n overflow: auto;\r\n}\r\n\r\n.panel-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 20px;\r\n padding-bottom: 16px;\r\n border-bottom: 1px solid var(--vscode-panel-border);\r\n}\r\n\r\n.panel-title {\r\n font-size: 18px;\r\n font-weight: 600;\r\n margin: 0;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.panel-actions {\r\n display: flex;\r\n gap: 8px;\r\n}\r\n\r\n.connection-selector {\r\n width: 300px;\r\n padding: 6px 10px;\r\n border: 1px solid var(--vscode-input-border);\r\n background-color: var(--vscode-input-background);\r\n color: var(--vscode-input-foreground);\r\n border-radius: 4px;\r\n font-size: 13px;\r\n}\r\n\r\n.btn {\r\n padding: 6px 14px;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 13px;\r\n cursor: pointer;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.btn-primary {\r\n background-color: var(--vscode-button-background);\r\n color: var(--vscode-button-foreground);\r\n}\r\n\r\n.btn-primary:hover {\r\n background-color: var(--vscode-button-hoverBackground);\r\n}\r\n\r\n.btn-secondary {\r\n background-color: var(--vscode-button-secondaryBackground);\r\n color: var(--vscode-button-secondaryForeground);\r\n}\r\n\r\n.btn-secondary:hover {\r\n background-color: var(--vscode-button-secondaryHoverBackground);\r\n}\r\n\r\n.database-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n gap: 16px;\r\n}\r\n\r\n.database-card {\r\n padding: 16px;\r\n background-color: var(--vscode-editor-background);\r\n border: 1px solid var(--vscode-panel-border);\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n}\r\n\r\n.database-card:hover {\r\n border-color: var(--vscode-focusBorder);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n transform: translateY(-2px);\r\n}\r\n\r\n.database-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.database-icon {\r\n font-size: 28px;\r\n color: var(--vscode-textLink-foreground);\r\n}\r\n\r\n.database-name {\r\n flex: 1;\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.database-info {\r\n display: flex;\r\n gap: 16px;\r\n font-size: 12px;\r\n color: var(--vscode-descriptionForeground);\r\n}\r\n\r\n.database-stat {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.section-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n margin: 24px 0 16px 0;\r\n padding-bottom: 8px;\r\n border-bottom: 1px solid var(--vscode-panel-border);\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.tabs {\r\n display: flex;\r\n gap: 4px;\r\n margin-bottom: 16px;\r\n border-bottom: 1px solid var(--vscode-panel-border);\r\n}\r\n\r\n.tab {\r\n padding: 8px 16px;\r\n border: none;\r\n background-color: transparent;\r\n color: var(--vscode-foreground);\r\n font-size: 13px;\r\n cursor: pointer;\r\n border-bottom: 2px solid transparent;\r\n transition: all 0.2s;\r\n}\r\n\r\n.tab:hover {\r\n background-color: var(--vscode-list-hoverBackground);\r\n}\r\n\r\n.tab.active {\r\n border-bottom-color: var(--vscode-focusBorder);\r\n color: var(--vscode-textLink-foreground);\r\n}\r\n\r\n.tab-content {\r\n display: none;\r\n}\r\n\r\n.tab-content.active {\r\n display: block;\r\n}\r\n\r\n.table-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.table-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 12px;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n transition: background-color 0.2s;\r\n}\r\n\r\n.table-item:hover {\r\n background-color: var(--vscode-list-hoverBackground);\r\n}\r\n\r\n.table-icon {\r\n font-size: 20px;\r\n color: var(--vscode-textLink-foreground);\r\n width: 24px;\r\n text-align: center;\r\n}\r\n\r\n.table-info {\r\n flex: 1;\r\n}\r\n\r\n.table-name {\r\n font-size: 14px;\r\n font-weight: 500;\r\n margin-bottom: 2px;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.table-comment {\r\n font-size: 12px;\r\n color: var(--vscode-descriptionForeground);\r\n}\r\n\r\n.table-meta {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n font-size: 12px;\r\n color: var(--vscode-descriptionForeground);\r\n margin-top: 4px;\r\n}\r\n\r\n.table-type {\r\n padding: 2px 8px;\r\n border-radius: 12px;\r\n background-color: var(--vscode-badge-background);\r\n font-weight: 500;\r\n font-size: 12px;\r\n}\r\n\r\n.table-type.table {\r\n background-color: var(--vscode-badge-background);\r\n}\r\n\r\n.table-type.view {\r\n background-color: var(--vscode-gitDecorationModifiedResourceForeground);\r\n color: white;\r\n}\r\n\r\n.table-actions {\r\n display: flex;\r\n gap: 8px;\r\n opacity: 0;\r\n transition: opacity 0.2s;\r\n}\r\n\r\n.table-item:hover .table-actions {\r\n opacity: 1;\r\n}\r\n\r\n.action-btn {\r\n padding: 4px 8px;\r\n font-size: 12px;\r\n background-color: var(--vscode-button-secondaryBackground);\r\n color: var(--vscode-button-secondaryForeground);\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n}\r\n\r\n.action-btn:hover {\r\n background-color: var(--vscode-button-secondaryHoverBackground);\r\n}\r\n\r\n.empty-state {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 80px 20px;\r\n text-align: center;\r\n}\r\n\r\n.empty-icon {\r\n font-size: 64px;\r\n margin-bottom: 16px;\r\n opacity: 0.3;\r\n}\r\n\r\n.empty-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n margin-bottom: 8px;\r\n color: var(--vscode-foreground);\r\n}\r\n\r\n.empty-text {\r\n font-size: 14px;\r\n color: var(--vscode-descriptionForeground);\r\n}\r\n\r\n.loading {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 40px;\r\n}\r\n\r\n.spinner {\r\n width: 32px;\r\n height: 32px;\r\n border: 3px solid var(--vscode-progressBar-background);\r\n border-top-color: var(--vscode-progressBar-foreground);\r\n border-radius: 50%;\r\n animation: spin 0.6s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n</style>\r\n","/**\r\n * VSCode WebView - Database Entry Point\r\n * 数据库管理面板入口\r\n */\r\n\r\nimport { createApp } from 'vue';\r\nimport DatabasePanel from '../components/DatabasePanel.vue';\r\n\r\n// 创建 Vue 应用\r\nconst app = createApp(DatabasePanel);\r\n\r\n// 挂载\r\napp.mount('#app');\r\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_Fragment","_renderList","_toDisplayString","_normalizeClass","_withDirectives","_withModifiers"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ {% include "./modules/header.tpl" %}
4
+ <body>
5
+ <div id="app" class="min-vh-100"></div>
6
+ <script type="module" lang="ts" src="{{prefix}}/src/platform/index.ts">
7
+ </script>
8
+ </body>
9
+ </html>
@@ -0,0 +1,14 @@
1
+ <head>
2
+ <meta charset="UTF-8" />
3
+ <base href="{{viteTarget}}" />
4
+ {% include "./initial_state.tpl" %}
5
+ <link rel="icon" href="{{prefix}}/public/favicon.png" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>数据库管理</title>
8
+ <meta name="description" content="{{description}}">
9
+ <script>
10
+ window.addEventListener('vite:preloadError', function (event) {
11
+ console.error(event);
12
+ });
13
+ </script>
14
+ </head>
@@ -0,0 +1,55 @@
1
+ <script type="text/template" id="__INITIAL_STATE__">
2
+ {{ data | dump | safe }}
3
+ </script>
4
+ <script type="text/template" id="__DEFAULTINITIAL_STATE__">
5
+ {{ __DEFAULTINITIAL_STATE__ }}
6
+ </script>
7
+ <script>
8
+ function __get_templateJson(id) {
9
+ try {
10
+ var tag = document.getElementById(id);
11
+ var obj = JSON.parse(tag.innerHTML);
12
+ return obj;
13
+ }
14
+ catch (e) {
15
+ return null;
16
+ }
17
+ }
18
+ var __INITIAL_STATE__ = __get_templateJson('__INITIAL_STATE__');
19
+ if(!__INITIAL_STATE__) __INITIAL_STATE__ = __get_templateJson('__DEFAULTINITIAL_STATE__');
20
+ // 动态加载入口
21
+ function __vitejs_load_entry(url, type) {
22
+ if(!url) return;
23
+ if(url.indexOf('/') !== 0) url = '/' + url;
24
+ var prefix = (window.__INITIAL_STATE__ && window.__INITIAL_STATE__.config && window.__INITIAL_STATE__.config.prefix) || '';
25
+ if(prefix && url.indexOf(prefix) !== 0) {
26
+ url = prefix + url;
27
+ }
28
+ var nodeObj;
29
+ switch(type) {
30
+ case 'script': {
31
+ // 检查是否已加载过
32
+ var existing = document.querySelector(`script[src="${url}"]`);
33
+ if(existing) return;
34
+ nodeObj = document.createElement('script');
35
+ nodeObj.src = url;
36
+ nodeObj.type = 'module';
37
+ break;
38
+ }
39
+ case 'stylesheet':
40
+ case 'modulepreload':
41
+ case 'icon': {
42
+ // 检查是否已加载过
43
+ var existing = document.querySelector(`link[href="${url}"]`);
44
+ if(existing) return;
45
+ nodeObj = document.createElement('link');
46
+ nodeObj.href = url;
47
+ nodeObj.rel = type;
48
+ break;
49
+ }
50
+ }
51
+ if(!nodeObj) return;
52
+ nodeObj.crossOrigin = 'crossorigin';
53
+ document.head.appendChild(nodeObj);
54
+ }
55
+ </script>
@@ -0,0 +1,162 @@
1
+
2
+ .query-panel[data-v-eaf4025e] {
3
+ display: flex;
4
+ flex-direction: column;
5
+ height: 100vh;
6
+ overflow: hidden;
7
+ }
8
+ .query-toolbar[data-v-eaf4025e] {
9
+ display: flex;
10
+ align-items: center;
11
+ gap: 12px;
12
+ padding: 12px;
13
+ background-color: var(--vscode-editorGroupHeader-tabsBackground);
14
+ border-bottom: 1px solid var(--vscode-panel-border);
15
+ }
16
+ .query-selector[data-v-eaf4025e] {
17
+ min-width: 200px;
18
+ padding: 6px 10px;
19
+ border: 1px solid var(--vscode-input-border);
20
+ background-color: var(--vscode-input-background);
21
+ color: var(--vscode-input-foreground);
22
+ border-radius: 4px;
23
+ }
24
+ .btn[data-v-eaf4025e] {
25
+ padding: 6px 14px;
26
+ border: none;
27
+ border-radius: 4px;
28
+ font-size: 13px;
29
+ cursor: pointer;
30
+ transition: background-color 0.2s;
31
+ }
32
+ .btn-primary[data-v-eaf4025e] {
33
+ background-color: var(--vscode-button-background);
34
+ color: var(--vscode-button-foreground);
35
+ }
36
+ .btn-primary[data-v-eaf4025e]:hover {
37
+ background-color: var(--vscode-button-hoverBackground);
38
+ }
39
+ .btn-secondary[data-v-eaf4025e] {
40
+ background-color: var(--vscode-button-secondaryBackground);
41
+ color: var(--vscode-button-secondaryForeground);
42
+ }
43
+ .btn-secondary[data-v-eaf4025e]:hover {
44
+ background-color: var(--vscode-button-secondaryHoverBackground);
45
+ }
46
+ .query-editor[data-v-eaf4025e] {
47
+ flex: 1;
48
+ display: flex;
49
+ flex-direction: column;
50
+ border-bottom: 1px solid var(--vscode-panel-border);
51
+ min-height: 200px;
52
+ }
53
+ .query-textarea[data-v-eaf4025e] {
54
+ flex: 1;
55
+ padding: 16px;
56
+ font-family: var(--vscode-editor-font-family, 'Consolas', 'Monaco', monospace);
57
+ font-size: 14px;
58
+ line-height: 1.6;
59
+ border: none;
60
+ resize: none;
61
+ background-color: var(--vscode-editor-background);
62
+ color: var(--vscode-editor-foreground);
63
+ }
64
+ .query-textarea[data-v-eaf4025e]:focus {
65
+ outline: none;
66
+ }
67
+ .query-results[data-v-eaf4025e] {
68
+ flex: 1;
69
+ overflow: auto;
70
+ padding: 12px;
71
+ }
72
+ .loading-state[data-v-eaf4025e] {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ padding: 40px;
77
+ gap: 12px;
78
+ }
79
+ .spinner[data-v-eaf4025e] {
80
+ width: 20px;
81
+ height: 20px;
82
+ border: 2px solid var(--vscode-progressBar-background);
83
+ border-top-color: var(--vscode-progressBar-foreground);
84
+ border-radius: 50%;
85
+ animation: spin-eaf4025e 0.6s linear infinite;
86
+ }
87
+ @keyframes spin-eaf4025e {
88
+ to {
89
+ transform: rotate(360deg);
90
+ }
91
+ }
92
+ .results-header[data-v-eaf4025e] {
93
+ display: flex;
94
+ justify-content: space-between;
95
+ align-items: center;
96
+ margin-bottom: 12px;
97
+ padding: 8px 12px;
98
+ background-color: var(--vscode-editorGroupHeader-tabsBackground);
99
+ border-radius: 4px;
100
+ }
101
+ .results-title[data-v-eaf4025e] {
102
+ font-size: 14px;
103
+ font-weight: 600;
104
+ }
105
+ .results-meta[data-v-eaf4025e] {
106
+ font-size: 12px;
107
+ color: var(--vscode-descriptionForeground);
108
+ }
109
+ .data-table[data-v-eaf4025e] {
110
+ width: 100%;
111
+ border-collapse: collapse;
112
+ font-size: 13px;
113
+ }
114
+ .data-table th[data-v-eaf4025e],
115
+ .data-table td[data-v-eaf4025e] {
116
+ padding: 8px 12px;
117
+ text-align: left;
118
+ border-bottom: 1px solid var(--vscode-panel-border);
119
+ }
120
+ .data-table th[data-v-eaf4025e] {
121
+ background-color: var(--vscode-editorGroupHeader-tabsBackground);
122
+ font-weight: 600;
123
+ position: sticky;
124
+ top: 0;
125
+ }
126
+ .data-table tbody tr[data-v-eaf4025e]:hover {
127
+ background-color: var(--vscode-list-hoverBackground);
128
+ }
129
+ .empty-state[data-v-eaf4025e] {
130
+ display: flex;
131
+ flex-direction: column;
132
+ align-items: center;
133
+ justify-content: center;
134
+ padding: 60px 20px;
135
+ text-align: center;
136
+ }
137
+ .empty-icon[data-v-eaf4025e] {
138
+ font-size: 48px;
139
+ margin-bottom: 16px;
140
+ opacity: 0.5;
141
+ }
142
+ .empty-text[data-v-eaf4025e] {
143
+ font-size: 14px;
144
+ color: var(--vscode-descriptionForeground);
145
+ }
146
+ .status-bar[data-v-eaf4025e] {
147
+ display: flex;
148
+ justify-content: space-between;
149
+ align-items: center;
150
+ padding: 8px 12px;
151
+ background-color: var(--vscode-statusBar-background);
152
+ color: var(--vscode-statusBar-foreground);
153
+ font-size: 12px;
154
+ }
155
+ .status-item[data-v-eaf4025e] {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: 8px;
159
+ }
160
+ .status-icon[data-v-eaf4025e] {
161
+ color: var(--vscode-textLink-foreground);
162
+ }