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