Skip to content

Commit 4c02b58

Browse files
committed
fix
1 parent e69da2c commit 4c02b58

File tree

2 files changed

+39
-32
lines changed

2 files changed

+39
-32
lines changed

web_src/js/features/repo-issue-content.ts

Lines changed: 38 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
1-
import $ from 'jquery';
21
import {svg} from '../svg.ts';
32
import {showErrorToast} from '../modules/toast.ts';
43
import {GET, POST} from '../modules/fetch.ts';
5-
import {showElem} from '../utils/dom.ts';
4+
import {createElementFromHTML, showElem} from '../utils/dom.ts';
65
import {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
&bull; ${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);

web_src/js/features/repo-issue-edit.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ async function tryOnEditContent(e) {
3030

3131
const saveAndRefresh = async (e) => {
3232
e.preventDefault();
33+
e.stopPropagation(); // we are already in a form, do not bubble up to the document otherwise there will be other "form submit handlers"
3334
renderContent.classList.add('is-loading');
3435
showElem(renderContent);
3536
hideElem(editContentZone);

0 commit comments

Comments
 (0)