]> source.dussan.org Git - gitea.git/commitdiff
Refactor issue page info (#32445)
authorwxiaoguang <wxiaoguang@gmail.com>
Fri, 8 Nov 2024 02:21:13 +0000 (10:21 +0800)
committerGitHub <noreply@github.com>
Fri, 8 Nov 2024 02:21:13 +0000 (02:21 +0000)
Fix a longstanding TODO since 2021 (#14826) / 2018 (#2531)

routers/web/repo/issue.go
templates/repo/issue/view_content.tmpl
templates/repo/issue/view_title.tmpl
templates/repo/pulls/files.tmpl
web_src/js/features/repo-issue-content.ts
web_src/js/features/repo-issue.ts
web_src/js/types.ts
web_src/js/utils.ts

index 1ee6e98afbd3d3152eaf7f412e6f8e92bf6d6d79..c4fc5354469df2251c47fb75cd99822c1372e22e 100644 (file)
@@ -1443,11 +1443,11 @@ func ViewIssue(ctx *context.Context) {
        }
 
        if issue.IsPull && !ctx.Repo.CanRead(unit.TypeIssues) {
-               ctx.Data["IssueType"] = "pulls"
+               ctx.Data["IssueDependencySearchType"] = "pulls"
        } else if !issue.IsPull && !ctx.Repo.CanRead(unit.TypePullRequests) {
-               ctx.Data["IssueType"] = "issues"
+               ctx.Data["IssueDependencySearchType"] = "issues"
        } else {
-               ctx.Data["IssueType"] = "all"
+               ctx.Data["IssueDependencySearchType"] = "all"
        }
 
        ctx.Data["IsProjectsEnabled"] = ctx.Repo.CanRead(unit.TypeProjects)
index 1f9bbd86aa4e46c98c1faf863d639c2aeb3fd949..3f7b2dc78f65bece7e013e1ef25d12a41702cee5 100644 (file)
@@ -1,11 +1,4 @@
 <div class="issue-content">
-       <!-- I know, there is probably a better way to do this (moved from sidebar.tmpl, original author: 6543 @ 2021-02-28) -->
-       <!-- Agree, there should be a better way, eg: introduce window.config.pageData (original author: wxiaoguang @ 2021-09-05) -->
-       <input type="hidden" id="repolink" value="{{$.RepoRelPath}}">
-       <input type="hidden" id="repoId" value="{{.Repository.ID}}">
-       <input type="hidden" id="issueIndex" value="{{.Issue.Index}}">
-       <input type="hidden" id="type" value="{{.IssueType}}">
-
        {{$createdStr:= DateUtils.TimeSince .Issue.CreatedUnix}}
        <div class="issue-content-left comment-list prevent-before-timeline">
                <div class="ui timeline">
index 0f796ce9bf754b1db192a05efcb180745004794d..26b36d6ffcf811b673c3182562694d37a0c7ab37 100644 (file)
@@ -3,6 +3,12 @@
                {{template "base/alert" .}}
        </div>
 {{end}}
+<div class="tw-hidden" id="issue-page-info"
+       data-issue-index="{{$.Issue.Index}}"
+       data-issue-dependency-search-type="{{$.IssueDependencySearchType}}"
+       data-issue-repo-link="{{$.RepoLink}}"
+       data-issue-repo-id="{{$.Repository.ID}}"
+></div>
 <div class="issue-title-header">
        {{$canEditIssueTitle := and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .Repository.IsArchived)}}
        <div class="issue-title" id="issue-title-display">
index 402bec800b2587f546f840042c8e4f53581a3f7a..e7baa484a1847780105983ef0cf2f2f51a890c51 100644 (file)
@@ -1,8 +1,4 @@
 {{template "base/head" .}}
-
-<input type="hidden" id="repolink" value="{{$.RepoRelPath}}">
-<input type="hidden" id="issueIndex" value="{{.Issue.Index}}">
-
 <div role="main" aria-label="{{.Title}}" class="page-content repository view issue pull files diff">
        {{template "repo/header" .}}
        <div class="ui container fluid padded">
index 7aaf9765eeccb384a841324bea2b5f54ca79419c..88672cc255340e7eb022bed4625551d6834b458a 100644 (file)
@@ -3,8 +3,8 @@ import {svg} from '../svg.ts';
 import {showErrorToast} from '../modules/toast.ts';
 import {GET, POST} from '../modules/fetch.ts';
 import {showElem} from '../utils/dom.ts';
+import {parseIssuePageInfo} from '../utils.ts';
 
-const {appSubUrl} = window.config;
 let i18nTextEdited;
 let i18nTextOptions;
 let i18nTextDeleteFromHistory;
@@ -121,15 +121,14 @@ function showContentHistoryMenu(issueBaseUrl, $item, commentId) {
 }
 
 export async function initRepoIssueContentHistory() {
-  const issueIndex = $('#issueIndex').val();
-  if (!issueIndex) return;
+  const issuePageInfo = parseIssuePageInfo();
+  if (!issuePageInfo.issueNumber) return;
 
   const $itemIssue = $('.repository.issue .timeline-item.comment.first'); // issue(PR) main content
   const $comments = $('.repository.issue .comment-list .comment'); // includes: issue(PR) comments, review comments, code comments
   if (!$itemIssue.length && !$comments.length) return;
 
-  const repoLink = $('#repolink').val();
-  const issueBaseUrl = `${appSubUrl}/${repoLink}/issues/${issueIndex}`;
+  const issueBaseUrl = `${issuePageInfo.repoLink}/issues/${issuePageInfo.issueNumber}`;
 
   try {
     const response = await GET(`${issueBaseUrl}/content-history/overview`);
index 392af776f8804e103903dc055d63eecb73740254..721a746aa2c4d713dd9e2f7c63b3af656cbcc949 100644 (file)
@@ -4,7 +4,7 @@ import {createTippy, showTemporaryTooltip} from '../modules/tippy.ts';
 import {hideElem, showElem, toggleElem} from '../utils/dom.ts';
 import {setFileFolding} from './file-fold.ts';
 import {ComboMarkdownEditor, getComboMarkdownEditor, initComboMarkdownEditor} from './comp/ComboMarkdownEditor.ts';
-import {toAbsoluteUrl} from '../utils.ts';
+import {parseIssuePageInfo, toAbsoluteUrl} from '../utils.ts';
 import {GET, POST} from '../modules/fetch.ts';
 import {showErrorToast} from '../modules/toast.ts';
 import {initRepoIssueSidebar} from './repo-issue-sidebar.ts';
@@ -57,13 +57,11 @@ function excludeLabel(item) {
 }
 
 export function initRepoIssueSidebarList() {
-  const repolink = $('#repolink').val();
-  const repoId = $('#repoId').val();
+  const issuePageInfo = parseIssuePageInfo();
   const crossRepoSearch = $('#crossRepoSearch').val();
-  const tp = $('#type').val();
-  let issueSearchUrl = `${appSubUrl}/${repolink}/issues/search?q={query}&type=${tp}`;
+  let issueSearchUrl = `${issuePageInfo.repoLink}/issues/search?q={query}&type=${issuePageInfo.issueDependencySearchType}`;
   if (crossRepoSearch === 'true') {
-    issueSearchUrl = `${appSubUrl}/issues/search?q={query}&priority_repo_id=${repoId}&type=${tp}`;
+    issueSearchUrl = `${appSubUrl}/issues/search?q={query}&priority_repo_id=${issuePageInfo.repoId}&type=${issuePageInfo.issueDependencySearchType}`;
   }
   $('#new-dependency-drop-list')
     .dropdown({
index 9c601456bd9f169160ed87fb3f8aba1b89300738..f5c4a40bcac9549da88785cf5d6144d0f3b62726 100644 (file)
@@ -37,6 +37,13 @@ export type IssuePathInfo = {
   indexString?: string,
 }
 
+export type IssuePageInfo = {
+  repoLink: string,
+  repoId: number,
+  issueNumber: number,
+  issueDependencySearchType: string,
+}
+
 export type Issue = {
   id: number;
   number: number;
index 066a7c7b5460e8b376baa0ce1a2e6fe53a93969a..4fed74e20f02e75394404039e8a63f49475db305 100644 (file)
@@ -1,5 +1,5 @@
-import {encode, decode} from 'uint8-to-base64';
-import type {IssuePathInfo} from './types.ts';
+import {decode, encode} from 'uint8-to-base64';
+import type {IssuePageInfo, IssuePathInfo} from './types.ts';
 
 // transform /path/to/file.ext to file.ext
 export function basename(path: string): string {
@@ -43,6 +43,16 @@ export function parseIssueNewHref(href: string): IssuePathInfo {
   return {ownerName, repoName, pathType, indexString};
 }
 
+export function parseIssuePageInfo(): IssuePageInfo {
+  const el = document.querySelector('#issue-page-info');
+  return {
+    issueNumber: parseInt(el?.getAttribute('data-issue-index')),
+    issueDependencySearchType: el?.getAttribute('data-issue-dependency-search-type') || '',
+    repoId: parseInt(el?.getAttribute('data-issue-repo-id')),
+    repoLink: el?.getAttribute('data-issue-repo-link') || '',
+  };
+}
+
 // parse a URL, either relative '/path' or absolute 'https://localhost/path'
 export function parseUrl(str: string): URL {
   return new URL(str, str.startsWith('http') ? undefined : window.location.origin);