Refactor repo-legacy.js, remove messy global variables. Fix errors. (#17646)
Refactor repo-legacy.js, remove messy global variables. Fix errors. Fix an error in Sortable Fix a incorrect call assignMenuAttributes from the template
This commit is contained in:
		
					parent
					
						
							
								e1d655991b
							
						
					
				
			
			
				commit
				
					
						55be5fe339
					
				
			
		
					 4 changed files with 199 additions and 202 deletions
				
			
		| 
						 | 
					@ -74,7 +74,7 @@ or if sqlite support is required:
 | 
				
			||||||
The `build` target is split into two sub-targets:
 | 
					The `build` target is split into two sub-targets:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `make backend` which requires [Go 1.16](https://golang.org/dl/) or greater.
 | 
					- `make backend` which requires [Go 1.16](https://golang.org/dl/) or greater.
 | 
				
			||||||
- `make frontend` which requires [Node.js 12.17](https://nodejs.org/en/download/) or greater and Internet connectivity to download npm dependencies.
 | 
					- `make frontend` which requires [Node.js LTS](https://nodejs.org/en/download/) or greater and Internet connectivity to download npm dependencies.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
When building from the official source tarballs which include pre-built frontend files, the `frontend` target will not be triggered, making it possible to build without Node.js and Internet connectivity.
 | 
					When building from the official source tarballs which include pre-built frontend files, the `frontend` target will not be triggered, making it possible to build without Node.js and Internet connectivity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@
 | 
				
			||||||
		<input type="hidden" name="diff_start_cid">
 | 
							<input type="hidden" name="diff_start_cid">
 | 
				
			||||||
		<input type="hidden" name="diff_end_cid">
 | 
							<input type="hidden" name="diff_end_cid">
 | 
				
			||||||
		<input type="hidden" name="diff_base_cid">
 | 
							<input type="hidden" name="diff_base_cid">
 | 
				
			||||||
		<div class="ui top tabular menu" {{if not $.hidden}}onload="assignMenuAttributes(this)" {{end}}data-write="write" data-preview="preview">
 | 
							<div class="ui top tabular menu" data-write="write" data-preview="preview">
 | 
				
			||||||
			<a class="active item" data-tab="write">{{$.root.i18n.Tr "write"}}</a>
 | 
								<a class="active item" data-tab="write">{{$.root.i18n.Tr "write"}}</a>
 | 
				
			||||||
			<a class="item" data-tab="preview" data-url="{{$.root.Repository.APIURL}}/markdown" data-context="{{$.root.RepoLink}}">{{$.root.i18n.Tr "preview"}}</a>
 | 
								<a class="item" data-tab="preview" data-url="{{$.root.Repository.APIURL}}/markdown" data-context="{{$.root.RepoLink}}">{{$.root.i18n.Tr "preview"}}</a>
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,11 +29,6 @@ import {initRepoSettingBranches} from './repo-settings.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {csrfToken} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const commentMDEditors = {};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// FIXME: the usage of `autoSimpleMDE` is quite messy, the refactor should be done very carefully in future.
 | 
					 | 
				
			||||||
let autoSimpleMDE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export function initRepoCommentForm() {
 | 
					export function initRepoCommentForm() {
 | 
				
			||||||
  if ($('.comment.form').length === 0) {
 | 
					  if ($('.comment.form').length === 0) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
| 
						 | 
					@ -68,12 +63,12 @@ export function initRepoCommentForm() {
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  autoSimpleMDE = createCommentSimpleMDE($('.comment.form textarea:not(.review-textarea)'));
 | 
					  createCommentSimpleMDE($('.comment.form textarea:not(.review-textarea)'));
 | 
				
			||||||
  initBranchSelector();
 | 
					  initBranchSelector();
 | 
				
			||||||
  initCompMarkupContentPreviewTab($('.comment.form'));
 | 
					  initCompMarkupContentPreviewTab($('.comment.form'));
 | 
				
			||||||
  initCompImagePaste($('.comment.form'));
 | 
					  initCompImagePaste($('.comment.form'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Listsubmit
 | 
					  // List submits
 | 
				
			||||||
  function initListSubmits(selector, outerSelector) {
 | 
					  function initListSubmits(selector, outerSelector) {
 | 
				
			||||||
    const $list = $(`.ui.${outerSelector}.list`);
 | 
					    const $list = $(`.ui.${outerSelector}.list`);
 | 
				
			||||||
    const $noSelect = $list.find('.no-select');
 | 
					    const $noSelect = $list.find('.no-select');
 | 
				
			||||||
| 
						 | 
					@ -259,6 +254,163 @@ export function initRepoCommentForm() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function onEditContent(event) {
 | 
				
			||||||
 | 
					  event.preventDefault();
 | 
				
			||||||
 | 
					  $(this).closest('.dropdown').find('.menu').toggle('visible');
 | 
				
			||||||
 | 
					  const $segment = $(this).closest('.header').next();
 | 
				
			||||||
 | 
					  const $editContentZone = $segment.find('.edit-content-zone');
 | 
				
			||||||
 | 
					  const $renderContent = $segment.find('.render-content');
 | 
				
			||||||
 | 
					  const $rawContent = $segment.find('.raw-content');
 | 
				
			||||||
 | 
					  let $textarea;
 | 
				
			||||||
 | 
					  let $simplemde;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Setup new form
 | 
				
			||||||
 | 
					  if ($editContentZone.html().length === 0) {
 | 
				
			||||||
 | 
					    $editContentZone.html($('#edit-content-form').html());
 | 
				
			||||||
 | 
					    $textarea = $editContentZone.find('textarea');
 | 
				
			||||||
 | 
					    await attachTribute($textarea.get(), {mentions: true, emoji: true});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let dz;
 | 
				
			||||||
 | 
					    const $dropzone = $editContentZone.find('.dropzone');
 | 
				
			||||||
 | 
					    if ($dropzone.length === 1) {
 | 
				
			||||||
 | 
					      $dropzone.data('saved', false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const fileUuidDict = {};
 | 
				
			||||||
 | 
					      dz = await createDropzone($dropzone[0], {
 | 
				
			||||||
 | 
					        url: $dropzone.data('upload-url'),
 | 
				
			||||||
 | 
					        headers: {'X-Csrf-Token': csrfToken},
 | 
				
			||||||
 | 
					        maxFiles: $dropzone.data('max-file'),
 | 
				
			||||||
 | 
					        maxFilesize: $dropzone.data('max-size'),
 | 
				
			||||||
 | 
					        acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
 | 
				
			||||||
 | 
					        addRemoveLinks: true,
 | 
				
			||||||
 | 
					        dictDefaultMessage: $dropzone.data('default-message'),
 | 
				
			||||||
 | 
					        dictInvalidFileType: $dropzone.data('invalid-input-type'),
 | 
				
			||||||
 | 
					        dictFileTooBig: $dropzone.data('file-too-big'),
 | 
				
			||||||
 | 
					        dictRemoveFile: $dropzone.data('remove-file'),
 | 
				
			||||||
 | 
					        timeout: 0,
 | 
				
			||||||
 | 
					        thumbnailMethod: 'contain',
 | 
				
			||||||
 | 
					        thumbnailWidth: 480,
 | 
				
			||||||
 | 
					        thumbnailHeight: 480,
 | 
				
			||||||
 | 
					        init() {
 | 
				
			||||||
 | 
					          this.on('success', (file, data) => {
 | 
				
			||||||
 | 
					            fileUuidDict[file.uuid] = {submitted: false};
 | 
				
			||||||
 | 
					            const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
 | 
				
			||||||
 | 
					            $dropzone.find('.files').append(input);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          this.on('removedfile', (file) => {
 | 
				
			||||||
 | 
					            $(`#${file.uuid}`).remove();
 | 
				
			||||||
 | 
					            if ($dropzone.data('remove-url') && !fileUuidDict[file.uuid].submitted) {
 | 
				
			||||||
 | 
					              $.post($dropzone.data('remove-url'), {
 | 
				
			||||||
 | 
					                file: file.uuid,
 | 
				
			||||||
 | 
					                _csrf: csrfToken,
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          this.on('submit', () => {
 | 
				
			||||||
 | 
					            $.each(fileUuidDict, (fileUuid) => {
 | 
				
			||||||
 | 
					              fileUuidDict[fileUuid].submitted = true;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          this.on('reload', () => {
 | 
				
			||||||
 | 
					            $.getJSON($editContentZone.data('attachment-url'), (data) => {
 | 
				
			||||||
 | 
					              dz.removeAllFiles(true);
 | 
				
			||||||
 | 
					              $dropzone.find('.files').empty();
 | 
				
			||||||
 | 
					              $.each(data, function () {
 | 
				
			||||||
 | 
					                const imgSrc = `${$dropzone.data('link-url')}/${this.uuid}`;
 | 
				
			||||||
 | 
					                dz.emit('addedfile', this);
 | 
				
			||||||
 | 
					                dz.emit('thumbnail', this, imgSrc);
 | 
				
			||||||
 | 
					                dz.emit('complete', this);
 | 
				
			||||||
 | 
					                dz.files.push(this);
 | 
				
			||||||
 | 
					                fileUuidDict[this.uuid] = {submitted: true};
 | 
				
			||||||
 | 
					                $dropzone.find(`img[src='${imgSrc}']`).css('max-width', '100%');
 | 
				
			||||||
 | 
					                const input = $(`<input id="${this.uuid}" name="files" type="hidden">`).val(this.uuid);
 | 
				
			||||||
 | 
					                $dropzone.find('.files').append(input);
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      dz.emit('reload');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // Give new write/preview data-tab name to distinguish from others
 | 
				
			||||||
 | 
					    const $editContentForm = $editContentZone.find('.ui.comment.form');
 | 
				
			||||||
 | 
					    const $tabMenu = $editContentForm.find('.tabular.menu');
 | 
				
			||||||
 | 
					    $tabMenu.attr('data-write', $editContentZone.data('write'));
 | 
				
			||||||
 | 
					    $tabMenu.attr('data-preview', $editContentZone.data('preview'));
 | 
				
			||||||
 | 
					    $tabMenu.find('.write.item').attr('data-tab', $editContentZone.data('write'));
 | 
				
			||||||
 | 
					    $tabMenu.find('.preview.item').attr('data-tab', $editContentZone.data('preview'));
 | 
				
			||||||
 | 
					    $editContentForm.find('.write').attr('data-tab', $editContentZone.data('write'));
 | 
				
			||||||
 | 
					    $editContentForm.find('.preview').attr('data-tab', $editContentZone.data('preview'));
 | 
				
			||||||
 | 
					    $simplemde = createCommentSimpleMDE($textarea);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    initCompMarkupContentPreviewTab($editContentForm);
 | 
				
			||||||
 | 
					    if ($dropzone.length === 1) {
 | 
				
			||||||
 | 
					      initSimpleMDEImagePaste($simplemde, $dropzone[0], $dropzone.find('.files'));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $editContentZone.find('.cancel.button').on('click', () => {
 | 
				
			||||||
 | 
					      $renderContent.show();
 | 
				
			||||||
 | 
					      $editContentZone.hide();
 | 
				
			||||||
 | 
					      if (dz) {
 | 
				
			||||||
 | 
					        dz.emit('reload');
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    $editContentZone.find('.save.button').on('click', () => {
 | 
				
			||||||
 | 
					      $renderContent.show();
 | 
				
			||||||
 | 
					      $editContentZone.hide();
 | 
				
			||||||
 | 
					      const $attachments = $dropzone.find('.files').find('[name=files]').map(function () {
 | 
				
			||||||
 | 
					        return $(this).val();
 | 
				
			||||||
 | 
					      }).get();
 | 
				
			||||||
 | 
					      $.post($editContentZone.data('update-url'), {
 | 
				
			||||||
 | 
					        _csrf: csrfToken,
 | 
				
			||||||
 | 
					        content: $textarea.val(),
 | 
				
			||||||
 | 
					        context: $editContentZone.data('context'),
 | 
				
			||||||
 | 
					        files: $attachments,
 | 
				
			||||||
 | 
					      }, (data) => {
 | 
				
			||||||
 | 
					        if (data.length === 0 || data.content.length === 0) {
 | 
				
			||||||
 | 
					          $renderContent.html($('#no-content').html());
 | 
				
			||||||
 | 
					          $rawContent.text('');
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          $renderContent.html(data.content);
 | 
				
			||||||
 | 
					          $rawContent.text($textarea.val());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        const $content = $segment;
 | 
				
			||||||
 | 
					        if (!$content.find('.dropzone-attachments').length) {
 | 
				
			||||||
 | 
					          if (data.attachments !== '') {
 | 
				
			||||||
 | 
					            $content.append(`<div class="dropzone-attachments"></div>`);
 | 
				
			||||||
 | 
					            $content.find('.dropzone-attachments').replaceWith(data.attachments);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } else if (data.attachments === '') {
 | 
				
			||||||
 | 
					          $content.find('.dropzone-attachments').remove();
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          $content.find('.dropzone-attachments').replaceWith(data.attachments);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (dz) {
 | 
				
			||||||
 | 
					          dz.emit('submit');
 | 
				
			||||||
 | 
					          dz.emit('reload');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        initMarkupContent();
 | 
				
			||||||
 | 
					        initCommentContent();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    $textarea = $segment.find('textarea');
 | 
				
			||||||
 | 
					    $simplemde = $textarea.data('simplemde');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Show write/preview tab and copy raw content as needed
 | 
				
			||||||
 | 
					  $editContentZone.show();
 | 
				
			||||||
 | 
					  $renderContent.hide();
 | 
				
			||||||
 | 
					  if ($textarea.val().length === 0) {
 | 
				
			||||||
 | 
					    $textarea.val($rawContent.text());
 | 
				
			||||||
 | 
					    $simplemde.value($rawContent.text());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  requestAnimationFrame(() => {
 | 
				
			||||||
 | 
					    $textarea.focus();
 | 
				
			||||||
 | 
					    $simplemde.codemirror.focus();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function initRepository() {
 | 
					export function initRepository() {
 | 
				
			||||||
  if ($('.repository').length === 0) {
 | 
					  if ($('.repository').length === 0) {
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
| 
						 | 
					@ -333,186 +485,29 @@ export function initRepository() {
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Compare or pull request
 | 
				
			||||||
 | 
					  const $repoDiff = $('.repository.diff');
 | 
				
			||||||
 | 
					  if ($repoDiff.length) {
 | 
				
			||||||
 | 
					    initRepoCommonBranchOrTagDropdown('.choose.branch .dropdown');
 | 
				
			||||||
 | 
					    initRepoCommonFilterSearchDropdown('.choose.branch .dropdown');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  initRepoClone();
 | 
				
			||||||
 | 
					  initRepoCommonLanguageStats();
 | 
				
			||||||
 | 
					  initRepoSettingBranches();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Issues
 | 
					  // Issues
 | 
				
			||||||
  if ($('.repository.view.issue').length > 0) {
 | 
					  if ($('.repository.view.issue').length > 0) {
 | 
				
			||||||
 | 
					    initRepoIssueCommentEdit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    initRepoIssueBranchSelect();
 | 
					    initRepoIssueBranchSelect();
 | 
				
			||||||
    initRepoIssueTitleEdit();
 | 
					    initRepoIssueTitleEdit();
 | 
				
			||||||
    initRepoIssueWipToggle();
 | 
					    initRepoIssueWipToggle();
 | 
				
			||||||
    initRepoIssueComments();
 | 
					    initRepoIssueComments();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Issue/PR Context Menus
 | 
					 | 
				
			||||||
    $('.context-dropdown').dropdown({
 | 
					 | 
				
			||||||
      action: 'hide',
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    initRepoDiffConversationNav();
 | 
					    initRepoDiffConversationNav();
 | 
				
			||||||
    initRepoIssueQuoteReply();
 | 
					 | 
				
			||||||
    initRepoIssueReferenceIssue();
 | 
					    initRepoIssueReferenceIssue();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Edit issue or comment content
 | 
					 | 
				
			||||||
    $(document).on('click', '.edit-content', async function (event) {
 | 
					 | 
				
			||||||
      event.preventDefault();
 | 
					 | 
				
			||||||
      $(this).closest('.dropdown').find('.menu').toggle('visible');
 | 
					 | 
				
			||||||
      const $segment = $(this).closest('.header').next();
 | 
					 | 
				
			||||||
      const $editContentZone = $segment.find('.edit-content-zone');
 | 
					 | 
				
			||||||
      const $renderContent = $segment.find('.render-content');
 | 
					 | 
				
			||||||
      const $rawContent = $segment.find('.raw-content');
 | 
					 | 
				
			||||||
      let $textarea;
 | 
					 | 
				
			||||||
      let $simplemde;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Setup new form
 | 
					 | 
				
			||||||
      if ($editContentZone.html().length === 0) {
 | 
					 | 
				
			||||||
        $editContentZone.html($('#edit-content-form').html());
 | 
					 | 
				
			||||||
        $textarea = $editContentZone.find('textarea');
 | 
					 | 
				
			||||||
        await attachTribute($textarea.get(), {mentions: true, emoji: true});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let dz;
 | 
					 | 
				
			||||||
        const $dropzone = $editContentZone.find('.dropzone');
 | 
					 | 
				
			||||||
        if ($dropzone.length === 1) {
 | 
					 | 
				
			||||||
          $dropzone.data('saved', false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          const fileUuidDict = {};
 | 
					 | 
				
			||||||
          dz = await createDropzone($dropzone[0], {
 | 
					 | 
				
			||||||
            url: $dropzone.data('upload-url'),
 | 
					 | 
				
			||||||
            headers: {'X-Csrf-Token': csrfToken},
 | 
					 | 
				
			||||||
            maxFiles: $dropzone.data('max-file'),
 | 
					 | 
				
			||||||
            maxFilesize: $dropzone.data('max-size'),
 | 
					 | 
				
			||||||
            acceptedFiles: (['*/*', ''].includes($dropzone.data('accepts'))) ? null : $dropzone.data('accepts'),
 | 
					 | 
				
			||||||
            addRemoveLinks: true,
 | 
					 | 
				
			||||||
            dictDefaultMessage: $dropzone.data('default-message'),
 | 
					 | 
				
			||||||
            dictInvalidFileType: $dropzone.data('invalid-input-type'),
 | 
					 | 
				
			||||||
            dictFileTooBig: $dropzone.data('file-too-big'),
 | 
					 | 
				
			||||||
            dictRemoveFile: $dropzone.data('remove-file'),
 | 
					 | 
				
			||||||
            timeout: 0,
 | 
					 | 
				
			||||||
            thumbnailMethod: 'contain',
 | 
					 | 
				
			||||||
            thumbnailWidth: 480,
 | 
					 | 
				
			||||||
            thumbnailHeight: 480,
 | 
					 | 
				
			||||||
            init() {
 | 
					 | 
				
			||||||
              this.on('success', (file, data) => {
 | 
					 | 
				
			||||||
                fileUuidDict[file.uuid] = {
 | 
					 | 
				
			||||||
                  submitted: false,
 | 
					 | 
				
			||||||
                };
 | 
					 | 
				
			||||||
                const input = $(`<input id="${data.uuid}" name="files" type="hidden">`).val(data.uuid);
 | 
					 | 
				
			||||||
                $dropzone.find('.files').append(input);
 | 
					 | 
				
			||||||
              });
 | 
					 | 
				
			||||||
              this.on('removedfile', (file) => {
 | 
					 | 
				
			||||||
                $(`#${file.uuid}`).remove();
 | 
					 | 
				
			||||||
                if ($dropzone.data('remove-url') && !fileUuidDict[file.uuid].submitted) {
 | 
					 | 
				
			||||||
                  $.post($dropzone.data('remove-url'), {
 | 
					 | 
				
			||||||
                    file: file.uuid,
 | 
					 | 
				
			||||||
                    _csrf: csrfToken,
 | 
					 | 
				
			||||||
                  });
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
              });
 | 
					 | 
				
			||||||
              this.on('submit', () => {
 | 
					 | 
				
			||||||
                $.each(fileUuidDict, (fileUuid) => {
 | 
					 | 
				
			||||||
                  fileUuidDict[fileUuid].submitted = true;
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
              });
 | 
					 | 
				
			||||||
              this.on('reload', () => {
 | 
					 | 
				
			||||||
                $.getJSON($editContentZone.data('attachment-url'), (data) => {
 | 
					 | 
				
			||||||
                  dz.removeAllFiles(true);
 | 
					 | 
				
			||||||
                  $dropzone.find('.files').empty();
 | 
					 | 
				
			||||||
                  $.each(data, function () {
 | 
					 | 
				
			||||||
                    const imgSrc = `${$dropzone.data('link-url')}/${this.uuid}`;
 | 
					 | 
				
			||||||
                    dz.emit('addedfile', this);
 | 
					 | 
				
			||||||
                    dz.emit('thumbnail', this, imgSrc);
 | 
					 | 
				
			||||||
                    dz.emit('complete', this);
 | 
					 | 
				
			||||||
                    dz.files.push(this);
 | 
					 | 
				
			||||||
                    fileUuidDict[this.uuid] = {
 | 
					 | 
				
			||||||
                      submitted: true,
 | 
					 | 
				
			||||||
                    };
 | 
					 | 
				
			||||||
                    $dropzone.find(`img[src='${imgSrc}']`).css('max-width', '100%');
 | 
					 | 
				
			||||||
                    const input = $(`<input id="${this.uuid}" name="files" type="hidden">`).val(this.uuid);
 | 
					 | 
				
			||||||
                    $dropzone.find('.files').append(input);
 | 
					 | 
				
			||||||
                  });
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
              });
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          });
 | 
					 | 
				
			||||||
          dz.emit('reload');
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // Give new write/preview data-tab name to distinguish from others
 | 
					 | 
				
			||||||
        const $editContentForm = $editContentZone.find('.ui.comment.form');
 | 
					 | 
				
			||||||
        const $tabMenu = $editContentForm.find('.tabular.menu');
 | 
					 | 
				
			||||||
        $tabMenu.attr('data-write', $editContentZone.data('write'));
 | 
					 | 
				
			||||||
        $tabMenu.attr('data-preview', $editContentZone.data('preview'));
 | 
					 | 
				
			||||||
        $tabMenu.find('.write.item').attr('data-tab', $editContentZone.data('write'));
 | 
					 | 
				
			||||||
        $tabMenu.find('.preview.item').attr('data-tab', $editContentZone.data('preview'));
 | 
					 | 
				
			||||||
        $editContentForm.find('.write').attr('data-tab', $editContentZone.data('write'));
 | 
					 | 
				
			||||||
        $editContentForm.find('.preview').attr('data-tab', $editContentZone.data('preview'));
 | 
					 | 
				
			||||||
        $simplemde = createCommentSimpleMDE($textarea);
 | 
					 | 
				
			||||||
        commentMDEditors[$editContentZone.data('write')] = $simplemde;
 | 
					 | 
				
			||||||
        initCompMarkupContentPreviewTab($editContentForm);
 | 
					 | 
				
			||||||
        if ($dropzone.length === 1) {
 | 
					 | 
				
			||||||
          initSimpleMDEImagePaste($simplemde, $dropzone[0], $dropzone.find('.files'));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $editContentZone.find('.cancel.button').on('click', () => {
 | 
					 | 
				
			||||||
          $renderContent.show();
 | 
					 | 
				
			||||||
          $editContentZone.hide();
 | 
					 | 
				
			||||||
          if (dz) {
 | 
					 | 
				
			||||||
            dz.emit('reload');
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        $editContentZone.find('.save.button').on('click', () => {
 | 
					 | 
				
			||||||
          $renderContent.show();
 | 
					 | 
				
			||||||
          $editContentZone.hide();
 | 
					 | 
				
			||||||
          const $attachments = $dropzone.find('.files').find('[name=files]').map(function () {
 | 
					 | 
				
			||||||
            return $(this).val();
 | 
					 | 
				
			||||||
          }).get();
 | 
					 | 
				
			||||||
          $.post($editContentZone.data('update-url'), {
 | 
					 | 
				
			||||||
            _csrf: csrfToken,
 | 
					 | 
				
			||||||
            content: $textarea.val(),
 | 
					 | 
				
			||||||
            context: $editContentZone.data('context'),
 | 
					 | 
				
			||||||
            files: $attachments,
 | 
					 | 
				
			||||||
          }, (data) => {
 | 
					 | 
				
			||||||
            if (data.length === 0 || data.content.length === 0) {
 | 
					 | 
				
			||||||
              $renderContent.html($('#no-content').html());
 | 
					 | 
				
			||||||
              $rawContent.text('');
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
              $renderContent.html(data.content);
 | 
					 | 
				
			||||||
              $rawContent.text($textarea.val());
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            const $content = $segment;
 | 
					 | 
				
			||||||
            if (!$content.find('.dropzone-attachments').length) {
 | 
					 | 
				
			||||||
              if (data.attachments !== '') {
 | 
					 | 
				
			||||||
                $content.append(`
 | 
					 | 
				
			||||||
                  <div class="dropzone-attachments">
 | 
					 | 
				
			||||||
                  </div>
 | 
					 | 
				
			||||||
                `);
 | 
					 | 
				
			||||||
                $content.find('.dropzone-attachments').replaceWith(data.attachments);
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            } else if (data.attachments === '') {
 | 
					 | 
				
			||||||
              $content.find('.dropzone-attachments').remove();
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
              $content.find('.dropzone-attachments').replaceWith(data.attachments);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            if (dz) {
 | 
					 | 
				
			||||||
              dz.emit('submit');
 | 
					 | 
				
			||||||
              dz.emit('reload');
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            initMarkupContent();
 | 
					 | 
				
			||||||
            initCommentContent();
 | 
					 | 
				
			||||||
          });
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        $textarea = $segment.find('textarea');
 | 
					 | 
				
			||||||
        $simplemde = commentMDEditors[$editContentZone.data('write')];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Show write/preview tab and copy raw content as needed
 | 
					 | 
				
			||||||
      $editContentZone.show();
 | 
					 | 
				
			||||||
      $renderContent.hide();
 | 
					 | 
				
			||||||
      if ($textarea.val().length === 0) {
 | 
					 | 
				
			||||||
        $textarea.val($rawContent.text());
 | 
					 | 
				
			||||||
        $simplemde.value($rawContent.text());
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      requestAnimationFrame(() => {
 | 
					 | 
				
			||||||
        $textarea.focus();
 | 
					 | 
				
			||||||
        $simplemde.codemirror.focus();
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    initRepoIssueCommentDelete();
 | 
					    initRepoIssueCommentDelete();
 | 
				
			||||||
    initRepoIssueDependencyDelete();
 | 
					    initRepoIssueDependencyDelete();
 | 
				
			||||||
| 
						 | 
					@ -523,55 +518,55 @@ export function initRepository() {
 | 
				
			||||||
    initCompReactionSelector();
 | 
					    initCompReactionSelector();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  initRepoClone();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Compare or pull request
 | 
					 | 
				
			||||||
  const $repoDiff = $('.repository.diff');
 | 
					 | 
				
			||||||
  if ($repoDiff.length) {
 | 
					 | 
				
			||||||
    initRepoCommonBranchOrTagDropdown('.choose.branch .dropdown');
 | 
					 | 
				
			||||||
    initRepoCommonFilterSearchDropdown('.choose.branch .dropdown');
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Pull request
 | 
					  // Pull request
 | 
				
			||||||
  const $repoComparePull = $('.repository.compare.pull');
 | 
					  const $repoComparePull = $('.repository.compare.pull');
 | 
				
			||||||
  if ($repoComparePull.length > 0) {
 | 
					  if ($repoComparePull.length > 0) {
 | 
				
			||||||
    // show pull request form
 | 
					    // show pull request form
 | 
				
			||||||
    $repoComparePull.find('button.show-form').on('click', function (e) {
 | 
					    $repoComparePull.find('button.show-form').on('click', function (e) {
 | 
				
			||||||
      e.preventDefault();
 | 
					      e.preventDefault();
 | 
				
			||||||
      $repoComparePull.find('.pullrequest-form').show();
 | 
					 | 
				
			||||||
      autoSimpleMDE.codemirror.refresh();
 | 
					 | 
				
			||||||
      $(this).parent().hide();
 | 
					      $(this).parent().hide();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const $form = $repoComparePull.find('.pullrequest-form');
 | 
				
			||||||
 | 
					      const $simplemde = $form.find('textarea.edit_area').data('simplemde');
 | 
				
			||||||
 | 
					      $form.show();
 | 
				
			||||||
 | 
					      $simplemde.codemirror.refresh();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  initRepoSettingBranches();
 | 
					 | 
				
			||||||
  initRepoCommonLanguageStats();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function initRepoIssueQuoteReply() {
 | 
					function initRepoIssueCommentEdit() {
 | 
				
			||||||
 | 
					  // Issue/PR Context Menus
 | 
				
			||||||
 | 
					  $('.comment-header-right .context-dropdown').dropdown({action: 'hide'});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Edit issue or comment content
 | 
				
			||||||
 | 
					  $(document).on('click', '.edit-content', onEditContent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Quote reply
 | 
					  // Quote reply
 | 
				
			||||||
  $(document).on('click', '.quote-reply', function (event) {
 | 
					  $(document).on('click', '.quote-reply', function (event) {
 | 
				
			||||||
    $(this).closest('.dropdown').find('.menu').toggle('visible');
 | 
					    $(this).closest('.dropdown').find('.menu').toggle('visible');
 | 
				
			||||||
    const target = $(this).data('target');
 | 
					    const target = $(this).data('target');
 | 
				
			||||||
    const quote = $(`#comment-${target}`).text().replace(/\n/g, '\n> ');
 | 
					    const quote = $(`#comment-${target}`).text().replace(/\n/g, '\n> ');
 | 
				
			||||||
    const content = `> ${quote}\n\n`;
 | 
					    const content = `> ${quote}\n\n`;
 | 
				
			||||||
    let $simplemde = autoSimpleMDE;
 | 
					    let $simplemde;
 | 
				
			||||||
    if ($(this).hasClass('quote-reply-diff')) {
 | 
					    if ($(this).hasClass('quote-reply-diff')) {
 | 
				
			||||||
      const $parent = $(this).closest('.comment-code-cloud');
 | 
					      const $parent = $(this).closest('.comment-code-cloud');
 | 
				
			||||||
      $parent.find('button.comment-form-reply').trigger('click');
 | 
					      $parent.find('button.comment-form-reply').trigger('click');
 | 
				
			||||||
      $simplemde = $parent.find('[name="content"]').data('simplemde');
 | 
					      $simplemde = $parent.find('[name="content"]').data('simplemde');
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      // for normal issue/comment page
 | 
				
			||||||
 | 
					      $simplemde = $('#comment-form .edit_area').data('simplemde');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if ($simplemde !== null) {
 | 
					    if ($simplemde) {
 | 
				
			||||||
      if ($simplemde.value() !== '') {
 | 
					      if ($simplemde.value() !== '') {
 | 
				
			||||||
        $simplemde.value(`${$simplemde.value()}\n\n${content}`);
 | 
					        $simplemde.value(`${$simplemde.value()}\n\n${content}`);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        $simplemde.value(`${content}`);
 | 
					        $simplemde.value(`${content}`);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
      requestAnimationFrame(() => {
 | 
					      requestAnimationFrame(() => {
 | 
				
			||||||
        $simplemde.codemirror.focus();
 | 
					        $simplemde.codemirror.focus();
 | 
				
			||||||
        $simplemde.codemirror.setCursor($simplemde.codemirror.lineCount(), 0);
 | 
					        $simplemde.codemirror.setCursor($simplemde.codemirror.lineCount(), 0);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    event.preventDefault();
 | 
					    event.preventDefault();
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,13 @@
 | 
				
			||||||
const {csrfToken} = window.config;
 | 
					const {csrfToken} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function initRepoProjectSortable() {
 | 
					async function initRepoProjectSortable() {
 | 
				
			||||||
 | 
					  const els = document.getElementsByClassName('board');
 | 
				
			||||||
 | 
					  if (!els.length) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const {Sortable} = await import(/* webpackChunkName: "sortable" */'sortablejs');
 | 
					  const {Sortable} = await import(/* webpackChunkName: "sortable" */'sortablejs');
 | 
				
			||||||
  const boardColumns = document.getElementsByClassName('board-column');
 | 
					  const boardColumns = document.getElementsByClassName('board-column');
 | 
				
			||||||
 | 
					 | 
				
			||||||
  new Sortable(
 | 
					  new Sortable(
 | 
				
			||||||
    document.getElementsByClassName('board')[0],
 | 
					    els[0],
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      group: 'board-column',
 | 
					      group: 'board-column',
 | 
				
			||||||
      draggable: '.board-column',
 | 
					      draggable: '.board-column',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue