Skip to content

Commit 7580bd9

Browse files
TimsDevCornerTim Wundenbergwxiaoguang
authored
show warning on navigation if currently editing comment or title (#32920)
This PR fixes the issue #32223 Make the browser to show the confirm popup, as it does with other forms. --------- Co-authored-by: Tim Wundenberg <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
1 parent 52b319b commit 7580bd9

File tree

5 files changed

+27
-16
lines changed

5 files changed

+27
-16
lines changed

templates/repo/issue/view_content.tmpl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@
139139
</div>
140140

141141
<template id="issue-comment-editor-template">
142-
<div class="ui form comment">
142+
<form class="ui form comment">
143143
<div class="field">
144144
{{template "shared/combomarkdowneditor" (dict
145145
"CustomInit" true
@@ -158,11 +158,11 @@
158158

159159
<div class="field">
160160
<div class="text right edit">
161-
<button class="ui cancel button">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
162-
<button class="ui primary button">{{ctx.Locale.Tr "repo.issues.save"}}</button>
161+
<button type="button" class="ui cancel button">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
162+
<button type="submit" class="ui primary button">{{ctx.Locale.Tr "repo.issues.save"}}</button>
163163
</div>
164164
</div>
165-
</div>
165+
</form>
166166
</template>
167167

168168
{{template "repo/issue/view_content/reference_issue_dialog" .}}

templates/repo/issue/view_title.tmpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,17 @@
2626
</div>
2727
</div>
2828
{{if $canEditIssueTitle}}
29-
<div class="ui form issue-title tw-hidden" id="issue-title-editor">
29+
<form class="ui form issue-title tw-hidden" id="issue-title-editor">
3030
<div class="ui input tw-flex-1">
31-
<input value="{{.Issue.Title}}" data-old-title="{{.Issue.Title}}" maxlength="255" autocomplete="off">
31+
<input name="title" value="{{.Issue.Title}}" data-old-title="{{.Issue.Title}}" maxlength="255" autocomplete="off">
3232
</div>
3333
<div class="issue-title-buttons">
34-
<button class="ui small basic cancel button">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
35-
<button class="ui small primary button" data-update-url="{{$.RepoLink}}/issues/{{.Issue.Index}}/title">
34+
<button type="button" class="ui small basic cancel button">{{ctx.Locale.Tr "repo.issues.cancel"}}</button>
35+
<button type="submit" class="ui small primary button" data-update-url="{{$.RepoLink}}/issues/{{.Issue.Index}}/title">
3636
{{ctx.Locale.Tr "repo.issues.save"}}
3737
</button>
3838
</div>
39-
</div>
39+
</form>
4040
{{end}}
4141
<div class="issue-title-meta">
4242
{{if .HasMerged}}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {attachRefIssueContextPopup} from './contextpopup.ts';
77
import {initCommentContent, initMarkupContent} from '../markup/content.ts';
88
import {triggerUploadStateChanged} from './comp/EditorUpload.ts';
99
import {convertHtmlToMarkdown} from '../markup/html2markdown.ts';
10+
import {applyAreYouSure, reinitializeAreYouSure} from '../vendor/jquery.are-you-sure.ts';
1011

1112
async function tryOnEditContent(e) {
1213
const clickTarget = e.target.closest('.edit-content');
@@ -48,6 +49,7 @@ async function tryOnEditContent(e) {
4849
showErrorToast(data.errorMessage);
4950
return;
5051
}
52+
reinitializeAreYouSure(editContentZone.querySelector('form')); // the form is no longer dirty
5153
editContentZone.setAttribute('data-content-version', data.contentVersion);
5254
if (!data.content) {
5355
renderContent.innerHTML = document.querySelector('#no-content').innerHTML;
@@ -86,13 +88,15 @@ async function tryOnEditContent(e) {
8688
comboMarkdownEditor = getComboMarkdownEditor(editContentZone.querySelector('.combo-markdown-editor'));
8789
if (!comboMarkdownEditor) {
8890
editContentZone.innerHTML = document.querySelector('#issue-comment-editor-template').innerHTML;
91+
const form = editContentZone.querySelector('form');
92+
applyAreYouSure(form);
8993
const saveButton = querySingleVisibleElem<HTMLButtonElement>(editContentZone, '.ui.primary.button');
9094
const cancelButton = querySingleVisibleElem<HTMLButtonElement>(editContentZone, '.ui.cancel.button');
9195
comboMarkdownEditor = await initComboMarkdownEditor(editContentZone.querySelector('.combo-markdown-editor'));
9296
const syncUiState = () => saveButton.disabled = comboMarkdownEditor.isUploading();
9397
comboMarkdownEditor.container.addEventListener(ComboMarkdownEditor.EventUploadStateChanged, syncUiState);
9498
cancelButton.addEventListener('click', cancelAndReset);
95-
saveButton.addEventListener('click', saveAndRefresh);
99+
form.addEventListener('submit', saveAndRefresh);
96100
}
97101

98102
// FIXME: ideally here should reload content and attachment list from backend for existing editor, to avoid losing data

web_src/js/features/repo-issue.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ export function initRepoIssueWipToggle() {
532532

533533
export function initRepoIssueTitleEdit() {
534534
const issueTitleDisplay = document.querySelector('#issue-title-display');
535-
const issueTitleEditor = document.querySelector('#issue-title-editor');
535+
const issueTitleEditor = document.querySelector<HTMLFormElement>('#issue-title-editor');
536536
if (!issueTitleEditor) return;
537537

538538
const issueTitleInput = issueTitleEditor.querySelector('input');
@@ -558,7 +558,8 @@ export function initRepoIssueTitleEdit() {
558558
const prTargetUpdateUrl = pullDescEditor?.getAttribute('data-target-update-url');
559559

560560
const editSaveButton = issueTitleEditor.querySelector('.ui.primary.button');
561-
editSaveButton.addEventListener('click', async () => {
561+
issueTitleEditor.addEventListener('submit', async (e) => {
562+
e.preventDefault();
562563
const newTitle = issueTitleInput.value.trim();
563564
try {
564565
if (newTitle && newTitle !== oldTitle) {
@@ -577,6 +578,7 @@ export function initRepoIssueTitleEdit() {
577578
}
578579
}
579580
}
581+
issueTitleEditor.classList.remove('dirty');
580582
window.location.reload();
581583
} catch (error) {
582584
console.error(error);

web_src/js/vendor/jquery.are-you-sure.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Fork of the upstream module. The only changes are:
33
// * use export to make it work with ES6 modules.
44
// * the addition of `const` to make it strict mode compatible.
5+
// * ignore forms with "ignore-dirty" class, ignore hidden forms (closest('.tw-hidden'))
56

67
/*!
78
* jQuery Plugin: Are-You-Sure (Dirty Form Detection)
@@ -161,10 +162,10 @@ export function initAreYouSure($) {
161162
if (!settings.silent && !window.aysUnloadSet) {
162163
window.aysUnloadSet = true;
163164
$(window).bind('beforeunload', function() {
164-
const $dirtyForms = $("form").filter('.' + settings.dirtyClass);
165-
if ($dirtyForms.length == 0) {
166-
return;
167-
}
165+
const $forms = $("form:not(.ignore-dirty)").filter('.' + settings.dirtyClass);
166+
const dirtyFormCount = Array.from($forms).reduce((res, form) => form.closest('.tw-hidden') ? res : res + 1, 0);
167+
if (dirtyFormCount === 0) return;
168+
168169
// Prevent multiple prompts - seen on Chrome and IE
169170
if (navigator.userAgent.toLowerCase().match(/msie|chrome/)) {
170171
if (window.aysHasPrompted) {
@@ -199,3 +200,7 @@ export function initAreYouSure($) {
199200
export function applyAreYouSure(selectorOrEl: string|Element|$, opts = {}) {
200201
$(selectorOrEl).areYouSure(opts);
201202
}
203+
204+
export function reinitializeAreYouSure(selectorOrEl: string|Element|$) {
205+
$(selectorOrEl).trigger('reinitialize.areYouSure');
206+
}

0 commit comments

Comments
 (0)