@authrim/setup 0.1.62 → 0.1.63

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAkoHnF"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CA06HnF"}
package/dist/web/ui.js CHANGED
@@ -382,6 +382,77 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
382
382
  word-break: break-word;
383
383
  }
384
384
 
385
+ /* Progress UI Components */
386
+ .progress-container {
387
+ margin: 1rem 0;
388
+ }
389
+
390
+ .progress-status {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 0.75rem;
394
+ margin-bottom: 0.75rem;
395
+ }
396
+
397
+ .progress-status .spinner {
398
+ width: 20px;
399
+ height: 20px;
400
+ border: 2px solid #e2e8f0;
401
+ border-top-color: var(--primary);
402
+ border-radius: 50%;
403
+ animation: spin 0.8s linear infinite;
404
+ }
405
+
406
+ @keyframes spin {
407
+ to { transform: rotate(360deg); }
408
+ }
409
+
410
+ .progress-bar-wrapper {
411
+ background: #e2e8f0;
412
+ border-radius: 4px;
413
+ height: 8px;
414
+ overflow: hidden;
415
+ margin-bottom: 0.5rem;
416
+ }
417
+
418
+ .progress-bar {
419
+ height: 100%;
420
+ background: var(--primary);
421
+ border-radius: 4px;
422
+ transition: width 0.3s ease;
423
+ }
424
+
425
+ .progress-text {
426
+ font-size: 0.875rem;
427
+ color: var(--text-muted);
428
+ }
429
+
430
+ .log-toggle {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 0.5rem;
434
+ padding: 0.5rem 0.75rem;
435
+ background: #f1f5f9;
436
+ border: 1px solid var(--border);
437
+ border-radius: 6px;
438
+ cursor: pointer;
439
+ font-size: 0.875rem;
440
+ color: var(--text-muted);
441
+ margin-top: 1rem;
442
+ }
443
+
444
+ .log-toggle:hover {
445
+ background: #e2e8f0;
446
+ }
447
+
448
+ .log-toggle .arrow {
449
+ transition: transform 0.2s;
450
+ }
451
+
452
+ .log-toggle.open .arrow {
453
+ transform: rotate(90deg);
454
+ }
455
+
385
456
  .step-indicator {
386
457
  display: flex;
387
458
  justify-content: center;
@@ -1415,6 +1486,23 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1415
1486
  </div>
1416
1487
  </div>
1417
1488
 
1489
+ <!-- Progress UI (shown during provisioning) -->
1490
+ <div id="provision-progress-ui" class="progress-container hidden">
1491
+ <div class="progress-status">
1492
+ <div class="spinner" id="provision-spinner"></div>
1493
+ <span id="provision-current-task">Initializing...</span>
1494
+ </div>
1495
+ <div class="progress-bar-wrapper">
1496
+ <div class="progress-bar" id="provision-progress-bar" style="width: 0%"></div>
1497
+ </div>
1498
+ <div class="progress-text" id="provision-progress-text">0 / 0 resources</div>
1499
+
1500
+ <div class="log-toggle" id="provision-log-toggle">
1501
+ <span class="arrow">▶</span>
1502
+ <span>Show detailed log</span>
1503
+ </div>
1504
+ </div>
1505
+
1418
1506
  <div class="progress-log hidden" id="provision-log">
1419
1507
  <pre id="provision-output"></pre>
1420
1508
  </div>
@@ -1443,7 +1531,24 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1443
1531
  <span class="status-badge status-pending" id="deploy-status">Ready</span>
1444
1532
  </h2>
1445
1533
 
1446
- <p style="margin-bottom: 1rem;">Ready to deploy Authrim workers to Cloudflare.</p>
1534
+ <p id="deploy-ready-text" style="margin-bottom: 1rem;">Ready to deploy Authrim workers to Cloudflare.</p>
1535
+
1536
+ <!-- Progress UI (shown during deployment) -->
1537
+ <div id="deploy-progress-ui" class="progress-container hidden">
1538
+ <div class="progress-status">
1539
+ <div class="spinner" id="deploy-spinner"></div>
1540
+ <span id="deploy-current-task">Initializing...</span>
1541
+ </div>
1542
+ <div class="progress-bar-wrapper">
1543
+ <div class="progress-bar" id="deploy-progress-bar" style="width: 0%"></div>
1544
+ </div>
1545
+ <div class="progress-text" id="deploy-progress-text">0 / 0 components</div>
1546
+
1547
+ <div class="log-toggle" id="deploy-log-toggle">
1548
+ <span class="arrow">▶</span>
1549
+ <span>Show detailed log</span>
1550
+ </div>
1551
+ </div>
1447
1552
 
1448
1553
  <div class="progress-log hidden" id="deploy-log">
1449
1554
  <pre id="deploy-output"></pre>
@@ -1519,6 +1624,31 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1519
1624
  <code id="detail-env-name" style="background: var(--bg); padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 1rem;"></code>
1520
1625
  </h2>
1521
1626
 
1627
+ <!-- Admin Setup Section -->
1628
+ <div id="admin-setup-section" class="hidden" style="margin-bottom: 1.5rem; padding: 1rem; background: #fef3c7; border-radius: 8px; border: 1px solid #fcd34d;">
1629
+ <div style="display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem;">
1630
+ <span style="font-size: 1.5rem;">⚠️</span>
1631
+ <div>
1632
+ <div style="font-weight: 600; color: #92400e;">Admin Account Not Configured</div>
1633
+ <div style="font-size: 0.875rem; color: #a16207;">Initial administrator has not been set up for this environment.</div>
1634
+ </div>
1635
+ </div>
1636
+ <button class="btn-primary" id="btn-start-admin-setup" style="margin-top: 0.5rem;">
1637
+ 🔐 Start Admin Account Setup with Passkey
1638
+ </button>
1639
+ <div id="admin-setup-result" class="hidden" style="margin-top: 1rem; padding: 0.75rem; background: white; border-radius: 6px;">
1640
+ <div style="font-weight: 500; margin-bottom: 0.5rem;">Setup URL Generated:</div>
1641
+ <div style="display: flex; gap: 0.5rem; align-items: center;">
1642
+ <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;">
1643
+ <button class="btn-secondary" id="btn-copy-setup-url" style="white-space: nowrap;">📋 Copy</button>
1644
+ <a id="btn-open-setup-url" href="#" target="_blank" class="btn-primary" style="text-decoration: none; white-space: nowrap;">🔗 Open</a>
1645
+ </div>
1646
+ <div style="font-size: 0.75rem; color: #6b7280; margin-top: 0.5rem;">
1647
+ This URL is valid for 1 hour. Open it in a browser to register the first admin account.
1648
+ </div>
1649
+ </div>
1650
+ </div>
1651
+
1522
1652
  <div id="detail-resources">
1523
1653
  <!-- Workers -->
1524
1654
  <div class="resource-section">
@@ -1569,31 +1699,6 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1569
1699
  </div>
1570
1700
  </div>
1571
1701
 
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
-
1597
1702
  <div class="button-group">
1598
1703
  <button class="btn-secondary" id="btn-back-env-detail">← Back to List</button>
1599
1704
  <button class="btn-danger" id="btn-delete-from-detail">🗑️ Delete Environment...</button>
@@ -1615,6 +1720,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1615
1720
  Environment: <code id="delete-env-name" style="background: var(--bg); padding: 0.25rem 0.5rem; border-radius: 4px;"></code>
1616
1721
  </h3>
1617
1722
 
1723
+ <div id="delete-options-section">
1618
1724
  <p style="margin-bottom: 1rem; color: var(--text-muted);">Select resources to delete:</p>
1619
1725
 
1620
1726
  <div class="delete-options">
@@ -1666,6 +1772,24 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1666
1772
  </span>
1667
1773
  </label>
1668
1774
  </div>
1775
+ </div>
1776
+ </div>
1777
+
1778
+ <!-- Progress UI (shown during deletion) -->
1779
+ <div id="delete-progress-ui" class="progress-container hidden">
1780
+ <div class="progress-status">
1781
+ <div class="spinner" id="delete-spinner"></div>
1782
+ <span id="delete-current-task">Initializing...</span>
1783
+ </div>
1784
+ <div class="progress-bar-wrapper">
1785
+ <div class="progress-bar" id="delete-progress-bar" style="width: 0%"></div>
1786
+ </div>
1787
+ <div class="progress-text" id="delete-progress-text">0 / 0 resources</div>
1788
+
1789
+ <div class="log-toggle" id="delete-log-toggle">
1790
+ <span class="arrow">▶</span>
1791
+ <span>Show detailed log</span>
1792
+ </div>
1669
1793
  </div>
1670
1794
 
1671
1795
  <div class="progress-log hidden" id="delete-log">
@@ -1770,6 +1894,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1770
1894
  function showSection(name) {
1771
1895
  Object.values(sections).forEach(s => s.classList.add('hidden'));
1772
1896
  sections[name].classList.remove('hidden');
1897
+ window.scrollTo(0, 0);
1773
1898
  }
1774
1899
 
1775
1900
  // Auto-scroll helper for progress logs
@@ -1779,6 +1904,106 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1779
1904
  }
