diff --git a/src/engineering_platform/assets/dashboard.css b/src/engineering_platform/assets/dashboard.css index 20ab63ed..ac50154f 100644 --- a/src/engineering_platform/assets/dashboard.css +++ b/src/engineering_platform/assets/dashboard.css @@ -990,6 +990,9 @@ html[data-theme="light"] ::-webkit-scrollbar-thumb:hover{background:#0a6b9d} /* A glyph is visual control language, not body copy. Keep all icon-only actions and disclosure markers at one deliberate, legible weight. */ :is(.category-icon,.page-refresh>span,.dashboard-action,.component-info,.prompt-history-report,.prompt-history-analysis,.prompt-history-details,.prompt-history-chat,.dashboard-modal-shell__close,.report-view-modal__close,.chat-send>span){font-weight:700}:is(.technical-details,.codex-chat,.telemetry,.platform-health,#currentRun,.inbox-queue,.prompt-history)>summary::before,:is(.copy.copy--glyph,.download.download--glyph,.component-modal__restart,.rate-limit-reset,.predecessor-retry,.execution-dismiss,.operator-merge-wait__actions :is(.dashboard-action--primary,.dashboard-action--destructive),#operatorMergeWaitModal :is(.dashboard-modal-shell__action--primary,.dashboard-modal-shell__action--destructive),.component-modal h2,.confirmation-modal h2,.report-view-modal__title,.prompt-chat-modal__header h2)::before{font-weight:700} + +/* Relocation and component actions keep their position while optional actions change. */ +.component-modal__actions{display:grid;gap:10px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:18px}.component-modal__actions .component-modal__restart{margin:0;min-height:44px;min-width:0;width:100%}.component-modal__actions .dashboard-modal-shell__action{grid-column:2;margin:0;min-width:0;width:100%}.installation-relocation-modal .dashboard-modal-shell__panel{display:grid;gap:18px}.installation-relocation-modal .dashboard-modal-shell__panel>p{margin:0}.installation-relocation-modal__locations{display:grid;gap:12px;margin:0}.installation-relocation-modal__locations div{display:grid;gap:4px}.installation-relocation-modal__locations dt{color:var(--modal-secondary-accent);font-size:12px;font-weight:700;letter-spacing:.05em;text-transform:uppercase}.installation-relocation-modal__locations dd{margin:0;overflow-wrap:anywhere}.installation-relocation-modal .dashboard-modal-shell__actions{justify-content:flex-start;margin-top:0}.installation-relocation-modal .dashboard-modal-shell__action{min-width:10rem}.configuration-central-database__actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end} /* A stored run-scoped conversation gets a filled, heavier history glyph. */ .prompt-history-chat--recorded{font-weight:800} /* Categories are navigation surfaces, not selected inputs. Their disclosure diff --git a/src/engineering_platform/assets/dashboard.js b/src/engineering_platform/assets/dashboard.js index 6b6886cf..419bfcf9 100644 --- a/src/engineering_platform/assets/dashboard.js +++ b/src/engineering_platform/assets/dashboard.js @@ -3713,7 +3713,7 @@ componentModalDismiss.type = "button"; componentModalDismiss.className = "dashboard-modal-shell__action dashboard-modal-shell__action--primary"; componentModalDismiss.textContent = t("action.close"); componentModalDismiss.addEventListener("click", () => $("componentModal").close()); -$("componentModalStatus").before(componentModalDismiss); +$("componentModalActions").append(componentModalDismiss); $("componentModal").addEventListener("click", (event) => { if (event.target === $("componentModal")) $("componentModal").close(); }); diff --git a/src/engineering_platform/server.py b/src/engineering_platform/server.py index 802d923e..a308d181 100644 --- a/src/engineering_platform/server.py +++ b/src/engineering_platform/server.py @@ -2141,13 +2141,13 @@ def _central_database_section(data_root: Path) -> str: f'' '' '

' - '

Verplaats database

Kies een beschrijfbare lokale map. De server stopt eerst veilig en start daarna opnieuw.

' + '

Verplaats database

Kies een beschrijfbare lokale map. De server stopt eerst veilig en start daarna opnieuw.

Huidige map
{escape(str(details["path"]))}

' ) def _central_database_script() -> str: """Keep the EP database maintenance preference host-scoped in the Console.""" - return '''const maintenance=document.getElementById('centralDatabaseMaintenanceInterval'),maintenanceStatus=document.getElementById('centralDatabaseMaintenanceStatus'),translate=window.__engineeringPlatformDashboardTranslate;if(maintenance)maintenance.addEventListener('change',async()=>{const previous=maintenance.dataset.savedValue||maintenance.value,requested=Number(maintenance.value);maintenance.disabled=true;maintenance.setAttribute('aria-busy','true');if(maintenanceStatus)maintenanceStatus.textContent='';try{const response=await fetch('/api/central-database/configuration',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({interval_seconds:requested})});const result=response.ok?await response.json():null;if(!result||Number(result.interval_seconds)!==requested)throw Error();maintenance.dataset.savedValue=String(requested);if(maintenanceStatus)maintenanceStatus.textContent=translate('configuration.ep_database_maintenance_saved')}catch{maintenance.value=previous;if(maintenanceStatus)maintenanceStatus.textContent=translate('configuration.ep_database_maintenance_failed')}finally{maintenance.disabled=false;maintenance.removeAttribute('aria-busy')}});const modal=document.getElementById('centralDatabaseRelocateModal'),open=document.getElementById('centralDatabaseRelocate'),input=document.getElementById('centralDatabaseRelocateDirectory'),status=document.getElementById('centralDatabaseRelocateStatus');open?.addEventListener('click',()=>modal.showModal());modal?.querySelector('[data-close-relocation]')?.addEventListener('click',()=>modal.close());document.getElementById('centralDatabaseRelocateBrowse')?.addEventListener('click',async()=>{const r=await fetch('/api/central-database/relocate/browse',{method:'POST'}),p=await r.json();if(p.value)input.value=p.value;});document.getElementById('centralDatabaseRelocateSave')?.addEventListener('click',async()=>{const r=await fetch('/api/central-database/relocate',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({directory:input.value})}),p=await r.json();status.textContent=r.ok?translate('configuration.relocation_restarting'):p.error||translate('configuration.relocation_failed');if(r.ok)setTimeout(()=>location.reload(),2500);});''' + return '''const maintenance=document.getElementById('centralDatabaseMaintenanceInterval'),maintenanceStatus=document.getElementById('centralDatabaseMaintenanceStatus'),translate=window.__engineeringPlatformDashboardTranslate;if(maintenance)maintenance.addEventListener('change',async()=>{const previous=maintenance.dataset.savedValue||maintenance.value,requested=Number(maintenance.value);maintenance.disabled=true;maintenance.setAttribute('aria-busy','true');if(maintenanceStatus)maintenanceStatus.textContent='';try{const response=await fetch('/api/central-database/configuration',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({interval_seconds:requested})});const result=response.ok?await response.json():null;if(!result||Number(result.interval_seconds)!==requested)throw Error();maintenance.dataset.savedValue=String(requested);if(maintenanceStatus)maintenanceStatus.textContent=translate('configuration.ep_database_maintenance_saved')}catch{maintenance.value=previous;if(maintenanceStatus)maintenanceStatus.textContent=translate('configuration.ep_database_maintenance_failed')}finally{maintenance.disabled=false;maintenance.removeAttribute('aria-busy')}});const modal=document.getElementById('centralDatabaseRelocateModal'),open=document.getElementById('centralDatabaseRelocate'),input=document.getElementById('centralDatabaseRelocateDirectory'),destination=document.getElementById('centralDatabaseRelocateDestination'),destinationValue=document.getElementById('centralDatabaseRelocateDestinationValue'),save=document.getElementById('centralDatabaseRelocateSave'),status=document.getElementById('centralDatabaseRelocateStatus');open?.addEventListener('click',()=>modal.showModal());modal?.querySelector('[data-close-relocation]')?.addEventListener('click',()=>modal.close());document.getElementById('centralDatabaseRelocateBrowse')?.addEventListener('click',async()=>{const r=await fetch('/api/central-database/relocate/browse',{method:'POST'}),p=await r.json();if(p.value){input.value=p.value;destinationValue.textContent=p.value;destination.hidden=false;save.disabled=false;}});save?.addEventListener('click',async()=>{const r=await fetch('/api/central-database/relocate',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({directory:input.value})}),p=await r.json();status.textContent=r.ok?translate('configuration.relocation_restarting'):p.error||translate('configuration.relocation_failed');if(r.ok)setTimeout(()=>location.reload(),2500);});''' def _retire_legacy_inbox_configuration(document: bytes, data_root: Path) -> bytes: @@ -2161,6 +2161,9 @@ def _retire_legacy_inbox_configuration(document: bytes, data_root: Path) -> byte readonly = b'

' + location + b'

Verplaats bestandsinbox

Dit kan alleen als de inbox leeg is. De Server start daarna opnieuw.

' document = document.replace(b'data-i18n="section.host_components"', b'data-i18n="section.platform_components"') document = document.replace(b'data-i18n="description.host_components"', b'data-i18n="description.platform_components"') + server_settings_end = b'
' + if server_settings_end in document: + return document.replace(server_settings_end, b'' + readonly + b'
', 1) return document.replace( b'

', b'

' + readonly, diff --git a/src/engineering_platform/server_console_services.py b/src/engineering_platform/server_console_services.py index 1768b447..2e4495c1 100644 --- a/src/engineering_platform/server_console_services.py +++ b/src/engineering_platform/server_console_services.py @@ -1944,7 +1944,7 @@ def render_console_document(

-

+