40cffb3beb
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>
63 lines
2.5 KiB
JavaScript
63 lines
2.5 KiB
JavaScript
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');
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}); |