Files
taxbaik/legacy/smartadmin/scripts/pages/smarttableresponsive.js
T
kjh2064 40cffb3beb
TaxBaik CI/CD / build-and-deploy (push) Successful in 2m26s
fix: implement Blazor-native login form to properly update authentication state
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>
2026-07-03 13:03:53 +09:00

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');
}
}
});
});
}
}
});
});