Skip to content

Commit 74f80d4

Browse files
committed
fix dirty form check
1 parent fa2dd37 commit 74f80d4

File tree

5 files changed

+24
-13
lines changed

5 files changed

+24
-13
lines changed

templates/repo/issue/view_content.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@
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>
165165
</form>

templates/repo/issue/view_title.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
<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>

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +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} from '../vendor/jquery.are-you-sure.ts';
10+
import {applyAreYouSure, reinitializeAreYouSure} from '../vendor/jquery.are-you-sure.ts';
1111

1212
async function tryOnEditContent(e) {
1313
const clickTarget = e.target.closest('.edit-content');
@@ -20,16 +20,19 @@ async function tryOnEditContent(e) {
2020
const rawContent = segment.querySelector('.raw-content');
2121

2222
let comboMarkdownEditor : ComboMarkdownEditor;
23+
let form: HTMLFormElement;
2324

2425
const cancelAndReset = (e) => {
2526
e.preventDefault();
27+
form.classList.add('ignore-dirty');
2628
showElem(renderContent);
2729
hideElem(editContentZone);
2830
comboMarkdownEditor.dropzoneReloadFiles();
2931
};
3032

3133
const saveAndRefresh = async (e) => {
3234
e.preventDefault();
35+
form.classList.remove('ignore-dirty');
3336
renderContent.classList.add('is-loading');
3437
showElem(renderContent);
3538
hideElem(editContentZone);
@@ -49,6 +52,7 @@ async function tryOnEditContent(e) {
4952
showErrorToast(data.errorMessage);
5053
return;
5154
}
55+
reinitializeAreYouSure(form);
5256
editContentZone.setAttribute('data-content-version', data.contentVersion);
5357
if (!data.content) {
5458
renderContent.innerHTML = document.querySelector('#no-content').innerHTML;
@@ -87,14 +91,15 @@ async function tryOnEditContent(e) {
8791
comboMarkdownEditor = getComboMarkdownEditor(editContentZone.querySelector('.combo-markdown-editor'));
8892
if (!comboMarkdownEditor) {
8993
editContentZone.innerHTML = document.querySelector('#issue-comment-editor-template').innerHTML;
90-
applyAreYouSure(editContentZone.firstElementChild);
94+
form = editContentZone.querySelector('form');
95+
applyAreYouSure(form);
9196
const saveButton = querySingleVisibleElem<HTMLButtonElement>(editContentZone, '.ui.primary.button');
9297
const cancelButton = querySingleVisibleElem<HTMLButtonElement>(editContentZone, '.ui.cancel.button');
9398
comboMarkdownEditor = await initComboMarkdownEditor(editContentZone.querySelector('.combo-markdown-editor'));
9499
const syncUiState = () => saveButton.disabled = comboMarkdownEditor.isUploading();
95100
comboMarkdownEditor.container.addEventListener(ComboMarkdownEditor.EventUploadStateChanged, syncUiState);
96101
cancelButton.addEventListener('click', cancelAndReset);
97-
saveButton.addEventListener('click', saveAndRefresh);
102+
form.addEventListener('submit', saveAndRefresh);
98103
}
99104

100105
// 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: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {GET, POST} from '../modules/fetch.ts';
1616
import {showErrorToast} from '../modules/toast.ts';
1717
import {initRepoIssueSidebar} from './repo-issue-sidebar.ts';
1818
import {fomanticQuery} from '../modules/fomantic/base.ts';
19-
import {applyAreYouSure} from '../vendor/jquery.are-you-sure.ts';
2019

2120
const {appSubUrl} = window.config;
2221

@@ -533,14 +532,13 @@ export function initRepoIssueWipToggle() {
533532

534533
export function initRepoIssueTitleEdit() {
535534
const issueTitleDisplay = document.querySelector('#issue-title-display');
536-
const issueTitleEditor = document.querySelector('#issue-title-editor');
535+
const issueTitleEditor = document.querySelector<HTMLFormElement>('#issue-title-editor');
537536
if (!issueTitleEditor) return;
538537

539-
applyAreYouSure(issueTitleEditor);
540-
541538
const issueTitleInput = issueTitleEditor.querySelector('input');
542539
const oldTitle = issueTitleInput.getAttribute('data-old-title');
543540
issueTitleDisplay.querySelector('#issue-title-edit-show').addEventListener('click', () => {
541+
issueTitleEditor.classList.remove('ignore-dirty');
544542
hideElem(issueTitleDisplay);
545543
hideElem('#pull-desc-display');
546544
showElem(issueTitleEditor);
@@ -551,6 +549,7 @@ export function initRepoIssueTitleEdit() {
551549
issueTitleInput.focus();
552550
});
553551
issueTitleEditor.querySelector('.ui.cancel.button').addEventListener('click', () => {
552+
issueTitleEditor.classList.add('ignore-dirty');
554553
hideElem(issueTitleEditor);
555554
hideElem('#pull-desc-editor');
556555
showElem(issueTitleDisplay);
@@ -561,7 +560,8 @@ export function initRepoIssueTitleEdit() {
561560
const prTargetUpdateUrl = pullDescEditor?.getAttribute('data-target-update-url');
562561

563562
const editSaveButton = issueTitleEditor.querySelector('.ui.primary.button');
564-
editSaveButton.addEventListener('click', async () => {
563+
issueTitleEditor.addEventListener('submit', async (e) => {
564+
e.preventDefault();
565565
const newTitle = issueTitleInput.value.trim();
566566
try {
567567
if (newTitle && newTitle !== oldTitle) {
@@ -580,6 +580,7 @@ export function initRepoIssueTitleEdit() {
580580
}
581581
}
582582
}
583+
issueTitleEditor.classList.remove('dirty');
583584
window.location.reload();
584585
} catch (error) {
585586
console.error(error);

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

Lines changed: 6 additions & 1 deletion
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+
// * check "ignore-dirty" class, ignore forms with this class.
56

67
/*!
78
* jQuery Plugin: Are-You-Sure (Dirty Form Detection)
@@ -161,7 +162,7 @@ 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+
const $dirtyForms = $("form:not(.ignore-dirty)").filter('.' + settings.dirtyClass);
165166
if ($dirtyForms.length == 0) {
166167
return;
167168
}
@@ -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)