Repository: kernelci/dashboard
Pull request #1030: fix: minor details changes
Author: login: murilx
Created: 2025-02-28T18:49:09Z | Merged: 2025-03-06T16:01:14Z

- Remove some duplicate message ids in favor of using the most generic one (e.g. instead of 'buildDetails.compiler' we use 'global.compiler') this includes using 'global.config' instead of 'buildDetails.defconfig' for the config field.
- For fields that are equal in both build details and test details and don't have a global message id, unified the message ids in commonDetails.* (e.g. 'buildDetails.gitCommit' and 'testDetails.gitCommitHash' are not 'commonDetails.gitCommitHash')
- Moved up the files section in build details

Closes #1024

Linked issue #1024: BuildDetails small changes
Change "Defconfig" name to just "config"
Move Misc section to below Artifacts
Linked issue comments: user: login: murilx
created_at: 2025-02-28T15:25:43Z
body: I'd also add:
- When possible, make the field titles consistent between build and test details
- (Maybe, this is not very clear for me yet) move the files section of test details as well
author_association: CONTRIBUTOR

Diff:
diff --git a/dashboard/src/components/BuildDetails/BuildDetails.tsx b/dashboard/src/components/BuildDetails/BuildDetails.tsx
index 9f9a55bfa..4da87320d 100644
--- a/dashboard/src/components/BuildDetails/BuildDetails.tsx
+++ b/dashboard/src/components/BuildDetails/BuildDetails.tsx
@@ -18,7 +18,7 @@ import { formatDate, getBuildStatus, getTitle } from '@/utils/utils';
 
 import IssueSection from '@/components/Issue/IssueSection';
 
-import { shouldTruncate, valueOrEmpty } from '@/lib/string';
+import { shouldTruncate, truncateBigText, valueOrEmpty } from '@/lib/string';
 
 import { Sheet } from '@/components/Sheet';
 
@@ -47,6 +47,9 @@ import PageWithTitle from '@/components/PageWithTitle';
 import { MemoizedBuildDetailsOGTags } from '@/components/OpenGraphTags/BuildDetailsOGTags';
 import ButtonOpenLogSheet from '@/components/Button/ButtonOpenLogSheet';
 
