@@ -7,30 +7,19 @@ 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+ addElemsEventListener , createElementFromHTML ,
17+ } from '../utils/dom.ts' ;
1118import { POST , GET } from '../modules/fetch.ts' ;
19+ import { fomanticQuery } from '../modules/fomantic/base.ts' ;
1220
1321const { pageData, i18n} = window . config ;
1422
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-
3423function initRepoDiffFileViewToggle ( ) {
3524 $ ( '.file-view-toggle' ) . on ( 'click' , function ( ) {
3625 for ( const el of queryElemSiblings ( this ) ) {
@@ -47,19 +36,15 @@ function initRepoDiffFileViewToggle() {
4736}
4837
4938function initRepoDiffConversationForm ( ) {
50- $ ( document ) . on ( 'submit' , '.conversation-holder form' , async ( e ) => {
39+ addElemsEventListener < HTMLFormElement > ( document , 'submit' , '.conversation-holder form' , async ( form , e ) => {
5140 e . preventDefault ( ) ;
41+ const textArea = form . querySelector ( 'textarea' ) ;
42+ if ( ! validateTextareaNonEmpty ( textArea ) ) return ;
43+ if ( form . classList . contains ( 'is-loading' ) ) return ;
5244
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 ;
6045 try {
61- e . target . classList . add ( 'is-loading' ) ;
62- const formData = new FormData ( $ form[ 0 ] ) ;
46+ form . classList . add ( 'is-loading' ) ;
47+ const formData = new FormData ( form ) ;
6348
6449 // if the form is submitted by a button, append the button's name and value to the form data
6550 const submitter = submitEventSubmitter ( e ) ;
@@ -68,26 +53,41 @@ function initRepoDiffConversationForm() {
6853 formData . append ( submitter . name , submitter . value ) ;
6954 }
7055
71- const response = await POST ( e . target . getAttribute ( 'action' ) , { data : formData } ) ;
72- const $newConversationHolder = $ ( await response . text ( ) ) ;
73- const { path, side, idx} = $newConversationHolder . data ( ) ;
56+ const trLineType = form . closest ( 'tr' ) . getAttribute ( 'data-line-type' ) ;
57+ const response = await POST ( form . getAttribute ( 'action' ) , { data : formData } ) ;
58+ const newConversationHolder = createElementFromHTML ( await response . text ( ) ) ;
59+ const path = newConversationHolder . getAttribute ( 'data-path' ) ;
60+ const side = newConversationHolder . getAttribute ( 'data-side' ) ;
61+ const idx = newConversationHolder . getAttribute ( 'data-idx' ) ;
62+
63+ form . closest ( '.conversation-holder' ) . replaceWith ( newConversationHolder ) ;
64+ form = null ; // prevent further usage of the form because it should have been replaced
7465
75- $form . closest ( '.conversation-holder' ) . replaceWith ( $newConversationHolder ) ;
7666 let selector ;
77- if ( $form . closest ( 'tr' ) . data ( 'line-type' ) === 'same' ) {
67+ if ( trLineType === 'same' ) {
7868 selector = `[data-path="${ path } "] .add-code-comment[data-idx="${ idx } "]` ;
7969 } else {
8070 selector = `[data-path="${ path } "] .add-code-comment[data-side="${ side } "][data-idx="${ idx } "]` ;
8171 }
8272 for ( const el of document . querySelectorAll ( selector ) ) {
83- el . classList . add ( 'tw-invisible' ) ;
73+ el . classList . add ( 'tw-invisible' ) ; // TODO need to figure out why
74+ }
75+ fomanticQuery ( newConversationHolder . querySelectorAll ( '.ui.dropdown' ) ) . dropdown ( ) ;
76+
77+ if ( submitter ?. matches ( 'button[name="pending_review"]' ) ) {
78+ const reviewBox = document . querySelector ( '#review-box' ) ;
79+ const counter = reviewBox ?. querySelector ( '.review-comments-counter' ) ;
80+ if ( ! counter ) return ;
81+ const num = parseInt ( counter . getAttribute ( 'data-pending-comment-number' ) ) + 1 || 1 ;
82+ counter . setAttribute ( 'data-pending-comment-number' , String ( num ) ) ;
83+ counter . textContent = String ( num ) ;
84+ animateOnce ( reviewBox , 'pulse-1p5-200' ) ;
8485 }
85- $newConversationHolder . find ( '.dropdown' ) . dropdown ( ) ;
8686 } catch ( error ) {
8787 console . error ( 'Error:' , error ) ;
8888 showErrorToast ( i18n . network_error ) ;
8989 } finally {
90- e . target . classList . remove ( 'is-loading' ) ;
90+ form ? .classList . remove ( 'is-loading' ) ;
9191 }
9292 } ) ;
9393
@@ -219,7 +219,6 @@ export function initRepoDiffView() {
219219 initDiffFileList ( ) ;
220220 initDiffCommitSelect ( ) ;
221221 initRepoDiffShowMore ( ) ;
222- initRepoDiffReviewButton ( ) ;
223222 initRepoDiffFileViewToggle ( ) ;
224223 initViewedCheckboxListenerFor ( ) ;
225224 initExpandAndCollapseFilesButton ( ) ;
0 commit comments