@@ -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 } ${ idx }  ; 
7970      }  else  { 
8071        selector  =  `[data-path="${ path } ${ side } ${ 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