@arpproject/vibearp-mcp 1.2.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/LICENSE.md +202 -0
- package/README.md +158 -0
- package/lib/dashboard/static/dashboard.css +1611 -0
- package/lib/dashboard/static/dashboard.js +2402 -0
- package/lib/dashboard/static/index.html +569 -0
- package/lib/server.js +70099 -0
- package/lib/server.js.map +7 -0
- package/lib/shutdown.js +345 -0
- package/lib/shutdown.js.map +7 -0
- package/node_modules/cedar-template-converter/LICENSE.md +202 -0
- package/node_modules/cedar-template-converter/dist/cedar-converter.d.ts +139 -0
- package/node_modules/cedar-template-converter/dist/cedar-converter.d.ts.map +1 -0
- package/node_modules/cedar-template-converter/dist/cedar-converter.js +765 -0
- package/node_modules/cedar-template-converter/dist/cedar-converter.js.map +1 -0
- package/node_modules/cedar-template-converter/package.json +33 -0
- package/package.json +53 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<!-- ****************************************************************************************
|
|
3
|
+
* Copyright (C) 2025-2026 SZTAKI, Department of Distributed Systems (https://dsd.sztaki.hu).
|
|
4
|
+
*
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
**************************************************************************************** -->
|
|
7
|
+
<html lang="en">
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="UTF-8">
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
11
|
+
<title>RO-Crate MCP Dashboard</title>
|
|
12
|
+
<link rel="stylesheet" href="/static/dashboard.css">
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<div class="container">
|
|
16
|
+
<header class="header">
|
|
17
|
+
<h1>RO-Crate MCP Dashboard</h1>
|
|
18
|
+
<div class="header-controls">
|
|
19
|
+
<select id="timeRange" class="time-range-select">
|
|
20
|
+
<option value="all">All time</option>
|
|
21
|
+
<option value="15" selected>15 minutes</option>
|
|
22
|
+
<option value="60">1 hour</option>
|
|
23
|
+
<option value="1440">24 hours</option>
|
|
24
|
+
</select>
|
|
25
|
+
<button id="refreshBtn" class="btn btn-secondary">
|
|
26
|
+
<span class="icon">↻</span> Refresh
|
|
27
|
+
</button>
|
|
28
|
+
<button id="metadataProfilesBtn" class="btn btn-secondary">
|
|
29
|
+
<span class="icon">☁</span> Metadata Profiles
|
|
30
|
+
</button>
|
|
31
|
+
<button id="settingsBtn" class="btn btn-secondary">
|
|
32
|
+
<span class="icon">⚙</span> Settings
|
|
33
|
+
</button>
|
|
34
|
+
<button id="shutdownBtn" class="btn btn-danger" type="button">
|
|
35
|
+
<span class="icon">⏻</span> Shut down MCP
|
|
36
|
+
</button>
|
|
37
|
+
</div>
|
|
38
|
+
</header>
|
|
39
|
+
|
|
40
|
+
<div id="errorBanner" class="error-banner hidden"></div>
|
|
41
|
+
|
|
42
|
+
<section class="overview-cards">
|
|
43
|
+
<div class="card">
|
|
44
|
+
<div class="card-label">Total Calls</div>
|
|
45
|
+
<div class="card-value" id="totalCalls">-</div>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="card">
|
|
48
|
+
<div class="card-label">Error Rate</div>
|
|
49
|
+
<div class="card-value" id="errorRate">-</div>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="card">
|
|
52
|
+
<div class="card-label">Active Sessions</div>
|
|
53
|
+
<div class="card-value" id="activeSessions">-</div>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="card">
|
|
56
|
+
<div class="card-label">P95 Latency</div>
|
|
57
|
+
<div class="card-value" id="p95Latency">-</div>
|
|
58
|
+
</div>
|
|
59
|
+
<div class="card">
|
|
60
|
+
<div class="card-label">Avg Latency</div>
|
|
61
|
+
<div class="card-value" id="avgLatency">-</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="card">
|
|
64
|
+
<div class="card-label">Uptime</div>
|
|
65
|
+
<div class="card-value" id="uptime">-</div>
|
|
66
|
+
</div>
|
|
67
|
+
</section>
|
|
68
|
+
|
|
69
|
+
<div class="dashboard-grid">
|
|
70
|
+
<section class="panel">
|
|
71
|
+
<div class="panel-header">
|
|
72
|
+
<h2>Tool Statistics</h2>
|
|
73
|
+
</div>
|
|
74
|
+
<div class="panel-content">
|
|
75
|
+
<table class="data-table" id="toolsTable">
|
|
76
|
+
<thead>
|
|
77
|
+
<tr>
|
|
78
|
+
<th>Tool</th>
|
|
79
|
+
<th>Calls</th>
|
|
80
|
+
<th>Fail %</th>
|
|
81
|
+
<th>Avg Latency</th>
|
|
82
|
+
<th>P95 Latency</th>
|
|
83
|
+
<th>Last Call</th>
|
|
84
|
+
</tr>
|
|
85
|
+
</thead>
|
|
86
|
+
<tbody>
|
|
87
|
+
<tr>
|
|
88
|
+
<td colspan="6" class="loading">Loading...</td>
|
|
89
|
+
</tr>
|
|
90
|
+
</tbody>
|
|
91
|
+
</table>
|
|
92
|
+
</div>
|
|
93
|
+
</section>
|
|
94
|
+
|
|
95
|
+
<section class="panel">
|
|
96
|
+
<div class="panel-header">
|
|
97
|
+
<h2>Recent Errors</h2>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="panel-content">
|
|
100
|
+
<div id="errorsList" class="errors-list">
|
|
101
|
+
<div class="loading">Loading...</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</section>
|
|
105
|
+
|
|
106
|
+
<section class="panel full-width">
|
|
107
|
+
<div class="panel-header">
|
|
108
|
+
<h2>Sessions</h2>
|
|
109
|
+
</div>
|
|
110
|
+
<div class="panel-content">
|
|
111
|
+
<table class="data-table" id="sessionsTable">
|
|
112
|
+
<thead>
|
|
113
|
+
<tr>
|
|
114
|
+
<th>Session ID</th>
|
|
115
|
+
<th>Started</th>
|
|
116
|
+
<th>Last Activity</th>
|
|
117
|
+
<th>Mode</th>
|
|
118
|
+
<th>Requests</th>
|
|
119
|
+
<th>Errors</th>
|
|
120
|
+
<th>Status</th>
|
|
121
|
+
<th>Actions</th>
|
|
122
|
+
</tr>
|
|
123
|
+
</thead>
|
|
124
|
+
<tbody>
|
|
125
|
+
<tr>
|
|
126
|
+
<td colspan="8" class="loading">Loading...</td>
|
|
127
|
+
</tr>
|
|
128
|
+
</tbody>
|
|
129
|
+
</table>
|
|
130
|
+
</div>
|
|
131
|
+
</section>
|
|
132
|
+
|
|
133
|
+
<section class="panel full-width">
|
|
134
|
+
<div class="panel-header">
|
|
135
|
+
<h2>Dependency Usage</h2>
|
|
136
|
+
</div>
|
|
137
|
+
<div class="panel-content">
|
|
138
|
+
<table class="data-table" id="dependenciesTable">
|
|
139
|
+
<thead>
|
|
140
|
+
<tr>
|
|
141
|
+
<th>Dependency</th>
|
|
142
|
+
<th>Calls</th>
|
|
143
|
+
<th>Success Rate</th>
|
|
144
|
+
<th>Avg Latency</th>
|
|
145
|
+
<th>Last Call</th>
|
|
146
|
+
</tr>
|
|
147
|
+
</thead>
|
|
148
|
+
<tbody>
|
|
149
|
+
<tr>
|
|
150
|
+
<td colspan="5" class="loading">Loading...</td>
|
|
151
|
+
</tr>
|
|
152
|
+
</tbody>
|
|
153
|
+
</table>
|
|
154
|
+
</div>
|
|
155
|
+
</section>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<!-- Session Detail Modal -->
|
|
160
|
+
<div id="sessionModal" class="modal hidden">
|
|
161
|
+
<div class="modal-content">
|
|
162
|
+
<div class="modal-header">
|
|
163
|
+
<h2 id="sessionModalTitle">Session Details</h2>
|
|
164
|
+
<button class="modal-close" id="closeSessionModal">×</button>
|
|
165
|
+
</div>
|
|
166
|
+
<div class="modal-body" id="sessionModalBody">
|
|
167
|
+
<!-- Session details will be populated here -->
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
|
|
172
|
+
<!-- Tool Call Detail Modal -->
|
|
173
|
+
<div id="toolCallModal" class="modal hidden">
|
|
174
|
+
<div class="modal-content">
|
|
175
|
+
<div class="modal-header">
|
|
176
|
+
<h2 id="toolCallModalTitle">Tool Call Details</h2>
|
|
177
|
+
<button class="modal-close" id="closeToolCallModal">×</button>
|
|
178
|
+
</div>
|
|
179
|
+
<div class="modal-body" id="toolCallModalBody">
|
|
180
|
+
<!-- Tool call details will be populated here -->
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
|
|
185
|
+
<!-- Settings Modal -->
|
|
186
|
+
<div id="settingsModal" class="modal hidden">
|
|
187
|
+
<div class="modal-content settings-modal-content">
|
|
188
|
+
<div class="modal-header">
|
|
189
|
+
<h2>Dashboard Settings</h2>
|
|
190
|
+
<button class="modal-close" id="closeSettingsModal">×</button>
|
|
191
|
+
</div>
|
|
192
|
+
<div class="modal-body">
|
|
193
|
+
<form id="settingsForm" class="settings-form">
|
|
194
|
+
<section class="settings-section">
|
|
195
|
+
<div class="settings-section-header">
|
|
196
|
+
<h3>Telemetry</h3>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="setting-row">
|
|
199
|
+
<label class="setting-label">
|
|
200
|
+
<strong>Detailed Tool Call Logging</strong>
|
|
201
|
+
<span class="setting-description">Store tool parameters and results (uses more memory)</span>
|
|
202
|
+
</label>
|
|
203
|
+
<div class="setting-control">
|
|
204
|
+
<label class="toggle">
|
|
205
|
+
<input type="checkbox" id="detailedLoggingToggle">
|
|
206
|
+
<span class="toggle-slider"></span>
|
|
207
|
+
</label>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
<div class="setting-row">
|
|
212
|
+
<label class="setting-label">
|
|
213
|
+
<strong>Data Retention</strong>
|
|
214
|
+
<span class="setting-description">How long to keep telemetry data (hours)</span>
|
|
215
|
+
</label>
|
|
216
|
+
<div class="setting-control">
|
|
217
|
+
<input type="number" id="retentionHoursInput" class="number-input" min="1" max="168" value="24">
|
|
218
|
+
<span class="input-suffix">hours</span>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
</section>
|
|
222
|
+
|
|
223
|
+
<section class="settings-section">
|
|
224
|
+
<div class="settings-section-header">
|
|
225
|
+
<h3>Dataverse Upload Tool</h3>
|
|
226
|
+
</div>
|
|
227
|
+
<p class="settings-help"><span>Environment variables are used by default. Dashboard values are saved in the RocKIT storage root (default: ~/.rockit/rocrate-mcp-settings.json) and override them for this and future MCP processes.</span> <span>Select “Use environment/default value” to clear a dashboard override.</span> <span>Saved API-key values stay masked; click the eye to view them after reload.</span></p>
|
|
228
|
+
<div class="setting-row">
|
|
229
|
+
<label class="setting-label">
|
|
230
|
+
<strong>Keep RO-Crate ZIPs</strong>
|
|
231
|
+
<span class="setting-description">Keep generated ZIP files after successful Dataverse uploads</span>
|
|
232
|
+
</label>
|
|
233
|
+
<div class="setting-control">
|
|
234
|
+
<label class="toggle">
|
|
235
|
+
<input type="checkbox" id="keepDataverseUploadZipsToggle">
|
|
236
|
+
<span class="toggle-slider"></span>
|
|
237
|
+
</label>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
<div class="setting-row">
|
|
241
|
+
<label class="setting-label">
|
|
242
|
+
<strong>DATAVERSE_BASE_URL</strong>
|
|
243
|
+
<span class="setting-description" id="dataverseBaseUrlSource">Loading...</span>
|
|
244
|
+
</label>
|
|
245
|
+
<div class="setting-control setting-credential-control">
|
|
246
|
+
<input type="url" id="dataverseBaseUrlInput" class="text-input" autocomplete="url" placeholder="https://dataverse.example">
|
|
247
|
+
<label class="setting-reset">
|
|
248
|
+
<input type="checkbox" id="dataverseBaseUrlUseEnv">
|
|
249
|
+
Use environment/default value
|
|
250
|
+
</label>
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
<div class="setting-row">
|
|
254
|
+
<label class="setting-label">
|
|
255
|
+
<strong>DATAVERSE_API_KEY</strong>
|
|
256
|
+
<span class="setting-description" id="dataverseApiKeySource">Loading...</span>
|
|
257
|
+
</label>
|
|
258
|
+
<div class="setting-control setting-credential-control">
|
|
259
|
+
<div class="setting-input-with-action">
|
|
260
|
+
<input type="password" id="dataverseApiKeyInput" class="text-input" autocomplete="new-password" placeholder="Enter a new dashboard override">
|
|
261
|
+
<button type="button" class="password-visibility-button" id="dataverseApiKeyVisibilityBtn" title="Show API key" aria-label="Show API key">
|
|
262
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
263
|
+
<path d="M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12Z"></path>
|
|
264
|
+
<circle cx="12" cy="12" r="2.5"></circle>
|
|
265
|
+
</svg>
|
|
266
|
+
</button>
|
|
267
|
+
</div>
|
|
268
|
+
<label class="setting-reset">
|
|
269
|
+
<input type="checkbox" id="dataverseApiKeyUseEnv">
|
|
270
|
+
Use environment value
|
|
271
|
+
</label>
|
|
272
|
+
</div>
|
|
273
|
+
</div>
|
|
274
|
+
</section>
|
|
275
|
+
|
|
276
|
+
<section class="settings-section">
|
|
277
|
+
<div class="settings-section-header">
|
|
278
|
+
<h3>Web Search Tool</h3>
|
|
279
|
+
</div>
|
|
280
|
+
<p class="settings-help"><span>Configure the Tavily API key used by the</span> <code>search</code> <span>tool.</span> <span>Saved values stay masked; click the eye to view them.</span></p>
|
|
281
|
+
<div class="setting-row">
|
|
282
|
+
<label class="setting-label">
|
|
283
|
+
<strong>TAVILY_API_KEY</strong>
|
|
284
|
+
<span class="setting-description" id="tavilyApiKeySource">Loading...</span>
|
|
285
|
+
</label>
|
|
286
|
+
<div class="setting-control setting-credential-control">
|
|
287
|
+
<div class="setting-input-with-action">
|
|
288
|
+
<input type="password" id="tavilyApiKeyInput" class="text-input" autocomplete="new-password" placeholder="Enter a new dashboard override">
|
|
289
|
+
<button type="button" class="password-visibility-button" id="tavilyApiKeyVisibilityBtn" title="Show API key" aria-label="Show API key">
|
|
290
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
291
|
+
<path d="M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12Z"></path>
|
|
292
|
+
<circle cx="12" cy="12" r="2.5"></circle>
|
|
293
|
+
</svg>
|
|
294
|
+
</button>
|
|
295
|
+
</div>
|
|
296
|
+
<label class="setting-reset">
|
|
297
|
+
<input type="checkbox" id="tavilyApiKeyUseEnv">
|
|
298
|
+
Use environment value
|
|
299
|
+
</label>
|
|
300
|
+
<button type="button" class="btn btn-secondary btn-sm settings-inline-action" id="openTavilyTestBtn">
|
|
301
|
+
<span class="icon">🔍</span> Test Tavily Search
|
|
302
|
+
</button>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
</section>
|
|
306
|
+
|
|
307
|
+
<div class="setting-actions">
|
|
308
|
+
<button type="submit" class="btn btn-primary">Save Settings</button>
|
|
309
|
+
<button type="button" class="btn btn-secondary" id="cancelSettingsBtn">Cancel</button>
|
|
310
|
+
</div>
|
|
311
|
+
|
|
312
|
+
<div id="settingsMessage" class="settings-message hidden"></div>
|
|
313
|
+
</form>
|
|
314
|
+
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
</div>
|
|
318
|
+
|
|
319
|
+
<!-- Tavily Search Test Modal -->
|
|
320
|
+
<div id="tavilyTestModal" class="modal hidden" role="dialog" aria-modal="true" aria-labelledby="tavilyTestModalTitle">
|
|
321
|
+
<div class="modal-content tavily-test-modal-content">
|
|
322
|
+
<div class="modal-header">
|
|
323
|
+
<h2 id="tavilyTestModalTitle">Test Tavily Search</h2>
|
|
324
|
+
<button type="button" class="modal-close" id="closeTavilyTestModal" aria-label="Close">×</button>
|
|
325
|
+
</div>
|
|
326
|
+
<div class="modal-body">
|
|
327
|
+
<p class="settings-help">The test uses the currently saved Tavily configuration. Save Settings first if you changed the API key.</p>
|
|
328
|
+
<form id="tavilyTestForm" class="settings-form">
|
|
329
|
+
<div class="setting-row">
|
|
330
|
+
<label class="setting-label">
|
|
331
|
+
<strong>Search Query</strong>
|
|
332
|
+
<span class="setting-description">Enter a test query to verify Tavily search functionality</span>
|
|
333
|
+
</label>
|
|
334
|
+
<div class="setting-control">
|
|
335
|
+
<input type="text" id="tavilyQueryInput" class="text-input tavily-query-input" placeholder="e.g., RO-Crate metadata specification" required>
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
|
|
339
|
+
<div class="setting-row">
|
|
340
|
+
<label class="setting-label">
|
|
341
|
+
<strong>Max Results</strong>
|
|
342
|
+
<span class="setting-description">Number of results to return (1-10)</span>
|
|
343
|
+
</label>
|
|
344
|
+
<div class="setting-control">
|
|
345
|
+
<input type="number" id="tavilyMaxResults" class="number-input" min="1" max="10" value="3">
|
|
346
|
+
</div>
|
|
347
|
+
</div>
|
|
348
|
+
|
|
349
|
+
<div class="setting-row">
|
|
350
|
+
<label class="setting-label">
|
|
351
|
+
<strong>Search Depth</strong>
|
|
352
|
+
<span class="setting-description">Basic or advanced search</span>
|
|
353
|
+
</label>
|
|
354
|
+
<div class="setting-control">
|
|
355
|
+
<select id="tavilySearchDepth" class="time-range-select">
|
|
356
|
+
<option value="basic">Basic</option>
|
|
357
|
+
<option value="advanced">Advanced</option>
|
|
358
|
+
</select>
|
|
359
|
+
</div>
|
|
360
|
+
</div>
|
|
361
|
+
|
|
362
|
+
<div class="setting-actions">
|
|
363
|
+
<button type="submit" class="btn btn-primary" id="tavilyTestBtn">
|
|
364
|
+
<span class="icon">🔍</span> Test Search
|
|
365
|
+
</button>
|
|
366
|
+
<button type="button" class="btn btn-secondary" id="tavilyClearBtn">Clear Results</button>
|
|
367
|
+
</div>
|
|
368
|
+
|
|
369
|
+
<div id="tavilyTestResult" class="hidden"></div>
|
|
370
|
+
</form>
|
|
371
|
+
</div>
|
|
372
|
+
</div>
|
|
373
|
+
</div>
|
|
374
|
+
|
|
375
|
+
<!-- Metadata Profiles Modal -->
|
|
376
|
+
<div id="metadataProfilesModal" class="modal hidden">
|
|
377
|
+
<div class="modal-content profiles-modal-content">
|
|
378
|
+
<div class="modal-header">
|
|
379
|
+
<h2>Metadata Profiles</h2>
|
|
380
|
+
<button class="modal-close" id="closeMetadataProfilesModal">×</button>
|
|
381
|
+
</div>
|
|
382
|
+
<div class="profiles-modal-body">
|
|
383
|
+
<div class="profiles-toolbar">
|
|
384
|
+
<div>
|
|
385
|
+
<h3>CEDAR Schema Profiles</h3>
|
|
386
|
+
<p class="setting-description">Browse remote CEDAR repositories and manage locally converted recrate profiles.</p>
|
|
387
|
+
</div>
|
|
388
|
+
<div class="profiles-toolbar-actions">
|
|
389
|
+
<button type="button" class="btn btn-primary" id="browseMetadataProfilesBtn">
|
|
390
|
+
<span class="icon">☁</span> Browse Remote
|
|
391
|
+
</button>
|
|
392
|
+
<button type="button" class="icon-button provider-manage-icon" id="manageMetadataProvidersBtn" title="Manage Remote Providers" aria-label="Manage Remote Providers">
|
|
393
|
+
<span></span><span></span><span></span>
|
|
394
|
+
</button>
|
|
395
|
+
<button type="button" class="btn btn-secondary" id="reloadMetadataProfilesBtn">Reload</button>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
|
|
399
|
+
<div class="profiles-storage-strip">
|
|
400
|
+
<span class="profiles-storage-label">Storage</span>
|
|
401
|
+
<code id="metadataProfileStorageValue">Loading...</code>
|
|
402
|
+
</div>
|
|
403
|
+
|
|
404
|
+
<div class="profiles-table-wrap">
|
|
405
|
+
<table class="data-table profiles-table" id="metadataProfilesTable">
|
|
406
|
+
<thead>
|
|
407
|
+
<tr>
|
|
408
|
+
<th>Status</th>
|
|
409
|
+
<th>Name</th>
|
|
410
|
+
<th>Version</th>
|
|
411
|
+
<th>Source</th>
|
|
412
|
+
<th>Ref (@id)</th>
|
|
413
|
+
<th>Conforms To</th>
|
|
414
|
+
<th>Actions</th>
|
|
415
|
+
</tr>
|
|
416
|
+
</thead>
|
|
417
|
+
<tbody>
|
|
418
|
+
<tr>
|
|
419
|
+
<td colspan="7" class="loading">Loading...</td>
|
|
420
|
+
</tr>
|
|
421
|
+
</tbody>
|
|
422
|
+
</table>
|
|
423
|
+
</div>
|
|
424
|
+
<div class="profiles-pagination" id="metadataProfilesPagination">
|
|
425
|
+
<button type="button" class="pager-button" id="metadataProfilesPrevPageBtn" aria-label="Previous page">‹</button>
|
|
426
|
+
<span class="pager-page" id="metadataProfilesPageValue">1</span>
|
|
427
|
+
<button type="button" class="pager-button" id="metadataProfilesNextPageBtn" aria-label="Next page">›</button>
|
|
428
|
+
<select id="metadataProfilesPageSizeSelect" class="pager-size-select" aria-label="Rows per page">
|
|
429
|
+
<option value="10">10 / page</option>
|
|
430
|
+
<option value="25">25 / page</option>
|
|
431
|
+
<option value="50">50 / page</option>
|
|
432
|
+
<option value="100">100 / page</option>
|
|
433
|
+
</select>
|
|
434
|
+
</div>
|
|
435
|
+
|
|
436
|
+
<div class="profiles-import-bar">
|
|
437
|
+
<input type="text" id="metadataProfileUrlInput" class="text-input" placeholder="https://repo.schema.researchdata.hu/templates/...">
|
|
438
|
+
<button type="button" class="btn btn-primary" id="importMetadataProfileBtn">Import URL</button>
|
|
439
|
+
</div>
|
|
440
|
+
|
|
441
|
+
<div id="metadataProfilesMessage" class="settings-message hidden"></div>
|
|
442
|
+
</div>
|
|
443
|
+
</div>
|
|
444
|
+
</div>
|
|
445
|
+
|
|
446
|
+
<!-- Select Remote Provider Modal -->
|
|
447
|
+
<div id="remoteProviderSelectModal" class="modal hidden">
|
|
448
|
+
<div class="modal-content provider-select-modal-content">
|
|
449
|
+
<div class="modal-header">
|
|
450
|
+
<h2>Select Remote Provider</h2>
|
|
451
|
+
<button class="modal-close" id="closeRemoteProviderSelectModal">×</button>
|
|
452
|
+
</div>
|
|
453
|
+
<div class="provider-dialog-body">
|
|
454
|
+
<div class="provider-dialog-heading">
|
|
455
|
+
<div class="provider-dialog-icon provider-server-icon"></div>
|
|
456
|
+
<div>
|
|
457
|
+
<h3>Choose Repository</h3>
|
|
458
|
+
<p class="setting-description">Select a remote provider to browse schemas.</p>
|
|
459
|
+
</div>
|
|
460
|
+
</div>
|
|
461
|
+
<div id="remoteProviderSelectList" class="provider-select-list">
|
|
462
|
+
<div class="empty">Loading providers...</div>
|
|
463
|
+
</div>
|
|
464
|
+
</div>
|
|
465
|
+
<div class="provider-dialog-footer">
|
|
466
|
+
<button type="button" class="provider-link-button" id="openManageProvidersFromSelectBtn">
|
|
467
|
+
<span class="provider-mini-gear">⚙</span> Manage Providers...
|
|
468
|
+
</button>
|
|
469
|
+
<button type="button" class="btn btn-secondary" id="cancelRemoteProviderSelectBtn">Cancel</button>
|
|
470
|
+
</div>
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
|
|
474
|
+
<!-- Manage Remote Providers Modal -->
|
|
475
|
+
<div id="manageRemoteProvidersModal" class="modal hidden">
|
|
476
|
+
<div class="modal-content provider-manage-modal-content">
|
|
477
|
+
<div class="modal-header">
|
|
478
|
+
<h2>Manage Remote Providers</h2>
|
|
479
|
+
<button class="modal-close" id="closeManageRemoteProvidersModal">×</button>
|
|
480
|
+
</div>
|
|
481
|
+
<div class="provider-dialog-body">
|
|
482
|
+
<div class="provider-manage-heading">
|
|
483
|
+
<div class="provider-dialog-heading">
|
|
484
|
+
<div class="provider-dialog-icon provider-sliders-icon"><span></span><span></span><span></span></div>
|
|
485
|
+
<div>
|
|
486
|
+
<h3>Configured Providers</h3>
|
|
487
|
+
<p class="setting-description">Manage connections to remote schema repositories.</p>
|
|
488
|
+
</div>
|
|
489
|
+
</div>
|
|
490
|
+
<button type="button" class="btn btn-primary" id="addRemoteProviderBtn">
|
|
491
|
+
<span class="icon">+</span> Add Provider
|
|
492
|
+
</button>
|
|
493
|
+
</div>
|
|
494
|
+
|
|
495
|
+
<div id="remoteProviderManageList" class="provider-manage-list">
|
|
496
|
+
<div class="empty">Loading providers...</div>
|
|
497
|
+
</div>
|
|
498
|
+
|
|
499
|
+
<form id="remoteProviderForm" class="provider-form hidden">
|
|
500
|
+
<input type="hidden" id="remoteProviderOriginalId">
|
|
501
|
+
<div class="provider-form-grid">
|
|
502
|
+
<input type="text" id="remoteProviderIdInput" class="text-input" placeholder="Provider id">
|
|
503
|
+
<input type="text" id="remoteProviderTitleInput" class="text-input" placeholder="Display name">
|
|
504
|
+
<input type="text" id="remoteProviderBaseUrlInput" class="text-input" placeholder="https://cedar.schema.researchdata.hu/">
|
|
505
|
+
<input type="text" id="remoteProviderDomainInput" class="text-input" placeholder="schema.researchdata.hu">
|
|
506
|
+
<select id="remoteProviderAccessModeInput" class="text-input">
|
|
507
|
+
<option value="dataverseProxy">Dataverse proxy (read-only)</option>
|
|
508
|
+
<option value="apiKey">CEDAR API key</option>
|
|
509
|
+
</select>
|
|
510
|
+
<input type="text" id="remoteProviderProxyBaseUrlInput" class="text-input" placeholder="https://repo.researchdata.hu">
|
|
511
|
+
<div class="setting-input-with-action provider-form-wide" id="remoteProviderApiKeyControl">
|
|
512
|
+
<input type="password" id="remoteProviderApiKeyInput" class="text-input" placeholder="API key (stored in keytar when available)">
|
|
513
|
+
<button type="button" class="password-visibility-button" id="remoteProviderApiKeyVisibilityBtn" title="Show API key" aria-label="Show API key">
|
|
514
|
+
<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
|
|
515
|
+
<path d="M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12Z"></path>
|
|
516
|
+
<circle cx="12" cy="12" r="2.5"></circle>
|
|
517
|
+
</svg>
|
|
518
|
+
</button>
|
|
519
|
+
</div>
|
|
520
|
+
</div>
|
|
521
|
+
<div class="setting-actions">
|
|
522
|
+
<button type="submit" class="btn btn-primary">Save Provider</button>
|
|
523
|
+
<button type="button" class="btn btn-secondary" id="cancelRemoteProviderFormBtn">Cancel</button>
|
|
524
|
+
</div>
|
|
525
|
+
</form>
|
|
526
|
+
</div>
|
|
527
|
+
<div class="provider-dialog-footer">
|
|
528
|
+
<div id="remoteProviderManageMessage" class="settings-message hidden"></div>
|
|
529
|
+
<button type="button" class="btn btn-secondary" id="closeManageRemoteProvidersBtn">Close</button>
|
|
530
|
+
</div>
|
|
531
|
+
</div>
|
|
532
|
+
</div>
|
|
533
|
+
|
|
534
|
+
<!-- Browse Remote CEDAR Modal -->
|
|
535
|
+
<div id="cedarBrowserModal" class="modal hidden">
|
|
536
|
+
<div class="modal-content cedar-browser-modal-content">
|
|
537
|
+
<div class="modal-header">
|
|
538
|
+
<h2 id="cedarBrowserTitle">Browse Remote</h2>
|
|
539
|
+
<button class="modal-close" id="closeCedarBrowserModal">×</button>
|
|
540
|
+
</div>
|
|
541
|
+
<div class="cedar-browser-body">
|
|
542
|
+
<div class="cedar-browser-toolbar">
|
|
543
|
+
<button type="button" class="icon-button cedar-search-button" id="cedarSearchToggleBtn" title="Search" aria-label="Search"></button>
|
|
544
|
+
<input type="text" id="cedarSearchInput" class="text-input cedar-search-input hidden" placeholder="Search folders and templates">
|
|
545
|
+
<div class="cedar-browser-spacer"></div>
|
|
546
|
+
<button type="button" class="icon-button cedar-expand-button" id="cedarExpandAllBtn" title="Expand All" aria-label="Expand All"></button>
|
|
547
|
+
<button type="button" class="icon-button cedar-collapse-button" id="cedarCollapseAllBtn" title="Collapse All" aria-label="Collapse All"></button>
|
|
548
|
+
</div>
|
|
549
|
+
<div id="cedarBrowserTree" class="cedar-browser-tree">
|
|
550
|
+
<div class="loading">Loading repository...</div>
|
|
551
|
+
</div>
|
|
552
|
+
</div>
|
|
553
|
+
<div class="cedar-browser-footer">
|
|
554
|
+
<div class="cedar-browser-selection">
|
|
555
|
+
<button type="button" class="icon-button cedar-locate-button hidden" id="cedarLocateSelectedBtn" title="Locate in Tree" aria-label="Locate in Tree"></button>
|
|
556
|
+
<button type="button" class="icon-button cedar-clear-button hidden" id="cedarClearSelectionBtn" title="Deselect" aria-label="Deselect"></button>
|
|
557
|
+
<span id="cedarBrowserSelectionText" class="cedar-browser-placeholder">Select a template to import...</span>
|
|
558
|
+
</div>
|
|
559
|
+
<div class="cedar-browser-actions">
|
|
560
|
+
<button type="button" class="btn btn-secondary" id="cancelCedarBrowserBtn">Cancel</button>
|
|
561
|
+
<button type="button" class="btn btn-primary" id="addCedarTemplateBtn" disabled>Add</button>
|
|
562
|
+
</div>
|
|
563
|
+
</div>
|
|
564
|
+
</div>
|
|
565
|
+
</div>
|
|
566
|
+
|
|
567
|
+
<script src="/static/dashboard.js"></script>
|
|
568
|
+
</body>
|
|
569
|
+
</html>
|