mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 09:44:21 +00:00 
			
		
		
		
	Remove jQuery AJAX from the repo editor (#29636)
# Preview Tab
- Removed the jQuery AJAX call and replaced with our fetch wrapper
- Tested the preview tab functionality and it works as before
# Diff Tab
- Removed the jQuery AJAX call and replaced with htmx
- Tested the diff tab functionality and it works as before
## htmx Attributes
- `hx-post="{{.RepoLink}}..."`: make a POST request to the endpoint
- `hx-indicator=".tab[data-tab='diff']"`: attach the loading indicator
to the tab body
- `hx-target=".tab[data-tab='diff']"`: target the tab body for swapping
with the response
- `hx-swap="innerHTML"`: swap the target's inner HTML
- `hx-include="#edit_area"`: include the value of the textarea (content)
in the request body
- `hx-vals='{"context":"{{.BranchLink}}"}'`: include the context in the
request body
- `hx-params="context,content"`: include only these keys in the request
body
# Demo using `fetch` and `htmx` instead of jQuery AJAX

---------
Signed-off-by: Yarden Shoham <git@yardenshoham.com>
Co-authored-by: silverwind <me@silverwind.io>
			
			
This commit is contained in:
		@@ -4,15 +4,14 @@ import {createCodeEditor} from './codeeditor.js';
 | 
			
		||||
import {hideElem, showElem} from '../utils/dom.js';
 | 
			
		||||
import {initMarkupContent} from '../markup/content.js';
 | 
			
		||||
import {attachRefIssueContextPopup} from './contextpopup.js';
 | 
			
		||||
 | 
			
		||||
const {csrfToken} = window.config;
 | 
			
		||||
import {POST} from '../modules/fetch.js';
 | 
			
		||||
 | 
			
		||||
function initEditPreviewTab($form) {
 | 
			
		||||
  const $tabMenu = $form.find('.tabular.menu');
 | 
			
		||||
  $tabMenu.find('.item').tab();
 | 
			
		||||
  const $previewTab = $tabMenu.find(`.item[data-tab="${$tabMenu.data('preview')}"]`);
 | 
			
		||||
  if ($previewTab.length) {
 | 
			
		||||
    $previewTab.on('click', function () {
 | 
			
		||||
    $previewTab.on('click', async function () {
 | 
			
		||||
      const $this = $(this);
 | 
			
		||||
      let context = `${$this.data('context')}/`;
 | 
			
		||||
      const mode = $this.data('markup-mode') || 'comment';
 | 
			
		||||
@@ -21,43 +20,30 @@ function initEditPreviewTab($form) {
 | 
			
		||||
        context += treePathEl.val();
 | 
			
		||||
      }
 | 
			
		||||
      context = context.substring(0, context.lastIndexOf('/'));
 | 
			
		||||
      $.post($this.data('url'), {
 | 
			
		||||
        _csrf: csrfToken,
 | 
			
		||||
        mode,
 | 
			
		||||
        context,
 | 
			
		||||
        text: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val(),
 | 
			
		||||
        file_path: treePathEl.val(),
 | 
			
		||||
      }, (data) => {
 | 
			
		||||
 | 
			
		||||
      const formData = new FormData();
 | 
			
		||||
      formData.append('mode', mode);
 | 
			
		||||
      formData.append('context', context);
 | 
			
		||||
      formData.append('text', $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val());
 | 
			
		||||
      formData.append('file_path', treePathEl.val());
 | 
			
		||||
      try {
 | 
			
		||||
        const response = await POST($this.data('url'), {data: formData});
 | 
			
		||||
        const data = await response.text();
 | 
			
		||||
        const $previewPanel = $form.find(`.tab[data-tab="${$tabMenu.data('preview')}"]`);
 | 
			
		||||
        renderPreviewPanelContent($previewPanel, data);
 | 
			
		||||
      });
 | 
			
		||||
      } catch (error) {
 | 
			
		||||
        console.error('Error:', error);
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function initEditDiffTab($form) {
 | 
			
		||||
  const $tabMenu = $form.find('.tabular.menu');
 | 
			
		||||
  $tabMenu.find('.item').tab();
 | 
			
		||||
  $tabMenu.find(`.item[data-tab="${$tabMenu.data('diff')}"]`).on('click', function () {
 | 
			
		||||
    const $this = $(this);
 | 
			
		||||
    $.post($this.data('url'), {
 | 
			
		||||
      _csrf: csrfToken,
 | 
			
		||||
      context: $this.data('context'),
 | 
			
		||||
      content: $form.find(`.tab[data-tab="${$tabMenu.data('write')}"] textarea`).val(),
 | 
			
		||||
    }, (data) => {
 | 
			
		||||
      const $diffPreviewPanel = $form.find(`.tab[data-tab="${$tabMenu.data('diff')}"]`);
 | 
			
		||||
      $diffPreviewPanel.html(data);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function initEditorForm() {
 | 
			
		||||
  if ($('.repository .edit.form').length === 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  initEditPreviewTab($('.repository .edit.form'));
 | 
			
		||||
  initEditDiffTab($('.repository .edit.form'));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getCursorPosition($e) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user