1780
1905
  }
1781
1906
 
1907
+ // Log toggle functionality
1908
+ function setupLogToggle(toggleId, logId) {
1909
+ const toggle = document.getElementById(toggleId);
1910
+ const log = document.getElementById(logId);
1911
+ if (toggle && log) {
1912
+ toggle.addEventListener('click', () => {
1913
+ const isHidden = log.classList.contains('hidden');
1914
+ if (isHidden) {
1915
+ log.classList.remove('hidden');
1916
+ toggle.classList.add('open');
1917
+ toggle.querySelector('span:last-child').textContent = 'Hide detailed log';
1918
+ } else {
1919
+ log.classList.add('hidden');
1920
+ toggle.classList.remove('open');
1921
+ toggle.querySelector('span:last-child').textContent = 'Show detailed log';
1922
+ }
1923
+ });
1924
+ }
1925
+ }
1926
+
1927
+ // Setup all log toggles
1928
+ setupLogToggle('deploy-log-toggle', 'deploy-log');
1929
+ setupLogToggle('provision-log-toggle', 'provision-log');
1930
+ setupLogToggle('delete-log-toggle', 'delete-log');
1931
+
1932
+ // Progress UI update helper
1933
+ function updateProgressUI(prefix, current, total, currentTask) {
1934
+ const progressBar = document.getElementById(prefix + '-progress-bar');
1935
+ const progressText = document.getElementById(prefix + '-progress-text');
1936
+ const currentTaskEl = document.getElementById(prefix + '-current-task');
1937
+
1938
+ if (progressBar && total > 0) {
1939
+ const percent = Math.round((current / total) * 100);
1940
+ progressBar.style.width = percent + '%';
1941
+ }
1942
+ if (progressText) {
1943
+ progressText.textContent = current + ' / ' + total + ' ' + (prefix === 'deploy' ? 'components' : 'resources');
1944
+ }
1945
+ if (currentTaskEl && currentTask) {
1946
+ currentTaskEl.textContent = currentTask;
1947
+ }
1948
+ }
1949
+
1950
+ // Parse progress message to extract current task
1951
+ function parseProgressMessage(message) {
1952
+ // Match patterns like "Deploying xxx...", "Creating xxx...", "Deleting xxx..."
1953
+ if (message.includes('Deploying ')) {
1954
+ const parts = message.split('Deploying ')[1];
1955
+ if (parts) {
1956
+ const name = parts.split('.')[0].split(' ')[0];
1957
+ if (name) return 'Deploying ' + name + '...';
1958
+ }
1959
+ }
1960
+
1961
+ if (message.includes('Creating ')) {
1962
+ const parts = message.split('Creating ')[1];
1963
+ if (parts) {
1964
+ const name = parts.split(' ')[0].split('.')[0];
1965
+ if (name) return 'Creating ' + name + '...';
1966
+ }
1967
+ }
1968
+
1969
+ if (message.includes('Deleting')) {
1970
+ const parts = message.split('Deleting')[1];
1971
+ if (parts) {
1972
+ const name = parts.trim().split(' ')[0].replace(':', '');
1973
+ if (name) return 'Deleting ' + name + '...';
1974
+ }
1975
+ }
1976
+
1977
+ if (message.includes('✓')) {
1978
+ const parts = message.split('✓')[1];
1979
+ if (parts) {
1980
+ const text = parts.trim().substring(0, 40);
1981
+ return '✓ ' + text;
1982
+ }
1983
+ }
1984
+
1985
+ if (message.includes('Level ')) {
1986
+ const parts = message.split('Level ')[1];
1987
+ if (parts) {
1988
+ const num = parts.trim().split(' ')[0];
1989
+ if (num) return 'Deployment Level ' + num;
1990
+ }
1991
+ }
1992
+
1993
+ if (message.includes('Generating')) {
1994
+ const parts = message.split('Generating')[1];
1995
+ if (parts) {
1996
+ const text = parts.trim().substring(0, 30);
1997
+ return 'Generating ' + text + '...';
1998
+ }
1999
+ }
2000
+
2001
+ if (message.includes('Uploading')) return 'Uploading secrets...';
2002
+ if (message.toLowerCase().includes('building')) return 'Building packages...';
2003
+
2004
+ return null;
2005
+ }
2006
+
1782
2007
  // Safe DOM element creation helpers
