Skip to content

Commit 38ada32

Browse files
committed
feat: remove teleport dropdown modal in favour of new combobox component
1 parent 03ea910 commit 38ada32

File tree

16 files changed

+182
-265
lines changed

16 files changed

+182
-265
lines changed

apps/app-frontend/src/components/ui/instance_settings/InstallationSettings.vue

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import {
1515
ButtonStyled,
1616
Checkbox,
1717
Chips,
18+
Combobox,
1819
injectNotificationManager,
19-
TeleportDropdownMenu,
2020
} from '@modrinth/ui'
2121
import {
2222
formatCategory,
@@ -158,6 +158,21 @@ const selectableGameVersionNumbers = computed(() => {
158158
.map((x) => x.version)
159159
})
160160
161+
const gameVersionOptions = computed(() =>
162+
(selectableGameVersionNumbers.value ?? []).map((v) => ({ value: v, label: v })),
163+
)
164+
165+
const loaderVersionOptions = computed(() =>
166+
(selectableLoaderVersions.value ?? []).map((opt, index) => ({ value: index, label: opt.id })),
167+
)
168+
169+
const loaderVersionLabel = computed(() => {
170+
const idx = loaderVersionIndex.value
171+
return idx >= 0 && selectableLoaderVersions.value
172+
? selectableLoaderVersions.value[idx]?.id
173+
: 'Select version'
174+
})
175+
161176
const selectableLoaderVersions: ComputedRef<ManifestLoaderVersion[] | undefined> = computed(() => {
162177
if (gameVersion.value) {
163178
if (loader.value === 'fabric') {
@@ -647,11 +662,11 @@ const messages = defineMessages({
647662
{{ formatMessage(messages.gameVersion) }}
648663
</h2>
649664
<div class="flex flex-wrap mt-2 gap-2">
650-
<TeleportDropdownMenu
665+
<Combobox
651666
v-if="selectableGameVersionNumbers !== undefined"
652667
v-model="gameVersion"
653-
:options="selectableGameVersionNumbers"
654-
name="Game Version Dropdown"
668+
:options="gameVersionOptions"
669+
:display-value="gameVersion || formatMessage(messages.unknownVersion)"
655670
/>
656671
<Checkbox
657672
v-if="hasSnapshots"
@@ -663,14 +678,13 @@ const messages = defineMessages({
663678
<h2 class="m-0 mt-4 text-lg font-extrabold text-contrast block">
664679
{{ formatMessage(messages.loaderVersion, { loader: formatCategory(loader) }) }}
665680
</h2>
666-
<TeleportDropdownMenu
681+
<Combobox
667682
v-if="selectableLoaderVersions"
668-
:model-value="selectableLoaderVersions[loaderVersionIndex]"
669-
:options="selectableLoaderVersions"
670-
:display-name="(option: ManifestLoaderVersion) => option?.id"
683+
v-model="loaderVersionIndex"
684+
:options="loaderVersionOptions"
685+
:display-value="loaderVersionLabel"
671686
name="Version selector"
672687
class="mt-2"
673-
@change="(value) => (loaderVersionIndex = value.index)"
674688
/>
675689
<div v-else class="mt-2 text-brand-red flex gap-2 items-center">
676690
<IssuesIcon />

apps/app-frontend/src/components/ui/settings/AppearanceSettings.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { TeleportDropdownMenu, ThemeSelector, Toggle } from '@modrinth/ui'
2+
import { Combobox, ThemeSelector, Toggle } from '@modrinth/ui'
33
import { ref, watch } from 'vue'
44
55
import { get, set } from '@/helpers/settings.ts'
@@ -50,7 +50,7 @@ watch(
5050
:model-value="themeStore.advancedRendering"
5151
@update:model-value="
5252
(e) => {
53-
themeStore.advancedRendering = e
53+
themeStore.advancedRendering = !!e
5454
settings.advanced_rendering = themeStore.advancedRendering
5555
}
5656
"
@@ -86,12 +86,13 @@ watch(
8686
<h2 class="m-0 text-lg font-extrabold text-contrast">Default landing page</h2>
8787
<p class="m-0 mt-1">Change the page to which the launcher opens on.</p>
8888
</div>
89-
<TeleportDropdownMenu
89+
<Combobox
9090
id="opening-page"
9191
v-model="settings.default_page"
9292
name="Opening page dropdown"
9393
class="w-40"
94-
:options="['Home', 'Library']"
94+
:options="['Home', 'Library'].map((v) => ({ value: v, label: v }))"
95+
:display-value="settings.default_page ?? 'Select an option'"
9596
/>
9697
</div>
9798

@@ -122,7 +123,7 @@ watch(
122123
:model-value="settings.toggle_sidebar"
123124
@update:model-value="
124125
(e) => {
125-
settings.toggle_sidebar = e
126+
settings.toggle_sidebar = !!e
126127
themeStore.toggleSidebar = settings.toggle_sidebar
127128
}
128129
"

apps/app-frontend/src/components/ui/world/modal/ServerModalBody.vue

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { TeleportDropdownMenu } from '@modrinth/ui'
2+
import { Combobox } from '@modrinth/ui'
33
import { defineMessages, type MessageDescriptor, useVIntl } from '@vintl/vintl'
44
55
import type { ServerPackStatus } from '@/helpers/worlds.ts'
@@ -74,12 +74,19 @@ defineExpose({ resourcePackOptions })
7474
{{ formatMessage(messages.resourcePack) }}
7575
</h2>
7676
<div>
77-
<TeleportDropdownMenu
77+
<Combobox
7878
v-model="resourcePack"
79-
:options="resourcePackOptions"
79+
:options="
80+
resourcePackOptions.map((o) => ({
81+
value: o,
82+
label: formatMessage(resourcePackOptionMessages[o]),
83+
}))
84+
"
8085
name="Server resource pack"
81-
:display-name="
82-
(option: ServerPackStatus) => formatMessage(resourcePackOptionMessages[option])
86+
:display-value="
87+
resourcePack
88+
? formatMessage(resourcePackOptionMessages[resourcePack])
89+
: 'Select an option'
8390
"
8491
/>
8592
</div>

apps/frontend/src/components/ui/NavStack.vue

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
<template>
22
<nav :aria-label="ariaLabel" class="w-full">
3-
<ul
4-
class="border-surface-4 bg-surface-1 m-0 flex list-none flex-col items-start gap-1.5 rounded-2xl border border-solid p-4"
5-
>
3+
<ul class="m-0 flex list-none flex-col items-start gap-1.5 rounded-2xl bg-bg-raised p-4">
64
<slot v-if="hasSlotContent" />
75

86
<template v-else>
97
<li v-for="(item, idx) in items" :key="getKey(item, idx)" class="contents">
10-
<hr v-if="isSeparator(item)" class="border-surface-4 my-1 w-full border-t border-solid" />
8+
<hr v-if="isSeparator(item)" class="my-1 w-full border-t border-solid" />
119

1210
<div
1311
v-else-if="isHeading(item)"
@@ -27,7 +25,7 @@
2725
aria-hidden="true"
2826
class="h-5 w-5 shrink-0"
2927
/>
30-
<span>{{ item.label }}</span>
28+
<span class="text-contrast">{{ item.label }}</span>
3129
<span
3230
v-if="item.badge != null"
3331
class="rounded-full bg-brand-highlight px-2 text-sm font-bold text-brand"
@@ -49,7 +47,7 @@
4947
aria-hidden="true"
5048
class="h-5 w-5 shrink-0"
5149
/>
52-
<span>{{ item.label }}</span>
50+
<span class="text-contrast">{{ item.label }}</span>
5351
<span
5452
v-if="item.badge != null"
5553
class="rounded-full bg-brand-highlight px-2 text-sm font-bold text-brand"

apps/frontend/src/components/ui/dashboard/CreatorWithdrawModal.vue

Lines changed: 10 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
class="my-auto size-4 text-secondary"
7777
/>
7878
</div>
79-
<FancyDropdown
79+
<Combobox
8080
:listbox="true"
8181
:searchable="true"
8282
v-model="countryId"
@@ -89,7 +89,7 @@
8989
<span>Withdraw to</span><span class="text-brand-red">*</span>
9090
</div>
9191
<div class="relative">
92-
<FancyDropdown
92+
<Combobox
9393
:listbox="true"
9494
v-model="paymentMethodId"
9595
class="payment-method-select w-full"
@@ -98,75 +98,7 @@
9898
:displayValue="
9999
paymentMethod ? formatPaymentMethodName(paymentMethod) : 'Select method...'
100100
"
101-
>
102-
<template #extra>
103-
<div v-if="paymentMethod && showPaymentDetails" class="w-full">
104-
<div class="flex items-center justify-between text-sm">
105-
<span class="text-primary">{{ paymentAccountDisplay }}</span>
106-
<button
107-
@click="editPaymentMethod"
108-
class="flex items-center gap-1 text-primary hover:text-contrast"
109-
>
110-
<span>Change</span>
111-
<EditIcon class="h-4 w-4" />
112-
</button>
113-
</div>
114-
</div>
115-
116-
<div v-else-if="paymentMethod && isPayPalSelected" class="flex w-full flex-col gap-2">
117-
<div class="flex items-center gap-2">
118-
<ButtonStyled color="brand">
119-
<button @click="verifyPayPal" :disabled="isVerifying">
120-
Sign in with PayPal
121-
</button>
122-
</ButtonStyled>
123-
<button
124-
v-if="hasLinkedPayPal"
125-
class="text-sm text-secondary underline-offset-2 hover:underline"
126-
@click="cancelEditingLink"
127-
>
128-
Cancel
129-
</button>
130-
</div>
131-
<p class="text-xs text-secondary">
132-
We'll redirect you to PayPal to connect your account.
133-
</p>
134-
</div>
135-
136-
<div v-else-if="paymentMethod && isVenmoSelected" class="flex w-full flex-col gap-2">
137-
<label for="venmo-handle" class="text-sm text-primary">Venmo username</label>
138-
<input
139-
id="venmo-handle"
140-
v-model="venmoHandle"
141-
type="text"
142-
autocomplete="off"
143-
placeholder="@username"
144-
class="rounded-xl border border-divider bg-button-bg px-3 py-2 text-sm focus:outline-none"
145-
/>
146-
<div class="flex items-center gap-2">
147-
<ButtonStyled color="standard">
148-
<button @click="verifyVenmo" :disabled="isVerifying || !venmoHandleValid">
149-
Verify
150-
</button>
151-
</ButtonStyled>
152-
<button
153-
v-if="hasLinkedVenmo"
154-
class="text-sm text-secondary underline-offset-2 hover:underline"
155-
@click="cancelEditingLink"
156-
>
157-
Cancel
158-
</button>
159-
</div>
160-
<p class="text-xs text-secondary">
161-
Enter your Venmo username. We'll save it to your account.
162-
</p>
163-
</div>
164-
165-
<div v-else class="text-sm text-secondary">
166-
Tremendous™️ will contact you with redeem instructions using your Modrinth email.
167-
</div>
168-
</template>
169-
</FancyDropdown>
101+
/>
170102
</div>
171103

172104
<div class="flex gap-1 align-middle text-lg font-semibold text-contrast">
@@ -250,19 +182,23 @@
250182
import {
251183
CheckIcon,
252184
ChevronRightIcon,
253-
EditIcon,
254185
FileTextIcon,
255186
TransferIcon,
256187
UnknownIcon,
257188
XIcon,
258189
} from '@modrinth/assets'
259-
import { Admonition, ButtonStyled, NewModal, injectNotificationManager } from '@modrinth/ui'
190+
import {
191+
Admonition,
192+
ButtonStyled,
193+
Combobox,
194+
NewModal,
195+
injectNotificationManager,
196+
} from '@modrinth/ui'
260197
import { formatMoney } from '@modrinth/utils'
261198
import { all } from 'iso-3166-1'
262199
import type { CSSProperties } from 'vue'
263200
import { getAuthUrl } from '~/composables/auth.js'
264201
import CreatorTaxFormModal from './CreatorTaxFormModal.vue'
265-
import FancyDropdown from './FancyDropdown.vue'
266202
267203
const { addNotification, handleError } = injectNotificationManager()
268204

apps/frontend/src/components/ui/servers/BackupSettingsModal.vue

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@
2727
</p>
2828
</div>
2929

30-
<TeleportDropdownMenu
30+
<Combobox
3131
:id="'interval-field'"
3232
v-model="backupIntervalsLabel"
3333
:disabled="!autoBackupEnabled || isSaving"
3434
name="interval"
35-
:options="Object.keys(backupIntervals)"
36-
placeholder="Backup interval"
35+
:options="Object.keys(backupIntervals).map((k) => ({ value: k, label: k }))"
36+
:display-value="backupIntervalsLabel"
3737
/>
3838

3939
<div class="mt-4 flex justify-start gap-4">
@@ -57,12 +57,7 @@
5757

5858
<script setup lang="ts">
5959
import { SaveIcon, XIcon } from '@modrinth/assets'
60-
import {
61-
ButtonStyled,
62-
injectNotificationManager,
63-
NewModal,
64-
TeleportDropdownMenu,
65-
} from '@modrinth/ui'
60+
import { ButtonStyled, Combobox, injectNotificationManager, NewModal } from '@modrinth/ui'
6661
import { computed, ref } from 'vue'
6762
6863
import type { ModrinthServer } from '~/composables/servers/modrinth-servers.ts'

apps/frontend/src/components/ui/servers/ContentVersionEditModal.vue

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,24 @@
6060
</NuxtLink>
6161
</div>
6262
</div>
63-
<TeleportDropdownMenu
63+
<Combobox
6464
v-model="selectedVersion"
6565
name="Project"
66-
:options="filteredVersions"
67-
placeholder="No valid versions found"
66+
:options="
67+
filteredVersions.map((v) => ({
68+
value: v,
69+
label: typeof v === 'object' ? v.version_number : String(v),
70+
}))
71+
"
72+
:display-value="
73+
selectedVersion
74+
? typeof selectedVersion === 'object'
75+
? selectedVersion.version_number
76+
: String(selectedVersion)
77+
: 'No valid versions found'
78+
"
6879
class="!min-w-full"
6980
:disabled="filteredVersions.length === 0"
70-
:display-name="
71-
(version) => (typeof version === 'object' ? version?.version_number : version)
72-
"
7381
/>
7482
<Checkbox v-model="showBetaAlphaReleases"> Show any beta and alpha releases </Checkbox>
7583
</template>
@@ -237,14 +245,7 @@ import {
237245
LockOpenIcon,
238246
XIcon,
239247
} from '@modrinth/assets'
240-
import {
241-
Admonition,
242-
Avatar,
243-
ButtonStyled,
244-
CopyCode,
245-
NewModal,
246-
TeleportDropdownMenu,
247-
} from '@modrinth/ui'
248+
import { Admonition, Avatar, ButtonStyled, Combobox, CopyCode, NewModal } from '@modrinth/ui'
248249
import TagItem from '@modrinth/ui/src/components/base/TagItem.vue'
249250
import { formatCategory, formatVersionsForDisplay, type Mod, type Version } from '@modrinth/utils'
250251
import { computed, ref } from 'vue'

0 commit comments

Comments
 (0)