gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {hideElem, querySingleVisibleElem, showElem, toggleElem} from '../utils/dom.ts';
  2. import {htmlEscape} from '../utils/html.ts';
  3. import {fomanticQuery} from '../modules/fomantic/base.ts';
  4. import {sanitizeRepoName} from './repo-common.ts';
  5. const {appSubUrl} = window.config;
  6. function initRepoNewTemplateSearch(form: HTMLFormElement) {
  7. const elSubmitButton = querySingleVisibleElem<HTMLInputElement>(form, '.ui.primary.button');
  8. const elCreateRepoErrorMessage = form.querySelector('#create-repo-error-message');
  9. const elRepoOwnerDropdown = form.querySelector('#repo_owner_dropdown');
  10. const elRepoTemplateDropdown = form.querySelector<HTMLInputElement>('#repo_template_search');
  11. const inputRepoTemplate = form.querySelector<HTMLInputElement>('#repo_template');
  12. const elTemplateUnits = form.querySelector('#template_units');
  13. const elNonTemplate = form.querySelector('#non_template');
  14. const checkTemplate = function () {
  15. const hasSelectedTemplate = inputRepoTemplate.value !== '' && inputRepoTemplate.value !== '0';
  16. toggleElem(elTemplateUnits, hasSelectedTemplate);
  17. toggleElem(elNonTemplate, !hasSelectedTemplate);
  18. };
  19. inputRepoTemplate.addEventListener('change', checkTemplate);
  20. checkTemplate();
  21. const $repoOwnerDropdown = fomanticQuery(elRepoOwnerDropdown);
  22. const $repoTemplateDropdown = fomanticQuery(elRepoTemplateDropdown);
  23. const onChangeOwner = function () {
  24. const ownerId = $repoOwnerDropdown.dropdown('get value');
  25. const $ownerItem = $repoOwnerDropdown.dropdown('get item', ownerId);
  26. hideElem(elCreateRepoErrorMessage);
  27. elSubmitButton.disabled = false;
  28. if ($ownerItem?.length) {
  29. const elOwnerItem = $ownerItem[0];
  30. elCreateRepoErrorMessage.textContent = elOwnerItem.getAttribute('data-create-repo-disallowed-prompt') ?? '';
  31. const hasError = Boolean(elCreateRepoErrorMessage.textContent);
  32. toggleElem(elCreateRepoErrorMessage, hasError);
  33. elSubmitButton.disabled = hasError;
  34. }
  35. $repoTemplateDropdown.dropdown('setting', {
  36. apiSettings: {
  37. url: `${appSubUrl}/repo/search?q={query}&template=true&priority_owner_id=${ownerId}`,
  38. onResponse(response: any) {
  39. const results = [];
  40. results.push({name: '', value: ''}); // empty item means not using template
  41. for (const tmplRepo of response.data) {
  42. results.push({
  43. name: htmlEscape(tmplRepo.repository.full_name),
  44. value: String(tmplRepo.repository.id),
  45. });
  46. }
  47. $repoTemplateDropdown.fomanticExt.onResponseKeepSelectedItem($repoTemplateDropdown, inputRepoTemplate.value);
  48. return {results};
  49. },
  50. cache: false,
  51. },
  52. });
  53. };
  54. $repoOwnerDropdown.dropdown('setting', 'onChange', onChangeOwner);
  55. onChangeOwner();
  56. }
  57. export function initRepoNew() {
  58. const pageContent = document.querySelector('.page-content.repository.new-repo');
  59. if (!pageContent) return;
  60. const form = document.querySelector<HTMLFormElement>('.new-repo-form');
  61. const inputGitIgnores = form.querySelector<HTMLInputElement>('input[name="gitignores"]');
  62. const inputLicense = form.querySelector<HTMLInputElement>('input[name="license"]');
  63. const inputAutoInit = form.querySelector<HTMLInputElement>('input[name="auto_init"]');
  64. const updateUiAutoInit = () => {
  65. inputAutoInit.checked = Boolean(inputGitIgnores.value || inputLicense.value);
  66. };
  67. inputGitIgnores.addEventListener('change', updateUiAutoInit);
  68. inputLicense.addEventListener('change', updateUiAutoInit);
  69. updateUiAutoInit();
  70. const inputRepoName = form.querySelector<HTMLInputElement>('input[name="repo_name"]');
  71. const inputPrivate = form.querySelector<HTMLInputElement>('input[name="private"]');
  72. const updateUiRepoName = () => {
  73. const helps = form.querySelectorAll(`.help[data-help-for-repo-name]`);
  74. hideElem(helps);
  75. let help = form.querySelector(`.help[data-help-for-repo-name="${CSS.escape(inputRepoName.value)}"]`);
  76. if (!help) help = form.querySelector(`.help[data-help-for-repo-name=""]`);
  77. showElem(help);
  78. const repoNamePreferPrivate: Record<string, boolean> = {'.profile': false, '.profile-private': true};
  79. const preferPrivate = repoNamePreferPrivate[inputRepoName.value];
  80. // inputPrivate might be disabled because site admin "force private"
  81. if (preferPrivate !== undefined && !inputPrivate.closest('.disabled, [disabled]')) {
  82. inputPrivate.checked = preferPrivate;
  83. }
  84. };
  85. inputRepoName.addEventListener('input', updateUiRepoName);
  86. inputRepoName.addEventListener('change', () => {
  87. inputRepoName.value = sanitizeRepoName(inputRepoName.value);
  88. updateUiRepoName();
  89. });
  90. updateUiRepoName();
  91. initRepoNewTemplateSearch(form);
  92. }