Implement RBAC migration and role management enhancements
- Added AJAX functionality to fetch role permissions for copying. - Introduced system role management with permission checks for updates. - Implemented role deletion with confirmation modal and backend handling. - Enhanced user role assignment migration scripts to transition from legacy profiles to RBAC. - Created SQL migration scripts for user roles and permissions mapping. - Updated user interface to support new role management features including copy permissions and system role indicators.
This commit is contained in:
@@ -100,6 +100,45 @@ if (document.readyState === 'loading') {
|
||||
checkBrowserCompatibility();
|
||||
}
|
||||
|
||||
// Shared serial port reference for upload.js to use
|
||||
window.sharedSerialPort = null;
|
||||
|
||||
// Override requestPort to minimize user prompts
|
||||
// This intercepts all requestPort calls (including from upload.js) to reuse authorized ports
|
||||
if ('serial' in navigator) {
|
||||
const originalRequestPort = navigator.serial.requestPort.bind(navigator.serial);
|
||||
|
||||
navigator.serial.requestPort = async function(options) {
|
||||
// If we have a shared port, return it instead of prompting
|
||||
if (window.sharedSerialPort) {
|
||||
console.log('Using shared serial port (no prompt needed)');
|
||||
return window.sharedSerialPort;
|
||||
}
|
||||
|
||||
// Try already-authorized ports matching the filters
|
||||
const ports = await navigator.serial.getPorts();
|
||||
if (ports.length > 0 && options?.filters) {
|
||||
const match = ports.find(p => {
|
||||
const info = p.getInfo();
|
||||
return options.filters.some(f =>
|
||||
info.usbVendorId === f.usbVendorId &&
|
||||
info.usbProductId === f.usbProductId
|
||||
);
|
||||
});
|
||||
if (match) {
|
||||
console.log('Using previously authorized port (no prompt needed)');
|
||||
window.sharedSerialPort = match;
|
||||
return match;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: original prompt behavior
|
||||
const port = await originalRequestPort(options);
|
||||
window.sharedSerialPort = port; // Store for future use
|
||||
return port;
|
||||
};
|
||||
}
|
||||
|
||||
// Function to log communication to API (reused from scripts.js)
|
||||
async function logCommunication(data, direction) {
|
||||
// Only log if debug mode is enabled
|
||||
@@ -400,7 +439,11 @@ async function closePortAfterRead() {
|
||||
await port.close();
|
||||
await logCommunication('Port closed successfully', 'info');
|
||||
|
||||
// Reset for next connection
|
||||
// Keep port reference in sharedSerialPort for upload.js to reuse
|
||||
// This prevents the need for another user prompt during firmware upload
|
||||
window.sharedSerialPort = port;
|
||||
|
||||
// Reset local variables for next connection
|
||||
reader = null;
|
||||
writer = null;
|
||||
readableStreamClosed = null;
|
||||
@@ -410,7 +453,12 @@ async function closePortAfterRead() {
|
||||
console.error('Error closing port after read:', error);
|
||||
await logCommunication(`Error closing port: ${error.message}`, 'error');
|
||||
|
||||
// Force reset even on error
|
||||
// Keep port reference even on error if port exists
|
||||
if (port) {
|
||||
window.sharedSerialPort = port;
|
||||
}
|
||||
|
||||
// Force reset local variables even on error
|
||||
reader = null;
|
||||
writer = null;
|
||||
readableStreamClosed = null;
|
||||
|
||||
Reference in New Issue
Block a user