mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	Improve tags list page (#34898)
This commit is contained in:
		@@ -1,7 +1,7 @@
 | 
			
		||||
import {request} from '../modules/fetch.ts';
 | 
			
		||||
import {hideToastsAll, showErrorToast} from '../modules/toast.ts';
 | 
			
		||||
import {addDelegatedEventListener, submitEventSubmitter} from '../utils/dom.ts';
 | 
			
		||||
import {confirmModal} from './comp/ConfirmModal.ts';
 | 
			
		||||
import {addDelegatedEventListener, createElementFromHTML, submitEventSubmitter} from '../utils/dom.ts';
 | 
			
		||||
import {confirmModal, createConfirmModal} from './comp/ConfirmModal.ts';
 | 
			
		||||
import type {RequestOpts} from '../types.ts';
 | 
			
		||||
import {ignoreAreYouSure} from '../vendor/jquery.are-you-sure.ts';
 | 
			
		||||
 | 
			
		||||
@@ -111,28 +111,44 @@ export async function submitFormFetchAction(formEl: HTMLFormElement, formSubmitt
 | 
			
		||||
async function onLinkActionClick(el: HTMLElement, e: Event) {
 | 
			
		||||
  // A "link-action" can post AJAX request to its "data-url"
 | 
			
		||||
  // Then the browser is redirected to: the "redirect" in response, or "data-redirect" attribute, or current URL by reloading.
 | 
			
		||||
  // If the "link-action" has "data-modal-confirm" attribute, a confirm modal dialog will be shown before taking action.
 | 
			
		||||
  // If the "link-action" has "data-modal-confirm" attribute, a "confirm modal dialog" will be shown before taking action.
 | 
			
		||||
  // Attribute "data-modal-confirm" can be a modal element by "#the-modal-id", or a string content for the modal dialog.
 | 
			
		||||
  e.preventDefault();
 | 
			
		||||
  const url = el.getAttribute('data-url');
 | 
			
		||||
  const doRequest = async () => {
 | 
			
		||||
    if ('disabled' in el) el.disabled = true; // el could be A or BUTTON, but A doesn't have disabled attribute
 | 
			
		||||
    if ('disabled' in el) el.disabled = true; // el could be A or BUTTON, but "A" doesn't have the "disabled" attribute
 | 
			
		||||
    await fetchActionDoRequest(el, url, {method: el.getAttribute('data-link-action-method') || 'POST'});
 | 
			
		||||
    if ('disabled' in el) el.disabled = false;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const modalConfirmContent = el.getAttribute('data-modal-confirm') ||
 | 
			
		||||
    el.getAttribute('data-modal-confirm-content') || '';
 | 
			
		||||
  if (!modalConfirmContent) {
 | 
			
		||||
  let elModal: HTMLElement | null = null;
 | 
			
		||||
  const dataModalConfirm = el.getAttribute('data-modal-confirm') || '';
 | 
			
		||||
  if (dataModalConfirm.startsWith('#')) {
 | 
			
		||||
    // eslint-disable-next-line unicorn/prefer-query-selector
 | 
			
		||||
    elModal = document.getElementById(dataModalConfirm.substring(1));
 | 
			
		||||
    if (elModal) {
 | 
			
		||||
      elModal = createElementFromHTML(elModal.outerHTML);
 | 
			
		||||
      elModal.removeAttribute('id');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (!elModal) {
 | 
			
		||||
    const modalConfirmContent = dataModalConfirm || el.getAttribute('data-modal-confirm-content') || '';
 | 
			
		||||
    if (modalConfirmContent) {
 | 
			
		||||
      const isRisky = el.classList.contains('red') || el.classList.contains('negative');
 | 
			
		||||
      elModal = createConfirmModal({
 | 
			
		||||
        header: el.getAttribute('data-modal-confirm-header') || '',
 | 
			
		||||
        content: modalConfirmContent,
 | 
			
		||||
        confirmButtonColor: isRisky ? 'red' : 'primary',
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!elModal) {
 | 
			
		||||
    await doRequest();
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const isRisky = el.classList.contains('red') || el.classList.contains('negative');
 | 
			
		||||
  if (await confirmModal({
 | 
			
		||||
    header: el.getAttribute('data-modal-confirm-header') || '',
 | 
			
		||||
    content: modalConfirmContent,
 | 
			
		||||
    confirmButtonColor: isRisky ? 'red' : 'primary',
 | 
			
		||||
  })) {
 | 
			
		||||
  if (await confirmModal(elModal)) {
 | 
			
		||||
    await doRequest();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,20 +5,29 @@ import {fomanticQuery} from '../../modules/fomantic/base.ts';
 | 
			
		||||
 | 
			
		||||
const {i18n} = window.config;
 | 
			
		||||
 | 
			
		||||
export function confirmModal({header = '', content = '', confirmButtonColor = 'primary'} = {}): Promise<boolean> {
 | 
			
		||||
type ConfirmModalOptions = {
 | 
			
		||||
  header?: string;
 | 
			
		||||
  content?: string;
 | 
			
		||||
  confirmButtonColor?: 'primary' | 'red' | 'green' | 'blue';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function createConfirmModal({header = '', content = '', confirmButtonColor = 'primary'}:ConfirmModalOptions = {}): HTMLElement {
 | 
			
		||||
  const headerHtml = header ? `<div class="header">${htmlEscape(header)}</div>` : '';
 | 
			
		||||
  return createElementFromHTML(`
 | 
			
		||||
<div class="ui g-modal-confirm modal">
 | 
			
		||||
  ${headerHtml}
 | 
			
		||||
  <div class="content">${htmlEscape(content)}</div>
 | 
			
		||||
  <div class="actions">
 | 
			
		||||
    <button class="ui cancel button">${svg('octicon-x')} ${htmlEscape(i18n.modal_cancel)}</button>
 | 
			
		||||
    <button class="ui ${confirmButtonColor} ok button">${svg('octicon-check')} ${htmlEscape(i18n.modal_confirm)}</button>
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
`);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function confirmModal(modal: HTMLElement | ConfirmModalOptions): Promise<boolean> {
 | 
			
		||||
  if (!(modal instanceof HTMLElement)) modal = createConfirmModal(modal);
 | 
			
		||||
  return new Promise((resolve) => {
 | 
			
		||||
    const headerHtml = header ? `<div class="header">${htmlEscape(header)}</div>` : '';
 | 
			
		||||
    const modal = createElementFromHTML(`
 | 
			
		||||
      <div class="ui g-modal-confirm modal">
 | 
			
		||||
        ${headerHtml}
 | 
			
		||||
        <div class="content">${htmlEscape(content)}</div>
 | 
			
		||||
        <div class="actions">
 | 
			
		||||
          <button class="ui cancel button">${svg('octicon-x')} ${htmlEscape(i18n.modal_cancel)}</button>
 | 
			
		||||
          <button class="ui ${confirmButtonColor} ok button">${svg('octicon-check')} ${htmlEscape(i18n.modal_confirm)}</button>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    `);
 | 
			
		||||
    document.body.append(modal);
 | 
			
		||||
    const $modal = fomanticQuery(modal);
 | 
			
		||||
    $modal.modal({
 | 
			
		||||
      onApprove() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user