From 49faba6ad2a99ef01827679620563a3d38a555da Mon Sep 17 00:00:00 2001 From: Prospector Date: Mon, 31 Mar 2025 17:21:31 -0700 Subject: [PATCH 001/281] fixed a bug --- apps/frontend/src/assets/styles/global.scss | 60 ++++----- .../src/components/ui/AdPlaceholder.vue | 2 +- .../src/components/ui/charts/ChartDisplay.vue | 6 +- .../src/components/ui/servers/Globe.vue | 10 +- apps/frontend/src/layouts/default.vue | 2 +- apps/frontend/src/pages/app.vue | 116 ++++++++++-------- apps/frontend/src/pages/index.vue | 48 +++++--- apps/frontend/src/pages/servers/index.vue | 24 ++-- packages/assets/styles/classes.scss | 4 +- packages/assets/styles/variables.scss | 60 ++++----- packages/ui/src/components/base/Avatar.vue | 2 +- 11 files changed, 183 insertions(+), 151 deletions(-) diff --git a/apps/frontend/src/assets/styles/global.scss b/apps/frontend/src/assets/styles/global.scss index 06d8568c4..ecee16f73 100644 --- a/apps/frontend/src/assets/styles/global.scss +++ b/apps/frontend/src/assets/styles/global.scss @@ -56,9 +56,9 @@ html { --color-text-inverted: var(--color-bg); --color-bg-inverted: var(--color-text); - --color-brand: var(--color-green); - --color-brand-highlight: rgba(0, 175, 92, 0.25); - --color-brand-shadow: rgba(0, 175, 92, 0.7); + --color-brand: #F16436; + --color-brand-highlight: rgba(242, 101, 53, 0.25); + --color-brand-shadow: rgba(242, 101, 53, 0.7); --color-brand-inverted: #ffffff; --tab-underline-hovered: #e2e8f0; @@ -139,10 +139,10 @@ html { ); --landing-border-gradient: linear-gradient( to bottom right, - rgba(129, 137, 175, 0.75) 0%, - rgba(66, 71, 97, 0.34) 100% + rgba(175, 150, 129, 0.75) 0%, + rgba(97, 66, 66, 0.34) 100% ); - --landing-border-color: rgba(129, 137, 175, 0.55); + --landing-border-color: rgba(175, 134, 129, 0.55); --landing-creator-gradient: linear-gradient(180deg, #f8f8f8 0%, #f8f8f8 63.19%); --landing-blob-gradient: radial-gradient( @@ -158,8 +158,8 @@ html { --landing-blue-label: #0098ba; --landing-blue-label-bg: rgba(0, 177, 216, 0.15); - --landing-green-label: #00a936; - --landing-green-label-bg: rgba(0, 216, 69, 0.15); + --landing-green-label: #dd5b0b; + --landing-green-label-bg: rgba(221, 67, 21, 0.15); --landing-raw-bg: #fff; } @@ -174,22 +174,22 @@ html { --color-text-inactive: #929aa3; --color-text-dark: var(--dark-color-text-dark); --color-heading: #c4cfdd; - --color-bg: #16181c; - --color-raised-bg: #26292f; + --color-bg: #0D0D0D; + --color-raised-bg: #202020; --color-divider: #474b54; --color-divider-dark: #646c75; --color-text-inverted: var(--color-bg); --color-bg-inverted: var(--color-text); - --color-brand: var(--color-green); - --color-brand-highlight: rgba(27, 217, 106, 0.25); - --color-brand-shadow: rgba(27, 217, 106, 0.7); + --color-brand: #F16436; + --color-brand-highlight: rgba(242, 101, 53, 0.25); + --color-brand-shadow: rgba(242, 101, 53, 0.7); --color-brand-inverted: #000; --tab-underline-hovered: #414146; - --color-button-bg: hsl(222, 13%, 30%); + --color-button-bg: #333333; --color-button-text: var(--color-text); --color-button-bg-hover: #494f58; --color-button-text-hover: #ffffff; @@ -245,42 +245,42 @@ html { --shadow-card: rgba(0, 0, 0, 0.25) 0px 2px 4px 0px; --landing-maze-bg: url("https://cdn.modrinth.com/landing-new/landing.webp"); - --landing-maze-gradient-bg: linear-gradient(0deg, #31375f 0%, rgba(8, 14, 55, 0) 100%), + --landing-maze-gradient-bg: linear-gradient(0deg, #371f17 0%, rgba(8, 14, 55, 0) 100%), url("https://cdn.modrinth.com/landing-new/landing-lower.webp"); --landing-maze-outer-bg: linear-gradient(180deg, #06060d 0%, #000000 100%); --landing-color-heading: #fff; - --landing-color-subheading: #afb6be; + --landing-color-subheading: #beb4af; - --landing-transition-gradient-start: rgba(14, 16, 32, 0); - --landing-transition-gradient-end: #060a1c; + --landing-transition-gradient-start: rgba(32, 26, 14, 0); + --landing-transition-gradient-end: #1c0b06; --landing-hover-card-gradient: radial-gradient( 50% 50% at 50% 50%, - #2c304f 0%, - rgba(32, 35, 50, 0.77) 100% + #4f342c 0%, + rgba(50, 33, 32, 0.77) 100% ); --landing-border-gradient: linear-gradient( to bottom right, - rgba(168, 177, 221, 0.75) 0%, - rgba(168, 177, 221, 0.18) 100% + rgba(221, 184, 168, 0.75) 0%, + rgba(221, 187, 168, 0.18) 100% ); - --landing-border-color: rgba(168, 177, 221, 0.55); - --landing-creator-gradient: linear-gradient(180deg, #000000 0%, #0e101d 100%); + --landing-border-color: rgba(221, 174, 168, 0.55); + --landing-creator-gradient: linear-gradient(180deg, #000000 0%, #1d130e 100%); --landing-blob-gradient: radial-gradient( 50% 50% at 50% 50%, - rgba(44, 48, 79, 0.35) 0%, - rgba(32, 35, 50, 0.2695) 100% + rgba(79, 53, 44, 0.35) 0%, + rgba(50, 35, 32, 0.27) 100% ); - --landing-blob-shadow: 2px 2px 12px rgba(0, 0, 0, 0.16), inset 2px 2px 64px rgba(57, 61, 94, 0.45); + --landing-blob-shadow: 2px 2px 12px rgba(0, 0, 0, 0.16), inset 2px 2px 64px rgba(94, 71, 57, 0.45); - --landing-card-bg: rgba(59, 63, 85, 0.15); + --landing-card-bg: rgba(85, 69, 59, 0.15); --landing-card-shadow: 2px 2px 12px rgba(0, 0, 0, 0.16); --landing-blue-label: #10c0e7; --landing-blue-label-bg: rgba(0, 177, 216, 0.15); - --landing-green-label: #00d845; - --landing-green-label-bg: rgba(0, 216, 69, 0.15); + --landing-green-label: #ec6105; + --landing-green-label-bg: rgba(223, 83, 7, 0.15); --landing-raw-bg: #000; diff --git a/apps/frontend/src/components/ui/AdPlaceholder.vue b/apps/frontend/src/components/ui/AdPlaceholder.vue index 639a28b86..eec9b8098 100644 --- a/apps/frontend/src/components/ui/AdPlaceholder.vue +++ b/apps/frontend/src/components/ui/AdPlaceholder.vue @@ -2,7 +2,7 @@

75% of ad revenue goes to creators

- + Support creators and Modrinth ad-free with Modrinth+ diff --git a/apps/frontend/src/components/ui/charts/ChartDisplay.vue b/apps/frontend/src/components/ui/charts/ChartDisplay.vue index a6ca889c1..d5ff7d3ff 100644 --- a/apps/frontend/src/components/ui/charts/ChartDisplay.vue +++ b/apps/frontend/src/components/ui/charts/ChartDisplay.vue @@ -86,8 +86,8 @@ { transparent: true, side: THREE.BackSide, uniforms: { - color: { value: new THREE.Color("#56f690") }, + color: { value: new THREE.Color("#fabc89") }, viewVector: { value: camera.position }, }, vertexShader: ` @@ -262,13 +262,13 @@ onUnmounted(() => { diff --git a/apps/frontend/src/pages/servers/manage/[id].vue b/apps/frontend/src/pages/servers/manage/[id].vue index 0d1178738..8dfde57f0 100644 --- a/apps/frontend/src/pages/servers/manage/[id].vue +++ b/apps/frontend/src/pages/servers/manage/[id].vue @@ -1,5 +1,19 @@ diff --git a/packages/ui/src/components/base/ContentPageHeader.vue b/packages/ui/src/components/base/ContentPageHeader.vue index eeada8e89..3b6e5614a 100644 --- a/packages/ui/src/components/base/ContentPageHeader.vue +++ b/packages/ui/src/components/base/ContentPageHeader.vue @@ -11,10 +11,10 @@
-

+

-
+
diff --git a/packages/ui/src/components/base/ServerNotice.vue b/packages/ui/src/components/base/ServerNotice.vue new file mode 100644 index 000000000..cd06ab12b --- /dev/null +++ b/packages/ui/src/components/base/ServerNotice.vue @@ -0,0 +1,73 @@ + + + diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index ab41adef8..1c4ee40be 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -30,6 +30,7 @@ export { default as ProjectCard } from './base/ProjectCard.vue' export { default as RadialHeader } from './base/RadialHeader.vue' export { default as RadioButtons } from './base/RadioButtons.vue' export { default as ScrollablePanel } from './base/ScrollablePanel.vue' +export { default as ServerNotice } from './base/ServerNotice.vue' export { default as SimpleBadge } from './base/SimpleBadge.vue' export { default as Slider } from './base/Slider.vue' export { default as StatItem } from './base/StatItem.vue' diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json index d569d1ecb..c0fe5dbc7 100644 --- a/packages/ui/src/locales/en-US/index.json +++ b/packages/ui/src/locales/en-US/index.json @@ -404,6 +404,30 @@ "search.filter_type.shader_loader": { "defaultMessage": "Loader" }, + "servers.notice.dismiss": { + "defaultMessage": "Dismiss" + }, + "servers.notice.dismissable": { + "defaultMessage": "Dismissable" + }, + "servers.notice.heading.attention": { + "defaultMessage": "Attention" + }, + "servers.notice.heading.info": { + "defaultMessage": "Info" + }, + "servers.notice.level.critical.name": { + "defaultMessage": "Critical" + }, + "servers.notice.level.info.name": { + "defaultMessage": "Info" + }, + "servers.notice.level.warn.name": { + "defaultMessage": "Warning" + }, + "servers.notice.undismissable": { + "defaultMessage": "Undismissable" + }, "settings.account.title": { "defaultMessage": "Account and security" }, diff --git a/packages/ui/src/utils/notices.ts b/packages/ui/src/utils/notices.ts new file mode 100644 index 000000000..d7abf93d9 --- /dev/null +++ b/packages/ui/src/utils/notices.ts @@ -0,0 +1,63 @@ +import { defineMessage, type MessageDescriptor } from '@vintl/vintl' + +export const NOTICE_LEVELS: Record< + string, + { name: MessageDescriptor; colors: { text: string; bg: string } } +> = { + info: { + name: defineMessage({ + id: 'servers.notice.level.info.name', + defaultMessage: 'Info', + }), + colors: { + text: 'var(--color-blue)', + bg: 'var(--color-blue-bg)', + }, + }, + warn: { + name: defineMessage({ + id: 'servers.notice.level.warn.name', + defaultMessage: 'Warning', + }), + colors: { + text: 'var(--color-orange)', + bg: 'var(--color-orange-bg)', + }, + }, + critical: { + name: defineMessage({ + id: 'servers.notice.level.critical.name', + defaultMessage: 'Critical', + }), + colors: { + text: 'var(--color-red)', + bg: 'var(--color-red-bg)', + }, + }, +} + +const DISMISSABLE = { + name: defineMessage({ + id: 'servers.notice.dismissable', + defaultMessage: 'Dismissable', + }), + colors: { + text: 'var(--color-green)', + bg: 'var(--color-green-bg)', + }, +} + +const UNDISMISSABLE = { + name: defineMessage({ + id: 'servers.notice.undismissable', + defaultMessage: 'Undismissable', + }), + colors: { + text: 'var(--color-red)', + bg: 'var(--color-red-bg)', + }, +} + +export function getDismissableMetadata(dismissable: boolean) { + return dismissable ? DISMISSABLE : UNDISMISSABLE +} diff --git a/packages/utils/types.ts b/packages/utils/types.ts index 7f7892d26..bf440cdd2 100644 --- a/packages/utils/types.ts +++ b/packages/utils/types.ts @@ -252,3 +252,21 @@ export type Report = { created: string body: string } + +export type ServerNotice = { + id: number + message: string + level: string + dismissable: boolean + announce_at: string + expires: string + assigned: { + kind: 'server' | 'node' + id: string + name: string + }[] + dismissed_by: { + server: string + dismissed_on: string + }[] +} From edd09b0b16d962bb2697c81aed0bd23d83cccd8d Mon Sep 17 00:00:00 2001 From: Prospector Date: Sat, 12 Apr 2025 22:06:22 -0700 Subject: [PATCH 028/281] Update changelog --- packages/utils/changelog.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/utils/changelog.ts b/packages/utils/changelog.ts index 57087bd8b..c3cfb2d8a 100644 --- a/packages/utils/changelog.ts +++ b/packages/utils/changelog.ts @@ -10,6 +10,18 @@ export type VersionEntry = { } const VERSIONS: VersionEntry[] = [ + { + date: `2025-04-12T22:10:00-07:00`, + product: 'servers', + body: `### Added +- Added ability to notify customers in the panel with notices concerning their servers.`, + }, + { + date: `2025-04-12T22:10:00-07:00`, + product: 'web', + body: `### Improvements +- Fix missing dropdown icon in publishing checklist.`, + }, { date: `2025-04-01T21:15:00-07:00`, product: 'web', From f2ec89e62bf51b96df848513e9facde79d199a3e Mon Sep 17 00:00:00 2001 From: Emma Alexia Date: Sun, 13 Apr 2025 01:21:02 -0400 Subject: [PATCH 029/281] Fix two database errors (#3483) * Fixes error when an admin tries transferring project ownership * Fixes error when trying to delete a user when they previously have a transaction Co-authored-by: Jai Agrawal <18202329+Geometrically@users.noreply.github.com> --- ...e0368ee972ed20bd4d4b2490c655fde999dda.json | 15 +++++++++ .../labrinth/src/database/models/user_item.rs | 12 +++++++ apps/labrinth/src/routes/v3/teams.rs | 33 +++++++++++-------- 3 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 apps/labrinth/.sqlx/query-f1f93419f4394c702f256fe3e5de0368ee972ed20bd4d4b2490c655fde999dda.json diff --git a/apps/labrinth/.sqlx/query-f1f93419f4394c702f256fe3e5de0368ee972ed20bd4d4b2490c655fde999dda.json b/apps/labrinth/.sqlx/query-f1f93419f4394c702f256fe3e5de0368ee972ed20bd4d4b2490c655fde999dda.json new file mode 100644 index 000000000..f2104ac61 --- /dev/null +++ b/apps/labrinth/.sqlx/query-f1f93419f4394c702f256fe3e5de0368ee972ed20bd4d4b2490c655fde999dda.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE charges\n SET user_id = $1\n WHERE user_id = $2\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Int8" + ] + }, + "nullable": [] + }, + "hash": "f1f93419f4394c702f256fe3e5de0368ee972ed20bd4d4b2490c655fde999dda" +} diff --git a/apps/labrinth/src/database/models/user_item.rs b/apps/labrinth/src/database/models/user_item.rs index a231c2c63..05db19929 100644 --- a/apps/labrinth/src/database/models/user_item.rs +++ b/apps/labrinth/src/database/models/user_item.rs @@ -657,6 +657,18 @@ impl User { .execute(&mut **transaction) .await?; + sqlx::query!( + " + UPDATE charges + SET user_id = $1 + WHERE user_id = $2 + ", + deleted_user as UserId, + id as UserId, + ) + .execute(&mut **transaction) + .await?; + sqlx::query!( " DELETE FROM user_backup_codes diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index 4917d0547..e6f9ecd76 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -936,19 +936,26 @@ pub async fn transfer_ownership( let mut transaction = pool.begin().await?; // The following are the only places new_is_owner is modified. - TeamMember::edit_team_member( - id.into(), - current_user.id.into(), - None, - None, - None, - None, - None, - None, - Some(false), - &mut transaction, - ) - .await?; + if let Some(former_owner) = + TeamMember::get_from_team_full(id.into(), &**pool, &redis) + .await? + .into_iter() + .find(|x| x.is_owner) + { + TeamMember::edit_team_member( + id.into(), + former_owner.user_id, + None, + None, + None, + None, + None, + None, + Some(false), + &mut transaction, + ) + .await?; + } TeamMember::edit_team_member( id.into(), From 6c16688ca93fc1ab878d9e915246d78fa723dca8 Mon Sep 17 00:00:00 2001 From: Prospector Date: Sat, 12 Apr 2025 22:23:38 -0700 Subject: [PATCH 030/281] Remove notice limit --- apps/frontend/src/pages/admin/servers/notices.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/frontend/src/pages/admin/servers/notices.vue b/apps/frontend/src/pages/admin/servers/notices.vue index 14374c82f..153f8c5a7 100644 --- a/apps/frontend/src/pages/admin/servers/notices.vue +++ b/apps/frontend/src/pages/admin/servers/notices.vue @@ -47,7 +47,6 @@ id="scheduled-date" v-model="newNoticeScheduledDate" type="datetime-local" - maxlength="128" autocomplete="off" />
@@ -60,7 +59,6 @@ id="expiration-date" v-model="newNoticeExpiresDate" type="datetime-local" - maxlength="128" autocomplete="off" /> From 04659a8198f5f918cc17baf2ae896e1fc1921a6d Mon Sep 17 00:00:00 2001 From: Prospector <6166773+Prospector@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:58:31 -0700 Subject: [PATCH 031/281] Notices fixes and support for titles (#3508) * Notices fixes and support for titles * Lint --- .../ui/servers/notice/AssignNoticeModal.vue | 1 + .../ui/servers/notice/NoticeDashboardItem.vue | 1 + .../src/pages/admin/servers/notices.vue | 33 ++++++++++++++++--- .../src/pages/servers/manage/[id].vue | 1 + .../ui/src/components/base/ServerNotice.vue | 21 +++++++++++- packages/utils/types.ts | 1 + 6 files changed, 52 insertions(+), 6 deletions(-) diff --git a/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue b/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue index e57ac27aa..b7446c36f 100644 --- a/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue +++ b/apps/frontend/src/components/ui/servers/notice/AssignNoticeModal.vue @@ -114,6 +114,7 @@ defineExpose({ show, hide }); :level="notice.level" :message="notice.message" :dismissable="notice.dismissable" + :title="notice.title" preview />
diff --git a/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue b/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue index 434f3b85a..bae501e07 100644 --- a/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue +++ b/apps/frontend/src/components/ui/servers/notice/NoticeDashboardItem.vue @@ -85,6 +85,7 @@ const props = defineProps<{ :level="notice.level" :message="notice.message" :dismissable="notice.dismissable" + :title="notice.title" preview />
diff --git a/apps/frontend/src/pages/admin/servers/notices.vue b/apps/frontend/src/pages/admin/servers/notices.vue index 153f8c5a7..741695201 100644 --- a/apps/frontend/src/pages/admin/servers/notices.vue +++ b/apps/frontend/src/pages/admin/servers/notices.vue @@ -6,6 +6,18 @@ }}
+
+ + +
-
-