+import MemoizedLinkItem from '@/components/DetailsLink';
+import { LinkIcon } from '@/components/Icons/Link';
+
 import BuildDetailsTestSection from './BuildDetailsTestSection';
 
 interface BuildDetailsProps {
@@ -82,12 +85,35 @@ const BuildDetails = ({
     [navigate],
   );
 
+  const treeDetailsLink = useMemo(
+    () => (
+      <MemoizedLinkItem
+        to="/tree/$treeId"
+        params={{ treeId: data?.git_commit_hash }}
+        state={s => s}
+        search={{
+          treeInfo: {
+            gitBranch: data?.git_repository_branch,
+            gitUrl: data?.git_repository_url,
+            treeName: data?.tree_name,
+            commitName: data?.git_commit_name,
+            headCommitHash: data?.git_commit_hash,
+          },
+        }}
+      >
+        {truncateBigText(data?.git_commit_hash)}
+        <LinkIcon className="text-blue text-xl" />
+      </MemoizedLinkItem>
+    ),
+    [data],
+  );
+
   const miscSection: ISection | undefined = useMemo(():
     | ISection
     | undefined => {
     return getMiscSection({
       misc: data?.misc,
-      title: formatMessage({ id: 'globalDetails.miscData' }),
+      title: formatMessage({ id: 'commonDetails.miscData' }),
       setSheetType: setSheetType,
       setJsonContent: setJsonContent,
     });
@@ -99,7 +125,7 @@ const BuildDetails = ({
     return getFilesSection({
       inputFiles: data?.input_files,
       outputFiles: data?.output_files,
-      title: formatMessage({ id: 'globalDetails.artifacts' }),
+      title: formatMessage({ id: 'commonDetails.artifacts' }),
     });
   }, [data?.input_files, data?.output_files, formatMessage]);
 
@@ -128,12 +154,31 @@ const BuildDetails = ({
         subsections: [
           {
             infos: [
+              {
+                title: 'global.status',
+                linkText: getBuildStatus(data.valid).toUpperCase(),
+                icon: <StatusIcon status={data?.valid} className="text-xl" />,
+              },
+              {
+                title: 'buildDetails.gitDescribe',
+                linkText: valueOrEmpty(data.git_commit_name),
+              },
               {
                 title: 'global.tree',
                 linkText: valueOrEmpty(data.tree_name),
               },
               {
-                title: 'buildDetails.gitUrl',
+                title: 'commonDetails.gitRepositoryBranch',
+                linkText: valueOrEmpty(data.git_repository_branch),
+              },
+              {
+                title: 'commonDetails.gitCommitHash',
+                linkText: valueOrEmpty(data.git_commit_hash),
+                linkComponent: treeDetailsLink,
+                copyValue: valueOrEmpty(data.git_commit_hash),
+              },
+              {
+                title: 'commonDetails.gitRepositoryUrl',
                 linkText: shouldTruncate(
                   valueOrEmpty(data.git_repository_url),
                 ) ? (
@@ -147,51 +192,33 @@ const BuildDetails = ({
                 link: data.git_repository_url,
               },
               {
-                title: 'buildDetails.gitBranch',
-                linkText: valueOrEmpty(data.git_repository_branch),
-              },
-              {
-                title: 'buildDetails.gitCommit',
-                linkText: valueOrEmpty(data.git_commit_hash),
-                copyValue: valueOrEmpty(data.git_commit_hash),
+                title: 'commonDetails.gitCommitTag',
+                linkText: valueOrEmpty(data.git_commit_tags?.[0]),
               },
               {
-                title: 'buildDetails.gitDescribe',
-                linkText: valueOrEmpty(data.git_commit_name),
+                title: 'global.command',
+                linkText: valueOrEmpty(data.command),
               },
               {
-                title: 'globalDetails.gitCommitTag',
-                linkText: valueOrEmpty(data.git_commit_tags?.[0]),
+                title: 'global.architecture',
+                linkText: valueOrEmpty(data.architecture),
               },
               {
-                title: 'global.date',
-                linkText: formatDate(valueOrEmpty(data.start_time)),
+                title: 'global.compiler',
+                linkText: valueOrEmpty(data.compiler),
               },
               {
-                title: 'buildDetails.defconfig',
+                title: 'global.config',
                 linkText: valueOrEmpty(data.config_name),
               },
               {
-                title: 'global.status',
-                linkText: getBuildStatus(data.valid).toUpperCase(),
-                icon: <StatusIcon status={data?.valid} className="text-xl" />,
-              },
-              {
-                title: 'global.architecture',
-                linkText: valueOrEmpty(data.architecture),
+                title: 'global.date',
+                linkText: formatDate(valueOrEmpty(data.start_time)),
               },
               {
-                title: 'buildDetails.buildTime',
+                title: 'global.buildTime',
                 linkText: data.duration ? `${data.duration} sec` : '-',
               },
-              {
-                title: 'buildDetails.compiler',
-                linkText: valueOrEmpty(data.compiler),
-              },
-              {
-                title: 'global.command',
-                linkText: valueOrEmpty(data.command),
-              },
               {
                 title: 'buildDetails.buildId',
                 linkText: buildId,
@@ -219,10 +246,17 @@ const BuildDetails = ({
         ],
       },
     ];
-  }, [data, buildDetailsTitle, setSheetToLog, formatMessage, buildId]);
+  }, [
+    data,
+    buildDetailsTitle,
+    setSheetToLog,
+    formatMessage,
+    buildId,
+    treeDetailsLink,
+  ]);
 
   const sectionsData: ISection[] = useMemo(() => {
-    return [...generalSections, miscSection, filesSection].filter(
+    return [...generalSections, filesSection, miscSection].filter(
       section => section !== undefined,
     );
   }, [generalSections, miscSection, filesSection]);
diff --git a/dashboard/src/components/DetailsLink/DetailsLink.tsx b/dashboard/src/components/DetailsLink/DetailsLink.tsx
new file mode 100644
index 000000000..399826b02
--- /dev/null
+++ b/dashboard/src/components/DetailsLink/DetailsLink.tsx
@@ -0,0 +1,18 @@
+import { type JSX, memo } from 'react';
+
+import { Link, type LinkProps } from '@tanstack/react-router';
+
+const LinkItem = ({ children, ...props }: LinkProps): JSX.Element => {
+  return (
+    <Link
+      {...props}
+      className="flex flex-row items-center gap-1 underline hover:text-slate-900"
+      target="_blank"
+      rel="noreferrer"
+    >
+      {children}
+    </Link>
+  );
+};
+
+export default memo(LinkItem);
diff --git a/dashboard/src/components/DetailsLink/index.tsx b/dashboard/src/components/DetailsLink/index.tsx
new file mode 100644
index 000000000..3d22b1d22
--- /dev/null
+++ b/dashboard/src/components/DetailsLink/index.tsx
@@ -0,0 +1,3 @@
+import MemoizedLinkItem from './DetailsLink';
+
+export default MemoizedLinkItem;
diff --git a/dashboard/src/components/Filter/CodeBlock.tsx b/dashboard/src/components/Filter/CodeBlock.tsx
index 2e30159b7..f4aa809ac 100644
--- a/dashboard/src/components/Filter/CodeBlock.tsx
+++ b/dashboard/src/components/Filter/CodeBlock.tsx
@@ -212,7 +212,7 @@ const CodeBlock = ({
       <div className="py-4 pl-3">
         <span className="font-bold">
           <FormattedMessage
-            id="buildAccordion.logExcerpt"
+            id="global.logExcerpt"
             defaultMessage="Log Excerpt"
           />
         </span>
diff --git a/dashboard/src/components/IssueDetails/IssueDetails.tsx b/dashboard/src/components/IssueDetails/IssueDetails.tsx
index 904ca09b7..9b8a1d040 100644
--- a/dashboard/src/components/IssueDetails/IssueDetails.tsx
+++ b/dashboard/src/components/IssueDetails/IssueDetails.tsx
@@ -82,7 +82,7 @@ export const IssueDetails = ({
     | undefined => {
     return getMiscSection({
       misc: data?.misc,
-      title: formatMessage({ id: 'globalDetails.miscData' }),
+      title: formatMessage({ id: 'commonDetails.miscData' }),
       setJsonContent: setJsonContent,
     });
   }, [data?.misc, formatMessage]);
diff --git a/dashboard/src/components/Section/FirstIncidentSection.tsx b/dashboard/src/components/Section/FirstIncidentSection.tsx
index 0626b4d9c..1f9bf4ace 100644
--- a/dashboard/src/components/Section/FirstIncidentSection.tsx
+++ b/dashboard/src/components/Section/FirstIncidentSection.tsx
@@ -1,5 +1,3 @@
-import { Link } from '@tanstack/react-router';
-
 import type { JSX } from 'react';
 
 import { truncateBigText, shouldTruncate, valueOrEmpty } from '@/lib/string';
@@ -10,6 +8,8 @@ import { TooltipDateTime } from '@/components/TooltipDateTime';
 import { TruncatedValueTooltip } from '@/components/Tooltip/TruncatedValueTooltip';
 import { LinkIcon } from '@/components/Icons/Link';
 
+import MemoizedLinkItem from '@/components/DetailsLink';
+
 import type { ISection, SubsectionLink } from './Section';
 
 const FirstIncidentLink = ({
@@ -19,10 +19,7 @@ const FirstIncidentLink = ({
 }): JSX.Element => {
   if (firstIncident?.git_commit_hash !== undefined) {
     return (
-      <Link
-        className="flex flex-row items-center gap-1 underline hover:text-slate-900"
-        target="_blank"
-        rel="noreferrer"
+      <MemoizedLinkItem
         to="/tree/$treeId"
         params={{ treeId: firstIncident.git_commit_hash }}
         state={s => s}
@@ -39,7 +36,7 @@ const FirstIncidentLink = ({
       >
         {truncateBigText(firstIncident.git_commit_hash)}
         <LinkIcon className="text-blue text-xl" />
-      </Link>
+      </MemoizedLinkItem>
     );
   }
 
diff --git a/dashboard/src/components/TestDetails/TestDetails.tsx b/dashboard/src/components/TestDetails/TestDetails.tsx
index f47bccb01..373a4ff4d 100644
--- a/dashboard/src/components/TestDetails/TestDetails.tsx
+++ b/dashboard/src/components/TestDetails/TestDetails.tsx
@@ -1,11 +1,10 @@
 import { FormattedMessage, useIntl } from 'react-intl';
 
-import { Fragment, memo, useCallback, useMemo, useState } from 'react';
+import { Fragment, useCallback, useMemo, useState } from 'react';
 import type { Dispatch, SetStateAction, JSX } from 'react';
 
 import type { LinkProps } from '@tanstack/react-router';
 import {
-  Link,
   useParams,
   useNavigate,
   useRouterState,
@@ -52,22 +51,9 @@ import { Badge } from '@/components/ui/badge';
 
 import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/Tooltip';
 
-import { StatusHistoryItem } from './StatusHistoryItem';
+import MemoizedLinkItem from '@/components/DetailsLink';
 
-const LinkItem = ({ children, ...props }: LinkProps): JSX.Element => {
-  return (
-    <Link
-      {...props}
-      className="flex flex-row items-center gap-1 underline hover:text-slate-900"
-      target="_blank"
-      rel="noreferrer"
-    >
-      {children}
-    </Link>
-  );
-};
-
-const MemoizedLinkItem = memo(LinkItem);
+import { StatusHistoryItem } from './StatusHistoryItem';
 
 const TestDetailsSections = ({
   test,
@@ -206,30 +192,17 @@ const TestDetailsSections = ({
               linkText: truncateBigText(test.status),
               icon: <StatusIcon status={test.status} className="text-xl" />,
             },
-            {
-              title: 'global.tree',
-              linkText: truncateBigText(test.tree_name),
-            },
             {
               title: 'global.path',
               linkText: valueOrEmpty(test.path),
             },
             {
-              title: 'global.arch',
-              linkText: valueOrEmpty(test.architecture),
-            },
-            {
-              title: 'global.compiler',
-              linkText: valueOrEmpty(test.compiler),
+              title: 'global.tree',
+              linkText: truncateBigText(test.tree_name),
             },
             {
-              title: 'global.logs',
-              linkText: shouldTruncate(valueOrEmpty(test.log_url)) ? (
-                <TruncatedValueTooltip value={test.log_url} isUrl={true} />
-              ) : (
-                valueOrEmpty(test.log_url)
-              ),
-              link: test.log_url,
+              title: 'commonDetails.gitRepositoryBranch',
+              linkText: valueOrEmpty(test.git_repository_branch),
             },
             {
               title: 'commonDetails.gitCommitHash',
@@ -252,22 +225,26 @@ const TestDetailsSections = ({
               link: test.git_repository_url,
             },
             {
-              title: 'commonDetails.gitRepositoryBranch',
-              linkText: valueOrEmpty(test.git_repository_branch),
+              title: 'commonDetails.gitCommitTag',
+              linkText: valueOrEmpty(test.git_commit_tags?.[0]),
             },
             {
-              title: 'globalDetails.gitCommitTag',
-              linkText: valueOrEmpty(test.git_commit_tags?.[0]),
+              title: 'global.hardware',
+              linkText: hardware,
+            },
+            {
+              title: 'global.architecture',
+              linkText: valueOrEmpty(test.architecture),
+            },
+            {
+              title: 'global.compiler',
+              linkText: valueOrEmpty(test.compiler),
             },
             {
               title: 'testDetails.buildInfo',
               linkText: truncateBigText(test.build_id),
               linkComponent: buildDetailsLink,
             },
-            {
-              title: 'global.hardware',
-              linkText: hardware,
-            },
             {
               title: 'global.startTime',
               linkText: (
@@ -280,13 +257,22 @@ const TestDetailsSections = ({
               ),
             },
             {
-              title: 'testDetails.testId',
-              linkText: test.id,
+              title: 'global.logs',
+              linkText: shouldTruncate(valueOrEmpty(test.log_url)) ? (
+                <TruncatedValueTooltip value={test.log_url} isUrl={true} />
+              ) : (
+                valueOrEmpty(test.log_url)
+              ),
+              link: test.log_url,
             },
             {
               title: 'global.compatibles',
               linkText: valueOrEmpty(test.environment_compatible?.join(' | ')),
             },
+            {
+              title: 'testDetails.testId',
+              linkText: test.id,
+            },
           ],
         },
       ],
@@ -318,7 +304,7 @@ const TestDetailsSections = ({
     | undefined => {
     return getMiscSection({
       misc: test.misc,
-      title: formatMessage({ id: 'globalDetails.miscData' }),
+      title: formatMessage({ id: 'commonDetails.miscData' }),
       setSheetType: setSheetType,
       setJsonContent: setJsonContent,
     });
@@ -329,7 +315,7 @@ const TestDetailsSections = ({
     | undefined => {
     return getMiscSection({
       misc: test.environment_misc,
-      title: formatMessage({ id: 'globalDetails.environmentMiscData' }),
+      title: formatMessage({ id: 'commonDetails.environmentMiscData' }),
     });
   }, [formatMessage, test.environment_misc]);
 
@@ -338,7 +324,7 @@ const TestDetailsSections = ({
     | undefined => {
     return getFilesSection({
       outputFiles: test.output_files,
-      title: formatMessage({ id: 'globalDetails.artifacts' }),
+      title: formatMessage({ id: 'commonDetails.artifacts' }),
     });
   }, [formatMessage, test.output_files]);
 
diff --git a/dashboard/src/locales/messages/index.ts b/dashboard/src/locales/messages/index.ts
index f1949b7ba..82b4f3ddf 100644
--- a/dashboard/src/locales/messages/index.ts
+++ b/dashboard/src/locales/messages/index.ts
@@ -27,51 +27,25 @@ export const messages = {
       'Success - builds completed successfully{br}' +
       'Failed - builds failed{br}' +
       "Inconclusive - builds with unknown status, including ongoing builds that didn't finish yet.",
-    'buildAccordion.buildLogs': 'Build logs',
-    'buildAccordion.dtb': 'Dtb',
-    'buildAccordion.dtbs': 'dtbs',
-    'buildAccordion.kernelConfig': 'Kernel config',
-    'buildAccordion.kernelConfigPath': 'config/kernel.config',
-    'buildAccordion.kernelImage': 'Kernel image',
-    'buildAccordion.logExcerpt': 'Log Excerpt',
-    'buildAccordion.logs': 'Logs',
-    'buildAccordion.modules': 'Modules',
-    'buildAccordion.modulesZip': 'modules.tar.xz',
-    'buildAccordion.systemMap': 'System map',
-    'buildAccordion.systemMapPath': 'kernel/System.map',
-    'buildAccordion.testDone': 'Test done',
-    'buildAccordion.testError': 'Test error',
-    'buildAccordion.testFail': 'Test failed',
-    'buildAccordion.testMiss': 'Test missed',
-    'buildAccordion.testSkipped': 'Test skipped',
-    'buildAccordion.testStatus': 'Test status',
-    'buildAccordion.testSuccess': 'Test success',
     'buildDetails.buildDetails': 'Build Details',
     'buildDetails.buildId': 'Build Id',
     'buildDetails.buildLogs': 'Build Logs',
-    'buildDetails.buildTime': 'Build time',
-    'buildDetails.compiler': 'Compiler',
-    'buildDetails.defconfig': 'Defconfig',
-    'buildDetails.dtb': 'Dtb',
-    'buildDetails.failedToFetch': 'Failed to fetch build details',
-    'buildDetails.gitBranch': 'Git Branch',
-    'buildDetails.gitCommit': 'Git Commit',
     'buildDetails.gitDescribe': 'Git Describe',
-    'buildDetails.gitUrl': 'Git Url',
     'buildDetails.kernelConfig': 'Kernel Config',
-    'buildDetails.kernelImage': 'Kernel Image',
     'buildDetails.noTestResults': 'No test results found.',
-    'buildDetails.notFound': 'Build not found',
     'buildDetails.startTime': 'Start Time',
-    'buildDetails.systemMap': 'System Map',
     'buildDetails.testResults': 'Test Results',
     'buildTab.buildStatus': 'Build status',
     'codeBlock.highlights': 'Highlights:',
     'codeBlock.highlightsTooltip': 'Counting estimated based on text output',
+    'commonDetails.artifacts': 'Artifacts',
+    'commonDetails.environmentMiscData': 'Environment Misc Data',
     'commonDetails.gitCommitHash': 'Git Commit Hash',
     'commonDetails.gitCommitName': 'Git Commit Name',
+    'commonDetails.gitCommitTag': 'Git Commit Tag',
     'commonDetails.gitRepositoryBranch': 'Git Repository Branch',
     'commonDetails.gitRepositoryUrl': 'Git Repository Url',
+    'commonDetails.miscData': 'Misc Data',
     'filter.architectureSubtitle': 'Please select one or more Architectures:',
     'filter.bootDuration': 'Boot duration',
     'filter.bootIssue': 'Boot issue',
@@ -148,6 +122,7 @@ export const messages = {
     'global.last': 'Last',
     'global.legend': 'Legend',
     'global.loading': 'Loading...',
+    'global.logExcerpt': 'Log Excerpt',
     'global.logs': 'Logs',
     'global.modules': 'Modules',
     'global.name': 'Name',
@@ -183,10 +158,6 @@ export const messages = {
     'global.viewJson': 'View Json',
     'global.viewLog': 'View Log Excerpt',
     'global.warning': 'Warning',
-    'globalDetails.artifacts': 'Artifacts',
-    'globalDetails.environmentMiscData': 'Environment Misc Data',
-    'globalDetails.gitCommitTag': 'Git Commit Tag',
-    'globalDetails.miscData': 'Misc Data',
     'globalTable.bootStatus': 'Boot Status',
     'globalTable.branch': 'Branch',
     'globalTable.build': 'Build Status',
@@ -217,7 +188,6 @@ export const messages = {
     'issueDetails.culpritHarness': 'Harness',
     'issueDetails.culpritTitle': 'Culprit',
     'issueDetails.culpritTool': 'Tool',
-    'issueDetails.failedToFetch': 'Failed to fetch issue details',
     'issueDetails.firstIncidentData': 'First Incident Data',
     'issueDetails.id': 'Issue Id',
     'issueDetails.issueDetails': 'Issue Details',
@@ -265,7 +235,6 @@ export const messages = {
       'Inconclusive - test concluded with inconclusive results such as infrastructure errors.{br}{br}' +
       'Inconclusive groups tests with ERROR, MISS, SKIP, DONE, and unknown statuses defined by KCIDB.',
     'testDetails.buildInfo': 'Build Info',
-    'testDetails.failedToFetch': 'Failed to fetch test details',
     'testDetails.notFound': 'Test not found',
     'testDetails.regressionTypeTooltip':
       'The regression type of the test.\n' +


Reviews:
user: login: MarceloRobert
body: I believe that you could use this PR to reorder the fields in the details pages, so that they match a bit better. Here's my suggestion (left is testDetails, right is buildDetails, center is both):
```
status
path / git describe

tree
git repository branch

git commit hash
git repository url

git commit tag
hardware / command

architecture
compiler

build info / config
start time / date

logs / command
test id / build id

compatibles / -
---
- / build logs
- / kernel config
```

state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T12:11:51Z
user: login: Francisco2002
body: LGTM
state: APPROVED
author_association: NONE
submitted_at: 2025-03-06T14:34:48Z
user: login: MarceloRobert
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-06T14:42:17Z
user: login: MarceloRobert
body: LGTM, nice work
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-06T15:01:52Z

Review comments:
path: dashboard/src/components/DetailsLink/DetailsLink.tsx
user: login: MarceloRobert
body: You can add an index file with the export like it is being made in other components, then you won't have to import from /DetailsLink/DetailsLink
created_at: 2025-03-06T12:08:33Z
author_association: COLLABORATOR
path: dashboard/src/locales/messages/index.ts
user: login: MarceloRobert
body: There are a couple more keys that aren't being used, some from build details and a lot from buildAccordion (which we don't even have anymore), could you delete those as well?
created_at: 2025-03-06T12:09:26Z
author_association: COLLABORATOR
diff_hunk: @@ -147,55 +192,37 @@ const BuildDetails = ({
                 link: data.git_repository_url,
               },
               {
-                title: 'buildDetails.gitBranch',
-                linkText: valueOrEmpty(data.git_repository_branch),
-              },
-              {
-                title: 'buildDetails.gitCommit',
-                linkText: valueOrEmpty(data.git_commit_hash),
-                copyValue: valueOrEmpty(data.git_commit_hash),
-              },
-              {
-                title: 'buildDetails.gitDescribe',
-                linkText: valueOrEmpty(data.git_commit_name),
-              },
-              {
-                title: 'globalDetails.gitCommitTag',
+                title: 'commonDetails.gitCommitTag',
                 linkText: valueOrEmpty(data.git_commit_tags?.[0]),
               },
               {
-                title: 'global.date',
-                linkText: formatDate(valueOrEmpty(data.start_time)),
-              },
-              {
-                title: 'buildDetails.defconfig',
-                linkText: valueOrEmpty(data.config_name),
-              },
-              {
-                title: 'global.status',
-                linkText: getBuildStatus(data.valid).toUpperCase(),
-                icon: <StatusIcon status={data?.valid} className="text-xl" />,
+                title: 'global.command',
+                linkText: valueOrEmpty(data.command),
               },
               {
                 title: 'global.architecture',
                 linkText: valueOrEmpty(data.architecture),
               },
               {
-                title: 'buildDetails.buildTime',
-                linkText: data.duration ? `${data.duration} sec` : '-',
+                title: 'global.compiler',
+                linkText: valueOrEmpty(data.compiler),
               },
               {
-                title: 'buildDetails.compiler',
-                linkText: valueOrEmpty(data.compiler),
+                title: 'global.config',
+                linkText: valueOrEmpty(data.config_name),
               },
               {
-                title: 'global.command',
-                linkText: valueOrEmpty(data.command),
+                title: 'global.date',
+                linkText: formatDate(valueOrEmpty(data.start_time)),
               },
               {
                 title: 'buildDetails.buildId',
                 linkText: buildId,
               },
+              {
+                title: 'global.buildTime',
+                linkText: data.duration ? `${data.duration} sec` : '-',
+              },
path: dashboard/src/components/BuildDetails/BuildDetails.tsx
user: login: MarceloRobert
body: Can you swap those? I miswrote "command" twice and forgot about the buildTime in my last comment
created_at: 2025-03-06T14:28:42Z
author_association: COLLABORATOR

PR comments:
user: login: Francisco2002
created_at: 2025-03-05T12:37:24Z
body: Others suggested changes:

- `bootsTab.configs` -> `global.configs`
- `bootsTab.error` -> `global.error`
- `bootsTab.hardwareTested` and `testsTab.hardwareTested` -> `commonTab.hardwareTested`
- `bootsTab.info` -> `global.info`
- `bootsTab.success` -> `global.success`
- `buildAccordion.*` -> only `buildAccordion.logExcerpt` is used. I suggest to change to `global.logExcerpt` or something like it and remove this unused ids.
- `buildDetails.startTime` -> `commonDetails.startTime` (or `global.startTime)` 
- `buildTab.buildStatus` and `filter.buildStatus` -> `globalTable.build`
- `treeDetails.commitOrTag` -> `globalTable.commitTag`
author_association: NONE
user: login: murilx
created_at: 2025-03-05T14:07:51Z
body: @Francisco2002 I agree we should change all of these, but this PR initial focus is the test/build/issues details page, maybe changing tab messages would make the PR harder to review. I can still add these changes if you think they are important, though (I understand that's difficult to find an opportunity to perform refactor task)
author_association: CONTRIBUTOR