Skip to content

Commit d38f18f

Browse files
committed
fix
1 parent c9e582c commit d38f18f

File tree

6 files changed

+52
-94
lines changed

6 files changed

+52
-94
lines changed

templates/repo/editor/edit.tmpl

+5-23
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
{{template "repo/header" .}}
44
<div class="ui container">
55
{{template "base/alert" .}}
6-
<form class="ui edit form" method="post">
6+
<form class="ui edit form" method="post"
7+
data-text-empty-confirm-header="{{ctx.Locale.Tr "repo.editor.commit_empty_file_header"}}"
8+
data-text-empty-confirm-content="{{ctx.Locale.Tr "repo.editor.commit_empty_file_text"}}"
9+
>
710
{{.CsrfTokenHtml}}
811
<input type="hidden" name="last_commit" value="{{.last_commit}}">
912
<input type="hidden" name="page_has_posted" value="{{.PageHasPosted}}">
@@ -29,7 +32,7 @@
2932
<div class="ui top attached header">
3033
<div class="ui compact small menu small-menu-items repo-editor-menu">
3134
<a class="active item" data-tab="write">{{svg "octicon-code"}} {{if .IsNewFile}}{{ctx.Locale.Tr "repo.editor.new_file"}}{{else}}{{ctx.Locale.Tr "repo.editor.edit_file"}}{{end}}</a>
32-
<a class="item" data-tab="preview" data-url="{{.Repository.Link}}/markup" data-context="{{.RepoLink}}/src/{{.BranchNameSubURL}}" data-markup-mode="file">{{svg "octicon-eye"}} {{ctx.Locale.Tr "preview"}}</a>
35+
<a class="item" data-tab="preview" data-preview-url="{{.Repository.Link}}/markup" data-preview-context-ref="{{.RepoLink}}/src/{{.BranchNameSubURL}}">{{svg "octicon-eye"}} {{ctx.Locale.Tr "preview"}}</a>
3336
{{if not .IsNewFile}}
3437
<a class="item" data-tab="diff" hx-params="context,content" hx-vals='{"context":"{{.BranchLink}}"}' hx-include="#edit_area" hx-swap="innerHTML" hx-target=".tab[data-tab='diff']" hx-indicator=".tab[data-tab='diff']" hx-post="{{.RepoLink}}/_preview/{{.BranchName | PathEscapeSegments}}/{{.TreePath | PathEscapeSegments}}">{{svg "octicon-diff"}} {{ctx.Locale.Tr "repo.editor.preview_changes"}}</a>
3538
{{end}}
@@ -38,8 +41,6 @@
3841
<div class="ui bottom attached segment tw-p-0">
3942
<div class="ui active tab tw-rounded-b" data-tab="write">
4043
<textarea id="edit_area" name="content" class="tw-hidden" data-id="repo-{{.Repository.Name}}-{{.TreePath}}"
41-
data-url="{{.Repository.Link}}/markup"
42-
data-context="{{.RepoLink}}"
4344
data-previewable-extensions="{{.PreviewableExtensions}}"
4445
data-line-wrap-extensions="{{.LineWrapExtensions}}">{{.FileContent}}</textarea>
4546
<div class="editor-loading is-loading"></div>
@@ -55,24 +56,5 @@
5556
{{template "repo/editor/commit_form" .}}
5657
</form>
5758
</div>
58-
<div class="ui g-modal-confirm modal" id="edit-empty-content-modal">
59-
<div class="header">
60-
{{svg "octicon-file"}}
61-
{{ctx.Locale.Tr "repo.editor.commit_empty_file_header"}}
62-
</div>
63-
<div class="center content">
64-
<p>{{ctx.Locale.Tr "repo.editor.commit_empty_file_text"}}</p>
65-
</div>
66-
<div class="actions">
67-
<button class="ui cancel button">
68-
{{svg "octicon-x"}}
69-
{{ctx.Locale.Tr "repo.editor.cancel"}}
70-
</button>
71-
<button class="ui primary ok button">
72-
{{svg "fontawesome-save"}}
73-
{{ctx.Locale.Tr "repo.editor.commit_changes"}}
74-
</button>
75-
</div>
76-
</div>
7759
</div>
7860
{{template "base/footer" .}}

templates/repo/editor/patch.tmpl

