mirror of
https://github.com/modrinth/code.git
synced 2026-08-30 11:36:05 +00:00
* begin project disclosures * new project settings header * begin disclosure settings, edit content rules * togglecards * update phrasing of the rules, prepr * more disclosure settings structuring * add functionality toggle * implement functionality with staging api * improve project settings head titles * feat(labrinth): project disclosures model * feat(labrinth): project disclosures database model * feat(labrinth): project disclosures get endpoint * feat(labrinth): censor user ids if set by moderator * feat(labrinth): wrap disclosures in struct * feat(labrinth): edit project disclosures endpoint * style(labrinth): cargo fmt * style(labrinth): fix typo * feat(labrinth): add fields for ai content disclosure * fix(labrinth): field typo * chore(labrinth): update query cache * feat(labrinth): index disclosures in search * refactor(labrinth): use enum instead of bools * feat(labrinth): trigger incremental index on disclosure change * feat(labrinth): change archived status to disclosure * feat(labrinth): use disclosure for archival status * fix(labrinth): error type for deserialization * fix(labrinth): migration timestamp * fix(labrinth): add disclosures to elasticsearch schema * disclosures in search * update photosensitivity warning copy * update archiving, move general project settings to v3 (start redesign there), use project id lookups for stable cache keys, advanced in server search * blue archive banner * display AI use types * improve labels * add modrinth to link * add placeholder missing disclosure report type * add AI metadata checking to block image uploads with notice * update copy * update section 4 of rules * Update rule 6 layout * fix(labrinth): don't remove archival disclosure when changing status via v3 api * feat(labrinth): derive str for ai usages and telemtry consent * feat(labrinth): include ai usages and telemetry consent in disclosure types * Update moderation checklist (#7056) * fix: missing delphi severity (#7054) * Utils nav, new disclosures stage, ai button in rules * add prefix to collect * Finish up new disclosures stage * update r4 messages * new r4 msg, update showcase clarity message * fix: version upload failing to detect mrpack loader (#7063) * fix: mrpack exporting with zip64 (#7064) * fix: action bar max width (#7048) * fix: action bar max width * fix: width * changelog * Rule placeholders with subsections & anchors, update messages. * update new messages to account for new rule and placeholder layout * Add nag for content disclosures --------- Co-authored-by: ThatGravyBoat <gravy@thatgravyboat.tech> Co-authored-by: chyzman <chyzalt@gmail.com> Co-authored-by: Truman Gao <106889354+tdgao@users.noreply.github.com> Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com> * prepr * refactor(labrinth): move disclosure parsing to document creation * fix(labrinth): prevent removing moderator added archival disclosures * fix(labrinth): dedupe ai usages * fix(labrinth): auth logic on archived disclosure removal * feat(labrinth): add interactions field * style(labrinth): cargo fmt * feat(labrinth): granular disclosure locking * add 5.8, move 5.9, update messages and placeholders accordingly. * move disclosures stage earlier * include consent model info in telemetry disclosure msgs * prepr + update date * typo * qa pass * search suboptions * add empty state * checkboxes in column * persistent advanced filters * blog draft * prepr * support soft deletion * reload instead of optimistically updating * update blog * TOS update + minor verbiage adjustment * 45 day grace --------- Co-authored-by: sychic <47618543+Sychic@users.noreply.github.com> Co-authored-by: coolbot <76798835+coolbot100s@users.noreply.github.com> Co-authored-by: ThatGravyBoat <gravy@thatgravyboat.tech> Co-authored-by: chyzman <chyzalt@gmail.com> Co-authored-by: Truman Gao <106889354+tdgao@users.noreply.github.com>
101 lines
2.8 KiB
Vue
101 lines
2.8 KiB
Vue
<script setup lang="ts">
|
|
import { CircleDollarSignIcon, ListPlusIcon, XIcon } from '@modrinth/assets'
|
|
import {
|
|
Button,
|
|
commonMessages,
|
|
defineMessages,
|
|
IconButton,
|
|
SettingsFormGroup,
|
|
StyledInput,
|
|
useVIntl,
|
|
} from '@modrinth/ui'
|
|
import { watch } from 'vue'
|
|
|
|
import DisclosureToggleCard from './DisclosureToggleCard.vue'
|
|
import type { DisclosureCardMetaProps, DisclosureLockStatus, PaidFeaturesDisclosure } from './types'
|
|
|
|
const model = defineModel<PaidFeaturesDisclosure>({ required: true })
|
|
|
|
const props = defineProps<DisclosureCardMetaProps>()
|
|
|
|
const emit = defineEmits<{
|
|
setLockStatus: [status: DisclosureLockStatus]
|
|
}>()
|
|
|
|
const { formatMessage } = useVIntl()
|
|
|
|
const messages = defineMessages({
|
|
title: {
|
|
id: 'project.settings.disclosures.paid-features.title',
|
|
defaultMessage: 'Contains paid features',
|
|
},
|
|
description: {
|
|
id: 'project.settings.disclosures.paid-features.description',
|
|
defaultMessage:
|
|
'You must enable this if your project contains features that can be obtained by spending real-world money.',
|
|
},
|
|
featuresDescription: {
|
|
id: 'project.settings.disclosures.paid-features.features-description',
|
|
defaultMessage: 'List the types of paid features',
|
|
},
|
|
featurePlaceholder: {
|
|
id: 'project.settings.disclosures.paid-features.feature-placeholder',
|
|
defaultMessage: 'e.g. Cosmetics available as Patreon reward',
|
|
},
|
|
})
|
|
|
|
watch(
|
|
() => model.value.enabled,
|
|
(enabled) => {
|
|
if (enabled && model.value.features.length === 0) {
|
|
model.value.features = ['']
|
|
}
|
|
},
|
|
)
|
|
|
|
function addFeature() {
|
|
model.value.features = [...model.value.features, '']
|
|
}
|
|
|
|
function removeFeature(index: number) {
|
|
if (model.value.features.length <= 1) return
|
|
model.value.features = model.value.features.filter((_, i) => i !== index)
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<DisclosureToggleCard
|
|
v-bind="props"
|
|
v-model="model.enabled"
|
|
:icon="CircleDollarSignIcon"
|
|
:title="formatMessage(messages.title)"
|
|
:description="formatMessage(messages.description)"
|
|
@set-lock-status="emit('setLockStatus', $event)"
|
|
>
|
|
<template #expanded>
|
|
<SettingsFormGroup :title="formatMessage(messages.featuresDescription)">
|
|
<div v-for="(_, index) in model.features" :key="index" class="flex items-center gap-2">
|
|
<StyledInput
|
|
v-model="model.features[index]"
|
|
class="min-w-0 flex-1"
|
|
:disabled="disabled"
|
|
:placeholder="formatMessage(messages.featurePlaceholder)"
|
|
/>
|
|
<IconButton
|
|
v-if="model.features.length > 1"
|
|
:label="formatMessage(commonMessages.removeButton)"
|
|
:disabled="disabled"
|
|
@click="removeFeature(index)"
|
|
>
|
|
<XIcon />
|
|
</IconButton>
|
|
</div>
|
|
</SettingsFormGroup>
|
|
<Button class="w-fit" :disabled="disabled" @click="addFeature">
|
|
<ListPlusIcon />
|
|
{{ formatMessage(commonMessages.addAnotherButton) }}
|
|
</Button>
|
|
</template>
|
|
</DisclosureToggleCard>
|
|
</template>
|