Files
AstralRinth/apps/frontend/src/components/ui/create-project-version/components/VersionFileRow.vue
T
Truman Gao 61c8cd75cd feat: manage project versions v2 (#5049)
* update add files copy and go to next step on just one file

* rename and reorder stages

* add metadata stage and update details stage

* implement files inside metadata stage

* use regular prettier instead of prettier eslint

* remove changelog stage config

* save button on details stage

* update edit buttons in versions table

* add collapse environment selector

* implement dependencies list in metadata step

* move dependencies into provider

* add suggested dependencies to metadata stage

* pnpm prepr

* fix unused var

* Revert "add collapse environment selector"

This reverts commit f90fabc7a57ff201f26e1b628eeced8e6ef75865.

* hide resource pack loader only when its the only loader

* fix no dependencies for modpack

* add breadcrumbs with hide breadcrumb option

* wider stages

* add proper horizonal scroll breadcrumbs

* fix titles

* handle save version in version page

* remove box shadow

* add notification provider to storybook

* add drop area for versions to drop file right into page

* fix mobile versions table buttons overflowing

* pnpm prepr

* fix drop file opening modal in wrong stage

* implement invalid file for dropping files

* allow horizontal scroll on breadcrumbs

* update infer.js as best as possible

* add create version button uploading version state

* add extractVersionFromFilename for resource pack and datapack

* allow jars for datapack project

* detect multiple loaders when possible

* iris means compatible with optifine too

* infer environment on loader change as well

* add tooltip

* prevent navigate forward when cannot go to next step

* larger breadcrumb click targets

* hide loaders and mc versions stage until files added

* fix max width in header

* fix add files from metadata step jumping steps

* define width in NewModal instead

* disable remove dependency in metadata stage

* switch metadata and details buttons positions

* fix remove button spacing

* do not allow duplicate suggested dependencies

* fix version detection for fabric minecraft version semvar

* better verion number detection based on filename

* show resource pack loader but uneditable

* remove vanilla shader detection

* refactor: break up large infer.js into ts and modules

* remove duplicated types

* add fill missing from file name step

* pnpm prepr

* fix neoforge loader parse failing and not adding neoforge loader

* add missing pack formats

* handle new pack format

* pnpm prepr

* add another regex where it is version in anywhere in filename

* only show resource pack or data pack options for filetype on datapack project

* add redundant zip folder check

* reject RP and DP if has redundant folder

* fix hide stage in breadcrumb

* add snapshot group key in case no release version. brings out 26.1 snapshots

* pnpm prepr

* open in group if has something selected

* fix resource pack loader uneditable if accidentally selected on different project type

* add new environment tags

* add unknown and not applicable environment tags

* pnpm prepr

* use shared constant on labels

* use ref for timeout

* remove console logs

* remove box shadow only for cm-content

* feat: xhr upload + fix wrangler prettierignore

* fix: upload content type fix

* fix dependencies version width

* fix already added dependencies logic

* add changelog minheight

* set progress percentage on button

* add legacy fabric detection logic

* lint

* small update on create version button label

---------

Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-01-12 19:41:14 +00:00

127 lines
4.1 KiB
Vue

<template>
<div
class="flex items-center justify-between gap-2 rounded-xl bg-button-bg px-4 py-2 text-button-text"
>
<div class="flex items-center gap-2 overflow-hidden">
<div class="grid h-5 min-h-5 w-5 min-w-5 place-content-center rounded-full bg-green">
<CheckIcon class="text-sm text-black" />
</div>
<span v-tooltip="name" class="overflow-hidden text-ellipsis whitespace-nowrap font-medium">
{{ name }}
</span>
</div>
<div class="flex items-center gap-1">
<template v-if="!isPrimary">
<div class="w-36">
<Combobox
v-model="selectedType"
:searchable="false"
class="rounded-xl border border-solid border-surface-5 text-sm"
:options="versionTypes"
:close-on-select="true"
:show-labels="false"
:allow-empty="false"
@update:model-value="emitFileTypeChange"
/>
</div>
</template>
<ButtonStyled v-if="onRemove" size="standard" :circular="true">
<button aria-label="Remove file" class="!shadow-none" @click="onRemove">
<XIcon aria-hidden="true" />
</button>
</ButtonStyled>
<ButtonStyled v-if="isPrimary" size="standard" :circular="true">
<button
v-tooltip="
editingVersion
? 'Primary file cannot be changed after version is uploaded'
: 'Replace primary file'
"
aria-label="Change primary file"
class="!shadow-none"
:disabled="editingVersion"
@click="primaryFileInput?.click()"
>
<ArrowLeftRightIcon aria-hidden="true" />
<input
ref="primaryFileInput"
class="hidden"
type="file"
:accept="acceptFileFromProjectType(projectV2.project_type)"
:disabled="editingVersion"
@change="
(e) => {
emit('setPrimaryFile', (e.target as HTMLInputElement)?.files?.[0])
;(e.target as HTMLInputElement).value = ''
}
"
/>
</button>
</ButtonStyled>
</div>
</div>
</template>
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import { ArrowLeftRightIcon, CheckIcon, XIcon } from '@modrinth/assets'
import { ButtonStyled, Combobox, injectProjectPageContext } from '@modrinth/ui'
import type { ComboboxOption } from '@modrinth/ui/src/components/base/Combobox.vue'
import { acceptFileFromProjectType } from '@modrinth/utils'
import {
fileTypeLabels,
injectManageVersionContext,
} from '~/providers/version/manage-version-modal'
const { projectV2 } = injectProjectPageContext()
const { projectType } = injectManageVersionContext()
const emit = defineEmits<{
(e: 'setPrimaryFile', file?: File): void
(e: 'setFileType', type: Labrinth.Versions.v3.FileType): void
}>()
const { name, isPrimary, onRemove, initialFileType, editingVersion } = defineProps<{
name: string
isPrimary: boolean
onRemove?: () => void
initialFileType?: Labrinth.Versions.v3.FileType | 'primary'
editingVersion: boolean
}>()
const selectedType = ref<Labrinth.Versions.v3.FileType | 'primary'>(initialFileType || 'unknown')
const primaryFileInput = ref<HTMLInputElement>()
const isDatapackProject = computed(() => projectType.value === 'datapack')
const versionTypes = computed(
() =>
[
!editingVersion && { class: 'text-sm', value: 'primary', label: fileTypeLabels.primary },
{ class: 'text-sm', value: 'unknown', label: fileTypeLabels.unknown },
isDatapackProject.value && {
class: 'text-sm',
value: 'required-resource-pack',
label: fileTypeLabels['required-resource-pack'],
},
isDatapackProject.value && {
class: 'text-sm',
value: 'optional-resource-pack',
label: fileTypeLabels['optional-resource-pack'],
},
{ class: 'text-sm', value: 'sources-jar', label: fileTypeLabels['sources-jar'] },
{ class: 'text-sm', value: 'dev-jar', label: fileTypeLabels['dev-jar'] },
{ class: 'text-sm', value: 'javadoc-jar', label: fileTypeLabels['javadoc-jar'] },
{ class: 'text-sm', value: 'signature', label: fileTypeLabels.signature },
].filter(Boolean) as ComboboxOption<Labrinth.Versions.v3.FileType | 'primary'>[],
)
function emitFileTypeChange() {
if (selectedType.value === 'primary') emit('setPrimaryFile')
else emit('setFileType', selectedType.value)
}
</script>