2022-01-29 00:00:11 +03:00
import $ from 'jquery' ;
2021-10-11 01:40:03 +03:00
import { svg } from '../svg.js' ;
2021-10-21 10:37:43 +03:00
const { appSubUrl , csrfToken } = window . config ;
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" >
2021-10-11 01:40:03 +03:00
< i class = "close icon inside" > < / i >
< div class = "header" >
$ { itemTitleHtml }
< div class = "ui dropdown right dialog-header-options" style = "display: none; margin-right: 50px;" >
$ { i18nTextOptions } < i class = "dropdown icon" > < / i >
< div class = "menu" >
< div class = "item red text" data - option - item = "delete" > $ { i18nTextDeleteFromHistory } < / d i v >
< / d i v >
< / d i v >
< / d i v >
<!-- ".modal .content" style was polluted in "_base.less" : "&.modal > .content" -- >
2021-10-23 17:47:38 +03:00
< div class = "scrolling content" style = "text-align: left; min-height: 30vh;" >
2021-10-11 01:40:03 +03:00
< div class = "ui loader active" > < / d i v >
< / d i v >
< / d i v > ` ) ;
$dialog . appendTo ( $ ( 'body' ) ) ;
$dialog . find ( '.dialog-header-options' ) . dropdown ( {
showOnFocus : false ,
allowReselection : true ,
onChange ( _value , _text , $item ) {
const optionItem = $item . data ( 'option-item' ) ;
if ( optionItem === 'delete' ) {
if ( window . confirm ( i18nTextDeleteFromHistoryConfirm ) ) {
$ . post ( ` ${ issueBaseUrl } /content-history/soft-delete?comment_id= ${ commentId } &history_id= ${ historyId } ` , {
2021-10-21 10:37:43 +03:00
_csrf : csrfToken ,
2021-10-11 01:40:03 +03:00
} ) . done ( ( resp ) => {
if ( resp . ok ) {
$dialog . modal ( 'hide' ) ;
} else {
alert ( resp . message ) ;
}
} ) ;
}
} else { // required by eslint
window . alert ( ` unknown option item: ${ optionItem } ` ) ;
}
} ,
onHide ( ) {
$ ( this ) . dropdown ( 'clear' , true ) ;
}
} ) ;
$dialog . modal ( {
onShow ( ) {
$ . ajax ( {
url : ` ${ issueBaseUrl } /content-history/detail?comment_id= ${ commentId } &history_id= ${ historyId } ` ,
data : {
2021-10-21 10:37:43 +03:00
_csrf : csrfToken ,
2021-10-11 01:40:03 +03:00
} ,
} ) . done ( ( resp ) => {
$dialog . find ( '.content' ) . html ( resp . diffHtml ) ;
// there is only one option "item[data-option-item=delete]", so the dropdown can be entirely shown/hidden.
if ( resp . canSoftDelete ) {
$dialog . find ( '.dialog-header-options' ) . show ( ) ;
}
} ) ;
} ,
onHidden ( ) {
$dialog . remove ( ) ;
} ,
} ) . modal ( 'show' ) ;
}
function showContentHistoryMenu ( issueBaseUrl , $item , commentId ) {
const $headerLeft = $item . find ( '.comment-header-left' ) ;
const menuHtml = `
< div class = "ui pointing dropdown top left content-history-menu" data - comment - id = "${commentId}" >
< a > & bull ; $ { i18nTextEdited } $ { svg ( 'octicon-triangle-down' , 17 ) } < / a >
< div class = "menu" >
< / d i v >
< / d i v > ` ;
$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 ) ;
}
} ,
} ) ;
}
2021-11-09 12:27:25 +03:00
export function initRepoIssueContentHistory ( ) {
2021-10-11 01:40:03 +03:00
const issueIndex = $ ( '#issueIndex' ) . val ( ) ;
2021-11-22 15:20:16 +03:00
if ( ! issueIndex ) return ;
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
const repoLink = $ ( '#repolink' ) . val ( ) ;
2021-10-21 10:37:43 +03:00
const issueBaseUrl = ` ${ appSubUrl } / ${ repoLink } /issues/ ${ issueIndex } ` ;
2021-10-11 01:40:03 +03:00
$ . ajax ( {
url : ` ${ issueBaseUrl } /content-history/overview ` ,
data : {
2021-10-21 10:37:43 +03:00
_csrf : csrfToken ,
2021-10-11 01:40:03 +03:00
} ,
} ) . done ( ( resp ) => {
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 ) ;
}
} ) ;
}