Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/frontend/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ Nuxt 3 with SSR — pages are server-rendered and hydrated on the client. Uses `

Rule of thumb: if it doesn't depend on Nuxt-specific APIs or website-only features, it should be in `packages/ui`.

### Project Review Language

Project-review code is English-only. Do not add i18n message definitions, translation keys, or translation helpers to project-review routes, components, providers, or supporting code, including review-only components outside `src/components/project-review/`. Use plain English strings, ordinary interpolation and plural handling, and English date/number formatting. This exception also applies during i18n passes. Preserve localization in shared components used elsewhere.

### Project Review Popout Windows

Project review panels can be displayed in multiple browser documents while sharing the main window's Vue application and JavaScript context. Use an anchor, panel, or event target's `ownerDocument` for DOM queries and its `defaultView` for window behavior. Global `document` and `window` still identify the main window after a panel moves.
Expand Down
28 changes: 9 additions & 19 deletions apps/frontend/src/components/project-review/description/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@
/>
<div class="mt-0.5 flex shrink-0 justify-end gap-1">
<template v-if="editing">
<Button type="quiet" size="xs" :disabled="saving" @click="resetEditing">
{{ formatMessage(commonMessages.cancelButton) }}
</Button>
<Button type="quiet" size="xs" :disabled="saving" @click="resetEditing"> Cancel </Button>
<Button
type="colored"
color="brand"
Expand All @@ -27,27 +25,23 @@
:disabled="!valid"
@click="save"
>
{{ formatMessage(commonMessages.saveButton) }}
Save
</Button>
</template>
<EditButton
v-else-if="project && !isLoading && !error"
:section="formatMessage(messages.description)"
section="Description"
:disabled="saving"
@click="startEditing"
/>
</div>
</div>
<div class="min-h-0 flex-1">
<p v-if="!selection" class="m-0 text-secondary">
{{ formatMessage(messages.empty) }}
</p>
<p v-else-if="isLoading" role="status" class="m-0">
{{ formatMessage(messages.loading) }}
</p>
<p v-if="!selection" class="m-0 text-secondary">No project selected</p>
<p v-else-if="isLoading" role="status" class="m-0">Loading...</p>
<div v-else-if="error" role="alert">
<p class="m-0">{{ formatMessage(messages.loadError) }}</p>
<Button @click="refresh">{{ formatMessage(messages.retry) }}</Button>
<p class="m-0">Could not load project data</p>
<Button @click="refresh">Retry</Button>
</div>
<div v-else-if="editing" class="flex min-h-full flex-col gap-2">
<TemplateMarkdownEditor
Expand All @@ -67,28 +61,24 @@
class="text-sm leading-tight"
:description="project.description"
/>
<p v-else class="m-0 text-secondary">
{{ formatMessage(messages.emptyDescription) }}
</p>
<p v-else class="m-0 text-secondary">No description</p>
</div>
</div>
</template>

<script setup lang="ts">
import { moderationSettings } from '@modrinth/moderation'
import { Button, commonMessages, ProjectPageDescription, useVIntl } from '@modrinth/ui'
import { Button, ProjectPageDescription } from '@modrinth/ui'
import { useTemplateRef } from 'vue'

import TemplateMarkdownEditor from '~/components/project-review/message-thread/template-markdown-editor.vue'
import { useModerationSettings } from '~/composables/moderation'
import { injectProjectReviewPageContext } from '~/providers/project-review'

import { projectReviewMessages as messages } from '../messages'
import EditButton from '../project-info/edit/button.vue'
import { useProjectTextEdit } from '../project-info/edit/use-project-text-edit'
import ReviewPanel from '../review-panel/index.vue'

const { formatMessage } = useVIntl()
const settings = useModerationSettings()
const interactionScope = useTemplateRef<HTMLElement>('interactionScope')
const { selection, isLoading, error, refresh } = injectProjectReviewPageContext()
Expand Down
17 changes: 7 additions & 10 deletions apps/frontend/src/components/project-review/disclosures/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
<div class="shrink-0 p-2">
<ReviewPanel mode="inline" :target="{ kind: 'disclosures' }" hide-title />
</div>
<p v-if="isPending" role="status">{{ formatMessage(statusMessages.loading) }}</p>
<p v-if="isPending" role="status">Loading disclosures…</p>
<div v-else-if="isError" role="alert">
<p>{{ formatMessage(statusMessages.loadError) }}</p>
<Button @click="refetch()">{{ formatMessage(statusMessages.retry) }}</Button>
<p>Could not load disclosures.</p>
<Button @click="refetch()">Retry</Button>
</div>
<EmptyState
v-else-if="!canEditDisclosures"
type="no-documents"
:heading="formatMessage(editorMessages.uploadVersionFirstHeading)"
:description="formatMessage(commonMessages.uploadVersionsEmptyStateDescription)"
heading="Upload versions before adding disclosures"
description="Come back once you've uploaded your versions."
/>
<template v-else>
<div class="min-h-0 flex-1 overflow-y-auto overscroll-contain px-2 pb-2 pt-3">
Expand All @@ -25,7 +25,7 @@
</div>
<div class="z-10 mt-auto shrink-0">
<p v-if="saveError" role="alert" class="text-red">
{{ formatMessage(statusMessages.saveError) }}
Could not save all disclosure changes. Your edits have been kept. Try saving again.
</p>
<UnsavedChangesPopup
inline
Expand All @@ -43,18 +43,15 @@
</template>

<script setup lang="ts">
import { Button, commonMessages, EmptyState, UnsavedChangesPopup, useVIntl } from '@modrinth/ui'
import { Button, EmptyState, UnsavedChangesPopup } from '@modrinth/ui'

import DisclosureCards from '~/components/ui/project-settings/disclosures/DisclosureCards.vue'
import { disclosureStatusMessages as statusMessages } from '~/components/ui/project-settings/disclosures/messages'
import { injectProjectReviewPageContext } from '~/providers/project-review'

import ReviewPanel from '../review-panel/index.vue'

const { formatMessage } = useVIntl()
const { project, disclosures } = injectProjectReviewPageContext()
const {
messages: editorMessages,
savedSnapshot,
currentSnapshot,
saving,
Expand Down
Loading
Loading