You've already forked AstralRinth
forked from didirus/AstralRinth
* fix(content): changing mod versions works again * chore(assets): update pyro logo * fix(properties): deprecate fetchconfigfile * Revert "fix(content): changing mod versions works again" This reverts commit d7c0d1196f8c1850fd7ccbc1644941c6db4dc306. * feat(files): ability to sort via column click * chore(startup): update clunky wording * feat(serverListing): server icons SSR friendly * fix(servers): if archon fails, display err in listing * chore(serverlisting): use pyroserver hook to init icon * chore(servers): much more graceful reinstall * fix(servers): tw warn * fix(platform): correctly react when pack reinstalled * fix(serversroot): explicitly import navigateTo Signed-off-by: Evan Song <theevansong@gmail.com> * chore(serverlabels): show skeleton instead of hiding Signed-off-by: Evan Song <theevansong@gmail.com> * feat(platform): install-aware controls Signed-off-by: Evan Song <theevansong@gmail.com> * refactor!(platform): rewrite platform page * fix(platform): regression in autoselecting loader * chore(platform): prefer version over project modification date * fix(platform): permanent hang after initial mount * chore(platform): do not silently fail and hang if modpack fails loading * oops: remove hardcoded error causer * fix(platform): switch modpack btn while installing doesnt need class Signed-off-by: Evan Song <theevansong@gmail.com> * chore(platform): adjust styling in version modal Signed-off-by: Evan Song <theevansong@gmail.com> * chore(platform): prevent changing project card style Signed-off-by: Evan Song <theevansong@gmail.com> * refactor(pyrodropdown): rewrite Signed-off-by: Evan Song <theevansong@gmail.com> * fix(pyrodropdown): do nopt use deprecated substr Signed-off-by: Evan Song <theevansong@gmail.com> * chore: clean Signed-off-by: Evan Song <theevansong@gmail.com> * fix(network): sentence case Signed-off-by: Evan Song <theevansong@gmail.com> * refactor(terminal): initial batch Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): fulllog over fullscreen Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): fullscreen conflict with body scroll Signed-off-by: Evan Song <theevansong@gmail.com> * feat(terminal): init drag select * feat(terminal): shift click support Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): double lines limit Signed-off-by: Evan Song <theevansong@gmail.com> * feat(terminal): copy button Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): protip style Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): improve styles Signed-off-by: Evan Song <theevansong@gmail.com> * feat(terminal): regex search Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): move icons to icons dir Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): improve drag select autoscroll inertia Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): cancel selection on right click Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): progblur and stb btn disappearing Signed-off-by: Evan Song <theevansong@gmail.com> * refactor(serverstats): power efficiency * fix(subdomainlabel): correct tooltip terminology Signed-off-by: Evan Song <theevansong@gmail.com> * feat(preferences): users hide subdomain label Signed-off-by: Evan Song <theevansong@gmail.com> * chore(servers): clean Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): deselect lines on escape Signed-off-by: Evan Song <theevansong@gmail.com> * fix(serversidebar): type err Signed-off-by: Evan Song <theevansong@gmail.com> * fix(fileitem): vue server render type Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): disable pointer events on lines if scrolling Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): search result counts style Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): plural Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): clean Signed-off-by: Evan Song <theevansong@gmail.com> * feat(terminal): view selection Signed-off-by: Evan Song <theevansong@gmail.com> * feat(terminal): show actively selected lines in scrollbar Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminallog): btn color Signed-off-by: Evan Song <theevansong@gmail.com> * chore: clean Signed-off-by: Evan Song <theevansong@gmail.com> * fix(gamelabel): align to text Signed-off-by: Evan Song <theevansong@gmail.com> * fix(gamelabel): align to text Signed-off-by: Evan Song <theevansong@gmail.com> * fix(listing): remove deadcode Signed-off-by: Evan Song <theevansong@gmail.com> * fix(serverlisting): deprecated process.server Signed-off-by: Evan Song <theevansong@gmail.com> * fix(platform): correctly disable button Signed-off-by: Evan Song <theevansong@gmail.com> * fix(backups): do not allow backup creation during server installation Signed-off-by: Evan Song <theevansong@gmail.com> * fix(platform): flush stale currentversion data on successful install Signed-off-by: Evan Song <theevansong@gmail.com> * fix(gamelabel): fix gap Signed-off-by: Evan Song <theevansong@gmail.com> * chore(network): vaporize uppercase Signed-off-by: Evan Song <theevansong@gmail.com> * chore(info): vaporize uppercase Signed-off-by: Evan Song <theevansong@gmail.com> * chore(backups): style unification Signed-off-by: Evan Song <theevansong@gmail.com> * chore(backups): finalize style change Signed-off-by: Evan Song <theevansong@gmail.com> * fix(servers): catch pyro servers fetch errors during ssr Signed-off-by: Evan Song <theevansong@gmail.com> * fix(serverstats): ram as bytes graph now works Signed-off-by: Evan Song <theevansong@gmail.com> * fix(platform): unify attempts and refresh interval Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): input Signed-off-by: Evan Song <theevansong@gmail.com> * feat(servers): installing ticket + update available notice back in platform Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): dont add bg to scroll track Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): preserve whitespace Signed-off-by: Evan Song <theevansong@gmail.com> * chore(serversroot): unnest blurred icon query Signed-off-by: Evan Song <theevansong@gmail.com> * fix(serverstats): clamp memory usage to 100% no matter what Signed-off-by: Evan Song <theevansong@gmail.com> * feat(terminal): allow copy of single lines, show btn Signed-off-by: Evan Song <theevansong@gmail.com> * chore(terminal): animate copy>view transition Signed-off-by: Evan Song <theevansong@gmail.com> * init: search improvements Signed-off-by: Evan Song <theevansong@gmail.com> * fix: lint Signed-off-by: Evan Song <theevansong@gmail.com> * chore: change log modal title Signed-off-by: Evan Song <theevansong@gmail.com> * fix: hide fullscreen when selecting and cancel selection on clickout Signed-off-by: Evan Song <theevansong@gmail.com> * refactor(terminal): more reliable jumpToLine Signed-off-by: Evan Song <theevansong@gmail.com> * feat: search results separator Signed-off-by: Evan Song <theevansong@gmail.com> * chore: remove buggy isScrollable check Signed-off-by: Evan Song <theevansong@gmail.com> * fix: style Signed-off-by: Evan Song <theevansong@gmail.com> * refactor: correctly store pos to make jump reliable Signed-off-by: Evan Song <theevansong@gmail.com> * fix: disparity between search/log dragselect Signed-off-by: Evan Song <theevansong@gmail.com> * fix: prevent propagation of click events when clicking on jump btn Signed-off-by: Evan Song <theevansong@gmail.com> * fix: switch selection strategies depending on terminal mode Signed-off-by: Evan Song <theevansong@gmail.com> * chore: smarter esc handling Signed-off-by: Evan Song <theevansong@gmail.com> * finalize Signed-off-by: Evan Song <theevansong@gmail.com> * run fix * fix: ensure lines between cannot be selected Signed-off-by: Evan Song <theevansong@gmail.com> * fix: increase initial log batch to 256 Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): click on scroll track should take user to new scroll position Signed-off-by: Evan Song <theevansong@gmail.com> * fix(terminal): update aria label for view selected logs btn Signed-off-by: Evan Song <theevansong@gmail.com> * chore: clean Signed-off-by: Evan Song <theevansong@gmail.com> --------- Signed-off-by: Evan Song <theevansong@gmail.com>
255 lines
8.2 KiB
Vue
255 lines
8.2 KiB
Vue
<template>
|
|
<LazyUiServersPlatformVersionSelectModal
|
|
ref="versionSelectModal"
|
|
:server="props.server"
|
|
:current-loader="data?.loader as Loaders"
|
|
@reinstall="emit('reinstall', $event)"
|
|
/>
|
|
|
|
<LazyUiServersPlatformMrpackModal
|
|
ref="mrpackModal"
|
|
:server="props.server"
|
|
@reinstall="emit('reinstall', $event)"
|
|
/>
|
|
|
|
<LazyUiServersPlatformChangeModpackVersionModal
|
|
ref="modpackVersionModal"
|
|
:server="props.server"
|
|
:project="data?.project"
|
|
:versions="Array.isArray(versions) ? versions : []"
|
|
:current-version="currentVersion"
|
|
:current-version-id="data?.upstream?.version_id"
|
|
:server-status="data?.status"
|
|
@reinstall="emit('reinstall')"
|
|
/>
|
|
|
|
<div class="flex h-full w-full flex-col">
|
|
<div v-if="data && versions" class="flex w-full flex-col">
|
|
<div class="card flex flex-col gap-4">
|
|
<div class="flex select-none flex-col items-center justify-between gap-2 lg:flex-row">
|
|
<div class="flex flex-row items-center gap-2">
|
|
<h2 class="m-0 text-lg font-bold text-contrast">Modpack</h2>
|
|
<div
|
|
v-if="updateAvailable"
|
|
class="rounded-full bg-bg-orange px-2 py-1 text-xs font-medium text-orange"
|
|
>
|
|
<span>Update available</span>
|
|
</div>
|
|
</div>
|
|
<div v-if="data.upstream" class="flex gap-4">
|
|
<ButtonStyled>
|
|
<button
|
|
class="!w-full sm:!w-auto"
|
|
:disabled="isInstalling"
|
|
@click="mrpackModal.show()"
|
|
>
|
|
<UploadIcon class="size-4" /> Import .mrpack
|
|
</button>
|
|
</ButtonStyled>
|
|
<!-- dumb hack to make a button link not a link -->
|
|
<ButtonStyled>
|
|
<template v-if="isInstalling">
|
|
<button :disabled="isInstalling">
|
|
<TransferIcon class="size-4" />
|
|
Switch modpack
|
|
</button>
|
|
</template>
|
|
<nuxt-link v-else :to="`/modpacks?sid=${props.server.serverId}`">
|
|
<TransferIcon class="size-4" />
|
|
Switch modpack
|
|
</nuxt-link>
|
|
</ButtonStyled>
|
|
</div>
|
|
</div>
|
|
<div v-if="data.upstream" class="flex flex-col gap-2">
|
|
<div
|
|
v-if="versionsError || currentVersionError"
|
|
class="rounded-2xl border border-solid border-red p-4 text-contrast"
|
|
>
|
|
<p class="m-0 font-bold">Something went wrong while loading your modpack.</p>
|
|
<p class="m-0 mb-2 mt-1 text-sm">
|
|
{{ versionsError || currentVersionError }}
|
|
</p>
|
|
<ButtonStyled>
|
|
<button :disabled="isInstalling" @click="refreshData">Retry</button>
|
|
</ButtonStyled>
|
|
</div>
|
|
|
|
<NewProjectCard
|
|
v-if="!versionsError && !currentVersionError"
|
|
class="!cursor-default !bg-bg !filter-none"
|
|
:project="projectCardData"
|
|
:categories="data.project?.categories || []"
|
|
>
|
|
<template #actions>
|
|
<ButtonStyled color="brand">
|
|
<button :disabled="isInstalling" @click="modpackVersionModal.show()">
|
|
<SettingsIcon class="size-4" />
|
|
Change version
|
|
</button>
|
|
</ButtonStyled>
|
|
</template>
|
|
</NewProjectCard>
|
|
</div>
|
|
<div v-else class="flex w-full flex-col items-center gap-2 sm:w-fit sm:flex-row">
|
|
<ButtonStyled>
|
|
<nuxt-link class="!w-full sm:!w-auto" :to="`/modpacks?sid=${props.server.serverId}`">
|
|
<CompassIcon class="size-4" /> Find a modpack
|
|
</nuxt-link>
|
|
</ButtonStyled>
|
|
<span class="hidden sm:block">or</span>
|
|
<ButtonStyled>
|
|
<button class="!w-full sm:!w-auto" @click="mrpackModal.show()">
|
|
<UploadIcon class="size-4" /> Upload .mrpack file
|
|
</button>
|
|
</ButtonStyled>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card flex flex-col gap-4">
|
|
<div class="flex flex-col gap-2">
|
|
<h2 class="m-0 text-lg font-bold text-contrast">Platform</h2>
|
|
<p class="m-0">Your server's platform is the software that runs mods and plugins.</p>
|
|
<div v-if="data.upstream" class="mt-2 flex items-center gap-2">
|
|
<InfoIcon class="hidden sm:block" />
|
|
<span class="text-sm text-secondary">
|
|
The current platform was automatically selected based on your modpack.
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div
|
|
class="flex w-full flex-col gap-1 rounded-2xl"
|
|
:class="{
|
|
'pointer-events-none cursor-not-allowed select-none opacity-50':
|
|
props.server.general?.status === 'installing',
|
|
}"
|
|
:tabindex="props.server.general?.status === 'installing' ? -1 : 0"
|
|
>
|
|
<UiServersLoaderSelector
|
|
:data="data"
|
|
:is-installing="isInstalling"
|
|
@select-loader="selectLoader"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div v-else />
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { ButtonStyled, NewProjectCard } from "@modrinth/ui";
|
|
import { TransferIcon, UploadIcon, InfoIcon, CompassIcon, SettingsIcon } from "@modrinth/assets";
|
|
import type { Server } from "~/composables/pyroServers";
|
|
import type { Loaders } from "~/types/servers";
|
|
|
|
const props = defineProps<{
|
|
server: Server<["general", "content", "backups", "network", "startup", "ws", "fs"]>;
|
|
}>();
|
|
|
|
const emit = defineEmits<{
|
|
reinstall: [any?];
|
|
}>();
|
|
|
|
const isInstalling = computed(() => props.server.general?.status === "installing");
|
|
|
|
const versionSelectModal = ref();
|
|
const mrpackModal = ref();
|
|
const modpackVersionModal = ref();
|
|
|
|
const data = computed(() => props.server.general);
|
|
|
|
const {
|
|
data: versions,
|
|
error: versionsError,
|
|
refresh: refreshVersions,
|
|
} = await useAsyncData(
|
|
`content-loader-versions-${data.value?.upstream?.project_id}`,
|
|
async () => {
|
|
if (!data.value?.upstream?.project_id) return [];
|
|
try {
|
|
const result = await useBaseFetch(`project/${data.value.upstream.project_id}/version`);
|
|
return result || [];
|
|
} catch (e) {
|
|
console.error("couldnt fetch all versions:", e);
|
|
throw new Error("Failed to load modpack versions.");
|
|
}
|
|
},
|
|
{ default: () => [] },
|
|
);
|
|
|
|
const {
|
|
data: currentVersion,
|
|
error: currentVersionError,
|
|
refresh: refreshCurrentVersion,
|
|
} = await useAsyncData(
|
|
`content-loader-version-${data.value?.upstream?.version_id}`,
|
|
async () => {
|
|
if (!data.value?.upstream?.version_id) return null;
|
|
try {
|
|
const result = await useBaseFetch(`version/${data.value.upstream.version_id}`);
|
|
return result || null;
|
|
} catch (e) {
|
|
console.error("couldnt fetch version:", e);
|
|
throw new Error("Failed to load modpack version.");
|
|
}
|
|
},
|
|
{ default: () => null },
|
|
);
|
|
|
|
const projectCardData = computed(() => ({
|
|
icon_url: data.value?.project?.icon_url,
|
|
title: data.value?.project?.title,
|
|
description: data.value?.project?.description,
|
|
downloads: data.value?.project?.downloads,
|
|
follows: data.value?.project?.followers,
|
|
// @ts-ignore
|
|
date_modified: currentVersion.value?.date_published || data.value?.project?.updated,
|
|
}));
|
|
|
|
const selectLoader = (loader: string) => {
|
|
versionSelectModal.value?.show(loader as Loaders);
|
|
};
|
|
|
|
const refreshData = async () => {
|
|
await Promise.all([refreshVersions(), refreshCurrentVersion()]);
|
|
};
|
|
|
|
const updateAvailable = computed(() => {
|
|
// so sorry
|
|
// @ts-ignore
|
|
if (!data.value?.upstream || !versions.value?.length || !currentVersion.value) {
|
|
return false;
|
|
}
|
|
|
|
// @ts-ignore
|
|
const latestVersion = versions.value[0];
|
|
// @ts-ignore
|
|
return latestVersion.id !== currentVersion.value.id;
|
|
});
|
|
|
|
watch(
|
|
() => props.server.general?.status,
|
|
async (newStatus, oldStatus) => {
|
|
if (oldStatus === "installing" && newStatus === "available") {
|
|
await Promise.all([
|
|
refreshVersions(),
|
|
refreshCurrentVersion(),
|
|
props.server.refresh(["general"]),
|
|
]);
|
|
}
|
|
},
|
|
);
|
|
</script>
|
|
|
|
<style scoped>
|
|
.stylized-toggle:checked::after {
|
|
background: var(--color-accent-contrast) !important;
|
|
}
|
|
|
|
.button-base:active {
|
|
scale: none !important;
|
|
}
|
|
</style>
|