From 86c6fb82393227b9a0c24893e1a321f9495b9980 Mon Sep 17 00:00:00 2001 From: aecsocket <43144841+aecsocket@users.noreply.github.com> Date: Fri, 17 Jul 2026 16:08:59 +0100 Subject: [PATCH 01/43] fix: global trace and tech review improvements (#6699) * remaining globally safe/unsafe buttons * tweak global traces layout * deterministic local trace ordering * fix preview * ignore severity for ordering * show globally resolved traces toggle * minor frontend changes * prepr --------- Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com> --- .../moderation/GlobalDetailLocalTraceCard.vue | 48 ++- .../ui/moderation/GlobalDetailTracesList.vue | 69 +++- .../ui/moderation/ModerationTechRevCard.vue | 301 ++++++++++++++---- .../pages/moderation/global-traces/[key].vue | 64 +++- ...05a0874d1c5ad8469dd83133ac771b86ea4e.json} | 4 +- ...1e2a83b50d89f5954ab8d951a090e702de73.json} | 4 +- ...015c170b2fb325aaef554f08aac34457a3fa.json} | 4 +- ...8ff40af3b6b56f43540ec3798ef30e5c0b9d.json} | 4 +- ...e8eff6516004d0636357f146047789f8f8c1.json} | 4 +- .../routes/internal/moderation/tech_review.rs | 6 +- 10 files changed, 392 insertions(+), 116 deletions(-) rename apps/labrinth/.sqlx/{query-50d087248322373b2d5fc40e1c7b8a855b55d907d7fba0af0738c37366cb93e0.json => query-147e143aaaff82c71b89daddcc8805a0874d1c5ad8469dd83133ac771b86ea4e.json} (77%) rename apps/labrinth/.sqlx/{query-9070b1b6a5b1e93eb1fd1838c522fa6084ad6a5c86fafbfe8448ea7cc86f38ba.json => query-63a9a89443566baa880ddbe05f741e2a83b50d89f5954ab8d951a090e702de73.json} (94%) rename apps/labrinth/.sqlx/{query-8e38571ffae8bf246973d328c890a45b87c0f71d53cf46f390c4b286677b2b31.json => query-72012eb0655d9130a7c7894f7682015c170b2fb325aaef554f08aac34457a3fa.json} (89%) rename apps/labrinth/.sqlx/{query-10e2a3b31ba94b93ed2d6c9753a5aabf13190a0b336089e6521022069813cf17.json => query-8d37c8c2633b7d601c7ba74d63608ff40af3b6b56f43540ec3798ef30e5c0b9d.json} (88%) rename apps/labrinth/.sqlx/{query-632b79f51dd39a75ebff838ca4beab463f84aa32246288cc251881ec41d207f5.json => query-c69a7a5296941a52f15c3c073e65e8eff6516004d0636357f146047789f8f8c1.json} (81%) diff --git a/apps/frontend/src/components/ui/moderation/GlobalDetailLocalTraceCard.vue b/apps/frontend/src/components/ui/moderation/GlobalDetailLocalTraceCard.vue index 46850664df..a6756ce443 100644 --- a/apps/frontend/src/components/ui/moderation/GlobalDetailLocalTraceCard.vue +++ b/apps/frontend/src/components/ui/moderation/GlobalDetailLocalTraceCard.vue @@ -5,16 +5,21 @@

{{ trace.project_name }}

-

- Project {{ trace.project_slug ?? trace.project_id }} / Version - {{ trace.version_number }} / File {{ trace.file_name }} +

+ {{ trace.version_number }} +

- Local - - Effective - +
- -
-

- Issue - {{ trace.issue_type }} -

-

- Severity - {{ trace.severity }} -

-

- Path - {{ trace.file_path }} -

-

- JAR - {{ trace.jar }} -

-
diff --git a/apps/frontend/src/components/ui/moderation/GlobalDetailTracesList.vue b/apps/frontend/src/components/ui/moderation/GlobalDetailTracesList.vue index ec6cf6237a..8d42abbc1e 100644 --- a/apps/frontend/src/components/ui/moderation/GlobalDetailTracesList.vue +++ b/apps/frontend/src/components/ui/moderation/GlobalDetailTracesList.vue @@ -42,20 +42,34 @@ :key="trace.detail_key" class="universal-card flex flex-col gap-3" > -
+
-
+
+
+

+ Issue + {{ getLatestLocalTrace(trace)?.issue_type }} +

+

+ Path + {{ decodeTracePath(getLatestLocalTrace(trace)?.file_path ?? '') }} +

-

- {{ formatTraceCount(trace.local_trace_count) }} -

-
+
- {{ option.id }} + {{ option.label ?? option.id }} - {{ option.id }} + {{ option.label ?? option.id }} @@ -95,29 +107,49 @@ diff --git a/packages/ui/src/components/base/index.ts b/packages/ui/src/components/base/index.ts index 7fa6262111..60f9c2bfb3 100644 --- a/packages/ui/src/components/base/index.ts +++ b/packages/ui/src/components/base/index.ts @@ -19,7 +19,6 @@ export { default as CollapsibleAdmonition } from './CollapsibleAdmonition.vue' export { default as CollapsibleRegion } from './CollapsibleRegion.vue' export type { ComboboxOption } from './Combobox.vue' export { default as Combobox } from './Combobox.vue' -export { default as ContentPageHeader } from './ContentPageHeader.vue' export { default as CopyCode } from './CopyCode.vue' export { default as DatePicker } from './DatePicker.vue' export { default as DoubleIcon } from './DoubleIcon.vue' @@ -65,6 +64,23 @@ export { default as OptionGroup } from './OptionGroup.vue' export type { Option as OverflowMenuOption } from './OverflowMenu.vue' export { default as OverflowMenu } from './OverflowMenu.vue' export { default as Page } from './Page.vue' +export { default as PageHeader } from './page-header/index.vue' +export { default as PageHeaderMetadata } from './page-header/metadata/index.vue' +export { default as PageHeaderMetadataItem } from './page-header/metadata/page-header-metadata-item.vue' +export { default as PageHeaderMetadataNumberItem } from './page-header/metadata/page-header-metadata-number-item.vue' +export { default as PageHeaderMetadataTagsItem } from './page-header/metadata/page-header-metadata-tags-item.vue' +export { default as PageHeaderMetadataTimeItem } from './page-header/metadata/page-header-metadata-time-item.vue' +export { default as PageHeaderActions } from './page-header/page-header-actions.vue' +export { default as PageHeaderBadgeItem } from './page-header/page-header-badge-item.vue' +export type { + PageHeaderClass, + PageHeaderClickHandler, + PageHeaderIconProps, + PageHeaderInteractiveProps, + PageHeaderMetadataItemProps, + PageHeaderProps, + PageHeaderTarget, +} from './page-header/types' export { default as Pagination } from './Pagination.vue' export { default as PopoutMenu } from './PopoutMenu.vue' export { default as PreviewSelectButton } from './PreviewSelectButton.vue' @@ -89,6 +105,11 @@ export type { TabsTab, TabsValue } from './Tabs.vue' export { default as Tabs } from './Tabs.vue' export { default as TagItem } from './TagItem.vue' export { default as TagTagItem } from './TagTagItem.vue' +export type { + Item as TeleportOverflowMenuItem, + Option as TeleportOverflowMenuOption, +} from './TeleportOverflowMenu.vue' +export { default as TeleportOverflowMenu } from './TeleportOverflowMenu.vue' export type { TimeFrameLastUnit, TimeFrameLastUnitOption, diff --git a/packages/ui/src/components/base/page-header/index.vue b/packages/ui/src/components/base/page-header/index.vue new file mode 100644 index 0000000000..eef3b8db5b --- /dev/null +++ b/packages/ui/src/components/base/page-header/index.vue @@ -0,0 +1,67 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/index.vue b/packages/ui/src/components/base/page-header/metadata/index.vue new file mode 100644 index 0000000000..c9f14be49a --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-item.vue new file mode 100644 index 0000000000..ee8c7e35fd --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-item.vue @@ -0,0 +1,89 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-number-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-number-item.vue new file mode 100644 index 0000000000..9187a833cc --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-number-item.vue @@ -0,0 +1,61 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-tags-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-tags-item.vue new file mode 100644 index 0000000000..9986801a89 --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-tags-item.vue @@ -0,0 +1,33 @@ + + + diff --git a/packages/ui/src/components/base/page-header/metadata/page-header-metadata-time-item.vue b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-time-item.vue new file mode 100644 index 0000000000..2b8ac27a1b --- /dev/null +++ b/packages/ui/src/components/base/page-header/metadata/page-header-metadata-time-item.vue @@ -0,0 +1,66 @@ + + + diff --git a/packages/ui/src/components/base/page-header/page-header-actions.vue b/packages/ui/src/components/base/page-header/page-header-actions.vue new file mode 100644 index 0000000000..a515eecb50 --- /dev/null +++ b/packages/ui/src/components/base/page-header/page-header-actions.vue @@ -0,0 +1,5 @@ + diff --git a/packages/ui/src/components/base/page-header/page-header-badge-item.vue b/packages/ui/src/components/base/page-header/page-header-badge-item.vue new file mode 100644 index 0000000000..c7f4a42a39 --- /dev/null +++ b/packages/ui/src/components/base/page-header/page-header-badge-item.vue @@ -0,0 +1,82 @@ + + + diff --git a/packages/ui/src/components/base/page-header/types.ts b/packages/ui/src/components/base/page-header/types.ts new file mode 100644 index 0000000000..646d92f679 --- /dev/null +++ b/packages/ui/src/components/base/page-header/types.ts @@ -0,0 +1,36 @@ +import type { Component, HTMLAttributes } from 'vue' +import type { RouteLocationRaw } from 'vue-router' + +export type PageHeaderTarget = string | RouteLocationRaw +export type PageHeaderClass = HTMLAttributes['class'] + +export type PageHeaderClickHandler = (event: MouseEvent) => void | Promise + +export type PageHeaderIconProps = { + icon?: Component + iconProps?: Record + iconClass?: PageHeaderClass +} + +export type PageHeaderInteractiveProps = { + tooltip?: string + ariaLabel?: string + to?: PageHeaderTarget + action?: PageHeaderClickHandler + disabled?: boolean +} + +export type PageHeaderMetadataItemProps = PageHeaderIconProps & PageHeaderInteractiveProps + +export type PageHeaderProps = { + title: string + summary?: string | null + headerClass?: PageHeaderClass + rowClass?: PageHeaderClass + mainClass?: PageHeaderClass + titleClass?: PageHeaderClass + truncateTitle?: boolean + divider?: boolean + bottomPadding?: boolean + disableLineClamp?: boolean +} diff --git a/packages/ui/src/components/project/ProjectHeader.vue b/packages/ui/src/components/project/ProjectHeader.vue deleted file mode 100644 index 0f5235cf2f..0000000000 --- a/packages/ui/src/components/project/ProjectHeader.vue +++ /dev/null @@ -1,115 +0,0 @@ - - diff --git a/packages/ui/src/components/project/ProjectPageHeader.vue b/packages/ui/src/components/project/ProjectPageHeader.vue new file mode 100644 index 0000000000..86fea39c72 --- /dev/null +++ b/packages/ui/src/components/project/ProjectPageHeader.vue @@ -0,0 +1,117 @@ + + + diff --git a/packages/ui/src/components/project/index.ts b/packages/ui/src/components/project/index.ts index 46cc74f73b..efc797c1d2 100644 --- a/packages/ui/src/components/project/index.ts +++ b/packages/ui/src/components/project/index.ts @@ -6,8 +6,8 @@ export { default as ProjectCard } from './card/ProjectCard.vue' export { default as ProjectBackgroundGradient } from './ProjectBackgroundGradient.vue' export { default as ProjectCardList } from './ProjectCardList.vue' export { default as ProjectCombobox } from './ProjectCombobox.vue' -export { default as ProjectHeader } from './ProjectHeader.vue' export { default as ProjectPageDescription } from './ProjectPageDescription.vue' +export { default as ProjectPageHeader } from './ProjectPageHeader.vue' export { default as ProjectPageVersions } from './ProjectPageVersions.vue' export { default as ProjectSidebarCompatibility } from './ProjectSidebarCompatibility.vue' export { default as ProjectSidebarCreators } from './ProjectSidebarCreators.vue' diff --git a/packages/ui/src/components/servers/server-header/PanelServerOverflowMenu.vue b/packages/ui/src/components/servers/server-header/PanelServerOverflowMenu.vue deleted file mode 100644 index a05c6a8db2..0000000000 --- a/packages/ui/src/components/servers/server-header/PanelServerOverflowMenu.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/packages/ui/src/components/servers/server-header/ServerManageHeader.vue b/packages/ui/src/components/servers/server-header/ServerManageHeader.vue deleted file mode 100644 index 88e6adeb07..0000000000 --- a/packages/ui/src/components/servers/server-header/ServerManageHeader.vue +++ /dev/null @@ -1,182 +0,0 @@ - - - diff --git a/packages/ui/src/components/servers/server-header/index.ts b/packages/ui/src/components/servers/server-header/index.ts index 97bcdcc7f2..2ff43b46e4 100644 --- a/packages/ui/src/components/servers/server-header/index.ts +++ b/packages/ui/src/components/servers/server-header/index.ts @@ -1,3 +1 @@ export { default as PanelServerActionButton } from './PanelServerActionButton.vue' -export { default as PanelServerOverflowMenu } from './PanelServerOverflowMenu.vue' -export { default as ServerManageHeader } from './ServerManageHeader.vue' diff --git a/packages/ui/src/layouts/shared/browse-tab/header.vue b/packages/ui/src/layouts/shared/browse-tab/header.vue index bb976c861a..1ee98cea5c 100644 --- a/packages/ui/src/layouts/shared/browse-tab/header.vue +++ b/packages/ui/src/layouts/shared/browse-tab/header.vue @@ -1,11 +1,11 @@