Files
api/web/components/UpdateOs/Downgrade.vue
T
Eli Bosley 86b6c4f85b fix: inject Tailwind CSS into client entry point (#1537)
Added a Vite plugin to automatically inject the Tailwind CSS import into
the `unraid-components.client.js` entry file, enhancing the integration
of Tailwind CSS within the application. This change improves the setup
for styling components consistently across the project.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added automated validation to ensure Tailwind CSS styles are correctly
included in the custom elements build output.

* **Chores**
* Updated the build process to include a CSS validation step after
manifest generation.
* Enhanced development build configuration to enable CSS source maps and
optimize Tailwind CSS injection into web components.
  * Extended CSS theme with new responsive breakpoint variables.
* Improved CSS class specificity in user profile, server state, and
update modal components for consistent styling.
* Removed redundant style blocks and global CSS imports from multiple
components to streamline styling and reduce duplication.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-07-23 15:30:57 -04:00

133 lines
4.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script lang="ts" setup>
import {
ArrowTopRightOnSquareIcon,
ArrowUturnDownIcon,
FolderArrowDownIcon,
InformationCircleIcon,
LifebuoyIcon,
} from '@heroicons/vue/24/solid';
import { BrandButton, CardWrapper } from '@unraid/ui';
import useDateTimeHelper from '~/composables/dateTime';
import { FORUMS_BUG_REPORT } from '~/helpers/urls';
import { useServerStore } from '~/store/server';
import { useUpdateOsActionsStore } from '~/store/updateOsActions';
import type { UserProfileLink } from '~/types/userProfile';
import dayjs from 'dayjs';
import { storeToRefs } from 'pinia';
import { ref } from 'vue';
import type { ComposerTranslation } from 'vue-i18n';
const props = defineProps<{
t: ComposerTranslation;
releaseDate: string;
version: string;
}>();
const serverStore = useServerStore();
const updateOsActionsStore = useUpdateOsActionsStore();
const { dateTimeFormat } = storeToRefs(serverStore);
const { outputDateTimeFormatted: formattedReleaseDate } = useDateTimeHelper(
dateTimeFormat.value,
props.t,
true,
dayjs(props.releaseDate, 'YYYY-MM-DD').valueOf()
);
const diagnosticsButton = ref<UserProfileLink | undefined>({
click: () => {
// @ts-expect-error global function provided by the webgui on the update page
downloadDiagnostics();
},
icon: FolderArrowDownIcon,
name: 'download-diagnostics',
text: props.t('Download Diagnostics'),
});
const downgradeButton = ref<UserProfileLink>({
click: () => {
// @ts-expect-error global function provided by the webgui on the update page
confirmDowngrade();
},
name: 'downgrade',
text: props.t('Begin downgrade to {0}', [props.version]),
});
</script>
<template>
<CardWrapper :increased-padding="true">
<div class="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-5 sm:gap-6">
<div class="grid gap-y-4">
<h3 class="font-semibold leading-normal flex flex-row items-start justify-start gap-2">
<ArrowUturnDownIcon class="w-5 shrink-0" />
<span class="leading-none inline-flex flex-wrap justify-start items-baseline gap-2">
<span class="text-xl">
{{ t('Downgrade Unraid OS to {0}', [version]) }}
</span>
<span
v-if="releaseDate && formattedReleaseDate !== 'Invalid Date'"
class="text-base opacity-75 shrink"
>
{{ t('Original release date {0}', [formattedReleaseDate]) }}
</span>
</span>
</h3>
<div class="prose text-base leading-relaxed opacity-75 whitespace-normal">
<p>{{ t(`Downgrades are only recommended if you're unable to solve a critical issue.`) }}</p>
<p>
{{
t(
'In the rare event you need to downgrade we ask that you please provide us with Diagnostics so we can investigate your issue.'
)
}}
</p>
<p>
{{
t(
'Download the Diagnostics zip then please open a bug report on our forums with a description of the issue along with your diagnostics.'
)
}}
</p>
</div>
</div>
<div v-if="downgradeButton" class="flex flex-col shrink-0 gap-4 grow items-stretch">
<BrandButton
:variant="'underline'"
:icon="InformationCircleIcon"
:text="t('{0} Release Notes', [version])"
@click="
updateOsActionsStore.viewReleaseNotes(
t('{0} Release Notes', [version]),
'/boot/previous/changes.txt'
)
"
/>
<BrandButton
v-if="diagnosticsButton"
:variant="'gray'"
:icon="diagnosticsButton.icon"
:name="diagnosticsButton.name"
:text="diagnosticsButton.text"
@click="diagnosticsButton.click"
/>
<BrandButton
:variant="'gray'"
:external="true"
:href="FORUMS_BUG_REPORT.toString()"
:icon="LifebuoyIcon"
:icon-right="ArrowTopRightOnSquareIcon"
:text="t('Open a bug report')"
/>
<BrandButton
:external="downgradeButton?.external"
:icon="ArrowUturnDownIcon"
:name="downgradeButton?.name"
:text="downgradeButton?.text"
@click="downgradeButton?.click"
/>
</div>
</div>
</CardWrapper>
</template>