From 359fbd47382e73bbb3015fa25625aa9be4ada918 Mon Sep 17 00:00:00 2001 From: IMB11 Date: Fri, 11 Jul 2025 17:09:04 +0100 Subject: [PATCH] feat: moderation improvements (#3881) * feat: rough draft of tool * fix: example doc * feat: multiselect chips * feat: conditional actions+messaages + utils for handling conditions * feat: migrate checklist v1 to new format. * fix: lint issues * fix: severity util * feat: README.md * feat: start implementing new moderation checklist * feat: message assembly + fix imports * fix: lint issues * feat: add input suggestions * feat: utility cleanup * fix: icon * chore: remove debug logging * chore: remove debug button * feat: modpack permissions flow into it's own component * feat: icons + use id in stage selection button * Support md/plain text in stages. * fix: checklist not persisting/showing on subpages * feat: message gen + appr/with/deny buttons * feat: better notification placement + queue navigation * fix: default props for futureProjects * fix: modpack perms message * fix: issue with future projects props * fix: tab index + z index fixes * feat: keybinds * fix: file approval types * fix: generate message for non-modpack projects * feat: add generate message to stages dropdown * fix: variables not expanding * feat: requests * fix: empty message approval * fix: issues from sync * chore: add comment for old moderation checklist impl * fix: git artifacts * fix: update visibility logic for stages and actions * fix: cleanup logic for should show * fix: markdown editor accidental edit --- apps/frontend/package.json | 1 + .../src/components/ui/Notifications.vue | 15 +- .../ui/moderation/ChecklistKeybindsModal.vue | 116 ++ .../ui/moderation/ModpackPermissionsFlow.vue | 424 ++++++ .../ui/moderation/NewModerationChecklist.vue | 1246 +++++++++++++++++ apps/frontend/src/composables/util.ts | 12 + apps/frontend/src/pages/[type]/[id].vue | 67 +- apps/frontend/src/pages/moderation/review.vue | 5 +- packages/assets/generated-icons.ts | 8 + packages/assets/icons/book-open.svg | 1 + packages/assets/icons/brush-cleaning.svg | 9 + packages/assets/icons/keyboard.svg | 1 + packages/assets/icons/triangle-alert.svg | 7 + packages/moderation/.eslintrc.js | 7 + packages/moderation/LICENSE | 674 +++++++++ packages/moderation/README.md | 149 ++ packages/moderation/data/checklist.ts | 28 + packages/moderation/data/keybinds.ts | 45 + .../data/messages/categories/inaccurate.md | 3 + .../data/messages/copyright/reupload.md | 7 + .../messages/description/headers-as-body.md | 7 + .../data/messages/description/image-only.md | 9 + .../description/insufficient-packs.md | 8 + .../description/insufficient-projects.md | 8 + .../data/messages/description/insufficient.md | 7 + .../data/messages/description/non-english.md | 5 + .../messages/description/non-standard-text.md | 7 + .../data/messages/description/unfinished.md | 7 + .../data/messages/gallery/insufficient.md | 8 + .../data/messages/gallery/not-relevant.md | 3 + .../moderation/data/messages/links/misused.md | 3 + .../messages/links/not-accessible-other.md | 5 + .../messages/links/not-accessible-source.md | 5 + .../moderation/data/messages/rule-breaking.md | 5 + .../messages/side-types/inaccurate-mod.md | 9 + .../messages/side-types/inaccurate-modpack.md | 10 + .../moderation/data/messages/slug/misused.md | 3 + .../data/messages/summary/formatting.md | 7 + .../data/messages/summary/insufficient.md | 5 + .../data/messages/summary/non-english.md | 5 + .../data/messages/summary/repeat-title.md | 7 + .../data/messages/title/minecraft-branding.md | 7 + .../data/messages/title/similarities.md | 3 + .../data/messages/title/useless-info.md | 7 + .../versions/incorrect-additional-files.md | 7 + .../messages/versions/invalid-modpacks.md | 3 + .../versions/invalid-resourcepacks.md | 3 + .../data/modpack-permissions-stage.ts | 25 + packages/moderation/data/stages/categories.ts | 24 + packages/moderation/data/stages/copyright.ts | 37 + .../moderation/data/stages/description.ts | 107 ++ packages/moderation/data/stages/gallery.ts | 33 + packages/moderation/data/stages/links.ts | 49 + .../moderation/data/stages/rule-following.ts | 32 + packages/moderation/data/stages/side-types.ts | 36 + packages/moderation/data/stages/slug.ts | 23 + packages/moderation/data/stages/summary.ts | 50 + packages/moderation/data/stages/title.ts | 41 + packages/moderation/data/stages/versions.ts | 46 + packages/moderation/index.ts | 8 + packages/moderation/package.json | 21 + packages/moderation/tsconfig.json | 10 + packages/moderation/types/actions.ts | 245 ++++ packages/moderation/types/keybinds.ts | 130 ++ packages/moderation/types/messages.ts | 13 + packages/moderation/types/stage.ts | 52 + packages/moderation/utils.ts | 275 ++++ packages/moderation/vite-env.d.ts | 4 + .../ui/src/components/base/MarkdownEditor.vue | 4 + .../ui/src/components/base/OverflowMenu.vue | 2 +- packages/ui/src/components/index.ts | 1 + packages/utils/types.ts | 68 + pnpm-lock.yaml | 25 + 73 files changed, 4337 insertions(+), 12 deletions(-) create mode 100644 apps/frontend/src/components/ui/moderation/ChecklistKeybindsModal.vue create mode 100644 apps/frontend/src/components/ui/moderation/ModpackPermissionsFlow.vue create mode 100644 apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue create mode 100644 apps/frontend/src/composables/util.ts create mode 100644 packages/assets/icons/book-open.svg create mode 100644 packages/assets/icons/brush-cleaning.svg create mode 100644 packages/assets/icons/keyboard.svg create mode 100644 packages/assets/icons/triangle-alert.svg create mode 100644 packages/moderation/.eslintrc.js create mode 100644 packages/moderation/LICENSE create mode 100644 packages/moderation/README.md create mode 100644 packages/moderation/data/checklist.ts create mode 100644 packages/moderation/data/keybinds.ts create mode 100644 packages/moderation/data/messages/categories/inaccurate.md create mode 100644 packages/moderation/data/messages/copyright/reupload.md create mode 100644 packages/moderation/data/messages/description/headers-as-body.md create mode 100644 packages/moderation/data/messages/description/image-only.md create mode 100644 packages/moderation/data/messages/description/insufficient-packs.md create mode 100644 packages/moderation/data/messages/description/insufficient-projects.md create mode 100644 packages/moderation/data/messages/description/insufficient.md create mode 100644 packages/moderation/data/messages/description/non-english.md create mode 100644 packages/moderation/data/messages/description/non-standard-text.md create mode 100644 packages/moderation/data/messages/description/unfinished.md create mode 100644 packages/moderation/data/messages/gallery/insufficient.md create mode 100644 packages/moderation/data/messages/gallery/not-relevant.md create mode 100644 packages/moderation/data/messages/links/misused.md create mode 100644 packages/moderation/data/messages/links/not-accessible-other.md create mode 100644 packages/moderation/data/messages/links/not-accessible-source.md create mode 100644 packages/moderation/data/messages/rule-breaking.md create mode 100644 packages/moderation/data/messages/side-types/inaccurate-mod.md create mode 100644 packages/moderation/data/messages/side-types/inaccurate-modpack.md create mode 100644 packages/moderation/data/messages/slug/misused.md create mode 100644 packages/moderation/data/messages/summary/formatting.md create mode 100644 packages/moderation/data/messages/summary/insufficient.md create mode 100644 packages/moderation/data/messages/summary/non-english.md create mode 100644 packages/moderation/data/messages/summary/repeat-title.md create mode 100644 packages/moderation/data/messages/title/minecraft-branding.md create mode 100644 packages/moderation/data/messages/title/similarities.md create mode 100644 packages/moderation/data/messages/title/useless-info.md create mode 100644 packages/moderation/data/messages/versions/incorrect-additional-files.md create mode 100644 packages/moderation/data/messages/versions/invalid-modpacks.md create mode 100644 packages/moderation/data/messages/versions/invalid-resourcepacks.md create mode 100644 packages/moderation/data/modpack-permissions-stage.ts create mode 100644 packages/moderation/data/stages/categories.ts create mode 100644 packages/moderation/data/stages/copyright.ts create mode 100644 packages/moderation/data/stages/description.ts create mode 100644 packages/moderation/data/stages/gallery.ts create mode 100644 packages/moderation/data/stages/links.ts create mode 100644 packages/moderation/data/stages/rule-following.ts create mode 100644 packages/moderation/data/stages/side-types.ts create mode 100644 packages/moderation/data/stages/slug.ts create mode 100644 packages/moderation/data/stages/summary.ts create mode 100644 packages/moderation/data/stages/title.ts create mode 100644 packages/moderation/data/stages/versions.ts create mode 100644 packages/moderation/index.ts create mode 100644 packages/moderation/package.json create mode 100644 packages/moderation/tsconfig.json create mode 100644 packages/moderation/types/actions.ts create mode 100644 packages/moderation/types/keybinds.ts create mode 100644 packages/moderation/types/messages.ts create mode 100644 packages/moderation/types/stage.ts create mode 100644 packages/moderation/utils.ts create mode 100644 packages/moderation/vite-env.d.ts diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 3c395e55c..21cb1752e 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -41,6 +41,7 @@ "@modrinth/ui": "workspace:*", "@modrinth/utils": "workspace:*", "@modrinth/blog": "workspace:*", + "@modrinth/moderation": "workspace:*", "@pinia/nuxt": "^0.5.1", "@types/three": "^0.172.0", "@vintl/vintl": "^4.4.1", diff --git a/apps/frontend/src/components/ui/Notifications.vue b/apps/frontend/src/components/ui/Notifications.vue index eae6faace..ebb43c2e0 100644 --- a/apps/frontend/src/components/ui/Notifications.vue +++ b/apps/frontend/src/components/ui/Notifications.vue @@ -1,7 +1,10 @@ + + + + diff --git a/apps/frontend/src/components/ui/moderation/ModpackPermissionsFlow.vue b/apps/frontend/src/components/ui/moderation/ModpackPermissionsFlow.vue new file mode 100644 index 000000000..ff5db66ac --- /dev/null +++ b/apps/frontend/src/components/ui/moderation/ModpackPermissionsFlow.vue @@ -0,0 +1,424 @@ + + + + + diff --git a/apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue b/apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue new file mode 100644 index 000000000..c8ccab6ff --- /dev/null +++ b/apps/frontend/src/components/ui/moderation/NewModerationChecklist.vue @@ -0,0 +1,1246 @@ + + + + + diff --git a/apps/frontend/src/composables/util.ts b/apps/frontend/src/composables/util.ts new file mode 100644 index 000000000..5bf1f4dd8 --- /dev/null +++ b/apps/frontend/src/composables/util.ts @@ -0,0 +1,12 @@ +export const useNotificationRightwards = () => { + const isVisible = useState("moderation-checklist-notifications", () => false); + + const setVisible = (visible: boolean) => { + isVisible.value = visible; + }; + + return { + isVisible: readonly(isVisible), + setVisible, + }; +}; diff --git a/apps/frontend/src/pages/[type]/[id].vue b/apps/frontend/src/pages/[type]/[id].vue index cf25969bf..0b51f73bb 100644 --- a/apps/frontend/src/pages/[type]/[id].vue +++ b/apps/frontend/src/pages/[type]/[id].vue @@ -470,10 +470,14 @@ class="new-page sidebar" :class="{ 'alt-layout': cosmetics.leftContentLayout, - 'ultimate-sidebar': + 'checklist-open': showModerationChecklist && !collapsedModerationChecklist && !flags.alwaysShowChecklistAsPopup, + 'checklist-collapsed': + showModerationChecklist && + collapsedModerationChecklist && + !flags.alwaysShowChecklistAsPopup, }" >
@@ -878,7 +882,8 @@ />
- +
+
+ +