2022-01-29 00:00:11 +03:00
import $ from 'jquery' ;
2024-07-07 18:32:30 +03:00
import { svg } from '../svg.ts' ;
import { showErrorToast } from '../modules/toast.ts' ;
import { GET , POST } from '../modules/fetch.ts' ;
import { showElem } from '../utils/dom.ts' ;
2024-11-08 05:21:13 +03:00
import { parseIssuePageInfo } from '../utils.ts' ;
2021-10-11 01:40:03 +03:00
let i18nTextEdited ;
let i18nTextOptions ;
let i18nTextDeleteFromHistory ;
let i18nTextDeleteFromHistoryConfirm ;
function showContentHistoryDetail ( issueBaseUrl , commentId , historyId , itemTitleHtml ) {
let $dialog = $ ( '.content-history-detail-dialog' ) ;
if ( $dialog . length ) return ;
$dialog = $ ( `
2021-10-23 17:47:38 +03:00
< div class = "ui modal content-history-detail-dialog" >
2022-12-02 12:42:34 +03:00
$ { svg ( 'octicon-x' , 16 , 'close icon inside' ) }
2024-03-22 22:51:29 +03:00
< div class = "header tw-flex tw-items-center tw-justify-between" >
2022-12-02 12:42:34 +03:00
< div > $ { itemTitleHtml } < / div >
2024-03-24 21:23:38 +03:00
< div class = "ui dropdown dialog-header-options tw-mr-8 tw-hidden" >
2023-09-28 11:43:20 +03:00
$ { i18nTextOptions }
$ { svg ( 'octicon-triangle-down' , 14 , 'dropdown icon' ) }
2021-10-11 01:40:03 +03:00
< div class = "menu" >
< div class = "item red text" data - option - item = "delete" > $ { i18nTextDeleteFromHistory } < / div >
< / div >
< / div >
< / div >
2023-09-28 11:43:20 +03:00
< div class = "comment-diff-data is-loading" > < / div >
2021-10-11 01:40:03 +03:00
< / div > ` );
$dialog . appendTo ( $ ( 'body' ) ) ;
$dialog . find ( '.dialog-header-options' ) . dropdown ( {
showOnFocus : false ,
allowReselection : true ,
2024-03-10 22:26:41 +03:00
async onChange ( _value , _text , $item ) {
2021-10-11 01:40:03 +03:00
const optionItem = $item . data ( 'option-item' ) ;
if ( optionItem === 'delete' ) {
if ( window . confirm ( i18nTextDeleteFromHistoryConfirm ) ) {
2024-03-10 22:26:41 +03:00
try {
const params = new URLSearchParams ( ) ;
params . append ( 'comment_id' , commentId ) ;
params . append ( 'history_id' , historyId ) ;
const response = await POST ( ` ${ issueBaseUrl } /content-history/soft-delete? ${ params . toString ( ) } ` ) ;
const resp = await response . json ( ) ;
2021-10-11 01:40:03 +03:00
if ( resp . ok ) {
$dialog . modal ( 'hide' ) ;
} else {
2023-06-27 05:45:24 +03:00
showErrorToast ( resp . message ) ;
2021-10-11 01:40:03 +03:00
}
2024-03-10 22:26:41 +03:00
} catch ( error ) {
console . error ( 'Error:' , error ) ;
showErrorToast ( 'An error occurred while deleting the history.' ) ;
}
2021-10-11 01:40:03 +03:00
}
} else { // required by eslint
2023-06-27 05:45:24 +03:00
showErrorToast ( ` unknown option item: ${ optionItem } ` ) ;
2021-10-11 01:40:03 +03:00
}
} ,
onHide() {
$ ( this ) . dropdown ( 'clear' , true ) ;
2024-03-22 17:06:53 +03:00
} ,
2021-10-11 01:40:03 +03:00
} ) ;
$dialog . modal ( {
2024-03-10 22:26:41 +03:00
async onShow() {
try {
const params = new URLSearchParams ( ) ;
params . append ( 'comment_id' , commentId ) ;
params . append ( 'history_id' , historyId ) ;
const url = ` ${ issueBaseUrl } /content-history/detail? ${ params . toString ( ) } ` ;
const response = await GET ( url ) ;
const resp = await response . json ( ) ;
2024-03-31 01:09:46 +03:00
const commentDiffData = $dialog . find ( '.comment-diff-data' ) [ 0 ] ;
commentDiffData ? . classList . remove ( 'is-loading' ) ;
commentDiffData . innerHTML = resp . diffHtml ;
2021-10-11 01:40:03 +03:00
// there is only one option "item[data-option-item=delete]", so the dropdown can be entirely shown/hidden.
if ( resp . canSoftDelete ) {
2024-03-31 01:09:46 +03:00
showElem ( $dialog . find ( '.dialog-header-options' ) ) ;
2021-10-11 01:40:03 +03:00
}
2024-03-10 22:26:41 +03:00
} catch ( error ) {
console . error ( 'Error:' , error ) ;
}
2021-10-11 01:40:03 +03:00
} ,
onHidden() {
$dialog . remove ( ) ;
} ,
} ) . modal ( 'show' ) ;
}
function showContentHistoryMenu ( issueBaseUrl , $item , commentId ) {
const $headerLeft = $item . find ( '.comment-header-left' ) ;
const menuHtml = `
2023-06-14 19:40:15 +03:00
< div class = "ui dropdown interact-fg content-history-menu" data - comment - id = "${commentId}" >
& bull ; $ { i18nTextEdited } $ { svg ( 'octicon-triangle-down' , 14 , 'dropdown icon' ) }
2021-10-11 01:40:03 +03:00
< div class = "menu" >
< / div >
< / div > ` ;
$headerLeft . find ( ` .content-history-menu ` ) . remove ( ) ;
$headerLeft . append ( $ ( menuHtml ) ) ;
$headerLeft . find ( '.dropdown' ) . dropdown ( {
action : 'hide' ,
apiSettings : {
cache : false ,
url : ` ${ issueBaseUrl } /content-history/list?comment_id= ${ commentId } ` ,
} ,
saveRemoteData : false ,
onHide() {
$ ( this ) . dropdown ( 'change values' , null ) ;
} ,
onChange ( value , itemHtml , $item ) {
if ( value && ! $item . find ( '[data-history-is-deleted=1]' ) . length ) {
showContentHistoryDetail ( issueBaseUrl , commentId , value , itemHtml ) ;
}
} ,
} ) ;
}
2024-03-10 22:26:41 +03:00
export async function initRepoIssueContentHistory() {
2024-11-08 05:21:13 +03:00
const issuePageInfo = parseIssuePageInfo ( ) ;
if ( ! issuePageInfo . issueNumber ) return ;
2021-11-22 15:20:16 +03:00
const $itemIssue = $ ( '.repository.issue .timeline-item.comment.first' ) ; // issue(PR) main content
2022-01-18 20:28:38 +03:00
const $comments = $ ( '.repository.issue .comment-list .comment' ) ; // includes: issue(PR) comments, review comments, code comments
2021-11-22 15:20:16 +03:00
if ( ! $itemIssue . length && ! $comments . length ) return ;
2021-10-11 01:40:03 +03:00
2024-11-08 05:21:13 +03:00
const issueBaseUrl = ` ${ issuePageInfo . repoLink } /issues/ ${ issuePageInfo . issueNumber } ` ;
2021-10-11 01:40:03 +03:00
2024-03-10 22:26:41 +03:00
try {
const response = await GET ( ` ${ issueBaseUrl } /content-history/overview ` ) ;
const resp = await response . json ( ) ;
2021-10-11 01:40:03 +03:00
i18nTextEdited = resp . i18n . textEdited ;
i18nTextDeleteFromHistory = resp . i18n . textDeleteFromHistory ;
i18nTextDeleteFromHistoryConfirm = resp . i18n . textDeleteFromHistoryConfirm ;
i18nTextOptions = resp . i18n . textOptions ;
2021-11-22 15:20:16 +03:00
if ( resp . editedHistoryCountMap [ 0 ] && $itemIssue . length ) {
2021-10-11 01:40:03 +03:00
showContentHistoryMenu ( issueBaseUrl , $itemIssue , '0' ) ;
}
for ( const [ commentId , _editedCount ] of Object . entries ( resp . editedHistoryCountMap ) ) {
if ( commentId === '0' ) continue ;
const $itemComment = $ ( ` #issuecomment- ${ commentId } ` ) ;
showContentHistoryMenu ( issueBaseUrl , $itemComment , commentId ) ;
}
2024-03-10 22:26:41 +03:00
} catch ( error ) {
console . error ( 'Error:' , error ) ;
}
2021-10-11 01:40:03 +03:00
}