1- import $ from 'jquery' ;
21import { svg } from '../svg.ts' ;
32import { showErrorToast } from '../modules/toast.ts' ;
43import { GET , POST } from '../modules/fetch.ts' ;
5- import { showElem } from '../utils/dom.ts' ;
4+ import { createElementFromHTML , showElem } from '../utils/dom.ts' ;
65import { parseIssuePageInfo } from '../utils.ts' ;
6+ import { fomanticQuery } from '../modules/fomantic/base.ts' ;
77
8- let i18nTextEdited ;
9- let i18nTextOptions ;
10- let i18nTextDeleteFromHistory ;
11- let i18nTextDeleteFromHistoryConfirm ;
8+ let i18nTextEdited : string ;
9+ let i18nTextOptions : string ;
10+ let i18nTextDeleteFromHistory : string ;
11+ let i18nTextDeleteFromHistoryConfirm : string ;
1212
13- function showContentHistoryDetail ( issueBaseUrl , commentId , historyId , itemTitleHtml ) {
14- let $dialog = $ ( '.content-history-detail-dialog' ) ;
15- if ( $dialog . length ) return ;
13+ function showContentHistoryDetail ( issueBaseUrl : string , commentId : string , historyId : string , itemTitleHtml : string ) {
14+ let elDetailDialog = document . querySelector ( '.content-history-detail-dialog' ) ;
15+ if ( elDetailDialog ) return ;
1616
17- $dialog = $ ( `
17+ elDetailDialog = createElementFromHTML ( `
1818<div class="ui modal content-history-detail-dialog">
1919 ${ svg ( 'octicon-x' , 16 , 'close icon inside' ) }
2020 <div class="header tw-flex tw-items-center tw-justify-between">
@@ -29,8 +29,11 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
2929 </div>
3030 <div class="comment-diff-data is-loading"></div>
3131</div>` ) ;
32- $dialog . appendTo ( $ ( 'body' ) ) ;
33- $dialog . find ( '.dialog-header-options' ) . dropdown ( {
32+ document . body . append ( elDetailDialog ) ;
33+ const elOptionsDropdown = elDetailDialog . querySelector ( '.ui.dropdown.dialog-header-options' ) ;
34+ const $fomanticDialog = fomanticQuery ( elDetailDialog ) ;
35+ const $fomanticDropdownOptions = fomanticQuery ( elOptionsDropdown ) ;
36+ $fomanticDropdownOptions . dropdown ( {
3437 showOnFocus : false ,
3538 allowReselection : true ,
3639 async onChange ( _value , _text , $item ) {
@@ -46,7 +49,7 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
4649 const resp = await response . json ( ) ;
4750
4851 if ( resp . ok ) {
49- $dialog . modal ( 'hide' ) ;
52+ $fomanticDialog . modal ( 'hide' ) ;
5053 } else {
5154 showErrorToast ( resp . message ) ;
5255 }
@@ -60,10 +63,10 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
6063 }
6164 } ,
6265 onHide ( ) {
63- $ ( this ) . dropdown ( 'clear' , true ) ;
66+ $fomanticDropdownOptions . dropdown ( 'clear' , true ) ;
6467 } ,
6568 } ) ;
66- $dialog . modal ( {
69+ $fomanticDialog . modal ( {
6770 async onShow ( ) {
6871 try {
6972 const params = new URLSearchParams ( ) ;
@@ -74,43 +77,46 @@ function showContentHistoryDetail(issueBaseUrl, commentId, historyId, itemTitleH
7477 const response = await GET ( url ) ;
7578 const resp = await response . json ( ) ;
7679
77- const commentDiffData = $dialog . find ( '.comment-diff-data' ) [ 0 ] ;
78- commentDiffData ? .classList . remove ( 'is-loading' ) ;
80+ const commentDiffData = elDetailDialog . querySelector ( '.comment-diff-data' ) ;
81+ commentDiffData . classList . remove ( 'is-loading' ) ;
7982 commentDiffData . innerHTML = resp . diffHtml ;
8083 // there is only one option "item[data-option-item=delete]", so the dropdown can be entirely shown/hidden.
8184 if ( resp . canSoftDelete ) {
82- showElem ( $dialog . find ( '.dialog-header-options' ) ) ;
85+ showElem ( elOptionsDropdown ) ;
8386 }
8487 } catch ( error ) {
8588 console . error ( 'Error:' , error ) ;
8689 }
8790 } ,
8891 onHidden ( ) {
89- $dialog . remove ( ) ;
92+ $fomanticDialog . remove ( ) ;
9093 } ,
9194 } ) . modal ( 'show' ) ;
9295}
9396
94- function showContentHistoryMenu ( issueBaseUrl , $item , commentId ) {
95- const $headerLeft = $item . find ( '.comment-header-left' ) ;
97+ function showContentHistoryMenu ( issueBaseUrl : string , elCommentItem : Element , commentId : string ) {
98+ const elHeaderLeft = elCommentItem . querySelector ( '.comment-header-left' ) ;
9699 const menuHtml = `
97100 <div class="ui dropdown interact-fg content-history-menu" data-comment-id="${ commentId } ">
98101 • ${ i18nTextEdited } ${ svg ( 'octicon-triangle-down' , 14 , 'dropdown icon' ) }
99102 <div class="menu">
100103 </div>
101104 </div>` ;
102105
103- $headerLeft . find ( `.content-history-menu` ) . remove ( ) ;
104- $headerLeft . append ( $ ( menuHtml ) ) ;
105- $headerLeft . find ( '.dropdown' ) . dropdown ( {
106+ elHeaderLeft . querySelector ( `.ui.dropdown.content-history-menu` ) ?. remove ( ) ; // remove the old one if exists
107+ elHeaderLeft . append ( createElementFromHTML ( menuHtml ) ) ;
108+
109+ const elDropdown = elHeaderLeft . querySelector ( '.ui.dropdown.content-history-menu' ) ;
110+ const $fomanticDropdown = fomanticQuery ( elDropdown ) ;
111+ $fomanticDropdown . dropdown ( {
106112 action : 'hide' ,
107113 apiSettings : {
108114 cache : false ,
109115 url : `${ issueBaseUrl } /content-history/list?comment_id=${ commentId } ` ,
110116 } ,
111117 saveRemoteData : false ,
112118 onHide ( ) {
113- $ ( this ) . dropdown ( 'change values' , null ) ;
119+ $fomanticDropdown . dropdown ( 'change values' , null ) ;
114120 } ,
115121 onChange ( value , itemHtml , $item ) {
116122 if ( value && ! $item . find ( '[data-history-is-deleted=1]' ) . length ) {
@@ -124,9 +130,9 @@ export async function initRepoIssueContentHistory() {
124130 const issuePageInfo = parseIssuePageInfo ( ) ;
125131 if ( ! issuePageInfo . issueNumber ) return ;
126132
127- const $itemIssue = $ ( '.repository.issue .timeline-item.comment.first' ) ; // issue(PR) main content
128- const $comments = $ ( '.repository.issue .comment-list .comment' ) ; // includes: issue(PR) comments, review comments, code comments
129- if ( ! $itemIssue . length && ! $comments . length ) return ;
133+ const elIssueDescription = document . querySelector ( '.repository.issue .timeline-item.comment.first' ) ; // issue(PR) main content
134+ const elComments = document . querySelectorAll ( '.repository.issue .comment-list .comment' ) ; // includes: issue(PR) comments, review comments, code comments
135+ if ( ! elIssueDescription && ! elComments . length ) return ;
130136
131137 const issueBaseUrl = `${ issuePageInfo . repoLink } /issues/${ issuePageInfo . issueNumber } ` ;
132138
@@ -139,13 +145,13 @@ export async function initRepoIssueContentHistory() {
139145 i18nTextDeleteFromHistoryConfirm = resp . i18n . textDeleteFromHistoryConfirm ;
140146 i18nTextOptions = resp . i18n . textOptions ;
141147
142- if ( resp . editedHistoryCountMap [ 0 ] && $itemIssue . length ) {
143- showContentHistoryMenu ( issueBaseUrl , $itemIssue , '0' ) ;
148+ if ( resp . editedHistoryCountMap [ 0 ] && elIssueDescription ) {
149+ showContentHistoryMenu ( issueBaseUrl , elIssueDescription , '0' ) ;
144150 }
145151 for ( const [ commentId , _editedCount ] of Object . entries ( resp . editedHistoryCountMap ) ) {
146152 if ( commentId === '0' ) continue ;
147- const $itemComment = $ ( `#issuecomment-${ commentId } ` ) ;
148- showContentHistoryMenu ( issueBaseUrl , $itemComment , commentId ) ;
153+ const elIssueComment = document . querySelector ( `#issuecomment-${ commentId } ` ) ;
154+ if ( elIssueComment ) showContentHistoryMenu ( issueBaseUrl , elIssueComment , commentId ) ;
149155 }
150156 } catch ( error ) {
151157 console . error ( 'Error:' , error ) ;
0 commit comments