Files
api/web/components/Activation/ActivationModal.vue
T
Eli Bosley 345e83bfb0 feat: upgrade nuxt-custom-elements (#1461)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added new modal dialogs and UI components, including activation steps,
OS update feedback, and expanded notification management.
* Introduced a plugin to configure internationalization, state
management, and Apollo client support in web components.
* Added a new Log Viewer page with a streamlined interface for viewing
logs.

* **Improvements**
* Centralized Pinia state management by consolidating all stores to use
a shared global Pinia instance.
* Simplified component templates by removing redundant
internationalization host wrappers.
* Enhanced ESLint configuration with stricter rules and global variable
declarations.
* Refined custom element build process to prevent jQuery conflicts and
optimize minification.
* Updated component imports and templates for consistent structure and
maintainability.
* Streamlined log viewer dropdowns using simplified select components
with improved formatting.
* Improved notification sidebar with filtering by importance and modular
components.
* Replaced legacy notification popups with new UI components and added
automatic root session creation for localhost requests.
* Updated OS version display and user profile UI with refined styling
and component usage.

* **Bug Fixes**
* Fixed component tag capitalization and improved type annotations
across components.

* **Chores**
* Updated development dependencies including ESLint plugins and build
tools.
* Removed deprecated log viewer patch class and cleaned up related test
fixtures.
  * Removed unused imports and simplified Apollo client setup.
* Cleaned up test mocks and removed obsolete i18n host component tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---
- To see the specific tasks where the Asana app for GitHub is being
used, see below:
  - https://app.asana.com/0/0/1210730229632804

---------

Co-authored-by: Pujit Mehrotra <pujit@lime-technology.com>
Co-authored-by: Zack Spear <zackspear@users.noreply.github.com>
2025-07-08 10:05:39 -04:00

100 lines
3.0 KiB
Vue

<script lang="ts" setup>
import { computed } from 'vue';
import { storeToRefs } from 'pinia';
import { ArrowTopRightOnSquareIcon } from '@heroicons/vue/24/solid';
import { BrandButton } from '@unraid/ui';
import type { BrandButtonProps } from '@unraid/ui';
import type { ComposerTranslation } from 'vue-i18n';
import ActivationPartnerLogo from '~/components/Activation/ActivationPartnerLogo.vue';
import { useActivationCodeDataStore } from '~/components/Activation/store/activationCodeData';
import { useActivationCodeModalStore } from '~/components/Activation/store/activationCodeModal';
import { usePurchaseStore } from '~/store/purchase';
import { useThemeStore } from '~/store/theme';
import Modal from '~/components/Modal.vue';
import ActivationSteps from './ActivationSteps.vue';
export interface Props {
t: ComposerTranslation;
}
const props = defineProps<Props>();
const { isVisible } = storeToRefs(useActivationCodeModalStore());
const { partnerInfo } = storeToRefs(useActivationCodeDataStore());
const purchaseStore = usePurchaseStore();
useThemeStore();
const title = computed<string>(() => props.t("Let's activate your Unraid OS License"));
const description = computed<string>(() =>
props.t(
`On the following screen, your license will be activated. You'll then create an Unraid.net Account to manage your license going forward.`
)
);
const docsButtons = computed<BrandButtonProps[]>(() => {
return [
{
variant: 'underline',
external: true,
href: 'https://docs.unraid.net/unraid-os/faq/licensing-faq/',
iconRight: ArrowTopRightOnSquareIcon,
size: '14px',
text: props.t('More about Licensing'),
},
{
variant: 'underline',
external: true,
href: 'https://docs.unraid.net/account/',
iconRight: ArrowTopRightOnSquareIcon,
size: '14px',
text: props.t('More about Unraid.net Accounts'),
},
];
});
</script>
<template>
<Modal
v-if="isVisible"
:t="t"
:open="isVisible"
:show-close-x="false"
:title="title"
:title-in-main="partnerInfo?.hasPartnerLogo"
:description="description"
overlay-color="bg-background"
overlay-opacity="bg-opacity-100"
max-width="max-w-800px"
:modal-vertical-center="false"
:disable-shadow="true"
>
<template v-if="partnerInfo?.hasPartnerLogo" #header>
<ActivationPartnerLogo :name="partnerInfo.partnerName" />
</template>
<template #footer>
<div class="w-full flex gap-8px justify-center mx-auto">
<BrandButton
:text="t('Activate Now')"
:icon-right="ArrowTopRightOnSquareIcon"
@click="purchaseStore.activate"
/>
</div>
</template>
<template #subFooter>
<div class="flex flex-col gap-6">
<ActivationSteps :active-step="2" class="mt-6" />
<div class="flex flex-col sm:flex-row justify-center gap-4 mx-auto w-full">
<BrandButton v-for="button in docsButtons" :key="button.text" v-bind="button" />
</div>
</div>
</template>
</Modal>
</template>