fix: implement Blazor-native login form to properly update authentication state
TaxBaik CI/CD / build-and-deploy (push) Successful in 2m26s
TaxBaik CI/CD / build-and-deploy (push) Successful in 2m26s
Problem: JavaScript login form saved tokens to localStorage but didn't notify CustomAuthenticationStateProvider, causing [Authorize] pages to remain in 'loading' state indefinitely. The provider only reads tokens when: 1. GetAuthenticationStateAsync() is called (page load) 2. NotifyAuthenticationStateChanged() is triggered (UI updates) But JavaScript login didn't trigger either, leaving the authentication state stale. Solution: Convert AdminLoginForm from HTML+JavaScript to pure Blazor component. Now the login flow is: 1. User enters credentials in Blazor form 2. HttpClient POST to /api/auth/login 3. Save tokens to localStorage 4. Call CustomAuthenticationStateProvider.LoginAsync() directly 5. Blazor detects auth state change and re-evaluates [Authorize] pages 6. Dashboard [Authorize] page renders successfully Result: Immediate authentication state update, no loading timeout on protected pages. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import { SmartTables } from '../optional/smartTables/smartTables.bundle.js';
|
||||
|
||||
// Wait for the DOM to load before initializing
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
|
||||
// Initialize SmartTables with the table ID and options
|
||||
const table = new SmartTables('myTable', {
|
||||
responsive: {
|
||||
enabled: true,
|
||||
breakpoint: 768,
|
||||
columnPrikorities: {
|
||||
0: 1, // TradeID - highest priority (never hide)
|
||||
1: 2, // Symbol - second highest priority
|
||||
2: 3, // Qty - third priority
|
||||
3: 4, // BuyPrice - fourth priority
|
||||
4: 5, // SellPrice - fifth priority
|
||||
5: 6 // BuyDate - sixth priority
|
||||
}
|
||||
},
|
||||
debug: true,
|
||||
// Add hooks for customizing cell rendering
|
||||
hooks: {
|
||||
afterInit: function () {
|
||||
// Get all table cells after initialization
|
||||
const tbody = document.querySelector('#myTable tbody');
|
||||
if (!tbody) return;
|
||||
|
||||
// Process each row
|
||||
Array.from(tbody.querySelectorAll('tr')).forEach(row => {
|
||||
// Apply formatting to specific columns
|
||||
Array.from(row.cells).forEach((cell, index) => {
|
||||
const text = cell.textContent.trim();
|
||||
|
||||
// Check for null values in any column
|
||||
if (text === 'null') {
|
||||
cell.textContent = 'null'; // Replace with em dash
|
||||
cell.classList.add('text-muted', 'fst-italic');
|
||||
return;
|
||||
}
|
||||
|
||||
// Format Profit column (7)
|
||||
if (index === 7) {
|
||||
if (text.includes('-')) {
|
||||
cell.classList.add('text-danger', 'fw-bold');
|
||||
} else {
|
||||
cell.classList.add('text-success', 'fw-bold');
|
||||
}
|
||||
}
|
||||
|
||||
// Format Net column (9)
|
||||
if (index === 9) {
|
||||
if (text.includes('-')) {
|
||||
cell.classList.add('text-danger', 'fw-bold');
|
||||
} else {
|
||||
cell.classList.add('text-success', 'fw-bold');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user