@@ -7,30 +7,20 @@ import {validateTextareaNonEmpty} from './comp/ComboMarkdownEditor.ts';
7
7
import { initViewedCheckboxListenerFor , countAndUpdateViewedFiles , initExpandAndCollapseFilesButton } from './pull-view-file.ts' ;
8
8
import { initImageDiff } from './imagediff.ts' ;
9
9
import { 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' ;
11
19
import { POST , GET } from '../modules/fetch.ts' ;
20
+ import { fomanticQuery } from '../modules/fomantic/base.ts' ;
12
21
13
22
const { pageData, i18n} = window . config ;
14
23
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
-
34
24
function initRepoDiffFileViewToggle ( ) {
35
25
$ ( '.file-view-toggle' ) . on ( 'click' , function ( ) {
36
26
for ( const el of queryElemSiblings ( this ) ) {
@@ -47,19 +37,15 @@ function initRepoDiffFileViewToggle() {
47
37
}
48
38
49
39
function initRepoDiffConversationForm ( ) {
50
- $ ( document ) . on ( 'submit' , '.conversation-holder form' , async ( e ) => {
40
+ addDelegatedEventListener < HTMLFormElement > ( document , 'submit' , '.conversation-holder form' , async ( form , e ) => {
51
41
e . preventDefault ( ) ;
42
+ const textArea = form . querySelector < HTMLTextAreaElement > ( 'textarea' ) ;
43
+ if ( ! validateTextareaNonEmpty ( textArea ) ) return ;
44
+ if ( form . classList . contains ( 'is-loading' ) ) return ;
52
45
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 ;
60
46
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 ) ;
63
49
64
50
// if the form is submitted by a button, append the button's name and value to the form data
65
51
const submitter = submitEventSubmitter ( e ) ;
@@ -68,26 +54,42 @@ function initRepoDiffConversationForm() {
68
54
formData . append ( submitter . name , submitter . value ) ;
69
55
}
70
56
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
74
66
75
- $form . closest ( '.conversation-holder' ) . replaceWith ( $newConversationHolder ) ;
76
67
let selector ;
77
- if ( $form . closest ( 'tr' ) . data ( 'line-type' ) === 'same' ) {
68
+ if ( trLineType === 'same' ) {
78
69
selector = `[data-path="${ path } "] .add-code-comment[data-idx="${ idx } "]` ;
79
70
} else {
80
71
selector = `[data-path="${ path } "] .add-code-comment[data-side="${ side } "][data-idx="${ idx } "]` ;
81
72
}
82
73
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' ) ;
84
87
}
85
- $newConversationHolder . find ( '.dropdown' ) . dropdown ( ) ;
86
88
} catch ( error ) {
87
89
console . error ( 'Error:' , error ) ;
88
90
showErrorToast ( i18n . network_error ) ;
89
91
} finally {
90
- e . target . classList . remove ( 'is-loading' ) ;
92
+ form ? .classList . remove ( 'is-loading' ) ;
91
93
}
92
94
} ) ;
93
95
@@ -219,7 +221,6 @@ export function initRepoDiffView() {
219
221
initDiffFileList ( ) ;
220
222
initDiffCommitSelect ( ) ;
221
223
initRepoDiffShowMore ( ) ;
222
- initRepoDiffReviewButton ( ) ;
223
224
initRepoDiffFileViewToggle ( ) ;
224
225
initViewedCheckboxListenerFor ( ) ;
225
226
initExpandAndCollapseFilesButton ( ) ;
0 commit comments