+4-21
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
{{template "repo/header" .}}
44
<div class="ui container">
55
{{template "base/alert" .}}
6-
<form class="ui edit form" method="post" action="{{.RepoLink}}/_diffpatch/{{.BranchName | PathEscapeSegments}}">
6+
<form class="ui edit form" method="post" action="{{.RepoLink}}/_diffpatch/{{.BranchName | PathEscapeSegments}}"
7+
data-text-empty-confirm-header="{{ctx.Locale.Tr "repo.editor.commit_empty_file_header"}}"
8+
data-text-empty-confirm-content="{{ctx.Locale.Tr "repo.editor.commit_empty_file_text"}}"
9+
>
710
{{.CsrfTokenHtml}}
811
<input type="hidden" name="last_commit" value="{{.last_commit}}">
912
<input type="hidden" name="page_has_posted" value="{{.PageHasPosted}}">
@@ -33,25 +36,5 @@
3336
{{template "repo/editor/commit_form" .}}
3437
</form>
3538
</div>
36-
37-
<div class="ui g-modal-confirm modal" id="edit-empty-content-modal">
38-
<div class="header">
39-
{{svg "octicon-file"}}
40-
{{ctx.Locale.Tr "repo.editor.commit_empty_file_header"}}
41-
</div>
42-
<div class="center content">
43-
<p>{{ctx.Locale.Tr "repo.editor.commit_empty_file_text"}}</p>
44-
</div>
45-
<div class="actions">
46-
<button class="ui cancel button">
47-
{{svg "octicon-x"}}
48-
{{ctx.Locale.Tr "repo.editor.cancel"}}
49-
</button>
50-
<button class="ui primary ok button">
51-
{{svg "fontawesome-save"}}
52-
{{ctx.Locale.Tr "repo.editor.commit_changes"}}
53-
</button>
54-
</div>
55-
</div>
5639
</div>
5740
{{template "base/footer" .}}

web_src/js/features/codeeditor.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -134,19 +134,17 @@ function getFileBasedOptions(filename: string, lineWrapExts: string[]) {
134134
}
135135

