A Customized Confirmation UI

htmxλŠ” hx-confirm 속성을 μ§€μ›ν•˜μ—¬ μ‚¬μš©μžμ˜ μž‘μ—…μ„ ν™•μΈν•˜λŠ” κ°„λ‹¨ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이 속성은 기본적으둜 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ confirm() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, μ΄λŠ” μ‹ λ’°ν•  λ§Œν•œ κΈ°λŠ₯이긴 해도 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ UX와 μΌμΉ˜ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

이 μ˜ˆμ œμ—μ„œλŠ” sweetalert2λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μ •μ˜ 확인 λŒ€ν™” μƒμžλ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. μ•„λž˜μ—λŠ” 클릭+μ»€μŠ€ν…€ 이벀트 방법을 μ‚¬μš©ν•˜λŠ” μ˜ˆμ œμ™€ λ‚΄μž₯된 hx-confirm 속성과 htmx:confirm 이벀트λ₯Ό μ‚¬μš©ν•˜λŠ” μ˜ˆμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

#클릭+μ»€μŠ€ν…€ 이벀트 μ‚¬μš©

<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<button hx-get="/confirmed" 
        hx-trigger='confirmed'
        onClick="Swal.fire({title: 'Confirm', text:'Do you want to continue?'}).then((result)=>{
            if(result.isConfirmed){
              htmx.trigger(this, 'confirmed');  
            } 
        })">
  Click Me
</button>

μ—¬κΈ°μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ 클릭 μ‹œ Sweet Alert 2λ₯Ό ν‘œμ‹œν•˜κ³  μ‚¬μš©μžμ˜ 확인을 μš”μ²­ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λŒ€ν™” μƒμžλ₯Ό ν™•μΈν•˜λ©΄, μ»€μŠ€ν…€ β€œconfirmed” 이벀트λ₯Ό νŠΈλ¦¬κ±°ν•˜μ—¬ μš”μ²­μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€. 이 μ΄λ²€νŠΈλŠ” hx-trigger에 μ˜ν•΄ ν¬μ°©λ©λ‹ˆλ‹€.

#Vanilla JS, hx-confirm μ‚¬μš©

<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
  document.addEventListener("htmx:confirm", function(e) {
    e.preventDefault()
    Swal.fire({
      title: "Proceed?",
      text: `I ask you... ${e.detail.question}`
    }).then(function(result) {
      if(result.isConfirmed) e.detail.issueRequest(true) // use true to skip window.confirm
    })
  })
</script>
  
<button hx-get="/confirmed" hx-confirm="Some confirm text here">
  Click Me
</button>

이 λ°©λ²•μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μΆ”κ°€ν•˜μ—¬ 클릭 μ‹œ Sweet Alert 2λ₯Ό ν˜ΈμΆœν•˜κ³  확인을 μš”μ²­ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λŒ€ν™” μƒμžλ₯Ό ν™•μΈν•˜λ©΄ issueRequest λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μš”μ²­μ„ νŠΈλ¦¬κ±°ν•©λ‹ˆλ‹€. μ΄λ•Œ skipConfirmation=trueλ₯Ό 인수둜 μ „λ‹¬ν•˜μ—¬ window.confirm을 κ±΄λ„ˆλ›°λ„λ‘ ν•©λ‹ˆλ‹€.

이 방식은 ν”„λ‘¬ν”„νŠΈμ—μ„œ hx-confirm의 값을 μ‚¬μš©ν•  수 있게 ν•˜μ—¬, 예λ₯Ό λ“€μ–΄ Django 리슀트처럼 μš”μ†Œμ— 따라 질문이 λ‹¬λΌμ§ˆ λ•Œ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

{% for client in clients %}
<button hx-post="/delete/{{client.pk}}" hx-confirm="Delete {{client.name}}??">Delete</button>
{% endfor %}