mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Make Ctrl+Enter (quick submit) work for issue comment and wiki editor (#19729)
* Make Ctrl+Enter (quick submit) work for issue comment and wiki editor * Remove the required `SubmitReviewForm.Type`, empty type (triggered by quick submit) means "comment" * Merge duplicate code
This commit is contained in:
		| @@ -44,13 +44,28 @@ export function initFootLanguageMenu() { | ||||
|  | ||||
|  | ||||
| export function initGlobalEnterQuickSubmit() { | ||||
|   $('.js-quick-submit').on('keydown', function (e) { | ||||
|     if (((e.ctrlKey && !e.altKey) || e.metaKey) && (e.keyCode === 13 || e.keyCode === 10)) { | ||||
|       $(this).closest('form').trigger('submit'); | ||||
|   $(document).on('keydown', '.js-quick-submit', (e) => { | ||||
|     if (((e.ctrlKey && !e.altKey) || e.metaKey) && (e.key === 'Enter')) { | ||||
|       handleGlobalEnterQuickSubmit(e.target); | ||||
|       return false; | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export function handleGlobalEnterQuickSubmit(target) { | ||||
|   const $target = $(target); | ||||
|   const $form = $(target).closest('form'); | ||||
|   if ($form.length) { | ||||
|     // here use the event to trigger the submit event (instead of calling `submit()` method directly) | ||||
|     // otherwise the `areYouSure` handler won't be executed, then there will be an annoying "confirm to leave" dialog | ||||
|     $form.trigger('submit'); | ||||
|   } else { | ||||
|     // if no form, then the editor is for an AJAX request, dispatch an event to the target, let the target's event handler to do the AJAX request. | ||||
|     // the 'ce-' prefix means this is a CustomEvent | ||||
|     $target.trigger('ce-quick-submit'); | ||||
|   } | ||||
| } | ||||
|  | ||||
| export function initGlobalButtonClickOnEnter() { | ||||
|   $(document).on('keypress', '.ui.button', (e) => { | ||||
|     if (e.keyCode === 13 || e.keyCode === 32) { // enter key or space bar | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| import $ from 'jquery'; | ||||
| import attachTribute from '../tribute.js'; | ||||
| import {handleGlobalEnterQuickSubmit} from '../common-global.js'; | ||||
|  | ||||
| /** | ||||
|  * @returns {EasyMDE} | ||||
| @@ -71,9 +72,12 @@ export async function createCommentEasyMDE(textarea, easyMDEOptions = {}) { | ||||
|         title: 'Revert to simple textarea', | ||||
|       }, | ||||
|     ], ...easyMDEOptions}); | ||||
|  | ||||
|   const inputField = easyMDE.codemirror.getInputField(); | ||||
|   inputField.classList.add('js-quick-submit'); | ||||
|  | ||||
|   easyMDE.codemirror.setOption('extraKeys', { | ||||
|     'Cmd-Enter': codeMirrorQuickSubmit, | ||||
|     'Ctrl-Enter': codeMirrorQuickSubmit, | ||||
|     Enter: (cm) => { | ||||
|       const tributeContainer = document.querySelector('.tribute-container'); | ||||
|       if (!tributeContainer || tributeContainer.style.display === 'none') { | ||||
| @@ -149,3 +153,12 @@ export function validateTextareaNonEmpty($textarea) { | ||||
|   $mdeInputField.prop('required', false); | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * there is no guarantee that the CodeMirror object is inside the same form as the textarea, | ||||
|  * so can not call handleGlobalEnterQuickSubmit directly. | ||||
|  * @param {CodeMirror.EditorFromTextArea} codeMirror | ||||
|  */ | ||||
| export function codeMirrorQuickSubmit(codeMirror) { | ||||
|   handleGlobalEnterQuickSubmit(codeMirror.getTextArea()); | ||||
| } | ||||
|   | ||||
| @@ -355,6 +355,11 @@ async function onEditContent(event) { | ||||
|       initEasyMDEImagePaste(easyMDE, $dropzone[0], $dropzone.find('.files')); | ||||
|     } | ||||
|  | ||||
|     const $saveButton = $editContentZone.find('.save.button'); | ||||
|     $textarea.on('ce-quick-submit', () => { | ||||
|       $saveButton.trigger('click'); | ||||
|     }); | ||||
|  | ||||
|     $editContentZone.find('.cancel.button').on('click', () => { | ||||
|       $renderContent.show(); | ||||
|       $editContentZone.hide(); | ||||
| @@ -362,7 +367,8 @@ async function onEditContent(event) { | ||||
|         dz.emit('reload'); | ||||
|       } | ||||
|     }); | ||||
|     $editContentZone.find('.save.button').on('click', () => { | ||||
|  | ||||
|     $saveButton.on('click', () => { | ||||
|       $renderContent.show(); | ||||
|       $editContentZone.hide(); | ||||
|       const $attachments = $dropzone.find('.files').find('[name=files]').map(function () { | ||||
| @@ -400,7 +406,7 @@ async function onEditContent(event) { | ||||
|         initCommentContent(); | ||||
|       }); | ||||
|     }); | ||||
|   } else { | ||||
|   } else { // use existing form | ||||
|     $textarea = $segment.find('textarea'); | ||||
|     easyMDE = getAttachedEasyMDE($textarea); | ||||
|   } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| import $ from 'jquery'; | ||||
| import {initMarkupContent} from '../markup/content.js'; | ||||
| import {attachEasyMDEToElements, importEasyMDE, validateTextareaNonEmpty} from './comp/EasyMDE.js'; | ||||
| import {attachEasyMDEToElements, codeMirrorQuickSubmit, importEasyMDE, validateTextareaNonEmpty} from './comp/EasyMDE.js'; | ||||
| import {initCompMarkupContentPreviewTab} from './comp/MarkupContentPreview.js'; | ||||
|  | ||||
| const {csrfToken} = window.config; | ||||
| @@ -122,10 +122,12 @@ async function initRepoWikiFormEditor() { | ||||
|     ] | ||||
|   }); | ||||
|  | ||||
|   attachEasyMDEToElements(easyMDE); | ||||
|   easyMDE.codemirror.setOption('extraKeys', { | ||||
|     'Cmd-Enter': codeMirrorQuickSubmit, | ||||
|     'Ctrl-Enter': codeMirrorQuickSubmit, | ||||
|   }); | ||||
|  | ||||
|   const $mdeInputField = $(easyMDE.codemirror.getInputField()); | ||||
|   $mdeInputField.addClass('js-quick-submit'); | ||||
|   attachEasyMDEToElements(easyMDE); | ||||
|  | ||||
|   $form.on('submit', () => { | ||||
|     if (!validateTextareaNonEmpty($editArea)) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 wxiaoguang
					wxiaoguang