@@ -7,30 +7,20 @@ import {validateTextareaNonEmpty} from './comp/ComboMarkdownEditor.ts';
77import { initViewedCheckboxListenerFor , countAndUpdateViewedFiles , initExpandAndCollapseFilesButton } from './pull-view-file.ts' ;
88import { initImageDiff } from './imagediff.ts' ;
99import { showErrorToast } from '../modules/toast.ts' ;
10- import { submitEventSubmitter , queryElemSiblings , hideElem , showElem , animateOnce } from '../utils/dom.ts' ;
10+ import {
11+ submitEventSubmitter ,
12+ queryElemSiblings ,
13+ hideElem ,
14+ showElem ,
15+ animateOnce ,
16+ addDelegatedEventListener ,
17+ createElementFromHTML ,
18+ } from '../utils/dom.ts' ;
1119import { POST , GET } from '../modules/fetch.ts' ;
20+ import { fomanticQuery } from '../modules/fomantic/base.ts' ;
1221
1322const { pageData, i18n} = window . config ;
1423
15- function initRepoDiffReviewButton ( ) {
16- const reviewBox = document . querySelector ( '#review-box' ) ;
17- if ( ! reviewBox ) return ;
18-
19- const counter = reviewBox . querySelector ( '.review-comments-counter' ) ;
20- if ( ! counter ) return ;
21-
22- $ ( document ) . on ( 'click' , 'button[name="pending_review"]' , ( e ) => {
23- const $form = $ ( e . target ) . closest ( 'form' ) ;
24- // Watch for the form's submit event.
25- $form . on ( 'submit' , ( ) => {
26- const num = parseInt ( counter . getAttribute ( 'data-pending-comment-number' ) ) + 1 || 1 ;
27- counter . setAttribute ( 'data-pending-comment-number' , num ) ;
28- counter . textContent = num ;
29- animateOnce ( reviewBox , 'pulse-1p5-200' ) ;
30- } ) ;
31- } ) ;
32- }
33-
3424function initRepoDiffFileViewToggle ( ) {
3525 $ ( '.file-view-toggle' ) . on ( 'click' , function ( ) {
3626 for ( const el of queryElemSiblings ( this ) ) {
@@ -47,19 +37,15 @@ function initRepoDiffFileViewToggle() {
4737}
4838
4939function initRepoDiffConversationForm ( ) {
50- $ ( document ) . on ( 'submit' , '.conversation-holder form' , async ( e ) => {
40+ addDelegatedEventListener < HTMLFormElement > ( document , 'submit' , '.conversation-holder form' , async ( form , e ) => {
5141 e . preventDefault ( ) ;
42+ const textArea = form . querySelector < HTMLTextAreaElement > ( 'textarea' ) ;
43+ if ( ! validateTextareaNonEmpty ( textArea ) ) return ;
44+ if ( form . classList . contains ( 'is-loading' ) ) return ;
5245
53- const $form = $ ( e . target ) ;
54- const textArea = e . target . querySelector ( 'textarea' ) ;
55- if ( ! validateTextareaNonEmpty ( textArea ) ) {
56- return ;
57- }
58-
59- if ( e . target . classList . contains ( 'is-loading' ) ) return ;
6046 try {
61- e . target . classList . add ( 'is-loading' ) ;
62- const formData = new FormData ( $ form[ 0 ] ) ;
47+ form . classList . add ( 'is-loading' ) ;
48+ const formData = new FormData ( form ) ;
6349
6450 // if the form is submitted by a button, append the button's name and value to the form data
6551 const submitter = submitEventSubmitter ( e ) ;
@@ -68,26 +54,42 @@ function initRepoDiffConversationForm() {
6854 formData . append ( submitter . name , submitter . value ) ;
6955 }
7056
71- const response = await POST ( e . target . getAttribute ( 'action' ) , { data : formData } ) ;
72- const $newConversationHolder = $ ( await response . text ( ) ) ;
73- const { path, side, idx} = $newConversationHolder . data ( ) ;
57+ const trLineType = form . closest ( 'tr' ) . getAttribute ( 'data-line-type' ) ;
58+ const response = await POST ( form . getAttribute ( 'action' ) , { data : formData } ) ;
59+ const newConversationHolder = createElementFromHTML ( await response . text ( ) ) ;
60+ const path = newConversationHolder . getAttribute ( 'data-path' ) ;
61+ const side = newConversationHolder . getAttribute ( 'data-side' ) ;
62+ const idx = newConversationHolder . getAttribute ( 'data-idx' ) ;
63+
64+ form . closest ( '.conversation-holder' ) . replaceWith ( newConversationHolder ) ;
65+ form = null ; // prevent further usage of the form because it should have been replaced
7466
75- $form . closest ( '.conversation-holder' ) . replaceWith ( $newConversationHolder ) ;
7667 let selector ;
77- if ( $form . closest ( 'tr' ) . data ( 'line-type' ) === 'same' ) {
68+ if ( trLineType === 'same' ) {
7869 selector = `[data-path="${ path } "] .add-code-comment[data-idx="${ idx } "]` ;
7970 } else {
8071 selector = `[data-path="${ path } "] .add-code-comment[data-side="${ side } "][data-idx="${ idx } "]` ;
8172 }
8273 for ( const el of document . querySelectorAll ( selector ) ) {
83- el . classList . add ( 'tw-invisible' ) ;
74+ el . classList . add ( 'tw-invisible' ) ; // TODO need to figure out why
75+ }
76+ fomanticQuery ( newConversationHolder . querySelectorAll ( '.ui.dropdown' ) ) . dropdown ( ) ;
77+
78+ // the default behavior is to add a pending review, so if no submitter, it also means "pending_review"
79+ if ( ! submitter || submitter ?. matches ( 'button[name="pending_review"]' ) ) {
80+ const reviewBox = document . querySelector ( '#review-box' ) ;
81+ const counter = reviewBox ?. querySelector ( '.review-comments-counter' ) ;
82+ if ( ! counter ) return ;
83+ const num = parseInt ( counter . getAttribute ( 'data-pending-comment-number' ) ) + 1 || 1 ;
84+ counter . setAttribute ( 'data-pending-comment-number' , String ( num ) ) ;
85+ counter . textContent = String ( num ) ;
86+ animateOnce ( reviewBox , 'pulse-1p5-200' ) ;
8487 }
85- $newConversationHolder . find ( '.dropdown' ) . dropdown ( ) ;
8688 } catch ( error ) {
8789 console . error ( 'Error:' , error ) ;
8890 showErrorToast ( i18n . network_error ) ;
8991 } finally {
90- e . target . classList . remove ( 'is-loading' ) ;
92+ form ? .classList . remove ( 'is-loading' ) ;
9193 }
9294 } ) ;
9395
@@ -219,7 +221,6 @@ export function initRepoDiffView() {
219221 initDiffFileList ( ) ;
220222 initDiffCommitSelect ( ) ;
221223 initRepoDiffShowMore ( ) ;
222- initRepoDiffReviewButton ( ) ;
223224 initRepoDiffFileViewToggle ( ) ;
224225 initViewedCheckboxListenerFor ( ) ;
225226 initExpandAndCollapseFilesButton ( ) ;
0 commit comments