Skip to content

Commit eb04f36

Browse files
committed
Remove jQuery from repo wiki creation page
- Switched to plain JavaScript - Tested the wiki creation form functionality and it works as before Signed-off-by: Yarden Shoham <git@yardenshoham.com>
1 parent 35d5e4a commit eb04f36

File tree

3 files changed

+54
-36
lines changed

3 files changed

+54
-36
lines changed

web_src/js/features/comp/ComboMarkdownEditor.js

+8-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import '@github/markdown-toolbar-element';
22
import '@github/text-expander-element';
33
import $ from 'jquery';
44
import {attachTribute} from '../tribute.js';
5-
import {hideElem, showElem, autosize} from '../../utils/dom.js';
5+
import {hideElem, showElem, autosize, isVisible} from '../../utils/dom.js';
66
import {initEasyMDEImagePaste, initTextareaImagePaste} from './ImagePaste.js';
77
import {handleGlobalEnterQuickSubmit} from './QuickSubmit.js';
88
import {renderPreviewPanelContent} from '../repo-editor.js';
@@ -14,19 +14,18 @@ let elementIdCounter = 0;
1414

1515
/**
1616
* validate if the given textarea is non-empty.
17-
* @param {jQuery} $textarea
17+
* @param {HTMLElement} textarea - The textarea element to be validated.
1818
* @returns {boolean} returns true if validation succeeded.
1919
*/
20-
export function validateTextareaNonEmpty($textarea) {
20+
export function validateTextareaNonEmpty(textarea) {
2121
// When using EasyMDE, the original edit area HTML element is hidden, breaking HTML5 input validation.
2222
// The workaround (https://github.com/sparksuite/simplemde-markdown-editor/issues/324) doesn't work with contenteditable, so we just show an alert.
23-
if (!$textarea.val()) {
24-
if ($textarea.is(':visible')) {
25-
$textarea.prop('required', true);
26-
const $form = $textarea.parents('form');
27-
$form[0]?.reportValidity();
23+
if (!textarea.value) {
24+
if (isVisible(textarea)) {
25+
textarea.setAttribute('required', 'true');
26+
const form = textarea.closest('form');
27+
form?.reportValidity();
2828
} else {
29-
// The alert won't hurt users too much, because we are dropping the EasyMDE and the check only occurs in a few places.
3029
showErrorToast('Require non-empty content');
3130
}
3231
return false;

web_src/js/features/repo-wiki.js

+29-27
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,51 @@
1-
import $ from 'jquery';
21
import {initMarkupContent} from '../markup/content.js';
32
import {validateTextareaNonEmpty, initComboMarkdownEditor} from './comp/ComboMarkdownEditor.js';
43
import {fomanticMobileScreen} from '../modules/fomantic.js';
5-
6-
const {csrfToken} = window.config;
4+
import {POST} from '../modules/fetch.js';
75

86
async function initRepoWikiFormEditor() {
9-
const $editArea = $('.repository.wiki .combo-markdown-editor textarea');
10-
if (!$editArea.length) return;
7+
const editArea = document.querySelector('.repository.wiki .combo-markdown-editor textarea');
8+
if (!editArea) return;
119

12-
const $form = $('.repository.wiki.new .ui.form');
13-
const $editorContainer = $form.find('.combo-markdown-editor');
10+
const form = document.querySelector('.repository.wiki.new .ui.form');
11+
const editorContainer = form.querySelector('.combo-markdown-editor');
1412
let editor;
1513

1614
let renderRequesting = false;
1715
let lastContent;
18-
const renderEasyMDEPreview = function () {
16+
const renderEasyMDEPreview = async function () {
1917
if (renderRequesting) return;
2018

21-
const $previewFull = $editorContainer.find('.EasyMDEContainer .editor-preview-active');
22-
const $previewSide = $editorContainer.find('.EasyMDEContainer .editor-preview-active-side');
23-
const $previewTarget = $previewSide.length ? $previewSide : $previewFull;
24-
const newContent = $editArea.val();
25-
if (editor && $previewTarget.length && lastContent !== newContent) {
19+
const previewFull = editorContainer.querySelector('.EasyMDEContainer .editor-preview-active');
20+
const previewSide = editorContainer.querySelector('.EasyMDEContainer .editor-preview-active-side');
21+
const previewTarget = previewSide || previewFull;
22+
const newContent = editArea.value;
23+
if (editor && previewTarget && lastContent !== newContent) {
2624
renderRequesting = true;
27-
$.post(editor.previewUrl, {
28-
_csrf: csrfToken,
29-
mode: editor.previewMode,
30-
context: editor.previewContext,
31-
text: newContent,
32-
wiki: editor.previewWiki,
33-
}).done((data) => {
25+
const formData = new FormData();
26+
formData.append('mode', editor.previewMode);
27+
formData.append('context', editor.previewContext);
28+
formData.append('text', newContent);
29+
formData.append('wiki', editor.previewWiki);
30+
try {
31+
const response = await POST(editor.previewUrl, {data: formData});
32+
const data = await response.text();
3433
lastContent = newContent;
35-
$previewTarget.html(`<div class="markup ui segment">${data}</div>`);
34+
previewTarget.innerHTML = `<div class="markup ui segment">${data}</div>`;
3635
initMarkupContent();
37-
}).always(() => {
36+
} catch (error) {
37+
console.error('Error rendering preview:', error);
38+
} finally {
3839
renderRequesting = false;
3940
setTimeout(renderEasyMDEPreview, 1000);
40-
});
41+
}
4142
} else {
4243
setTimeout(renderEasyMDEPreview, 1000);
4344
}
4445
};
4546
renderEasyMDEPreview();
4647

47-
editor = await initComboMarkdownEditor($editorContainer, {
48+
editor = await initComboMarkdownEditor(editorContainer, {
4849
useScene: 'wiki',
4950
// EasyMDE has some problems of height definition, it has inline style height 300px by default, so we also use inline styles to override it.
5051
// And another benefit is that we only need to write the style once for both editors.
@@ -64,9 +65,10 @@ async function initRepoWikiFormEditor() {
6465
},
6566
});
6667

67-
$form.on('submit', () => {
68-
if (!validateTextareaNonEmpty($editArea)) {
69-
return false;
68+
form.addEventListener('submit', (e) => {
69+
if (!validateTextareaNonEmpty(editArea)) {
70+
e.preventDefault();
71+
e.stopPropagation();
7072
}
7173
});
7274
}

web_src/js/utils/dom.js

+17
Original file line numberDiff line numberDiff line change
@@ -227,3 +227,20 @@ export function initSubmitEventPolyfill() {
227227
document.body.addEventListener('click', submitEventPolyfillListener);
228228
document.body.addEventListener('focus', submitEventPolyfillListener);
229229
}
230+
231+
/**
232+
* Check if an element is visible.
233+
* Note: This function doesn't account for all possible visibility scenarios.
234+
* @param {HTMLElement} element The element to check.
235+
* @returns {boolean} True if the element is visible.
236+
*/
237+
export function isVisible(element) {
238+
if (!element) return false;
239+
240+
const style = window.getComputedStyle(element);
241+
return style.width !== '0' &&
242+
style.height !== '0' &&
243+
style.opacity !== '0' &&
244+
style.display !== 'none' &&
245+
style.visibility !== 'hidden';
246+
}

0 commit comments

Comments
 (0)