@authrim/setup 0.1.60 → 0.1.62
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 +51 -480
- package/dist/core/cloudflare.d.ts +17 -0
- package/dist/core/cloudflare.d.ts.map +1 -1
- package/dist/core/cloudflare.js +56 -0
- package/dist/core/cloudflare.js.map +1 -1
- package/dist/core/wrangler.d.ts.map +1 -1
- package/dist/core/wrangler.js +6 -3
- package/dist/core/wrangler.js.map +1 -1
- package/dist/web/api.d.ts.map +1 -1
- package/dist/web/api.js +102 -4
- package/dist/web/api.js.map +1 -1
- package/dist/web/ui.d.ts.map +1 -1
- package/dist/web/ui.js +268 -19
- package/dist/web/ui.js.map +1 -1
- package/package.json +1 -1
package/dist/web/ui.js
CHANGED
|
@@ -91,6 +91,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
91
91
|
.status-running { background: #dbeafe; color: var(--primary); }
|
|
92
92
|
.status-success { background: #d1fae5; color: var(--success); }
|
|
93
93
|
.status-error { background: #fee2e2; color: var(--error); }
|
|
94
|
+
.status-warning { background: #fef3c7; color: #b45309; }
|
|
94
95
|
|
|
95
96
|
/* Mode selection cards */
|
|
96
97
|
.mode-cards {
|
|
@@ -997,7 +998,19 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
997
998
|
|
|
998
999
|
<div id="config-preview-section" class="hidden">
|
|
999
1000
|
<h3 style="font-size: 1rem; margin-bottom: 0.5rem;">Configuration Preview</h3>
|
|
1000
|
-
<div class="config-preview" id="config-preview"></div>
|
|
1001
|
+
<div class="config-preview" id="config-preview-content"></div>
|
|
1002
|
+
</div>
|
|
1003
|
+
|
|
1004
|
+
<div id="config-validation-error" class="hidden" style="margin-top: 1rem; padding: 1rem; background: #fee2e2; border: 1px solid #fca5a5; border-radius: 8px;">
|
|
1005
|
+
<div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;">
|
|
1006
|
+
<span style="font-size: 1.25rem;">⚠️</span>
|
|
1007
|
+
<strong style="color: #b91c1c;">Configuration Validation Failed</strong>
|
|
1008
|
+
</div>
|
|
1009
|
+
<ul id="config-validation-errors" style="margin: 0; padding-left: 1.5rem; color: #991b1b; font-size: 0.875rem;"></ul>
|
|
1010
|
+
</div>
|
|
1011
|
+
|
|
1012
|
+
<div id="config-validation-success" class="hidden" style="margin-top: 1rem; padding: 0.75rem 1rem; background: #d1fae5; border: 1px solid #6ee7b7; border-radius: 8px;">
|
|
1013
|
+
<span style="color: #065f46;">✓ Configuration is valid</span>
|
|
1001
1014
|
</div>
|
|
1002
1015
|
|
|
1003
1016
|
<div class="button-group">
|
|
@@ -1556,6 +1569,31 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
1556
1569
|
</div>
|
|
1557
1570
|
</div>
|
|
1558
1571
|
|
|
1572
|
+
<!-- Admin Setup Section -->
|
|
1573
|
+
<div id="admin-setup-section" class="resource-section hidden" style="margin-top: 1.5rem; padding: 1rem; background: #fef3c7; border-radius: 8px; border: 1px solid #fcd34d;">
|
|
1574
|
+
<div style="display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem;">
|
|
1575
|
+
<span style="font-size: 1.5rem;">⚠️</span>
|
|
1576
|
+
<div>
|
|
1577
|
+
<div style="font-weight: 600; color: #92400e;">Admin Account Not Configured</div>
|
|
1578
|
+
<div style="font-size: 0.875rem; color: #a16207;">Initial administrator has not been set up for this environment.</div>
|
|
1579
|
+
</div>
|
|
1580
|
+
</div>
|
|
1581
|
+
<button class="btn-primary" id="btn-start-admin-setup" style="margin-top: 0.5rem;">
|
|
1582
|
+
🔐 Start Admin Account Setup with Passkey
|
|
1583
|
+
</button>
|
|
1584
|
+
<div id="admin-setup-result" class="hidden" style="margin-top: 1rem; padding: 0.75rem; background: white; border-radius: 6px;">
|
|
1585
|
+
<div style="font-weight: 500; margin-bottom: 0.5rem;">Setup URL Generated:</div>
|
|
1586
|
+
<div style="display: flex; gap: 0.5rem; align-items: center;">
|
|
1587
|
+
<input type="text" id="admin-setup-url" readonly style="flex: 1; padding: 0.5rem; border: 1px solid #d1d5db; border-radius: 4px; font-family: monospace; font-size: 0.875rem;">
|
|
1588
|
+
<button class="btn-secondary" id="btn-copy-setup-url" style="white-space: nowrap;">📋 Copy</button>
|
|
1589
|
+
<a id="btn-open-setup-url" href="#" target="_blank" class="btn-primary" style="text-decoration: none; white-space: nowrap;">🔗 Open</a>
|
|
1590
|
+
</div>
|
|
1591
|
+
<div style="font-size: 0.75rem; color: #6b7280; margin-top: 0.5rem;">
|
|
1592
|
+
This URL is valid for 1 hour. Open it in a browser to register the first admin account.
|
|
1593
|
+
</div>
|
|
1594
|
+
</div>
|
|
1595
|
+
</div>
|
|
1596
|
+
|
|
1559
1597
|
<div class="button-group">
|
|
1560
1598
|
<button class="btn-secondary" id="btn-back-env-detail">← Back to List</button>
|
|
1561
1599
|
<button class="btn-danger" id="btn-delete-from-detail">🗑️ Delete Environment...</button>
|
|
@@ -1929,23 +1967,76 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
1929
1967
|
});
|
|
1930
1968
|
|
|
1931
1969
|
// Load config handlers
|
|
1932
|
-
document.getElementById('config-file').addEventListener('change', (e) => {
|
|
1970
|
+
document.getElementById('config-file').addEventListener('change', async (e) => {
|
|
1933
1971
|
const file = e.target.files[0];
|
|
1934
1972
|
if (!file) return;
|
|
1935
1973
|
|
|
1936
1974
|
document.getElementById('config-file-name').textContent = file.name;
|
|
1937
1975
|
|
|
1976
|
+
// Reset validation display
|
|
1977
|
+
document.getElementById('config-validation-error').classList.add('hidden');
|
|
1978
|
+
document.getElementById('config-validation-success').classList.add('hidden');
|
|
1979
|
+
document.getElementById('config-preview-section').classList.add('hidden');
|
|
1980
|
+
document.getElementById('btn-load-config').disabled = true;
|
|
1981
|
+
|
|
1938
1982
|
const reader = new FileReader();
|
|
1939
|
-
reader.onload = (event) => {
|
|
1983
|
+
reader.onload = async (event) => {
|
|
1984
|
+
let rawConfig;
|
|
1940
1985
|
try {
|
|
1941
|
-
|
|
1942
|
-
document.getElementById('config-preview').textContent = JSON.stringify(loadedConfig, null, 2);
|
|
1943
|
-
document.getElementById('config-preview-section').classList.remove('hidden');
|
|
1944
|
-
document.getElementById('btn-load-config').disabled = false;
|
|
1986
|
+
rawConfig = JSON.parse(event.target.result);
|
|
1945
1987
|
} catch (err) {
|
|
1946
|
-
|
|
1988
|
+
document.getElementById('config-validation-error').classList.remove('hidden');
|
|
1989
|
+
const errorList = document.getElementById('config-validation-errors');
|
|
1990
|
+
while (errorList.firstChild) errorList.removeChild(errorList.firstChild);
|
|
1991
|
+
const li = document.createElement('li');
|
|
1992
|
+
li.textContent = 'Invalid JSON: ' + err.message;
|
|
1993
|
+
errorList.appendChild(li);
|
|
1994
|
+
loadedConfig = null;
|
|
1995
|
+
return;
|
|
1996
|
+
}
|
|
1997
|
+
|
|
1998
|
+
// Show preview
|
|
1999
|
+
document.getElementById('config-preview-content').textContent = JSON.stringify(rawConfig, null, 2);
|
|
2000
|
+
document.getElementById('config-preview-section').classList.remove('hidden');
|
|
2001
|
+
|
|
2002
|
+
// Validate via API
|
|
2003
|
+
try {
|
|
2004
|
+
const response = await api('/config/validate', {
|
|
2005
|
+
method: 'POST',
|
|
2006
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2007
|
+
body: JSON.stringify(rawConfig),
|
|
2008
|
+
});
|
|
2009
|
+
|
|
2010
|
+
if (response.valid) {
|
|
2011
|
+
loadedConfig = response.config;
|
|
2012
|
+
document.getElementById('config-validation-success').classList.remove('hidden');
|
|
2013
|
+
document.getElementById('btn-load-config').disabled = false;
|
|
2014
|
+
} else {
|
|
2015
|
+
document.getElementById('config-validation-error').classList.remove('hidden');
|
|
2016
|
+
const errorList = document.getElementById('config-validation-errors');
|
|
2017
|
+
while (errorList.firstChild) errorList.removeChild(errorList.firstChild);
|
|
2018
|
+
|
|
2019
|
+
if (response.errors) {
|
|
2020
|
+
for (const err of response.errors) {
|
|
2021
|
+
const li = document.createElement('li');
|
|
2022
|
+
li.textContent = (err.path ? err.path + ': ' : '') + err.message;
|
|
2023
|
+
errorList.appendChild(li);
|
|
2024
|
+
}
|
|
2025
|
+
} else if (response.error) {
|
|
2026
|
+
const li = document.createElement('li');
|
|
2027
|
+
li.textContent = response.error;
|
|
2028
|
+
errorList.appendChild(li);
|
|
2029
|
+
}
|
|
2030
|
+
loadedConfig = null;
|
|
2031
|
+
}
|
|
2032
|
+
} catch (err) {
|
|
2033
|
+
document.getElementById('config-validation-error').classList.remove('hidden');
|
|
2034
|
+
const errorList = document.getElementById('config-validation-errors');
|
|
2035
|
+
while (errorList.firstChild) errorList.removeChild(errorList.firstChild);
|
|
2036
|
+
const li = document.createElement('li');
|
|
2037
|
+
li.textContent = 'Validation request failed: ' + err.message;
|
|
2038
|
+
errorList.appendChild(li);
|
|
1947
2039
|
loadedConfig = null;
|
|
1948
|
-
document.getElementById('btn-load-config').disabled = true;
|
|
1949
2040
|
}
|
|
1950
2041
|
};
|
|
1951
2042
|
reader.readAsText(file);
|
|
@@ -2030,14 +2121,13 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
2030
2121
|
// Trigger env input to update preview/default labels
|
|
2031
2122
|
document.getElementById('env').dispatchEvent(new Event('input'));
|
|
2032
2123
|
|
|
2033
|
-
//
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
}
|
|
2124
|
+
// Show configuration screen for review/editing
|
|
2125
|
+
// User can modify settings before proceeding to provision
|
|
2126
|
+
setupMode = 'custom'; // Enable all options for editing
|
|
2127
|
+
document.getElementById('advanced-options').classList.remove('hidden');
|
|
2128
|
+
setStep(2);
|
|
2129
|
+
showSection('config');
|
|
2130
|
+
updatePreview();
|
|
2041
2131
|
});
|
|
2042
2132
|
|
|
2043
2133
|
// Configuration handlers
|
|
@@ -3097,7 +3187,10 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
3097
3187
|
const container = document.getElementById('env-cards');
|
|
3098
3188
|
const noEnvsMessage = document.getElementById('no-envs-message');
|
|
3099
3189
|
|
|
3100
|
-
|
|
3190
|
+
// Clear existing cards using safe method
|
|
3191
|
+
while (container.firstChild) {
|
|
3192
|
+
container.removeChild(container.firstChild);
|
|
3193
|
+
}
|
|
3101
3194
|
|
|
3102
3195
|
if (detectedEnvironments.length === 0) {
|
|
3103
3196
|
noEnvsMessage.classList.remove('hidden');
|
|
@@ -3109,14 +3202,25 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
3109
3202
|
for (const env of detectedEnvironments) {
|
|
3110
3203
|
const card = document.createElement('div');
|
|
3111
3204
|
card.className = 'env-card';
|
|
3205
|
+
card.id = 'env-card-' + env.env.replace(/[^a-zA-Z0-9-]/g, '_');
|
|
3112
3206
|
|
|
3113
3207
|
const info = document.createElement('div');
|
|
3114
3208
|
info.className = 'env-card-info';
|
|
3115
3209
|
|
|
3210
|
+
const nameRow = document.createElement('div');
|
|
3211
|
+
nameRow.style.cssText = 'display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap;';
|
|
3212
|
+
|
|
3116
3213
|
const name = document.createElement('div');
|
|
3117
3214
|
name.className = 'env-card-name';
|
|
3118
3215
|
name.textContent = env.env;
|
|
3119
|
-
|
|
3216
|
+
nameRow.appendChild(name);
|
|
3217
|
+
|
|
3218
|
+
// Badge placeholder for admin status (will be populated async)
|
|
3219
|
+
const badgeContainer = document.createElement('span');
|
|
3220
|
+
badgeContainer.id = 'admin-badge-' + env.env.replace(/[^a-zA-Z0-9-]/g, '_');
|
|
3221
|
+
nameRow.appendChild(badgeContainer);
|
|
3222
|
+
|
|
3223
|
+
info.appendChild(nameRow);
|
|
3120
3224
|
|
|
3121
3225
|
const stats = document.createElement('div');
|
|
3122
3226
|
stats.className = 'env-card-stats';
|
|
@@ -3144,6 +3248,35 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
3144
3248
|
// Make entire card clickable
|
|
3145
3249
|
card.addEventListener('click', () => showEnvDetail(env));
|
|
3146
3250
|
container.appendChild(card);
|
|
3251
|
+
|
|
3252
|
+
// Check admin status and add badge if needed
|
|
3253
|
+
checkAndAddAdminBadge(env);
|
|
3254
|
+
}
|
|
3255
|
+
}
|
|
3256
|
+
|
|
3257
|
+
// Check admin status and add badge to environment card
|
|
3258
|
+
async function checkAndAddAdminBadge(env) {
|
|
3259
|
+
const configKv = env.kv.find(kv =>
|
|
3260
|
+
kv.name.toUpperCase().includes('AUTHRIM_CONFIG') ||
|
|
3261
|
+
kv.name.toUpperCase().includes('AUTHRIM-CONFIG')
|
|
3262
|
+
);
|
|
3263
|
+
|
|
3264
|
+
if (!configKv || !configKv.id) return;
|
|
3265
|
+
|
|
3266
|
+
try {
|
|
3267
|
+
const response = await api('/admin/status/' + encodeURIComponent(configKv.id));
|
|
3268
|
+
if (response.success && !response.adminSetupCompleted) {
|
|
3269
|
+
const badgeContainer = document.getElementById('admin-badge-' + env.env.replace(/[^a-zA-Z0-9-]/g, '_'));
|
|
3270
|
+
if (badgeContainer) {
|
|
3271
|
+
const badge = document.createElement('span');
|
|
3272
|
+
badge.className = 'status-badge status-warning';
|
|
3273
|
+
badge.style.cssText = 'font-size: 0.75rem; padding: 0.125rem 0.5rem;';
|
|
3274
|
+
badge.textContent = 'Admin未設定';
|
|
3275
|
+
badgeContainer.appendChild(badge);
|
|
3276
|
+
}
|
|
3277
|
+
}
|
|
3278
|
+
} catch (error) {
|
|
3279
|
+
console.error('Failed to check admin status for ' + env.env + ':', error);
|
|
3147
3280
|
}
|
|
3148
3281
|
}
|
|
3149
3282
|
|
|
@@ -3166,12 +3299,46 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
3166
3299
|
document.getElementById('detail-r2-section').style.display = env.r2.length === 0 ? 'none' : 'block';
|
|
3167
3300
|
document.getElementById('detail-pages-section').style.display = (env.pages || []).length === 0 ? 'none' : 'block';
|
|
3168
3301
|
|
|
3302
|
+
// Check and show/hide admin setup section
|
|
3303
|
+
const adminSetupSection = document.getElementById('admin-setup-section');
|
|
3304
|
+
const resultDiv = document.getElementById('admin-setup-result');
|
|
3305
|
+
const btn = document.getElementById('btn-start-admin-setup');
|
|
3306
|
+
|
|
3307
|
+
// Reset state
|
|
3308
|
+
adminSetupSection.classList.add('hidden');
|
|
3309
|
+
resultDiv.classList.add('hidden');
|
|
3310
|
+
btn.disabled = false;
|
|
3311
|
+
btn.textContent = '🔐 Start Admin Account Setup with Passkey';
|
|
3312
|
+
|
|
3313
|
+
// Find AUTHRIM_CONFIG KV namespace
|
|
3314
|
+
const configKv = env.kv.find(kv =>
|
|
3315
|
+
kv.name.toUpperCase().includes('AUTHRIM_CONFIG') ||
|
|
3316
|
+
kv.name.toUpperCase().includes('AUTHRIM-CONFIG')
|
|
3317
|
+
);
|
|
3318
|
+
|
|
3319
|
+
if (configKv && configKv.id) {
|
|
3320
|
+
// Check admin setup status asynchronously
|
|
3321
|
+
checkAndShowAdminSetup(configKv.id);
|
|
3322
|
+
}
|
|
3323
|
+
|
|
3169
3324
|
showSection('envDetail');
|
|
3170
3325
|
|
|
3171
3326
|
// Load details asynchronously
|
|
3172
3327
|
loadResourceDetails(env);
|
|
3173
3328
|
}
|
|
3174
3329
|
|
|
3330
|
+
// Check admin setup status and show section if needed
|
|
3331
|
+
async function checkAndShowAdminSetup(kvNamespaceId) {
|
|
3332
|
+
try {
|
|
3333
|
+
const response = await api('/admin/status/' + encodeURIComponent(kvNamespaceId));
|
|
3334
|
+
if (response.success && !response.adminSetupCompleted) {
|
|
3335
|
+
document.getElementById('admin-setup-section').classList.remove('hidden');
|
|
3336
|
+
}
|
|
3337
|
+
} catch (error) {
|
|
3338
|
+
console.error('Failed to check admin status:', error);
|
|
3339
|
+
}
|
|
3340
|
+
}
|
|
3341
|
+
|
|
3175
3342
|
// Helper to render resource list
|
|
3176
3343
|
function renderResourceList(listId, countId, resources, nameKey, resourceType) {
|
|
3177
3344
|
const list = document.getElementById(listId);
|
|
@@ -3370,6 +3537,88 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
|
|
|
3370
3537
|
}
|
|
3371
3538
|
});
|
|
3372
3539
|
|
|
3540
|
+
// Admin setup button
|
|
3541
|
+
document.getElementById('btn-start-admin-setup').addEventListener('click', async () => {
|
|
3542
|
+
if (!selectedEnvForDetail) return;
|
|
3543
|
+
|
|
3544
|
+
const btn = document.getElementById('btn-start-admin-setup');
|
|
3545
|
+
const resultDiv = document.getElementById('admin-setup-result');
|
|
3546
|
+
const urlInput = document.getElementById('admin-setup-url');
|
|
3547
|
+
const openLink = document.getElementById('btn-open-setup-url');
|
|
3548
|
+
|
|
3549
|
+
btn.disabled = true;
|
|
3550
|
+
btn.textContent = '⏳ Generating token...';
|
|
3551
|
+
|
|
3552
|
+
try {
|
|
3553
|
+
// Find AUTHRIM_CONFIG KV namespace
|
|
3554
|
+
const configKv = selectedEnvForDetail.kv.find(kv =>
|
|
3555
|
+
kv.name.toUpperCase().includes('AUTHRIM_CONFIG') ||
|
|
3556
|
+
kv.name.toUpperCase().includes('AUTHRIM-CONFIG')
|
|
3557
|
+
);
|
|
3558
|
+
|
|
3559
|
+
if (!configKv) {
|
|
3560
|
+
alert('Could not find AUTHRIM_CONFIG KV namespace for this environment');
|
|
3561
|
+
btn.disabled = false;
|
|
3562
|
+
btn.textContent = '🔐 Start Admin Account Setup with Passkey';
|
|
3563
|
+
return;
|
|
3564
|
+
}
|
|
3565
|
+
|
|
3566
|
+
// Find router worker to construct base URL
|
|
3567
|
+
const router = selectedEnvForDetail.workers.find(w =>
|
|
3568
|
+
w.name.toLowerCase().includes('router')
|
|
3569
|
+
);
|
|
3570
|
+
|
|
3571
|
+
let baseUrl = '';
|
|
3572
|
+
if (router && router.name) {
|
|
3573
|
+
// Construct URL from worker name
|
|
3574
|
+
baseUrl = 'https://' + router.name + '.workers.dev';
|
|
3575
|
+
} else {
|
|
3576
|
+
// Fallback - ask for URL
|
|
3577
|
+
baseUrl = prompt('Enter the base URL for the router (e.g., https://myenv-ar-router.workers.dev):');
|
|
3578
|
+
if (!baseUrl) {
|
|
3579
|
+
btn.disabled = false;
|
|
3580
|
+
btn.textContent = '🔐 Start Admin Account Setup with Passkey';
|
|
3581
|
+
return;
|
|
3582
|
+
}
|
|
3583
|
+
}
|
|
3584
|
+
|
|
3585
|
+
const response = await api('/admin/generate-token', {
|
|
3586
|
+
method: 'POST',
|
|
3587
|
+
headers: { 'Content-Type': 'application/json' },
|
|
3588
|
+
body: JSON.stringify({
|
|
3589
|
+
kvNamespaceId: configKv.id,
|
|
3590
|
+
baseUrl: baseUrl,
|
|
3591
|
+
}),
|
|
3592
|
+
});
|
|
3593
|
+
|
|
3594
|
+
if (response.success && response.setupUrl) {
|
|
3595
|
+
urlInput.value = response.setupUrl;
|
|
3596
|
+
openLink.href = response.setupUrl;
|
|
3597
|
+
resultDiv.classList.remove('hidden');
|
|
3598
|
+
btn.textContent = '✓ Token Generated';
|
|
3599
|
+
} else {
|
|
3600
|
+
alert('Failed to generate token: ' + (response.error || 'Unknown error'));
|
|
3601
|
+
btn.disabled = false;
|
|
3602
|
+
btn.textContent = '🔐 Start Admin Account Setup with Passkey';
|
|
3603
|
+
}
|
|
3604
|
+
} catch (error) {
|
|
3605
|
+
alert('Error: ' + error.message);
|
|
3606
|
+
btn.disabled = false;
|
|
3607
|
+
btn.textContent = '🔐 Start Admin Account Setup with Passkey';
|
|
3608
|
+
}
|
|
3609
|
+
});
|
|
3610
|
+
|
|
3611
|
+
// Copy setup URL button
|
|
3612
|
+
document.getElementById('btn-copy-setup-url').addEventListener('click', () => {
|
|
3613
|
+
const urlInput = document.getElementById('admin-setup-url');
|
|
3614
|
+
urlInput.select();
|
|
3615
|
+
document.execCommand('copy');
|
|
3616
|
+
const btn = document.getElementById('btn-copy-setup-url');
|
|
3617
|
+
const originalText = btn.textContent;
|
|
3618
|
+
btn.textContent = '✓ Copied!';
|
|
3619
|
+
setTimeout(() => { btn.textContent = originalText; }, 2000);
|
|
3620
|
+
});
|
|
3621
|
+
|
|
3373
3622
|
document.getElementById('btn-back-env-delete').addEventListener('click', () => {
|
|
3374
3623
|
// Go back to detail view if we came from there
|
|
3375
3624
|
if (selectedEnvForDetail) {
|
package/dist/web/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,eAAe,CAAC,YAAqB,EAAE,UAAoB;IACzE,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAErD,OAAO
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,eAAe,CAAC,YAAqB,EAAE,UAAoB;IACzE,gDAAgD;IAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAErD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA2pDoB,SAAS;0BACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAg+DhC,CAAC;AACT,CAAC"}
|