.
This commit is contained in:
@@ -141,6 +141,28 @@
|
||||
if(window._calendars){ Object.values(window._calendars).forEach(c => c.refreshLeaves && c.refreshLeaves()); }
|
||||
}catch(e){ console.error('leaveUpdated handler', e); }
|
||||
});
|
||||
|
||||
// As a robustness measure, also listen to HTMX afterRequest and inspect
|
||||
// the HX-Trigger header. Some flows use hx-swap="none" which may not
|
||||
// produce an htmx:afterSwap event for #modal; reading the header here
|
||||
// ensures we still honor closeModal/leaveUpdated triggers.
|
||||
document.body.addEventListener('htmx:afterRequest', function(evt){
|
||||
try{
|
||||
const xhr = evt.detail && evt.detail.xhr;
|
||||
if(!xhr) return;
|
||||
const trig = xhr.getResponseHeader && xhr.getResponseHeader('HX-Trigger');
|
||||
if(!trig) return;
|
||||
// HX-Trigger may be a JSON string or comma-separated names; handle both
|
||||
let triggers = [];
|
||||
try{ triggers = JSON.parse(trig); }catch(e){ triggers = String(trig).split(/\s*,\s*/); }
|
||||
if(triggers.includes('closeModal')){
|
||||
try{ if(window.closeProcRotaModal) window.closeProcRotaModal(); }catch(e){}
|
||||
}
|
||||
if(triggers.includes('leaveUpdated')){
|
||||
try{ if(window._calendars){ Object.values(window._calendars).forEach(c => c.refreshLeaves && c.refreshLeaves()); } }catch(e){}
|
||||
}
|
||||
}catch(e){ console.error('htmx:afterRequest robustness handler', e); }
|
||||
});
|
||||
</script>
|
||||
{% block scripts %}{% endblock %}
|
||||
</body>
|
||||
|
||||
@@ -7,7 +7,10 @@
|
||||
<button class="delete" aria-label="close" onclick="(window.closeProcRotaModal || (()=>{document.getElementById('modal').innerHTML=''}))()"></button>
|
||||
</header>
|
||||
<section class="modal-card-body">
|
||||
<form method="post" hx-post="{{ form_action }}" hx-target="#modal" hx-swap="innerHTML">
|
||||
<!-- Use hx-swap="none" and rely on server HX-Trigger to close the modal
|
||||
and OOB swaps to update the leave list. This avoids HTMX attempting a
|
||||
main-swap into #modal when the server only returns OOB fragments. -->
|
||||
<form method="post" hx-post="{{ form_action }}" hx-swap="none">
|
||||
{% csrf_token %}
|
||||
{% if worker %}
|
||||
<input type="hidden" name="worker_id" value="{{ worker.id }}" />
|
||||
|
||||
Reference in New Issue
Block a user