Monorepo for Tangled
at 9259beb17e5eb25f45d05c4d541415f1b6639829 150 lines 5.9 kB view raw
1{{ define "repo/issues/fragments/newComment" }} 2 {{ if .LoggedInUser }} 3 <form 4 id="comment-form" 5 hx-post="/{{ .RepoInfo.FullName }}/issues/{{ .Issue.IssueId }}/comment" 6 hx-on::after-request="if(event.detail.successful) this.reset()" 7 > 8 <div class="bg-white dark:bg-gray-800 rounded drop-shadow-sm py-4 px-4 relative w-full"> 9 <div class="text-sm pb-2 text-gray-500 dark:text-gray-400"> 10 {{ template "user/fragments/picHandleLink" .LoggedInUser.Did }} 11 </div> 12 <textarea 13 id="comment-textarea" 14 name="body" 15 class="w-full p-2 rounded" 16 placeholder="Add to the discussion. Markdown is supported." 17 onkeyup="updateCommentForm()" 18 rows="5" 19 ></textarea> 20 <div id="issue-comment"></div> 21 <div id="issue-action" class="error"></div> 22 </div> 23 24 <div class="flex gap-2 mt-2"> 25 <button 26 id="comment-button" 27 hx-post="/{{ .RepoInfo.FullName }}/issues/{{ .Issue.IssueId }}/comment" 28 type="submit" 29 hx-disabled-elt="#comment-button" 30 class="btn-create p-2 flex items-center gap-2 no-underline hover:no-underline group" 31 disabled 32 > 33 {{ i "message-square-plus" "w-4 h-4" }} 34 comment 35 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 36 </button> 37 38 {{ $isIssueAuthor := and .LoggedInUser (eq .LoggedInUser.Did .Issue.Did) }} 39 {{ $isRepoCollaborator := .RepoInfo.Roles.IsCollaborator }} 40 {{ $isRepoOwner := .RepoInfo.Roles.IsOwner }} 41 {{ if and (or $isIssueAuthor $isRepoCollaborator $isRepoOwner) .Issue.Open }} 42 <button 43 id="close-button" 44 type="button" 45 class="btn flex items-center gap-2" 46 hx-indicator="#close-spinner" 47 hx-trigger="click" 48 > 49 {{ i "ban" "w-4 h-4" }} 50 close 51 <span id="close-spinner" class="group"> 52 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 53 </span> 54 </button> 55 <div 56 id="close-with-comment" 57 hx-post="/{{ .RepoInfo.FullName }}/issues/{{ .Issue.IssueId }}/comment" 58 hx-trigger="click from:#close-button" 59 hx-disabled-elt="#close-with-comment" 60 hx-target="#issue-comment" 61 hx-indicator="#close-spinner" 62 hx-vals="js:{body: document.getElementById('comment-textarea').value.trim() !== '' ? document.getElementById('comment-textarea').value : ''}" 63 hx-swap="none" 64 > 65 </div> 66 <div 67 id="close-issue" 68 hx-disabled-elt="#close-issue" 69 hx-post="/{{ .RepoInfo.FullName }}/issues/{{ .Issue.IssueId }}/close" 70 hx-trigger="click from:#close-button" 71 hx-target="#issue-action" 72 hx-indicator="#close-spinner" 73 hx-swap="none" 74 > 75 </div> 76 <script> 77 document.addEventListener('htmx:configRequest', function(evt) { 78 if (evt.target.id === 'close-with-comment') { 79 const commentText = document.getElementById('comment-textarea').value.trim(); 80 if (commentText === '') { 81 evt.detail.parameters = {}; 82 evt.preventDefault(); 83 } 84 } 85 }); 86 </script> 87 {{ else if and (or $isIssueAuthor $isRepoCollaborator $isRepoOwner) (not .Issue.Open) }} 88 <button 89 type="button" 90 class="btn flex items-center gap-2" 91 hx-post="/{{ .RepoInfo.FullName }}/issues/{{ .Issue.IssueId }}/reopen" 92 hx-indicator="#reopen-spinner" 93 hx-swap="none" 94 > 95 {{ i "refresh-ccw-dot" "w-4 h-4" }} 96 reopen 97 <span id="reopen-spinner" class="group"> 98 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 99 </span> 100 </button> 101 {{ end }} 102 103 <script> 104 function updateCommentForm() { 105 const textarea = document.getElementById('comment-textarea'); 106 const commentButton = document.getElementById('comment-button'); 107 const closeButton = document.getElementById('close-button'); 108 109 if (textarea.value.trim() !== '') { 110 commentButton.removeAttribute('disabled'); 111 } else { 112 commentButton.setAttribute('disabled', ''); 113 } 114 115 if (closeButton) { 116 if (textarea.value.trim() !== '') { 117 closeButton.innerHTML = ` 118{{ i "ban" "w-4 h-4" }} 119<span>close with comment</span> 120<span id="close-spinner" class="group"> 121 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 122</span>`; 123 } else { 124 closeButton.innerHTML = ` 125{{ i "ban" "w-4 h-4" }} 126<span>close</span> 127<span id="close-spinner" class="group"> 128 {{ i "loader-circle" "w-4 h-4 animate-spin hidden group-[.htmx-request]:inline" }} 129</span>`; 130 } 131 } 132 } 133 134 document.addEventListener('DOMContentLoaded', function() { 135 updateCommentForm(); 136 }); 137 </script> 138 </div> 139 </form> 140 {{ else }} 141 <div class="bg-amber-50 dark:bg-amber-900 border border-amber-500 rounded drop-shadow-sm p-6 relative flex gap-2 items-center"> 142 <a href="/signup" class="btn-create py-0 hover:no-underline hover:text-white flex items-center gap-2"> 143 sign up 144 </a> 145 <span class="text-gray-500 dark:text-gray-400">or</span> 146 <a href="/login" class="underline">login</a> 147 to add to the discussion 148 </div> 149 {{ end }} 150{{ end }}