136136
function togglePreviewDisplay(previewable: boolean) {
137-
const previewTab = document.querySelector('a[data-tab="preview"]');
137+
const previewTab = document.querySelector<HTMLElement>('a[data-tab="preview"]');
138138
if (!previewTab) return;
139139

140140
if (previewable) {
141-
const newUrl = (previewTab.getAttribute('data-url') || '').replace(/(.*)\/.*/, `$1/markup`);
142-
previewTab.setAttribute('data-url', newUrl);
143141
previewTab.style.display = '';
144142
} else {
145143
previewTab.style.display = 'none';
146144
// If the "preview" tab was active, user changes the filename to a non-previewable one,
147145
// then the "preview" tab becomes inactive (hidden), so the "write" tab should become active
148146
if (previewTab.classList.contains('active')) {
149-
const writeTab = document.querySelector('a[data-tab="write"]');
147+
const writeTab = document.querySelector<HTMLElement>('a[data-tab="write"]');
150148
writeTab.click();
151149
}
152150
}

web_src/js/features/comp/ConfirmModal.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {fomanticQuery} from '../../modules/fomantic/base.ts';
55

66
const {i18n} = window.config;
77

8-
export function confirmModal({header = '', content = '', confirmButtonColor = 'primary'} = {}) {
8+
export function confirmModal({header = '', content = '', confirmButtonColor = 'primary'} = {}): Promise<boolean> {
99
return new Promise((resolve) => {
1010
const headerHtml = header ? `<div class="header">${htmlEscape(header)}</div>` : '';
1111
const modal = createElementFromHTML(`

web_src/js/features/repo-editor.ts

+38-43
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,37 @@
1-
import $ from 'jquery';
21
import {htmlEscape} from 'escape-goat';
32
import {createCodeEditor} from './codeeditor.ts';
43
import {hideElem, queryElems, showElem, createElementFromHTML} from '../utils/dom.ts';
54
import {initMarkupContent} from '../markup/content.ts';
65
import {attachRefIssueContextPopup} from './contextpopup.ts';
76
import {POST} from '../modules/fetch.ts';
87
import {initDropzone} from './dropzone.ts';
8+
import {confirmModal} from './comp/ConfirmModal.ts';
9+
import {applyAreYouSure} from '../vendor/jquery.are-you-sure.ts';
10+
import {fomanticQuery} from '../modules/fomantic/base.ts';
911

10-
function initEditPreviewTab($form) {
11-
const $tabMenu = $form.find('.repo-editor-menu');
12-
$tabMenu.find('.item').tab();
13-
const $previewTab = $tabMenu.find('a[data-tab="preview"]');
14-
if ($previewTab.length) {
15-
$previewTab.on('click', async function () {
16-
const $this = $(this);
17-
let context = `${$this.data('context')}/`;
18-
const mode = $this.data('markup-mode') || 'comment';
19-
const $treePathEl = $form.find('input#tree_path');
20-
if ($treePathEl.length > 0) {
21-
context += $treePathEl.val();
22-
}
23-
context = context.substring(0, context.lastIndexOf('/'));
12+
function initEditPreviewTab(elForm: HTMLFormElement) {
13+
const elTabMenu = elForm.querySelector('.repo-editor-menu');
14+
fomanticQuery(elTabMenu.querySelectorAll('.item')).tab();
2415

25-
const formData = new FormData();
26-
formData.append('mode', mode);
27-
formData.append('context', context);
28-
formData.append('text', $form.find('.tab[data-tab="write"] textarea').val());
29-
formData.append('file_path', $treePathEl.val());
30-
try {
31-
const response = await POST($this.data('url'), {data: formData});
32-
const data = await response.text();
33-
const $previewPanel = $form.find('.tab[data-tab="preview"]');
34-
if ($previewPanel.length) {
35-
renderPreviewPanelContent($previewPanel, data);
36-
}
37-
} catch (error) {
38-
console.error('Error:', error);
39-
}
40-
});
41-
}
16+
const elPreviewTab = elTabMenu.querySelector('a[data-tab="preview"]');
17+
const elPreviewPanel = elForm.querySelector('.tab[data-tab="preview"]');
18+
if (!elPreviewTab || !elPreviewPanel) return;
19+
20+
elPreviewTab.addEventListener('click', async () => {
21+
const elTreePath = elForm.querySelector<HTMLInputElement>('input#tree_path');
22+
const previewUrl = elPreviewTab.getAttribute('data-preview-url');
23+
const previewContextRef = elPreviewTab.getAttribute('data-preview-context-ref');
24+
let previewContext = `${previewContextRef}/${elTreePath.value}`;
25+
previewContext = previewContext.substring(0, previewContext.lastIndexOf('/'));
26+
const formData = new FormData();
27+
formData.append('mode', 'file');
28+
formData.append('context', previewContext);
29+
formData.append('text', elForm.querySelector<HTMLTextAreaElement>('.tab[data-tab="write"] textarea').value);
30+
formData.append('file_path', elTreePath.value);
31+
const response = await POST(previewUrl, {data: formData});
32+
const data = await response.text();
33+
renderPreviewPanelContent(elPreviewPanel, data);
34+
});
4235
}
4336

4437
export function initRepoEditor() {
@@ -151,25 +144,25 @@ export function initRepoEditor() {
151144
}
152145
});
153146

154-
const $form = $('.repository.editor .edit.form');
155-
initEditPreviewTab($form);
147+
const elForm = document.querySelector<HTMLFormElement>('.repository.editor .edit.form');
148+
initEditPreviewTab(elForm);
156149

157150
(async () => {
158151
const editor = await createCodeEditor(editArea, filenameInput);
159152

160153
// Using events from https://github.com/codedance/jquery.AreYouSure#advanced-usage
161154
// to enable or disable the commit button
162155
const commitButton = document.querySelector<HTMLButtonElement>('#commit-button');
163-
const $editForm = $('.ui.edit.form');
164156
const dirtyFileClass = 'dirty-file';
165157

166158
// Disabling the button at the start
167-
if ($('input[name="page_has_posted"]').val() !== 'true') {
159+
if (document.querySelector<HTMLInputElement>('input[name="page_has_posted"]').value !== 'true') {
168160
commitButton.disabled = true;
169161
}
170162

171163
// Registering a custom listener for the file path and the file content
172-
$editForm.areYouSure({
164+
// FIXME: it is not quite right here (old bug), it causes double-init, the global areYouSure "dirty" class will also be added
165+
applyAreYouSure(elForm, {
173166
silent: true,
174167
dirtyClass: dirtyFileClass,
175168
fieldSelector: ':input:not(.commit-form-wrapper :input)',
@@ -187,15 +180,17 @@ export function initRepoEditor() {
187180
editor.setValue(value);
188181
}
189182

190-
commitButton?.addEventListener('click', (e) => {
183+
commitButton?.addEventListener('click', async (e) => {
191184
// A modal which asks if an empty file should be committed
192185
if (!editArea.value) {
193-
$('#edit-empty-content-modal').modal({
194-
onApprove() {
195-
$('.edit.form').trigger('submit');
196-
},
197-
}).modal('show');
198186
e.preventDefault();
187+
if (await confirmModal({
188+
header: elForm.getAttribute('data-text-empty-confirm-header'),
189+
content: elForm.getAttribute('data-text-empty-confirm-content'),
190+
})) {
191+
elForm.classList.remove('dirty');
192+
elForm.submit();
193+
}
199194
}
200195
});
201196
})();

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,6 @@ export function initAreYouSure($) {
196196
};
197197
}
198198

199-
export function applyAreYouSure(selector: string) {
200-
$(selector).areYouSure();
199+
export function applyAreYouSure(selectorOrEl: string|Element|$, opts = {}) {
200+
$(selectorOrEl).areYouSure(opts);
201201
}

0 commit comments

Comments
 (0)