1783
2008
  function createAlert(type, content) {
1784
2009
  const div = document.createElement('div');
@@ -2578,16 +2803,23 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2578
2803
  const resourcePreview = document.getElementById('resource-preview');
2579
2804
  const keysSavedInfo = document.getElementById('keys-saved-info');
2580
2805
  const keysPath = document.getElementById('keys-path');
2806
+ const progressUI = document.getElementById('provision-progress-ui');
2581
2807
 
2582
2808
  btn.disabled = true;
2809
+ btn.classList.add('hidden');
2583
2810
  btnGotoDeploy.classList.add('hidden');
2584
2811
  status.textContent = 'Running...';
2585
2812
  status.className = 'status-badge status-running';
2586
- log.classList.remove('hidden');
2813
+ progressUI.classList.remove('hidden');
2814
+ log.classList.add('hidden'); // Log is hidden by default, toggled via button
2587
2815
  resourcePreview.classList.add('hidden');
2588
2816
  keysSavedInfo.classList.add('hidden');
2589
2817
  output.textContent = '';
2590
2818
 
2819
+ let provisionCompleted = 0;
2820
+ const totalResources = 8; // D1 Core, D1 PII, KV Settings, KV Cache, KV Tokens, R2 (optional), Queues (optional), Keys
2821
+ updateProgressUI('provision', 0, totalResources, 'Initializing...');
2822
+
2591
2823
  // Start polling for progress
2592
2824
  let lastProgressLength = 0;
2593
2825
  provisionPollInterval = setInterval(async () => {
@@ -2598,6 +2830,16 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2598
2830
  const newMessages = statusResult.progress.slice(lastProgressLength);
2599
2831
  newMessages.forEach(msg => {
2600
2832
  output.textContent += msg + '\\n';
2833
+ // Update progress UI based on message content
2834
+ const taskInfo = parseProgressMessage(msg);
2835
+ if (taskInfo) {
2836
+ updateProgressUI('provision', provisionCompleted, totalResources, taskInfo);
2837
+ }
2838
+ // Count completed items (lines with checkmark)
2839
+ if (msg.includes('✓') || msg.includes('✅')) {
2840
+ provisionCompleted++;
2841
+ updateProgressUI('provision', provisionCompleted, totalResources, taskInfo || ('Completed ' + provisionCompleted + ' items'));
2842
+ }
2601
2843
  });
2602
2844
  lastProgressLength = statusResult.progress.length;
2603
2845
  scrollToBottom(log);
@@ -2649,6 +2891,8 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2649
2891
  }
2650
2892
 
2651
2893
  if (result.success) {
2894
+ // Final progress update
2895
+ updateProgressUI('provision', totalResources, totalResources, '✅ Provisioning complete!');
2652
2896
  output.textContent += '\\n✅ Provisioning complete!\\n';
2653
2897
  scrollToBottom(log);
2654
2898
  status.textContent = 'Complete';
@@ -2662,6 +2906,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2662
2906
 
2663
2907
  // Update buttons
2664
2908
  btn.textContent = 'Re-provision (Delete & Create)';
2909
+ btn.classList.remove('hidden');
2665
2910
  btn.disabled = false;
2666
2911
  btnGotoDeploy.classList.remove('hidden');
2667
2912
  } else {
@@ -2678,6 +2923,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2678
2923
  scrollToBottom(log);
2679
2924
  status.textContent = 'Error';
2680
2925
  status.className = 'status-badge status-error';
2926
+ btn.classList.remove('hidden');
2681
2927
  btn.disabled = false;
2682
2928
  resourcePreview.classList.remove('hidden');
2683
2929
  }
@@ -2706,13 +2952,21 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2706
2952
  const status = document.getElementById('deploy-status');
2707
2953
  const log = document.getElementById('deploy-log');
2708
2954
  const output = document.getElementById('deploy-output');
2955
+ const progressUI = document.getElementById('deploy-progress-ui');
2956
+ const readyText = document.getElementById('deploy-ready-text');
2709
2957
 
2710
2958
  btn.disabled = true;
2959
+ btn.classList.add('hidden');
2711
2960
  status.textContent = 'Deploying...';
2712
2961
  status.className = 'status-badge status-running';
2713
- log.classList.remove('hidden');
2962
+ readyText.classList.add('hidden');
2963
+ progressUI.classList.remove('hidden');
2964
+ log.classList.add('hidden'); // Log is hidden by default, toggled via button
2714
2965
  output.textContent = 'Starting deployment...\\n\\n';
2715
- scrollToBottom(log);
2966
+
2967
+ let completedCount = 0;
2968
+ const totalComponents = 10; // Approximate total components
2969
+ updateProgressUI('deploy', 0, totalComponents, 'Initializing...');
2716
2970
 
2717
2971
  try {
2718
2972
  // Generate wrangler configs first
@@ -2730,10 +2984,25 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2730
2984
  scrollToBottom(log);
2731
2985
 
2732
2986
  // Poll for status updates
2987
+ let lastProgressLength = 0;
2733
2988
  const pollInterval = setInterval(async () => {
2734
2989
  const statusResult = await api('/deploy/status');
2735
- if (statusResult.progress && statusResult.progress.length > 0) {
2736
- output.textContent = statusResult.progress.join('\\n') + '\\n';
2990
+ if (statusResult.progress && statusResult.progress.length > lastProgressLength) {
2991
+ const newMessages = statusResult.progress.slice(lastProgressLength);
2992
+ newMessages.forEach(msg => {
2993
+ output.textContent += msg + '\\n';
2994
+ // Update progress UI based on message content
2995
+ const taskInfo = parseProgressMessage(msg);
2996
+ if (taskInfo) {
2997
+ updateProgressUI('deploy', completedCount, totalComponents, taskInfo);
2998
+ }
2999
+ // Count completed items (lines with checkmark)
3000
+ if (msg.includes('✓') || msg.includes('✅')) {
3001
+ completedCount++;
3002
+ updateProgressUI('deploy', completedCount, totalComponents, taskInfo || ('Completed ' + completedCount + ' items'));
3003
+ }
3004
+ });
3005
+ lastProgressLength = statusResult.progress.length;
2737
3006
  scrollToBottom(log);
2738
3007
  }
2739
3008
  }, 1000);
@@ -2749,6 +3018,8 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2749
3018
  clearInterval(pollInterval);
2750
3019
 
2751
3020
  if (result.success) {
3021
+ // Final progress update
3022
+ updateProgressUI('deploy', totalComponents, totalComponents, '✓ Deployment complete!');
2752
3023
  output.textContent += '\\n✓ Deployment complete!\\n';
2753
3024
  scrollToBottom(log);
2754
3025
 
@@ -3510,9 +3781,11 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3510
3781
  document.getElementById('delete-pages').checked = true;
3511
3782
 
3512
3783
  // Reset UI state
3784
+ document.getElementById('delete-options-section').classList.remove('hidden');
3513
3785
  document.getElementById('delete-log').classList.add('hidden');
3514
3786
  document.getElementById('delete-result').classList.add('hidden');
3515
- document.getElementById('delete-result').innerHTML = '';
3787
+ document.getElementById('delete-result').textContent = '';
3788
+ document.getElementById('btn-confirm-delete').classList.remove('hidden');
3516
3789
  document.getElementById('btn-confirm-delete').disabled = false;
3517
3790
 
3518
3791
  showSection('envDelete');
@@ -3636,9 +3909,13 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3636
3909
  const log = document.getElementById('delete-log');
3637
3910
  const output = document.getElementById('delete-output');
3638
3911
  const result = document.getElementById('delete-result');
3912
+ const progressUI = document.getElementById('delete-progress-ui');
3639
3913
 
3640
3914
  btn.disabled = true;
3641
- log.classList.remove('hidden');
3915
+ btn.classList.add('hidden');
3916
+ document.getElementById('delete-options-section').classList.add('hidden');
3917
+ progressUI.classList.remove('hidden');
3918
+ log.classList.add('hidden'); // Log is hidden by default, toggled via button
3642
3919
  result.classList.add('hidden');
3643
3920
  output.textContent = '';
3644
3921
 
@@ -3651,6 +3928,11 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3651
3928
  deletePages: document.getElementById('delete-pages').checked,
3652
3929
  };
3653
3930
 
3931
+ // Count selected options for progress tracking
3932
+ let deleteCompleted = 0;
3933
+ const totalToDelete = Object.values(deleteOptions).filter(v => v).length;
3934
+ updateProgressUI('delete', 0, totalToDelete, 'Starting deletion...');
3935
+
3654
3936
  // Poll for progress
3655
3937
  let lastProgressLength = 0;
3656
3938
  const pollInterval = setInterval(async () => {
@@ -3660,9 +3942,19 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3660
3942
  const newMessages = statusResult.progress.slice(lastProgressLength);
3661
3943
  newMessages.forEach(msg => {
3662
3944
  output.textContent += msg + '\\n';
3945
+ // Update progress UI based on message content
3946
+ const taskInfo = parseProgressMessage(msg);
3947
+ if (taskInfo) {
3948
+ updateProgressUI('delete', deleteCompleted, totalToDelete, taskInfo);
3949
+ }
3950
+ // Count completed items (lines with checkmark)
3951
+ if (msg.includes('✓') || msg.includes('✅') || msg.includes('Deleted')) {
3952
+ deleteCompleted++;
3953
+ updateProgressUI('delete', deleteCompleted, totalToDelete, taskInfo || ('Deleted ' + deleteCompleted + ' items'));
3954
+ }
3663
3955
  });
3664
3956
  lastProgressLength = statusResult.progress.length;
3665
- log.scrollTop = log.scrollHeight;
3957
+ scrollToBottom(log);
3666
3958
  }
3667
3959
  } catch (e) {}
3668
3960
  }, 500);
@@ -3683,6 +3975,8 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3683
3975
  result.classList.remove('hidden');
3684
3976
 
3685
3977
  if (deleteResult.success) {
3978
+ // Final progress update
3979
+ updateProgressUI('delete', totalToDelete, totalToDelete, '✅ Deletion complete!');
3686
3980
  result.textContent = '';
3687
3981
  result.appendChild(createAlert('success', '✅ Environment deleted successfully!'));
3688
3982
 
@@ -3694,6 +3988,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3694
3988
  } else {
3695
3989
  result.textContent = '';
3696
3990
  result.appendChild(createAlert('error', '❌ Some errors occurred: ' + (deleteResult.errors || []).join(', ')));
3991
+ btn.classList.remove('hidden');
3697
3992
  btn.disabled = false;
3698
3993
  }
3699
3994
  } catch (error) {
@@ -3701,6 +3996,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3701
3996
  result.classList.remove('hidden');
3702
3997
  result.textContent = '';
3703
3998
  result.appendChild(createAlert('error', '❌ Error: ' + error.message));
3999
+ btn.classList.remove('hidden');
3704
4000
  btn.disabled = false;
3705
4001
  }
3706
4002
  });
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA2pDoB,SAAS;0BACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAg+DhC,CAAC;AACT,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAuxDoB,SAAS;0BACZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4oEhC,CAAC;AACT,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@authrim/setup",
3
- "version": "0.1.62",
3
+ "version": "0.1.63",
4
4
  "description": "CLI tool for setting up Authrim OIDC Provider on Cloudflare Workers",
5
5
  "type": "module",
6
6
  "bin": {