diff --git a/libs/i18n/locales/en/translation.json b/libs/i18n/locales/en/translation.json
index c5ecab72d..9ec7a72ef 100644
--- a/libs/i18n/locales/en/translation.json
+++ b/libs/i18n/locales/en/translation.json
@@ -1375,8 +1375,6 @@
"Choose formats you need for this image. Each selection will generate a separate, ready-to-use image file.": "Choose formats you need for this image. Each selection will generate a separate, ready-to-use image file.",
"{{count}} image export tasks will be created._one": "{{count}} image export task will be created.",
"{{count}} image export tasks will be created._other": "{{count}} image export tasks will be created.",
- "Red Hat Edge Manager": "Red Hat Edge Manager",
- "Flight Control": "Flight Control",
"Early binding": "Early binding",
"This image is automatically secured. Register it within {{ validityPeriod }} years to keep it active._one": "This image is automatically secured. Register it within {{ validityPeriod }} year to keep it active.",
"This image is automatically secured. Register it within {{ validityPeriod }} years to keep it active._other": "This image is automatically secured. Register it within {{ validityPeriod }} years to keep it active.",
@@ -1675,39 +1673,181 @@
"All good!": "All good!",
"Tasks": "Tasks",
"View the health of your edge environment and explore details across devices, fleets, and security.": "View the health of your edge environment and explore details across devices, fleets, and security.",
+ "Expand guide": "Expand guide",
+ "Minimize guide": "Minimize guide",
+ "Close guide": "Close guide",
+ "Drag guide": "Drag guide",
+ "Preview table": "Preview table",
+ "No issues detected.": "No issues detected.",
+ "Action not available in preview mode": "Action not available in preview mode",
+ "See how it looks": "See how it looks",
+ "What happens after approval": "What happens after approval",
+ "After approval, the device appears in the enrolled devices table with connectivity status and fleet membership. You can open its detail page to monitor health and apply updates.": "After approval, the device appears in the enrolled devices table with connectivity status and fleet membership. You can open its detail page to monitor health and apply updates.",
+ "Browse approved devices in the enrolled devices table.": "Browse approved devices in the enrolled devices table.",
+ "Approve the enrollment": "Approve the enrollment",
+ "Click Approve to accept a device into your managed environment. After approval, it moves from pending requests into the enrolled devices table.": "Click Approve to accept a device into your managed environment. After approval, it moves from pending requests into the enrolled devices table.",
+ "Use the Approve action on a pending request to bring the device under management.": "Use the Approve action on a pending request to bring the device under management.",
+ "Boot the device or VM": "Boot the device or VM",
+ "Write the downloaded disk image to your edge device (USB stick, SD card, or network boot), or load it into a virtual machine. When the device powers on for the first time, it contacts the control plane and appears as a device pending approval.": "Write the downloaded disk image to your edge device (USB stick, SD card, or network boot), or load it into a virtual machine. When the device powers on for the first time, it contacts the control plane and appears as a device pending approval.",
+ "For virtual testing, boot the QCOW2 image in a VM. It connects the same way as physical hardware.": "For virtual testing, boot the QCOW2 image in a VM. It connects the same way as physical hardware.",
+ "What a device detail page shows": "What a device detail page shows",
+ "After approval, devices appear in the enrolled devices table. Open a device detail page to check connectivity status, system resources, and OS version.": "After approval, devices appear in the enrolled devices table. Open a device detail page to check connectivity status, system resources, and OS version.",
+ "Example device": "Example device",
+ "Healthy": "Healthy",
+ "Online": "Online",
+ "Preview enrolled devices": "Preview enrolled devices",
+ "Some devices are already enrolled to the system. Browse their connectivity and fleet membership to see what an approved device looks like.": "Some devices are already enrolled to the system. Browse their connectivity and fleet membership to see what an approved device looks like.",
+ "The enrolled devices table is empty right now. Once devices are approved, each row will show connectivity and fleet membership.": "The enrolled devices table is empty right now. Once devices are approved, each row will show connectivity and fleet membership.",
+ "Each row shows connectivity and fleet membership.": "Each row shows connectivity and fleet membership.",
+ "Find devices pending approval": "Find devices pending approval",
+ "When a device boots for the first time, it stays in Devices pending approval panel until approved. Each row shows the device alias, name, and when the request was created.": "When a device boots for the first time, it stays in Devices pending approval panel until approved. Each row shows the device alias, name, and when the request was created.",
+ "When a device boots for the first time, it stays in Devices pending approval panel until approved. The panel is empty right now. Once a device requests enrollment, each row will show the device alias, name, and when the request was created.": "When a device boots for the first time, it stays in Devices pending approval panel until approved. The panel is empty right now. Once a device requests enrollment, each row will show the device alias, name, and when the request was created.",
+ "Check the pending requests panel above the enrolled devices table.": "Check the pending requests panel above the enrolled devices table.",
+ "The Devices page is your central hub for all managed edge hardware. From here you can monitor enrolled device health and status and view pending enrollment requests. Each row shows device connectivity, OS version, and fleet membership at a glance.": "The Devices page is your central hub for all managed edge hardware. From here you can monitor enrolled device health and status and view pending enrollment requests. Each row shows device connectivity, OS version, and fleet membership at a glance.",
+ "This is your device hub. The enrolled devices table is empty right now. Once devices are approved, each row will show connectivity and fleet membership. To show you what it will look like, click the link below.": "This is your device hub. The enrolled devices table is empty right now. Once devices are approved, each row will show connectivity and fleet membership. To show you what it will look like, click the link below.",
+ "This is your device hub. Enrolled devices appear in the table below with connectivity and fleet membership.": "This is your device hub. Enrolled devices appear in the table below with connectivity and fleet membership.",
+ "Open the Devices page": "Open the Devices page",
+ "Devices requiring approval appear in the panel above the table when a device first boots.": "Devices requiring approval appear in the panel above the table when a device first boots.",
+ "Device pending approval": "Device pending approval",
+ "2 hours ago": "2 hours ago",
+ "Review the enrollment details": "Review the enrollment details",
+ "Click a device pending approval to review system information, requested labels, and the certificate signing request.": "Click a device pending approval to review system information, requested labels, and the certificate signing request.",
+ "Verify it matches the device you booted before approving.": "Verify it matches the device you booted before approving.",
+ "Select a request in the pending devices panel to open its details.": "Select a request in the pending devices panel to open its details.",
+ "Approve a device pending approval": "Approve a device pending approval",
+ "Download a disk image to provision a device": "Download a disk image to provision a device",
+ "When you need help from your team": "When you need help from your team",
+ "Contact your administrator if you need to": "Contact your administrator if you need to",
+ "View enrolled device health and status in the devices table": "View enrolled device health and status in the devices table",
+ "View pending enrollment requests in the panel above the table": "View pending enrollment requests in the panel above the table",
+ "Open enrolled and pending devices detail pages to review configuration and status": "Open enrolled and pending devices detail pages to review configuration and status",
+ "What you can do on Devices": "What you can do on Devices",
+ "With your current permissions, you can": "With your current permissions, you can",
+ "The Devices page is where your organization manages enrolled edge hardware.": "The Devices page is where your organization manages enrolled edge hardware.",
+ "Flashing devices, approving enrollment requests, and adding devices are handled by an administrator or operator and your administrator or image builder.": "Flashing devices, approving enrollment requests, and adding devices are handled by an administrator or operator and your administrator or image builder.",
+ "Create your first fleet": "Create your first fleet",
+ "Click \"Create fleet\" in the toolbar to open the fleet creation wizard. You will define which devices belong to this fleet, what they should run, and how updates roll out.": "Click \"Create fleet\" in the toolbar to open the fleet creation wizard. You will define which devices belong to this fleet, what they should run, and how updates roll out.",
+ "Fleets group devices that share the same OS image, applications, and update policies.": "Fleets group devices that share the same OS image, applications, and update policies.",
+ "Example fleet": "Example fleet",
+ "Valid": "Valid",
+ "Request a new fleet for your devices": "Request a new fleet for your devices",
+ "Change fleet configurations or update rollout policies": "Change fleet configurations or update rollout policies",
+ "Contact your fleet administrator if you need to": "Contact your fleet administrator if you need to",
+ "How fleet creation works": "How fleet creation works",
+ "Creating a fleet involves three steps: defining a label selector (which devices belong to this fleet), configuring the device template (desired OS, applications, and configurations), and setting an update policy (batch size and disruption budget for rollouts). Once created, matching devices automatically receive the fleet configuration.": "Creating a fleet involves three steps: defining a label selector (which devices belong to this fleet), configuring the device template (desired OS, applications, and configurations), and setting an update policy (batch size and disruption budget for rollouts). Once created, matching devices automatically receive the fleet configuration.",
+ "How fleets work": "How fleets work",
+ "Fleets use label selectors to match devices. Any device whose labels satisfy the selector automatically becomes a fleet member. The fleet's device template defines what that group of devices should look like (OS version, apps, configurations). When you update the template, changes roll out to all members based on the fleet's update policy.": "Fleets use label selectors to match devices. Any device whose labels satisfy the selector automatically becomes a fleet member. The fleet's device template defines what that group of devices should look like (OS version, apps, configurations). When you update the template, changes roll out to all members based on the fleet's update policy.",
+ "Think of fleets like a desired state: you declare what devices should run, and {{ productName }} drives them toward it.": "Think of fleets like a desired state: you declare what devices should run, and {{ productName }} drives them toward it.",
+ "Fleets group edge devices that share the same desired configuration: OS image, installed applications, and update policies. From this page you can see which devices belong to each fleet and check fleet compliance and system image versions.": "Fleets group edge devices that share the same desired configuration: OS image, installed applications, and update policies. From this page you can see which devices belong to each fleet and check fleet compliance and system image versions.",
+ "Fleets group devices that share the same configuration. This page is empty right now. Once you create a fleet, each row will show its name, system image, member count, and rollout status.": "Fleets group devices that share the same configuration. This page is empty right now. Once you create a fleet, each row will show its name, system image, member count, and rollout status.",
+ "Fleets group devices that share the same configuration. Each row shows a fleet name, system image, member count, and rollout status.": "Fleets group devices that share the same configuration. Each row shows a fleet name, system image, member count, and rollout status.",
+ "Open the Fleets page": "Open the Fleets page",
+ "Devices matching a fleet's label selector join automatically.": "Devices matching a fleet's label selector join automatically.",
+ "Use Create fleet in the empty state to create your first fleet.": "Use Create fleet in the empty state to create your first fleet.",
+ "Update fleet configurations": "Update fleet configurations",
+ "Open any fleet's detail page and click \"Edit configurations\" to modify the device template. Changes trigger a rollout: {{ productName }} updates member devices according to the fleet's update policy.": "Open any fleet's detail page and click \"Edit configurations\" to modify the device template. Changes trigger a rollout: {{ productName }} updates member devices according to the fleet's update policy.",
+ "Browse fleets and see member counts, system images, and rollout status in the table": "Browse fleets and see member counts, system images, and rollout status in the table",
+ "Open a fleet detail page to review its device selector and configuration template": "Open a fleet detail page to review its device selector and configuration template",
+ "Update fleet configurations and track rollout progress": "Update fleet configurations and track rollout progress",
+ "What you can do on Fleets": "What you can do on Fleets",
+ "The Fleets page is where your organization groups edge devices that share the same configuration.": "The Fleets page is where your organization groups edge devices that share the same configuration.",
+ "Creating fleets and defining rollout policies are handled by your fleet administrator.": "Creating fleets and defining rollout policies are handled by your fleet administrator.",
+ "Build your base image": "Build your base image",
+ "Name your build and choose the source OS from your registry: select the repository, enter the base image path and version tag, and confirm the reference URL {{ productName }} will pull from.": "Name your build and choose the source OS from your registry: select the repository, enter the base image path and version tag, and confirm the reference URL {{ productName }} will pull from.",
+ "Use a descriptive build name and registry paths your team recognizes.": "Use a descriptive build name and registry paths your team recognizes.",
+ "Configure device enrollment": "Configure device enrollment",
+ "Choose how devices enroll with {{ productName }}. Early binding embeds an enrollment certificate in the image so devices auto-register on first boot with zero-touch provisioning. No cloud-init or Ignition scripts are needed. Late binding omits the certificate and relies on cloud-init or Ignition at first boot to complete registration instead. You can also configure optional first-boot settings such as the onboarding wizard and SSH access.": "Choose how devices enroll with {{ productName }}. Early binding embeds an enrollment certificate in the image so devices auto-register on first boot with zero-touch provisioning. No cloud-init or Ignition scripts are needed. Late binding omits the certificate and relies on cloud-init or Ignition at first boot to complete registration instead. You can also configure optional first-boot settings such as the onboarding wizard and SSH access.",
+ "Early binding is recommended for most edge deployments. Use wizard Next when you are ready for Software Catalog.": "Early binding is recommended for most edge deployments. Use wizard Next when you are ready for Software Catalog.",
+ "Configure your image output": "Configure your image output",
+ "Choose where the finished image is pushed, name and tag the output image, and optionally select disk export formats (ISO, QCOW2, and others).": "Choose where the finished image is pushed, name and tag the output image, and optionally select disk export formats (ISO, QCOW2, and others).",
+ "Use the wizard Next button when you are ready to continue to device enrollment.": "Use the wizard Next button when you are ready to continue to device enrollment.",
+ "Expand a build row": "Expand a build row",
+ "After a build finishes, click the expand control at the start of its row to open the summary panel. Use the panel to track progress, review exports, and open the detail page.": "After a build finishes, click the expand control at the start of its row to open the summary panel. Use the panel to track progress, review exports, and open the detail page.",
+ "Building and exporting can take a few minutes. You can close the guide and return when your build is ready.": "Building and exporting can take a few minutes. You can close the guide and return when your build is ready.",
+ "Explore the build detail page": "Explore the build detail page",
+ "The detail page summarizes your build configuration. Base image shows status and settings cards, Export images lists disk formats, YAML shows the resource definition, and Logs can help with troubleshooting.": "The detail page summarizes your build configuration. Base image shows status and settings cards, Export images lists disk formats, YAML shows the resource definition, and Logs can help with troubleshooting.",
+ "The Actions menu at the top includes Rebuild, Add to catalog, and other operations when you have permission.": "The Actions menu at the top includes Rebuild, Add to catalog, and other operations when you have permission.",
+ "This is the last step in the image build phase.": "This is the last step in the image build phase.",
+ "Explore the details page": "Explore the details page",
+ "On the details page, tabs organize what you can review: Base image for settings, Export images for disk formats, YAML for the resource definition, and Logs for troubleshooting.": "On the details page, tabs organize what you can review: Base image for settings, Export images for disk formats, YAML for the resource definition, and Logs for troubleshooting.",
+ "Create a new build": "Create a new build",
+ "Create a new version (Rebuild)": "Create a new version (Rebuild)",
+ "Open build row actions": "Open build row actions",
+ "Open the kebab menu at the end of the image build row to see actions you can do": "Open the kebab menu at the end of the image build row to see actions you can do",
+ "You can perform the same actions via the build detail page as well.": "You can perform the same actions via the build detail page as well.",
+ "Example image build": "Example image build",
+ "Meet the image build wizard": "Meet the image build wizard",
+ "This wizard builds a custom edge OS image from a base OS and pushes the result to your registry. Work through five steps on the left (Base image, Image output, Registration, Software Catalog, and Review) with the form for each step on the right. Use the wizard Next button to move between steps. This guide follows along one step at a time.": "This wizard builds a custom edge OS image from a base OS and pushes the result to your registry. Work through five steps on the left (Base image, Image output, Registration, Software Catalog, and Review) with the form for each step on the right. Use the wizard Next button to move between steps. This guide follows along one step at a time.",
+ "Base image and Image output are required. Registration sets enrollment binding. Software Catalog is optional.": "Base image and Image output are required. Registration sets enrollment binding. Software Catalog is optional.",
+ "Open the build detail page": "Open the build detail page",
+ "Click the build name in the list or View more in the expanded panel to open the detail page for configuration, exports, YAML, and logs.": "Click the build name in the list or View more in the expanded panel to open the detail page for configuration, exports, YAML, and logs.",
+ "You can open any build from the list.": "You can open any build from the list.",
+ "Open the details page": "Open the details page",
+ "Click a build name in the list or choose View more after expanding a row to open its detail page for configuration, exports, YAML, and logs.": "Click a build name in the list or choose View more after expanding a row to open its detail page for configuration, exports, YAML, and logs.",
+ "The Image builds page tracks OS image builds across your organization. Your administrator or image builder creates and manages images here.": "The Image builds page tracks OS image builds across your organization. Your administrator or image builder creates and manages images here.",
+ "This is the Image builds page. Here you will see image builds and their status in the list. From here you can open a build to review its configuration and progress.": "This is the Image builds page. Here you will see image builds and their status in the list. From here you can open a build to review its configuration and progress.",
+ "Open Image builds in the left sidebar, then continue here.": "Open Image builds in the left sidebar, then continue here.",
+ "Browse the builds in the table behind this guide": "Browse the builds in the table behind this guide",
+ "Create your first build to get started": "Create your first build to get started",
+ "Navigate to Image builds": "Navigate to Image builds",
+ "Preview in the list": "Preview in the list",
+ "Expand a row using the arrow on the left to see a build summary and any export formats available.": "Expand a row using the arrow on the left to see a build summary and any export formats available.",
+ "The image builds table is empty right now. Once a build finishes, expand its row to see a summary and any export formats available.": "The image builds table is empty right now. Once a build finishes, expand its row to see a summary and any export formats available.",
+ "Publish to Software Catalog": "Publish to Software Catalog",
+ "Optionally publish the built image to the Software Catalog testing channel after a successful build so other teams can discover and deploy it.": "Optionally publish the built image to the Software Catalog testing channel after a successful build so other teams can discover and deploy it.",
+ "You can skip this step or publish later from the build detail page. Use wizard Next when you are ready for review.": "You can skip this step or publish later from the build detail page. Use wizard Next when you are ready for review.",
+ "Review and start the build": "Review and start the build",
+ "Confirm your base image, output, registration, and catalog choices, then click Build image to start the build.": "Confirm your base image, output, registration, and catalog choices, then click Build image to start the build.",
+ "Review the summary on the right before submitting.": "Review the summary on the right before submitting.",
+ "Start a new image build": "Start a new image build",
+ "Click \"Build new image\" in the toolbar to open the image build wizard. This guides you through selecting a base OS, configuring output, embedding the enrollment certificate, and optionally publishing to the Software Catalog.": "Click \"Build new image\" in the toolbar to open the image build wizard. This guides you through selecting a base OS, configuring output, embedding the enrollment certificate, and optionally publishing to the Software Catalog.",
+ "You'll need access to at least one OCI repository where base images are stored.": "You'll need access to at least one OCI repository where base images are stored.",
+ "Request a new or updated OS image": "Request a new or updated OS image",
+ "Obtain a disk image for device provisioning": "Obtain a disk image for device provisioning",
+ "Publish a build to the Software Catalog": "Publish a build to the Software Catalog",
+ "See image builds and their status in the list": "See image builds and their status in the list",
+ "Open a build to review its configuration and progress": "Open a build to review its configuration and progress",
+ "Review build logs when troubleshooting": "Review build logs when troubleshooting",
+ "Download exported disk images when they are available": "Download exported disk images when they are available",
+ "What you can do on Image builds": "What you can do on Image builds",
+ "From the Image builds area you can": "From the Image builds area you can",
+ "The Image builds area is where your organization prepares custom edge OS images.": "The Image builds area is where your organization prepares custom edge OS images.",
+ "New images are created through a build wizard managed by your administrator or image builder.": "New images are created through a build wizard managed by your administrator or image builder.",
+ "Navigate the console": "Navigate the console",
+ "The left sidebar is your primary navigation. Each section corresponds to a stage of the edge device lifecycle: Image builds for OS preparation, Devices for enrollment and monitoring, Fleets for group configuration, Software Catalog for application management, and Repositories for GitOps sources.": "The left sidebar is your primary navigation. Each section corresponds to a stage of the edge device lifecycle: Image builds for OS preparation, Devices for enrollment and monitoring, Fleets for group configuration, Software Catalog for application management, and Repositories for GitOps sources.",
+ "Sections visible to you depend on your permissions. If something isn't listed, your administrator controls access.": "Sections visible to you depend on your permissions. If something isn't listed, your administrator controls access.",
+ "Explore the Overview dashboard": "Explore the Overview dashboard",
+ "The Overview page gives you an at-a-glance summary of your edge environment. The Status card shows device and application health. The Tasks card tracks pending enrollment requests. The Security card surfaces active vulnerabilities. Use this page as your starting point each day.": "The Overview page gives you an at-a-glance summary of your edge environment. The Status card shows device and application health. The Tasks card tracks pending enrollment requests. The Security card surfaces active vulnerabilities. Use this page as your starting point each day.",
+ "Cards adapt to what you have permission to see. Some may not appear for all roles.": "Cards adapt to what you have permission to see. Some may not appear for all roles.",
+ "What is {{ productName }}?": "What is {{ productName }}?",
+ "{{ productName }} lets you build OS images, enroll edge devices, organize them into fleets, and deploy software, all from a single console. It handles the full lifecycle from initial provisioning through day-2 operations like updates, monitoring, and decommissioning.": "{{ productName }} lets you build OS images, enroll edge devices, organize them into fleets, and deploy software, all from a single console. It handles the full lifecycle from initial provisioning through day-2 operations like updates, monitoring, and decommissioning.",
+ "Think of it as a control plane for all your edge hardware, no matter where it is deployed.": "Think of it as a control plane for all your edge hardware, no matter where it is deployed.",
+ "Locked": "Locked",
"{{count}} minutes_one": "{{count}} minute",
"{{count}} minutes_other": "{{count}} minutes",
"{{count}} tasks_one": "{{count}} task",
"{{count}} tasks_other": "{{count}} tasks",
- "Locked": "Locked",
"Prerequisites": "Prerequisites",
"Complete \"{{prevPhaseTitle}}\"": "Complete \"{{prevPhaseTitle}}\"",
"Prerequisites (1)": "Prerequisites (1)",
"To show it again, open Settings in the toolbar above and choose Show quick start guide.": "To show it again, open Settings in the toolbar above and choose Show quick start guide.",
"Quick start guide": "Quick start guide",
+ "Follow these phases to get your edge management environment up and running.": "Follow these phases to get your edge management environment up and running.",
"{{completed}}/{{total}} phases complete": "{{completed}}/{{total}} phases complete",
- "Expand guide": "Expand guide",
"Collapse guide": "Collapse guide",
- "Follow these phases to get your edge management environment up and running.": "Follow these phases to get your edge management environment up and running.",
"Progress": "Progress",
"{{completed}} of {{total}}": "{{completed}} of {{total}}",
"About {{count}} minutes_one": "About {{count}} minute",
"About {{count}} minutes_other": "About {{count}} minutes",
"Welcome & Orientation": "Welcome & Orientation",
- "Get familiar with {{ productName }} and learn how to navigate the console.": "Get familiar with {{ productName }} and learn how to navigate the console.",
"Build an OS Image": "Build an OS Image",
- "Create a custom edge OS image so devices auto-register on boot.": "Create a custom edge OS image so devices auto-register on boot.",
"Enroll Your First Device": "Enroll Your First Device",
- "Boot a device with your image, then approve it to bring it under management.": "Boot a device with your image, then approve it to bring it under management.",
"Create and Manage Fleets": "Create and Manage Fleets",
- "Group devices that share identical or similar configuration and update policy for centralized management.": "Group devices that share identical or similar configuration and update policy for centralized management.",
- "Close guide": "Close guide",
- "Minimize guide": "Minimize guide",
- "Explore the console": "Explore the console",
- "Orientation": "Orientation",
- "Some description here.": "Some description here.",
- "Sections visible to you depend on your permissions.": "Sections visible to you depend on your permissions.",
- "Drag guide": "Drag guide",
+ "Get familiar with {{ productName }} and learn how to navigate the console.": "Get familiar with {{ productName }} and learn how to navigate the console.",
+ "Create a custom edge OS image so devices auto-register on boot.": "Create a custom edge OS image so devices auto-register on boot.",
+ "Boot a device with your image, then approve it to bring it under management.": "Boot a device with your image, then approve it to bring it under management.",
+ "Learn how fleets group devices, what you can view on the Fleets page, and how fleet administrators manage rollouts.": "Learn how fleets group devices, what you can view on the Fleets page, and how fleet administrators manage rollouts.",
+ "Group devices that share the same OS image and update policy into a fleet for centralized management.": "Group devices that share the same OS image and update policy into a fleet for centralized management.",
"Failed to retrieve repository details": "Failed to retrieve repository details",
"Failed to retrieve the resource syncs": "Failed to retrieve the resource syncs",
"The repository cannot be modified at the moment because some of its details could not be obtained.": "The repository cannot be modified at the moment because some of its details could not be obtained.",
@@ -1951,6 +2091,8 @@
"Product UUID": "Product UUID",
"TPM vendor info": "TPM vendor info",
"Package": "Package",
+ "Red Hat Edge Manager": "Red Hat Edge Manager",
+ "Flight Control": "Flight Control",
"Unknown error": "Unknown error",
"Failed to connect to device terminal: {{reason}}": "Failed to connect to device terminal: {{reason}}",
"Failed to connect to device terminal": "Failed to connect to device terminal",
@@ -2021,13 +2163,11 @@
"Error": "Error",
"Degraded": "Degraded",
"No applications": "No applications",
- "Healthy": "Healthy",
"Preparing": "Preparing",
"Starting": "Starting",
"Stopping": "Stopping",
"Rebooting": "Rebooting",
"Powered Off": "Powered Off",
- "Online": "Online",
"Pending sync": "Pending sync",
"Suspended": "Suspended",
"Name and alias": "Name and alias",
@@ -2038,7 +2178,6 @@
"Pending approval": "Pending approval",
"Approved": "Approved",
"Denied": "Denied",
- "Valid": "Valid",
"Invalid": "Invalid",
"Sync pending": "Sync pending",
"Awaiting first sync": "Awaiting first sync",
diff --git a/libs/ui-components/src/components/EnrollmentRequest/EnrollmentRequestList.tsx b/libs/ui-components/src/components/EnrollmentRequest/EnrollmentRequestList.tsx
index fe369cf94..3bdf27601 100644
--- a/libs/ui-components/src/components/EnrollmentRequest/EnrollmentRequestList.tsx
+++ b/libs/ui-components/src/components/EnrollmentRequest/EnrollmentRequestList.tsx
@@ -28,7 +28,7 @@ const EnrollmentRequestEmptyState = () => {
return ;
};
-const getEnrollmentColumns = (t: TFunction) => [
+export const getEnrollmentRequestTableColumns = (t: TFunction) => [
{
name: t('Alias'),
},
@@ -57,7 +57,7 @@ const EnrollmentRequestList = ({ refetchDevices, isStandalone }: EnrollmentReque
const { remove } = useFetch();
const [search, setSearch] = React.useState('');
- const enrollmentColumns = React.useMemo(() => getEnrollmentColumns(t), [t]);
+ const enrollmentColumns = React.useMemo(() => getEnrollmentRequestTableColumns(t), [t]);
const [pendingEnrollments, isLoading, error, refetch, pagination] = usePendingEnrollments(search);
const itemCount = pendingEnrollments.length;
diff --git a/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.tsx b/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.tsx
index 8848749d3..62ba5aa54 100644
--- a/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.tsx
+++ b/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.tsx
@@ -23,7 +23,7 @@ import { BindingType } from '@flightctl/types/imagebuilder';
import { type ImageBuildFormValues } from '../types';
import { PUBLIC_KEY_MAX_LENGTH } from '../../../form/validations';
import { useTranslation } from '../../../../hooks/useTranslation';
-import { useAppContext } from '../../../../hooks/useAppContext';
+import { useProductName } from '../../../../hooks/useProductName';
import FlightCtlForm from '../../../form/FlightCtlForm';
import TextField from '../../../form/TextField';
import UploadField from '../../../form/UploadField';
@@ -43,9 +43,8 @@ export const isRegistrationStepValid = (errors: FormikErrors {
const { t } = useTranslation();
- const { settings } = useAppContext();
const { values, setFieldValue } = useFormikContext();
- const productName = settings.isRHEM ? t('Red Hat Edge Manager') : t('Flight Control');
+ const productName = useProductName();
const isEarlyBindingSelected = values.bindingType === BindingType.BindingTypeEarly;
diff --git a/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.tsx b/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.tsx
index 42cc09c04..992f948f5 100644
--- a/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.tsx
+++ b/libs/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.tsx
@@ -20,7 +20,7 @@ import { InfoCircleIcon } from '@patternfly/react-icons/dist/js/icons/info-circl
import { BindingType } from '@flightctl/types/imagebuilder';
import { useTranslation } from '../../../../hooks/useTranslation';
-import { useAppContext } from '../../../../hooks/useAppContext';
+import { useProductName } from '../../../../hooks/useProductName';
import { type ImageBuildFormValues, type ImageBuildWizardError } from '../types';
import { getImageReference } from '../../../../utils/imageBuilds';
import { getExportFormatLabel } from '../../../../utils/imageBuilds';
@@ -39,9 +39,8 @@ type ReviewStepProps = {
const ReviewStep = ({ error }: ReviewStepProps) => {
const { t } = useTranslation();
- const { settings } = useAppContext();
const { values } = useFormikContext();
- const productName = settings.isRHEM ? t('Red Hat Edge Manager') : t('Flight Control');
+ const productName = useProductName();
const { ociRegistries } = useOciRegistriesContext();
const srcImageReference = React.useMemo(
diff --git a/libs/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsTab.tsx b/libs/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsTab.tsx
index 4470bfc39..f108c0a2b 100644
--- a/libs/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsTab.tsx
+++ b/libs/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsTab.tsx
@@ -28,7 +28,7 @@ import ImagePromotionStatus from '../../ImagePromotion/ImagePromotionStatus';
import { getDateDisplay } from '../../../utils/dates';
import { getExportFormatLabel, getImageReference } from '../../../utils/imageBuilds';
import { useTranslation } from '../../../hooks/useTranslation';
-import { useAppContext } from '../../../hooks/useAppContext';
+import { useProductName } from '../../../hooks/useProductName';
import DetailsPageCard from '../../DetailsPage/DetailsPageCard';
import { CERTIFICATE_VALIDITY_IN_YEARS } from '../../../constants';
import { type ImageBuildWithExports } from '../../../types/extraTypes';
@@ -203,9 +203,8 @@ const ImagePromotionsCard = ({
const ImageBuildDetailsTab = ({ imageBuild }: { imageBuild: ImageBuildWithExports }) => {
const { t } = useTranslation();
- const { settings } = useAppContext();
const { checkPermissions } = usePermissionsContext();
- const productName = settings.isRHEM ? t('Red Hat Edge Manager') : t('Flight Control');
+ const productName = useProductName();
const [canListPromotions, canEditPromotions, canDeletePromotions] = checkPermissions(detailsPermissions);
const srcRepositoryName = imageBuild.spec.source.repository;
const dstRepositoryName = imageBuild.spec.destination.repository;
diff --git a/libs/ui-components/src/components/Masthead/CommandLineToolsPage.tsx b/libs/ui-components/src/components/Masthead/CommandLineToolsPage.tsx
index 0aa89e550..9fc6d9745 100644
--- a/libs/ui-components/src/components/Masthead/CommandLineToolsPage.tsx
+++ b/libs/ui-components/src/components/Masthead/CommandLineToolsPage.tsx
@@ -14,7 +14,7 @@ import {
import ExternalLinkAltIcon from '@patternfly/react-icons/dist/js/icons/external-link-alt-icon';
import { useTranslation } from '../../hooks/useTranslation';
-import { useAppContext } from '../../hooks/useAppContext';
+import { useProductName } from '../../hooks/useProductName';
import { type CliArtifactsDisplayResponse, useCliArtifacts } from '../../hooks/useCliArtifacts';
import { type CliArtifact, CliArtifactTool } from '../../types/extraTypes';
import { getArtifactDownloadLabel, getArtifactUrl } from '../../utils/cliArtifacts';
@@ -145,10 +145,9 @@ const CommandLineToolsContent = ({
const CommandLineToolsPage = () => {
const { t } = useTranslation();
- const { settings } = useAppContext();
const { loading, loadError, hasArtifactsEnabled, artifactsResponse } = useCliArtifacts();
- const productName = settings.isRHEM ? t('Red Hat Edge Manager') : t('Flight Control');
+ const productName = useProductName();
return (
diff --git a/libs/ui-components/src/components/QuickStart/QuickStart.css b/libs/ui-components/src/components/QuickStart/QuickStart.css
index 906bf3e12..b84b37dea 100644
--- a/libs/ui-components/src/components/QuickStart/QuickStart.css
+++ b/libs/ui-components/src/components/QuickStart/QuickStart.css
@@ -1,7 +1,25 @@
-.fctl-quickstart-card {
+/* Quick start panel on the Overview page */
+.fctl-quickstart-panel {
margin-bottom: var(--pf-t--global--spacer--xl);
}
-.fctl-quickstart-card__expanded {
+.fctl-quickstart-panel__expanded {
border-top: 3px solid var(--pf-t--global--color--brand--default, #06c);
}
+
+/* Individual phase cards in the quick start panel */
+.fctl-quickstart-phase {
+ width: 100%;
+}
+
+.fctl-quickstart-phase.fctl-quickstart-phase--locked {
+ opacity: 65%;
+}
+
+.fctl-quickstart-phase .fctl-quickstart-phase__icon .pf-v6-c-icon__content {
+ --pf-v6-c-icon__content--Color: var(--pf-t--global--icon--color--brand--default);
+}
+
+.fctl-quickstart-phase.fctl-quickstart-phase--locked .pf-v6-c-icon__content {
+ --pf-v6-c-icon__content--Color: var(--pf-t--global--icon--color--disabled);
+}
diff --git a/libs/ui-components/src/components/QuickStart/QuickStart.tsx b/libs/ui-components/src/components/QuickStart/QuickStart.tsx
index 86df3e048..758e49351 100644
--- a/libs/ui-components/src/components/QuickStart/QuickStart.tsx
+++ b/libs/ui-components/src/components/QuickStart/QuickStart.tsx
@@ -1,4 +1,5 @@
import * as React from 'react';
+import type { TFunction } from 'i18next';
import {
Button,
Card,
@@ -31,14 +32,18 @@ import HomeIcon from '@patternfly/react-icons/dist/js/icons/home-icon';
import BuilderImageIcon from '@patternfly/react-icons/dist/js/icons/builder-image-icon';
import PlusCircleIcon from '@patternfly/react-icons/dist/js/icons/plus-circle-icon';
import CubesIcon from '@patternfly/react-icons/dist/js/icons/cubes-icon';
+import CheckCircleIcon from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
-import type { QuickStartPhase } from './types';
+import type { PhaseCardStatus, QuickStartPhase, QuickStartPhaseIcon, QuickStartPhaseId } from './types';
import { useTranslation } from '../../hooks/useTranslation';
+import { useProductName } from '../../hooks/useProductName';
+import { usePermissionsContext } from '../common/PermissionsContext';
import { useQuickStart } from './QuickStartContext';
+import { getPhaseDescription, getPhaseTitle } from './quickStartDefinitions';
import './QuickStart.css';
-const PHASE_ICONS: Record = {
+const PHASE_ICONS: Record = {
home: HomeIcon,
image: BuilderImageIcon,
plus: PlusCircleIcon,
@@ -47,104 +52,128 @@ const PHASE_ICONS: Record = {
interface PhaseCardProps {
card: QuickStartPhase;
- isLocked: boolean;
- prevPhaseTitle: string | undefined;
+ prevPhaseId?: QuickStartPhaseId;
}
-const PhaseCard = ({ card, isLocked, prevPhaseTitle }: PhaseCardProps) => {
+const getActionLabel = (t: TFunction, status: PhaseCardStatus) => {
+ switch (status) {
+ case 'complete':
+ return t('Restart');
+ case 'in-progress':
+ return t('Continue');
+ default:
+ return t('Start');
+ }
+};
+
+const CardStatusLabel = ({ status }: { status: PhaseCardStatus }) => {
+ const { t } = useTranslation();
+
+ switch (status) {
+ case 'complete':
+ return (
+ }>
+ {t('Complete')}
+
+ );
+ case 'in-progress':
+ return (
+
+ );
+ case 'locked':
+ return (
+ }>
+ {t('Locked')}
+
+ );
+ default:
+ return null;
+ }
+};
+
+const PhaseCard = ({ card, prevPhaseId }: PhaseCardProps) => {
const { t } = useTranslation();
const { startPhase } = useQuickStart();
- const PhaseIcon = PHASE_ICONS[card.icon] || HomeIcon;
+ const { checkPermissions } = usePermissionsContext();
+ const PhaseIcon = PHASE_ICONS[card.icon];
+
+ const isLocked = card.status === 'locked';
+ const actionLabel = getActionLabel(t, card.status);
+ const productName = useProductName();
+
+ let lockedByPhase: string | undefined;
+ if (isLocked) {
+ lockedByPhase = prevPhaseId ? getPhaseTitle(t, prevPhaseId) : undefined;
+ }
return (
-
-
-
-
+
+
+
+
-
- {card.title}
-
+ {getPhaseTitle(t, card.id)}
}>
- {t('{{count}} minutes', { count: 3 })}
-
-
- {isLocked && (
- }>
- {t('Locked')}
+ {card.stepCount > 0 && (
+
)}
+
-
- {card.description}
+
+ {getPhaseDescription(t, card.id, productName, checkPermissions)}
-
-