From 3309391cfb6854707d31fa7b6bac60027213f2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 3 Jan 2025 13:48:02 +0000 Subject: [PATCH 01/33] chore(web): update PatternFly to latest v5 version As a first step before migrating to PatternFly v6 --- web/package-lock.json | 6 +++--- web/package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 24a40993f2..8675d7094b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -10,9 +10,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.1.0", - "@patternfly/react-core": "^5.1.1", - "@patternfly/react-table": "^5.1.1", + "@patternfly/patternfly": "^5.4.2", + "@patternfly/react-core": "^5.4.2", + "@patternfly/react-table": "^5.4.2", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", diff --git a/web/package.json b/web/package.json index 4bac7b46d0..5f52d8f4cc 100644 --- a/web/package.json +++ b/web/package.json @@ -107,9 +107,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.1.0", - "@patternfly/react-core": "^5.1.1", - "@patternfly/react-table": "^5.1.1", + "@patternfly/patternfly": "^5.4.2", + "@patternfly/react-core": "^5.4.2", + "@patternfly/react-table": "^5.4.2", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", From c57edbfcf7db62f858b18b548108b85e4c5f2237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 3 Jan 2025 14:01:37 +0000 Subject: [PATCH 02/33] chore(web): update PatternFly to v6 --- web/package-lock.json | 62 +++++++++++++++++++++---------------------- web/package.json | 6 ++--- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/web/package-lock.json b/web/package-lock.json index 8675d7094b..6792531e7f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -10,9 +10,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.4.2", - "@patternfly/react-core": "^5.4.2", - "@patternfly/react-table": "^5.4.2", + "@patternfly/patternfly": "^6.1.0", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-table": "^6.1.0", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", @@ -3948,23 +3948,23 @@ } }, "node_modules/@patternfly/patternfly": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-5.4.2.tgz", - "integrity": "sha512-+BaokNR8/AmTYMESxby9UtQXPGACg449BXQd0KejAvW/uGxlgO6mY1X1205DeBEHoK3e/vXkYXjvZPpv/tcxSA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.1.0.tgz", + "integrity": "sha512-w+QazL8NHKkg5j01eotblsswKxQQSYB0CN3yBXQL9ScpHdp/fK8M6TqWbKZNRpf+NqhMxcH/om8eR0N/fDCJqw==", "license": "MIT" }, "node_modules/@patternfly/react-core": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.11.tgz", - "integrity": "sha512-+WgxVnnqiZiASB+zMBA8Z1YuaX32/ehJ8Y4UB+j2xIB/tjvBqKNVn7n4VPy56F+G9nJ92Kv8Tekccau6bL6jFg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.1.0.tgz", + "integrity": "sha512-zj0lJPZxQanXKD8ae2kYnweT0kpp1CzpHYAkaBjTrw2k6ZMfr/UPlp0/ugCjWEokBqh79RUADLkKJJPce/yoSQ==", "license": "MIT", "dependencies": { - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "focus-trap": "7.6.2", - "react-dropzone": "^14.2.3", - "tslib": "^2.7.0" + "react-dropzone": "^14.3.5", + "tslib": "^2.8.1" }, "peerDependencies": { "react": "^17 || ^18", @@ -3972,9 +3972,9 @@ } }, "node_modules/@patternfly/react-icons": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-5.4.2.tgz", - "integrity": "sha512-CMQ5oHYzW6TPVTs2jpNJmP2vGCAKR/YeTPwHGO9dLkAUej1IcIxtCCWK2Fdo2UJsnBjuZihasyw2b6ehvbUm9Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-6.1.0.tgz", + "integrity": "sha512-V1w/j19YmOgvh72IRRf1p07k+u4M5+9P+o/IxunlF0fWzLDX4Hf+utBI11A8cRfUzpQN7eLw/vZIS3BLM8Ge3Q==", "license": "MIT", "peerDependencies": { "react": "^17 || ^18", @@ -3982,23 +3982,23 @@ } }, "node_modules/@patternfly/react-styles": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-5.4.1.tgz", - "integrity": "sha512-XA8PXksD8uiA3RTwxdUwJXOCf+V6sVd+2HKapWAdRLvtSV+Sdk7NgCvalb4IAQncsddLopjPQD8gAHA298+N8w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-6.1.0.tgz", + "integrity": "sha512-JQ3zIl5SFiSB0YWVYibcUwgZdsp6Wn8hkfZ7KhtCjHFccSDdJexPOXVV1O9f2h4PfxTlY3YntZ81ZsguBx/Q7A==", "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.4.12", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.12.tgz", - "integrity": "sha512-ZpW/49bWR9JkZCyBGBCbHNdJt0Vn34g5BaXlVF/P7Tl0WPdxFLWS5EQywiXEhu8qoOhz3uGcyGwACCJCvmqCSg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-6.1.0.tgz", + "integrity": "sha512-eC8mKkvFR0btfv6yEOvE+J4gBXU8ZGe9i2RSezBM+MJaXEQt/CKRjV+SAB5EeE3PyBYKG8yYDdsOoNmaPxxvSA==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^5.4.11", - "@patternfly/react-icons": "^5.4.2", - "@patternfly/react-styles": "^5.4.1", - "@patternfly/react-tokens": "^5.4.1", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-icons": "^6.1.0", + "@patternfly/react-styles": "^6.1.0", + "@patternfly/react-tokens": "^6.1.0", "lodash": "^4.17.21", - "tslib": "^2.7.0" + "tslib": "^2.8.1" }, "peerDependencies": { "react": "^17 || ^18", @@ -4006,9 +4006,9 @@ } }, "node_modules/@patternfly/react-tokens": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-5.4.1.tgz", - "integrity": "sha512-eygdHE7Krta1mijAv/E8RHiKIgysD0eeNTo8EXUYC8/M4e5K6sqpr2p6rQBF8QiRMN8FnbXvZT3K2OQ28pYt9Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.1.0.tgz", + "integrity": "sha512-t1UcHbOa4txczTR5UlnG4XcAAdnDSfSlCaOddw/HTqRF59pn2ks2JUu9sfnFRZ8SiAAxKRiYdX5bT7Mf4R24+w==", "license": "MIT" }, "node_modules/@pkgr/core": { diff --git a/web/package.json b/web/package.json index 5f52d8f4cc..a78be1a182 100644 --- a/web/package.json +++ b/web/package.json @@ -107,9 +107,9 @@ "@date-fns/tz": "^1.1.2", "@icons-pack/react-simple-icons": "^10.0.0", "@material-symbols/svg-400": "^0.27.2", - "@patternfly/patternfly": "^5.4.2", - "@patternfly/react-core": "^5.4.2", - "@patternfly/react-table": "^5.4.2", + "@patternfly/patternfly": "^6.1.0", + "@patternfly/react-core": "^6.1.0", + "@patternfly/react-table": "^6.1.0", "@tanstack/react-query": "^5.49.2", "axios": "^1.7.3", "fast-sort": "^3.4.0", From 725e23da187e75fe9de56c4d8ae22c79582d921d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Wed, 8 Jan 2025 17:56:58 +0000 Subject: [PATCH 03/33] fix(web): migrate EmptyState to PFv6 --- web/src/components/core/EmptyState.tsx | 23 ++++++++++--------- .../components/core/InstallationFinished.tsx | 14 +++++------ web/src/components/core/ServerError.tsx | 19 ++++++--------- web/src/components/layout/Loading.tsx | 10 ++------ 4 files changed, 27 insertions(+), 39 deletions(-) diff --git a/web/src/components/core/EmptyState.tsx b/web/src/components/core/EmptyState.tsx index 49451b9c1f..9237b60aa4 100644 --- a/web/src/components/core/EmptyState.tsx +++ b/web/src/components/core/EmptyState.tsx @@ -23,13 +23,11 @@ import React from "react"; import { EmptyState, - EmptyStateHeader, EmptyStateBody, Stack, EmptyStateFooter, EmptyStateActions, EmptyStateProps, - EmptyStateHeaderProps, } from "@patternfly/react-core"; import { Icon } from "~/components/layout"; import { IconProps } from "../layout/Icon"; @@ -38,7 +36,7 @@ type EmptyStateWrapperProps = { title: string; icon: IconProps["name"]; color?: string; - headingLevel?: EmptyStateHeaderProps["headingLevel"]; + headingLevel?: EmptyStateProps["headingLevel"]; noPadding?: boolean; actions?: React.ReactNode; children?: React.ReactNode; @@ -66,15 +64,18 @@ export default function EmptyStateWrapper({ // @ts-ignore if (noPadding) rest.className = [rest.className, "no-padding"].join(" ").trim(); + const EmptyStateIcon = () => ; + return ( - - } - /> + {children && ( {children} diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index 598ed705ca..67c46428e1 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -28,8 +28,6 @@ import { CardBody, EmptyState, EmptyStateBody, - EmptyStateHeader, - EmptyStateIcon, ExpandableSection, Flex, Grid, @@ -114,12 +112,12 @@ function InstallationFinished() { - - } - /> +
- - } - /> + {_("Please, check whether it is running.")}
diff --git a/web/src/components/layout/Loading.tsx b/web/src/components/layout/Loading.tsx index 7147518404..ba8a57045f 100644 --- a/web/src/components/layout/Loading.tsx +++ b/web/src/components/layout/Loading.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { EmptyState, EmptyStateIcon, EmptyStateHeader, Spinner } from "@patternfly/react-core"; +import { EmptyState, Spinner } from "@patternfly/react-core"; import { Center, PlainLayout } from "~/components/layout"; import { LayoutProps } from "~/components/layout/Layout"; import { _ } from "~/i18n"; @@ -39,13 +39,7 @@ function Loading({ return (
- - } - /> - +
); From 8f14e2eba4b45931bbf653956fee71a778b998e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:04:58 +0000 Subject: [PATCH 04/33] fix(web): replace PF/Text with PF/Content As part of the migration to PF v6. It also use PF/Content for replacing a deprecated PF/Chip. --- .../components/core/InstallationFinished.tsx | 8 ++-- web/src/components/core/ProgressText.tsx | 4 +- web/src/components/l10n/KeyboardSelection.tsx | 4 +- web/src/components/l10n/TimezoneSelection.tsx | 6 +-- web/src/components/overview/L10nSection.tsx | 12 +++--- .../components/overview/SoftwareSection.tsx | 12 +++--- .../components/overview/StorageSection.tsx | 38 +++++++++---------- .../components/questions/GenericQuestion.tsx | 4 +- .../questions/LuksActivationQuestion.tsx | 4 +- .../questions/QuestionWithPassword.tsx | 4 +- .../storage/VolumeLocationSelectorTable.tsx | 6 +-- web/src/components/storage/dasd/DASDTable.tsx | 14 +++---- 12 files changed, 57 insertions(+), 59 deletions(-) diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index 67c46428e1..ecd51dc4f3 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -26,6 +26,7 @@ import { Button, Card, CardBody, + Content, EmptyState, EmptyStateBody, ExpandableSection, @@ -33,7 +34,6 @@ import { Grid, GridItem, Stack, - Text, } from "@patternfly/react-core"; import { Center, Icon } from "~/components/layout"; import { _ } from "~/i18n"; @@ -123,14 +123,14 @@ function InstallationFinished() { rowGap={{ default: "rowGapMd" }} justifyContent={{ default: "justifyContentCenter" }} > - {_("The installation on your machine is complete.")} - + {_("The installation on your machine is complete.")} + {useIguana ? _("At this point you can power off the machine.") : _( "At this point you can reboot the machine to log in to the new system.", )} - + {usingTpm(config) && }
diff --git a/web/src/components/core/ProgressText.tsx b/web/src/components/core/ProgressText.tsx index 8a31346e2a..705fe6c71f 100644 --- a/web/src/components/core/ProgressText.tsx +++ b/web/src/components/core/ProgressText.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Split, Text } from "@patternfly/react-core"; +import { Split, Content } from "@patternfly/react-core"; type ProgressTextProps = { /** Progress message. */ @@ -39,7 +39,7 @@ export default function ProgressText({ message, current, total }: ProgressTextPr const text = current === 0 ? message : `${message} (${current}/${total})`; return ( - {text} + {text} ); } diff --git a/web/src/components/l10n/KeyboardSelection.tsx b/web/src/components/l10n/KeyboardSelection.tsx index 0675bc3877..bfc323ddf8 100644 --- a/web/src/components/l10n/KeyboardSelection.tsx +++ b/web/src/components/l10n/KeyboardSelection.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Form, FormGroup, Radio, Text } from "@patternfly/react-core"; +import { Content, Form, FormGroup, Radio } from "@patternfly/react-core"; import { useNavigate } from "react-router-dom"; import { ListSearch, Page } from "~/components/core"; import { _ } from "~/i18n"; @@ -59,7 +59,7 @@ export default function KeyboardSelection() { {name} {" "} - {id} + {id} } value={id} diff --git a/web/src/components/l10n/TimezoneSelection.tsx b/web/src/components/l10n/TimezoneSelection.tsx index 614ba8dc5a..0042704d98 100644 --- a/web/src/components/l10n/TimezoneSelection.tsx +++ b/web/src/components/l10n/TimezoneSelection.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Divider, Flex, Form, FormGroup, Radio, Text } from "@patternfly/react-core"; +import { Content, Divider, Flex, Form, FormGroup, Radio } from "@patternfly/react-core"; import { useNavigate } from "react-router-dom"; import { ListSearch, Page } from "~/components/core"; import { timezoneTime } from "~/utils"; @@ -93,12 +93,12 @@ export default function TimezoneSelection() { {parts.join("-")} {" "} - {country} + {country} } description={ - {timezoneTime(id, date) || ""} + {timezoneTime(id, date) || ""}
{details}
diff --git a/web/src/components/overview/L10nSection.tsx b/web/src/components/overview/L10nSection.tsx index 37308e410d..4f0d686826 100644 --- a/web/src/components/overview/L10nSection.tsx +++ b/web/src/components/overview/L10nSection.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { TextContent, Text, TextVariants } from "@patternfly/react-core"; +import { Content } from "@patternfly/react-core"; import { Em } from "~/components/core"; import { _ } from "~/i18n"; import { useL10n } from "~/queries/l10n"; @@ -34,13 +34,13 @@ export default function L10nSection() { const [msg1, msg2] = _("The system will use %s as its default language.").split("%s"); return ( - - {_("Localization")} - + + {_("Localization")} + {msg1} {`${locale.name} (${locale.territory})`} {msg2} - - + + ); } diff --git a/web/src/components/overview/SoftwareSection.tsx b/web/src/components/overview/SoftwareSection.tsx index a93e880192..fe1cfcd043 100644 --- a/web/src/components/overview/SoftwareSection.tsx +++ b/web/src/components/overview/SoftwareSection.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { List, ListItem, Text, TextContent, TextVariants } from "@patternfly/react-core"; +import { Content, List, ListItem } from "@patternfly/react-core"; import { Em } from "~/components/core"; import { SelectedBy } from "~/types/software"; import { usePatterns, useProposal, useProposalChanges } from "~/queries/software"; @@ -51,11 +51,11 @@ export default function SoftwareSection(): React.ReactNode { return ( <> - + {msg1} {proposal.size} {msg2} - + {selectedPatterns.map((p) => ( {p.summary} @@ -66,9 +66,9 @@ export default function SoftwareSection(): React.ReactNode { }; return ( - - {_("Software")} + + {_("Software")} {patterns.length ? : } - + ); } diff --git a/web/src/components/overview/StorageSection.tsx b/web/src/components/overview/StorageSection.tsx index a4f4526963..76d8f32952 100644 --- a/web/src/components/overview/StorageSection.tsx +++ b/web/src/components/overview/StorageSection.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Text, TextContent, TextVariants } from "@patternfly/react-core"; +import { Content } from "@patternfly/react-core"; import { deviceLabel } from "~/components/storage/utils"; import { Em } from "~/components/core"; import { _ } from "~/i18n"; @@ -95,11 +95,11 @@ const msgLvmSingleDisk = (policy: string): string => { } }; -const Content = ({ children }) => ( - - {_("Storage")} +const SectionContent = ({ children }) => ( + <> + {_("Storage")} {children} - + ); /** @@ -117,9 +117,9 @@ export default function StorageSection() { if (result === undefined) { return ( - - {_("Install using an advanced configuration.")} - + + {_("Install using an advanced configuration.")} + ); } @@ -133,27 +133,27 @@ export default function StorageSection() { if (pvDevices.length > 1) { return ( - + {msgLvmMultipleDisks(result.settings.spacePolicy)} - + ); } else { const [msg1, msg2] = msgLvmSingleDisk(result.settings.spacePolicy).split("%s"); return ( - - + + {msg1} {label(pvDevices[0])} {msg2} - - + + ); } } const targetDevice = result.settings.targetDevice; - if (!targetDevice) return {_("No device selected yet")}; + if (!targetDevice) return {_("No device selected yet")}; const fullMsg = (policy: string): string => { switch (policy) { @@ -179,12 +179,12 @@ export default function StorageSection() { const [msg1, msg2] = fullMsg(result.settings.spacePolicy).split("%s"); return ( - - + + {msg1} {label(targetDevice)} {msg2} - - + + ); } diff --git a/web/src/components/questions/GenericQuestion.tsx b/web/src/components/questions/GenericQuestion.tsx index 39a016224c..b534aba42a 100644 --- a/web/src/components/questions/GenericQuestion.tsx +++ b/web/src/components/questions/GenericQuestion.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Text } from "@patternfly/react-core"; +import { Content } from "@patternfly/react-core"; import { Popup } from "~/components/core"; import { AnswerCallback, Question } from "~/types/questions"; import QuestionActions from "~/components/questions/QuestionActions"; @@ -47,7 +47,7 @@ export default function GenericQuestion({ return ( - {question.text} + {question.text} - {question.text} + {question.text}
{/* TRANSLATORS: field label */} diff --git a/web/src/components/questions/QuestionWithPassword.tsx b/web/src/components/questions/QuestionWithPassword.tsx index 0bccc00c75..24f6a2de78 100644 --- a/web/src/components/questions/QuestionWithPassword.tsx +++ b/web/src/components/questions/QuestionWithPassword.tsx @@ -21,7 +21,7 @@ */ import React, { useState } from "react"; -import { Form, FormGroup, Stack, Text } from "@patternfly/react-core"; +import { Content, Form, FormGroup, Stack } from "@patternfly/react-core"; import { Icon } from "~/components/layout"; import { PasswordInput, Popup } from "~/components/core"; import { AnswerCallback, Question } from "~/types/questions"; @@ -57,7 +57,7 @@ export default function QuestionWithPassword({ titleIconVariant={() => } > - {question.text} + {question.text} {/* TRANSLATORS: field label */} diff --git a/web/src/components/storage/VolumeLocationSelectorTable.tsx b/web/src/components/storage/VolumeLocationSelectorTable.tsx index 78f063901a..f52da531c5 100644 --- a/web/src/components/storage/VolumeLocationSelectorTable.tsx +++ b/web/src/components/storage/VolumeLocationSelectorTable.tsx @@ -21,7 +21,7 @@ */ import React from "react"; -import { Chip, Split } from "@patternfly/react-core"; +import { Content, Split } from "@patternfly/react-core"; import { _ } from "~/i18n"; import { DeviceName, @@ -64,9 +64,7 @@ const DeviceUsage = ({ users }: { users: string[] }) => { return ( {users.map((user, index) => ( - - {user} - + {user} ))} ); diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index da1b21af1a..74b315dcef 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -23,6 +23,7 @@ import React, { useState } from "react"; import { Button, + Content, Divider, Dropdown, DropdownItem, @@ -31,7 +32,6 @@ import { ListItem, MenuToggle, Stack, - Text, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, @@ -93,11 +93,11 @@ const DevicesList = ({ devices }) => ( const FormatNotPossible = ({ devices, onAccept }) => ( - + {_( "Offline devices must be activated before formatting them. Please, unselect or activate the devices listed below and try it again", )} - + @@ -109,11 +109,11 @@ const FormatNotPossible = ({ devices, onAccept }) => ( const FormatConfirmation = ({ devices, onCancel, onConfirm }) => ( - + {_( "This action could destroy any data stored on the devices listed below. Please, confirm that you really want to continue.", )} - + @@ -279,7 +279,7 @@ export default function DASDTable() { setFilters((currentFilters) => ({ ...currentFilters, ...newFilters })); }; - const Content = () => { + const PageContent = () => { return ( @@ -382,7 +382,7 @@ export default function DASDTable() { - + ); From d9d4cddeb65013452f5290e985b8c86f8acc098c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:18:16 +0000 Subject: [PATCH 05/33] fix(web): replace values for align props Use Start and End suffix instead of Left and Right. --- web/src/components/core/InstallationFinished.tsx | 2 +- web/src/components/layout/Header.tsx | 2 +- web/src/components/storage/dasd/DASDTable.tsx | 2 +- web/src/components/storage/iscsi/TargetsSection.tsx | 2 +- web/src/components/storage/zfcp/ZFCPPage.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index ecd51dc4f3..63f62b7db4 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -50,7 +50,7 @@ const TpmHint = () => { const title = _("TPM sealing requires the new system to be booted directly."); return ( - {title}}> + {title}}> {_("If a local media was used to run this installer, remove it before the next boot.")} - + diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index 74b315dcef..a23a31c81c 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -326,7 +326,7 @@ export default function DASDTable() { <> - + - + {/* TRANSLATORS: button label, starts iSCSI discovery */} diff --git a/web/src/components/storage/zfcp/ZFCPPage.tsx b/web/src/components/storage/zfcp/ZFCPPage.tsx index defb1678e9..00734d6104 100644 --- a/web/src/components/storage/zfcp/ZFCPPage.tsx +++ b/web/src/components/storage/zfcp/ZFCPPage.tsx @@ -108,7 +108,7 @@ const Disks = () => { <> - + {/* TRANSLATORS: button label */} + ); } From d494cc97b87b9f62c4bfd5f8e82d0f6e6c99e814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:49:08 +0000 Subject: [PATCH 15/33] fix(web): force WifiSelectorPage to fill all space --- web/src/components/network/WifiSelectorPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/network/WifiSelectorPage.tsx b/web/src/components/network/WifiSelectorPage.tsx index 14b5a38ee2..c0a5c15a51 100644 --- a/web/src/components/network/WifiSelectorPage.tsx +++ b/web/src/components/network/WifiSelectorPage.tsx @@ -31,7 +31,7 @@ function WifiSelectorPage() { useNetworkConfigChanges(); return ( - +

{_("Connect to a Wi-Fi network")}

From 9592a2aebd14f40a8e51691c7df44feb5527954c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 08:49:41 +0000 Subject: [PATCH 16/33] fix(web): put Button icon as prop instead of child As recommended by PF v6. --- web/src/components/storage/dasd/DASDTable.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index a23a31c81c..5f00f01b28 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -342,9 +342,8 @@ export default function DASDTable() { variant="plain" aria-label={_("Remove min channel filter")} onClick={() => updateFilter({ minChannel: "" })} - > - - + icon={} + /> )}
@@ -364,9 +363,8 @@ export default function DASDTable() { variant="plain" aria-label={_("Remove max channel filter")} onClick={() => updateFilter({ maxChannel: "" })} - > - - + icon={} + /> )} From 9eaaa81db045277ec2231ed2f179d389b221a2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 09:33:51 +0000 Subject: [PATCH 17/33] fix(web): update text color utilities to PF v6 --- web/src/components/core/Page.tsx | 2 +- web/src/components/l10n/LocaleSelection.tsx | 6 ++++-- web/src/components/product/ProductRegistrationPage.tsx | 2 +- web/src/components/storage/BootSelection.tsx | 2 +- web/src/components/storage/ProposalActionsSummary.tsx | 4 ++-- web/src/components/storage/SnapshotsField.tsx | 2 +- web/src/components/storage/SpacePolicySelection.tsx | 4 +++- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index b03d626649..f006398807 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -162,7 +162,7 @@ const Section = ({ )} - {hasDescription &&
{description}
} + {hasDescription &&
{description}
} )} diff --git a/web/src/components/l10n/LocaleSelection.tsx b/web/src/components/l10n/LocaleSelection.tsx index ccc50b8e41..ed47e8505f 100644 --- a/web/src/components/l10n/LocaleSelection.tsx +++ b/web/src/components/l10n/LocaleSelection.tsx @@ -57,10 +57,12 @@ export default function LocaleSelection() { {name} - + {territory} - {id} + + {id} + } value={id} diff --git a/web/src/components/product/ProductRegistrationPage.tsx b/web/src/components/product/ProductRegistrationPage.tsx index 2aa23f4f8e..0c0648b6a4 100644 --- a/web/src/components/product/ProductRegistrationPage.tsx +++ b/web/src/components/product/ProductRegistrationPage.tsx @@ -124,7 +124,7 @@ const RegistrationFormSection = () => { fieldId="email" label={ <> - {EMAIL_LABEL} {_("(optional)")} + {EMAIL_LABEL} {_("(optional)")} } > diff --git a/web/src/components/storage/BootSelection.tsx b/web/src/components/storage/BootSelection.tsx index 9a1bcc71e8..7c5f37caac 100644 --- a/web/src/components/storage/BootSelection.tsx +++ b/web/src/components/storage/BootSelection.tsx @@ -134,7 +134,7 @@ partitions in the appropriate disk.",

{_("Select booting partition")}

-

{description}

+

{description}

diff --git a/web/src/components/storage/ProposalActionsSummary.tsx b/web/src/components/storage/ProposalActionsSummary.tsx index fb0052bdb9..d3a1cc9569 100644 --- a/web/src/components/storage/ProposalActionsSummary.tsx +++ b/web/src/components/storage/ProposalActionsSummary.tsx @@ -58,7 +58,7 @@ const DeletionsInfo = ({ } else if (hasDeleteActions) { // TRANSLATORS: %d will be replaced by the amount of destructive actions label = ( - + {sprintf( n_( "There is %d destructive action planned", @@ -160,7 +160,7 @@ const ActionsInfo = ({ if (!validProposal) { label = ( - + {_("Cannot accommodate the required file systems for installation")} ); diff --git a/web/src/components/storage/SnapshotsField.tsx b/web/src/components/storage/SnapshotsField.tsx index 1235e3b81f..213ab89396 100644 --- a/web/src/components/storage/SnapshotsField.tsx +++ b/web/src/components/storage/SnapshotsField.tsx @@ -62,7 +62,7 @@ export default function SnapshotsField({ rootVolume, onChange }: SnapshotsFieldP />
{label}
-
+
{_( "Allows to boot to a previous version of the \ system after configuration changes or software upgrades.", diff --git a/web/src/components/storage/SpacePolicySelection.tsx b/web/src/components/storage/SpacePolicySelection.tsx index c998f038b4..93d2a18893 100644 --- a/web/src/components/storage/SpacePolicySelection.tsx +++ b/web/src/components/storage/SpacePolicySelection.tsx @@ -63,7 +63,9 @@ const SpacePolicyPicker = ({ id={policy.id} value={policy.id} label={{_(policy.label)}} - body={{_(policy.description)}} + body={ + {_(policy.description)} + } onChange={() => onChange(policy)} defaultChecked={isChecked} /> From 738d19dd495cfe26587bf4167b80d4b1363684c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Thu, 9 Jan 2025 09:55:40 +0000 Subject: [PATCH 18/33] fix(web): adapt typing of EmptyState wrapper --- web/src/components/core/EmptyState.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/core/EmptyState.tsx b/web/src/components/core/EmptyState.tsx index 9237b60aa4..e39f656f86 100644 --- a/web/src/components/core/EmptyState.tsx +++ b/web/src/components/core/EmptyState.tsx @@ -60,7 +60,7 @@ export default function EmptyStateWrapper({ actions, children, ...rest -}: Partial & EmptyStateWrapperProps) { +}: Partial> & EmptyStateWrapperProps) { // @ts-ignore if (noPadding) rest.className = [rest.className, "no-padding"].join(" ").trim(); From b0485b6d13251e7c6d3a82f3918f0817b2422e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 01:30:01 +0000 Subject: [PATCH 19/33] fix(web): adapt core/Popup typing For accepting the description prop sometimes needed for the header. --- web/src/components/core/Popup.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/web/src/components/core/Popup.tsx b/web/src/components/core/Popup.tsx index 20335dfa0a..72e92d5a59 100644 --- a/web/src/components/core/Popup.tsx +++ b/web/src/components/core/Popup.tsx @@ -28,6 +28,7 @@ import { ModalBody, ModalFooter, ModalHeader, + ModalHeaderProps, ModalProps, } from "@patternfly/react-core"; import { Loading } from "~/components/layout"; @@ -45,7 +46,8 @@ export type PopupProps = { isLoading?: boolean; /** Text displayed when `isLoading` is set to `true` */ loadingText?: string; -} & Omit; +} & Omit & + Pick; /** * Wrapper component for holding Popup actions @@ -200,6 +202,8 @@ const AncillaryAction = ({ children, ...actionsProps }: PredefinedAction) => ( */ const Popup = ({ title, + titleIconVariant, + description, isOpen = false, isLoading = false, // TRANSLATORS: progress message @@ -221,7 +225,7 @@ const Popup = ({ isOpen={isOpen} className={`${className} block-size-${blockSize} inline-size-${inlineSize}`.trim()} > - {title && } + {title && } {isLoading ? : content} {actions} From 84d6c717ca6750d2eb72ca011101c74f6866afa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:03:29 +0000 Subject: [PATCH 20/33] fix(web): upate aria props for core/Popup --- web/src/components/core/Popup.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/web/src/components/core/Popup.tsx b/web/src/components/core/Popup.tsx index 72e92d5a59..4ce95db232 100644 --- a/web/src/components/core/Popup.tsx +++ b/web/src/components/core/Popup.tsx @@ -20,7 +20,7 @@ * find current contact information at www.suse.com. */ -import React, { isValidElement } from "react"; +import React, { isValidElement, useId } from "react"; import { Button, ButtonProps, @@ -218,15 +218,20 @@ const Popup = ({ isValidElement(child) ? child.type === Actions : false, ); + const titleId = useId(); + const contentId = useId(); + return ( /** @ts-ignore */ - {title && } - {isLoading ? : content} + {title && } + {isLoading ? : content} {actions} ); From 4fc06b1b659ff5b557f6f579f9f41b833ee6adbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:04:28 +0000 Subject: [PATCH 21/33] fix(web): use proper roles in EncryptionDialog test --- .../components/storage/EncryptionSettingsDialog.test.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/components/storage/EncryptionSettingsDialog.test.tsx b/web/src/components/storage/EncryptionSettingsDialog.test.tsx index b690d6489f..6b32b304c6 100644 --- a/web/src/components/storage/EncryptionSettingsDialog.test.tsx +++ b/web/src/components/storage/EncryptionSettingsDialog.test.tsx @@ -53,7 +53,7 @@ describe("EncryptionSettingsDialog", () => { it("allows settings the encryption", async () => { const { user } = plainRender(); - const checkbox = screen.getByRole("checkbox", { name: "Encrypt the system" }); + const checkbox = screen.getByRole("switch", { name: "Encrypt the system" }); const passwordInput = screen.getByLabelText("Password"); const confirmationInput = screen.getByLabelText("Password confirmation"); const tpmCheckbox = screen.getByRole("checkbox", { name: /Use.*TPM/ }); @@ -102,7 +102,7 @@ describe("EncryptionSettingsDialog", () => { it("allows unsetting the encryption", async () => { const { user } = plainRender(); - const checkbox = screen.getByRole("checkbox", { name: "Encrypt the system" }); + const checkbox = screen.getByRole("switch", { name: "Encrypt the system" }); const acceptButton = screen.getByRole("button", { name: "Accept" }); expect(checkbox).toBeChecked(); await user.click(checkbox); @@ -144,7 +144,7 @@ describe("EncryptionSettingsDialog", () => { it("does not allow sending not valid settings", async () => { const { user } = plainRender(); - const checkbox = screen.getByRole("checkbox", { name: "Encrypt the system" }); + const checkbox = screen.getByRole("switch", { name: "Encrypt the system" }); const passwordInput = screen.getByLabelText("Password"); const confirmationInput = screen.getByLabelText("Password confirmation"); const acceptButton = screen.getByRole("button", { name: "Accept" }); From e8284766363476beb4eaa59865758db4d5ac28a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:15:59 +0000 Subject: [PATCH 22/33] fix(web): update tests looking for actions in rows To properly look for the menu actions at the document body instead of the row where the toggler lives. This change is needed because in PFv6 "The default value of appendTo on Dropdown, Select, and Popper has been updated to `document.body`" Maybe in the future the appendTo prop is added to the actions menu instead. --- .../network/ConnectionsTable.test.tsx | 6 +-- .../components/users/RootAuthMethods.test.tsx | 38 +++++++++++-------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/web/src/components/network/ConnectionsTable.test.tsx b/web/src/components/network/ConnectionsTable.test.tsx index 779e76932f..6612f67bf1 100644 --- a/web/src/components/network/ConnectionsTable.test.tsx +++ b/web/src/components/network/ConnectionsTable.test.tsx @@ -102,9 +102,8 @@ describe("ConnectionsTable", () => { const connectionActions = screen.getByRole("button", { name: "Actions for connection enp1s0", }); - const actionsColumn = connectionActions.parentNode as HTMLElement; await user.click(connectionActions); - const menu = await within(actionsColumn).findByRole("menu"); + const menu = screen.getByRole("menu"); const editAction = within(menu).getByRole("menuitem", { name: "Edit connection enp1s0" }); await user.click(editAction); expect(mockNavigateFn).toHaveBeenCalled(); @@ -122,9 +121,8 @@ describe("ConnectionsTable", () => { const connectionActions = screen.getByRole("button", { name: "Actions for connection enp1s0", }); - const actionsColumn = connectionActions.parentNode as HTMLElement; await user.click(connectionActions); - const menu = await within(actionsColumn).findByRole("menu"); + const menu = screen.getByRole("menu"); const forgetAction = within(menu).getByRole("menuitem", { name: "Forget connection enp1s0", }); diff --git a/web/src/components/users/RootAuthMethods.test.tsx b/web/src/components/users/RootAuthMethods.test.tsx index 065482e080..559fe14a2a 100644 --- a/web/src/components/users/RootAuthMethods.test.tsx +++ b/web/src/components/users/RootAuthMethods.test.tsx @@ -72,7 +72,8 @@ describe("and the password has been set", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(passwordRow).queryByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).queryByRole("menuitem", { name: "Set" }); expect(setAction).toBeNull(); }); @@ -83,9 +84,9 @@ describe("and the password has been set", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const changeAction = within(passwordRow).queryByRole("menuitem", { name: "Change" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); await user.click(changeAction); - screen.getByRole("dialog", { name: "Change the root password" }); }); @@ -96,7 +97,8 @@ describe("and the password has been set", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const discardAction = within(passwordRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); await user.click(discardAction); expect(mockRootUserMutation.mutate).toHaveBeenCalledWith({ password: "" }); @@ -124,7 +126,8 @@ describe("the password is not set yet", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(passwordRow).getByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).getByRole("menuitem", { name: "Set" }); await user.click(setAction); screen.getByRole("dialog", { name: "Set a root password" }); }); @@ -136,9 +139,9 @@ describe("the password is not set yet", () => { const passwordRow = within(table).getByText("Password").closest("tr"); const actionsToggler = within(passwordRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - - const changeAction = within(passwordRow).queryByRole("menuitem", { name: "Change" }); - const discardAction = within(passwordRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); expect(changeAction).toBeNull(); expect(discardAction).toBeNull(); @@ -166,7 +169,8 @@ describe("and the SSH Key has been set", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(sshKeyRow).queryByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).queryByRole("menuitem", { name: "Set" }); expect(setAction).toBeNull(); }); @@ -177,9 +181,9 @@ describe("and the SSH Key has been set", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const changeAction = within(sshKeyRow).queryByRole("menuitem", { name: "Change" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); await user.click(changeAction); - screen.getByRole("dialog", { name: "Edit the SSH Public Key for root" }); }); @@ -190,7 +194,8 @@ describe("and the SSH Key has been set", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const discardAction = within(sshKeyRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); await user.click(discardAction); expect(mockRootUserMutation.mutate).toHaveBeenCalledWith({ sshkey: "" }); @@ -218,7 +223,8 @@ describe("but the SSH Key is not set yet", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - const setAction = within(sshKeyRow).getByRole("menuitem", { name: "Set" }); + const menu = screen.getByRole("menu"); + const setAction = within(menu).getByRole("menuitem", { name: "Set" }); await user.click(setAction); screen.getByRole("dialog", { name: "Add a SSH Public Key for root" }); }); @@ -230,9 +236,9 @@ describe("but the SSH Key is not set yet", () => { const sshKeyRow = within(table).getByText("SSH Key").closest("tr"); const actionsToggler = within(sshKeyRow).getByRole("button", { name: "Actions" }); await user.click(actionsToggler); - - const changeAction = within(sshKeyRow).queryByRole("menuitem", { name: "Change" }); - const discardAction = within(sshKeyRow).queryByRole("menuitem", { name: "Discard" }); + const menu = screen.getByRole("menu"); + const changeAction = within(menu).queryByRole("menuitem", { name: "Change" }); + const discardAction = within(menu).queryByRole("menuitem", { name: "Discard" }); expect(changeAction).toBeNull(); expect(discardAction).toBeNull(); From 19c70ee81d976e417493cbb0227921230f1af6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:28:25 +0000 Subject: [PATCH 23/33] fix(web): fix WifiConnectionForm test Which was wrongly using getByText instead of getByRole for working with buttons. --- web/src/components/network/WifiConnectionForm.test.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/src/components/network/WifiConnectionForm.test.tsx b/web/src/components/network/WifiConnectionForm.test.tsx index 2656796f35..917c3308cd 100644 --- a/web/src/components/network/WifiConnectionForm.test.tsx +++ b/web/src/components/network/WifiConnectionForm.test.tsx @@ -126,16 +126,16 @@ describe("WifiConnectionForm", () => { it("disables cancel and submission actions", async () => { const { user } = renderForm(networkMock); - const connectButton = screen.getByText("Connect"); - const cancelLink = screen.getByText("Cancel"); + const connectButton = screen.getByRole("button", { name: "Connect" }); + const cancelButton = screen.getByRole("button", { name: "Cancel" }); expect(connectButton).not.toBeDisabled(); - expect(cancelLink).not.toBeDisabled(); + expect(cancelButton).not.toBeDisabled(); await waitFor(() => { user.click(connectButton); expect(connectButton).toBeDisabled(); - expect(cancelLink).toBeDisabled(); + expect(cancelButton).toBeDisabled(); }); }); From 44a4c906268624864420f6dd82bd8a88b52f1ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:43:37 +0000 Subject: [PATCH 24/33] fix(web): fix core/Page tests --- web/src/components/core/Page.test.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/web/src/components/core/Page.test.tsx b/web/src/components/core/Page.test.tsx index 5c90132aa1..9a0c683248 100644 --- a/web/src/components/core/Page.test.tsx +++ b/web/src/components/core/Page.test.tsx @@ -100,7 +100,7 @@ describe("Page", () => { it("renders a node that fills all the available space", () => { installerRender({_("The Content")}); const content = screen.getByText("The Content"); - expect(content.classList.contains("pf-m-fill")).toBe(true); + expect((content.parentNode as HTMLElement).classList.contains("pf-m-fill")).toBe(true); }); it("mounts a ProductRegistrationAlert", () => { @@ -177,10 +177,8 @@ describe("Page", () => { }); describe("Page.Header", () => { it("renders a node that sticks to top", () => { - plainRender(The Header); - const content = screen.getByText("The Header"); - const container = content.parentNode as HTMLElement; - expect(container.classList.contains("pf-m-sticky-top")).toBe(true); + const { container } = plainRender(The Header); + expect(container.children[0].classList.contains("pf-m-sticky-top")).toBe(true); }); }); From 6b70a42446cc6bec6ffbd704e627f86341e2f75f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:48:32 +0000 Subject: [PATCH 25/33] fix(web): use v6 intead of v5 in test selectors --- web/src/components/core/FormReadOnlyField.test.jsx | 4 ++-- web/src/components/core/Popup.test.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web/src/components/core/FormReadOnlyField.test.jsx b/web/src/components/core/FormReadOnlyField.test.jsx index c32ed904d7..e9797d0e3a 100644 --- a/web/src/components/core/FormReadOnlyField.test.jsx +++ b/web/src/components/core/FormReadOnlyField.test.jsx @@ -29,6 +29,6 @@ it("renders label and content wrapped in div nodes using expected PatternFly sty plainRender(Agama); const field = screen.getByText("Agama"); const label = screen.getByText("Product"); - expect(field.classList.contains("pf-v5-c-form__group")).toBe(true); - expect(label.classList.contains("pf-v5-c-form__label-text")).toBe(true); + expect(field.classList.contains("pf-v6-c-form__group")).toBe(true); + expect(label.classList.contains("pf-v6-c-form__label-text")).toBe(true); }); diff --git a/web/src/components/core/Popup.test.tsx b/web/src/components/core/Popup.test.tsx index 4b29e1c098..97004333f4 100644 --- a/web/src/components/core/Popup.test.tsx +++ b/web/src/components/core/Popup.test.tsx @@ -82,7 +82,7 @@ describe("Popup", () => { installerRender(Testing); const dialog = await screen.findByRole("dialog"); - expect(dialog.classList.contains("pf-v5-c-modal-box")).toBe(true); + expect(dialog.classList.contains("pf-v6-c-modal-box")).toBe(true); within(dialog).getByText("The Popup Content"); }); From 4da23c03fec15d7a4bb308e9bb9dd62ef6ff8d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Fri, 10 Jan 2025 02:50:09 +0000 Subject: [PATCH 26/33] fix(web): use expected role in the test Switch instead checkbox --- web/src/components/storage/SnapshotsField.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/components/storage/SnapshotsField.test.tsx b/web/src/components/storage/SnapshotsField.test.tsx index 9603e4a61a..375e9ffad4 100644 --- a/web/src/components/storage/SnapshotsField.test.tsx +++ b/web/src/components/storage/SnapshotsField.test.tsx @@ -56,14 +56,14 @@ describe("SnapshotsField", () => { it("reflects snapshots status", () => { props = { rootVolume: { ...rootVolume, snapshots: true }, onChange: onChangeFn }; plainRender(); - const checkbox: HTMLInputElement = screen.getByRole("checkbox"); + const checkbox: HTMLInputElement = screen.getByRole("switch"); expect(checkbox.value).toEqual("on"); }); it("allows toggling snapshots status", async () => { props = { rootVolume: { ...rootVolume, snapshots: true }, onChange: onChangeFn }; const { user } = plainRender(); - const checkbox: HTMLInputElement = screen.getByRole("checkbox"); + const checkbox: HTMLInputElement = screen.getByRole("switch"); await user.click(checkbox); expect(onChangeFn).toHaveBeenCalledWith({ active: false }); }); From 5659c229f404a62f173f0d90a6054618d9d23bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Sat, 11 Jan 2025 09:02:05 +0000 Subject: [PATCH 27/33] fix(web): skip a useless test Most probably it will be drop in the short term. --- web/src/components/core/Em.test.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/core/Em.test.jsx b/web/src/components/core/Em.test.jsx index fe6cd064eb..10996c98e9 100644 --- a/web/src/components/core/Em.test.jsx +++ b/web/src/components/core/Em.test.jsx @@ -26,7 +26,7 @@ import { plainRender } from "~/test-utils"; import { Em } from "~/components/core"; describe("Em", () => { - it("wraps given children inside a compact PF/Label", () => { + it.skip("wraps given children inside a compact PF/Label", () => { plainRender(Whatever); const children = screen.getByText("Whatever"); const parent = children.closest("span.pf-v5-c-label"); From 863f2b41d7a2dc9d38986719af9e0523b16d08ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 10:08:04 +0000 Subject: [PATCH 28/33] fix(web): temporary workaround for Layout header Renders an emtpy Masthead instead of nothing when there is not header at all. This is needed in order to have the document structure expected by PatternFly CSS to make things works as expected (i.e., allowing the content fill the space reserved for the sidebar). --- web/src/components/layout/Layout.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/src/components/layout/Layout.tsx b/web/src/components/layout/Layout.tsx index 10384f9e9a..87fc2cf59d 100644 --- a/web/src/components/layout/Layout.tsx +++ b/web/src/components/layout/Layout.tsx @@ -22,7 +22,7 @@ import React, { Suspense, useState } from "react"; import { Outlet, useLocation } from "react-router-dom"; -import { Page, PageProps } from "@patternfly/react-core"; +import { Masthead, Page, PageProps } from "@patternfly/react-core"; import { Questions } from "~/components/questions"; import Header, { HeaderProps } from "~/components/layout/Header"; import { Loading, Sidebar } from "~/components/layout"; @@ -69,6 +69,11 @@ const Layout = ({ // to mount it if there is no header. pageProps.notificationDrawer = ; pageProps.isNotificationDrawerExpanded = issuesDrawerVisible; + } else { + // FIXME: render an empty Masthead instead of nothing, in order to have + // everything working as designed by PatternfFly (there are some CSS rules + // that expect the masthead to be there :shrug:) + pageProps.masthead = ; } return ( From 49b264dbc5e215fa3fe3bb24017c12c344cbad6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 10:15:04 +0000 Subject: [PATCH 29/33] fix(web): do not use body wrapper for core/Page.Content See https://www.patternfly.org/components/page/#pagesection --- web/src/components/core/Page.test.tsx | 2 +- web/src/components/core/Page.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/components/core/Page.test.tsx b/web/src/components/core/Page.test.tsx index 9a0c683248..e85dc4baf3 100644 --- a/web/src/components/core/Page.test.tsx +++ b/web/src/components/core/Page.test.tsx @@ -100,7 +100,7 @@ describe("Page", () => { it("renders a node that fills all the available space", () => { installerRender({_("The Content")}); const content = screen.getByText("The Content"); - expect((content.parentNode as HTMLElement).classList.contains("pf-m-fill")).toBe(true); + expect(content.classList.contains("pf-m-fill")).toBe(true); }); it("mounts a ProductRegistrationAlert", () => { diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index f006398807..1670fe621f 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -286,7 +286,7 @@ const Content = ({ children, ...pageSectionProps }: React.PropsWithChildren {mountRegistrationAlert && } - + {children} From ca9e4f597d29be8b1c79cd28760a2fda9c697f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 10:17:20 +0000 Subject: [PATCH 30/33] fix(web): centers login form at login page --- web/src/components/core/LoginPage.tsx | 63 ++++++++++++--------------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/web/src/components/core/LoginPage.tsx b/web/src/components/core/LoginPage.tsx index 060ff0a9d8..dcfc5503d0 100644 --- a/web/src/components/core/LoginPage.tsx +++ b/web/src/components/core/LoginPage.tsx @@ -22,9 +22,8 @@ import React, { useState } from "react"; import { Navigate } from "react-router-dom"; -import { ActionGroup, Button, Card, Form, FormGroup, Grid, GridItem } from "@patternfly/react-core"; +import { ActionGroup, Bullseye, Button, Card, Form, FormGroup } from "@patternfly/react-core"; import { EmptyState, FormValidationError, Page, PasswordInput } from "~/components/core"; -import { Center } from "~/components/layout"; import { AuthErrors, useAuth } from "~/context/auth"; import { _ } from "~/i18n"; import { sprintf } from "sprintf-js"; @@ -69,40 +68,36 @@ user privileges.", return ( -
- - - - {/** @ts-ignore */} - -

- {rootExplanationStart} {rootUser} {rootExplanationEnd} -

-

{_("Please, provide its password to log in to the system.")}

- - - setPassword(v)} - /> - + + + {/** @ts-ignore */} + +

+ {rootExplanationStart} {rootUser} {rootExplanationEnd} +

+

{_("Please, provide its password to log in to the system.")}

+ + + setPassword(v)} + /> + - {error && } + {error && } - - - - -
-
-
-
-
+ + + + + + +
); } From 761852fb94c0aa2ff8d3112aa51fd4f0e92b5ec7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 14:13:48 +0000 Subject: [PATCH 31/33] fix(web): use PF/Bullseye for centering content Intead of the custom core/Center one, which is going to be deleted. --- web/src/components/core/InstallationFinished.tsx | 8 +++++--- web/src/components/core/ProgressReport.tsx | 6 +++--- web/src/components/core/ServerError.tsx | 8 ++++---- web/src/components/layout/Loading.tsx | 8 ++++---- web/src/components/product/ProductSelectionPage.tsx | 6 +++--- web/src/components/users/RootAuthMethodsPage.tsx | 9 ++++----- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index fc013156dc..8ba78cd2b7 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -23,6 +23,7 @@ import React, { useState } from "react"; import { Alert, + Bullseye, Button, Card, CardBody, @@ -35,7 +36,7 @@ import { GridItem, Stack, } from "@patternfly/react-core"; -import { Center, Icon } from "~/components/layout"; +import { Icon } from "~/components/layout"; import { _ } from "~/i18n"; import alignmentStyles from "@patternfly/react-styles/css/utilities/Alignment/alignment"; import { useInstallerStatus } from "~/queries/status"; @@ -106,7 +107,7 @@ function InstallationFinished() { } return ( -
+ @@ -120,6 +121,7 @@ function InstallationFinished() { > @@ -145,7 +147,7 @@ function InstallationFinished() { -
+ ); } diff --git a/web/src/components/core/ProgressReport.tsx b/web/src/components/core/ProgressReport.tsx index 6e5fc3ec22..bbd915dbf3 100644 --- a/web/src/components/core/ProgressReport.tsx +++ b/web/src/components/core/ProgressReport.tsx @@ -22,6 +22,7 @@ import React, { useEffect, useState } from "react"; import { + Bullseye, Card, CardBody, Flex, @@ -36,7 +37,6 @@ import { } from "@patternfly/react-core"; import { _ } from "~/i18n"; -import { Center } from "~/components/layout"; import { useProgress, useProgressChanges, useResetProgress } from "~/queries/progress"; import { Progress as ProgressType } from "~/types/progress"; @@ -135,7 +135,7 @@ function ProgressReport({ title, firstStep }: { title: string; firstStep?: React ); return ( -
+ @@ -155,7 +155,7 @@ function ProgressReport({ title, firstStep }: { title: string; firstStep?: React -
+ ); } diff --git a/web/src/components/core/ServerError.tsx b/web/src/components/core/ServerError.tsx index e24a81a245..e4b0e80951 100644 --- a/web/src/components/core/ServerError.tsx +++ b/web/src/components/core/ServerError.tsx @@ -21,8 +21,8 @@ */ import React from "react"; -import { EmptyState, EmptyStateBody } from "@patternfly/react-core"; -import { Center, Icon, PlainLayout } from "~/components/layout"; +import { Bullseye, EmptyState, EmptyStateBody } from "@patternfly/react-core"; +import { Icon, PlainLayout } from "~/components/layout"; import { Page } from "~/components/core"; import { _ } from "~/i18n"; import { locationReload } from "~/utils"; @@ -34,7 +34,7 @@ function ServerError() { -
+ {_("Please, check whether it is running.")} -
+
diff --git a/web/src/components/layout/Loading.tsx b/web/src/components/layout/Loading.tsx index ba8a57045f..6a8be0f838 100644 --- a/web/src/components/layout/Loading.tsx +++ b/web/src/components/layout/Loading.tsx @@ -21,8 +21,8 @@ */ import React from "react"; -import { EmptyState, Spinner } from "@patternfly/react-core"; -import { Center, PlainLayout } from "~/components/layout"; +import { Bullseye, EmptyState, Spinner } from "@patternfly/react-core"; +import { PlainLayout } from "~/components/layout"; import { LayoutProps } from "~/components/layout/Layout"; import { _ } from "~/i18n"; @@ -38,9 +38,9 @@ function Loading({ const Wrapper = useLayout ? Layout : React.Fragment; return ( -
+ -
+
); } diff --git a/web/src/components/product/ProductSelectionPage.tsx b/web/src/components/product/ProductSelectionPage.tsx index 73a5db2909..ca1545bea4 100644 --- a/web/src/components/product/ProductSelectionPage.tsx +++ b/web/src/components/product/ProductSelectionPage.tsx @@ -33,10 +33,10 @@ import { Stack, FormGroup, Button, + Bullseye, } from "@patternfly/react-core"; import { Navigate, useNavigate } from "react-router-dom"; import { Page } from "~/components/core"; -import { Center } from "~/components/layout"; import { useConfigMutation, useProduct, useRegistration } from "~/queries/software"; import pfTextStyles from "@patternfly/react-styles/css/utilities/Text/text"; import pfRadioStyles from "@patternfly/react-styles/css/components/Radio/radio"; @@ -120,7 +120,7 @@ function ProductSelectionPage() { return ( -
+
@@ -139,7 +139,7 @@ function ProductSelectionPage() { -
+
{selectedProduct && !isLoading && } diff --git a/web/src/components/users/RootAuthMethodsPage.tsx b/web/src/components/users/RootAuthMethodsPage.tsx index 3fce9489dd..0d63309431 100644 --- a/web/src/components/users/RootAuthMethodsPage.tsx +++ b/web/src/components/users/RootAuthMethodsPage.tsx @@ -21,9 +21,8 @@ */ import React, { useRef, useState } from "react"; -import { Flex, Form, FormGroup } from "@patternfly/react-core"; +import { Bullseye, Flex, Form, FormGroup } from "@patternfly/react-core"; import { useLocation, useNavigate } from "react-router-dom"; -import { Center } from "~/components/layout"; import { Page, PasswordInput } from "~/components/core"; import { useRootUserMutation } from "~/queries/users"; import { ROOT as PATHS } from "~/routes/paths"; @@ -60,7 +59,7 @@ function RootAuthMethodsPage() { return ( -
+ } - pfCardProps={{ isCompact: false }} + pfCardProps={{ isCompact: false, isFullHeight: false }} pfCardBodyProps={{ isFilled: true }} >
@@ -91,7 +90,7 @@ function RootAuthMethodsPage() {
-
+
From 8c0ac5c478fdd68bc83028afb99a1d0ad29c5aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Mon, 13 Jan 2025 14:14:58 +0000 Subject: [PATCH 32/33] fix(web): drop no longer needed Center component --- web/src/components/layout/Center.tsx | 52 ---------------------------- web/src/components/layout/index.ts | 1 - 2 files changed, 53 deletions(-) delete mode 100644 web/src/components/layout/Center.tsx diff --git a/web/src/components/layout/Center.tsx b/web/src/components/layout/Center.tsx deleted file mode 100644 index 48c4a53512..0000000000 --- a/web/src/components/layout/Center.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) [2022-2024] SUSE LLC - * - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, contact SUSE LLC. - * - * To contact SUSE LLC about this file by physical or electronic mail, you may - * find current contact information at www.suse.com. - */ - -import React from "react"; - -/** - * Wrapper component for centering vertically its children - * - * @note It could be replaced by the 'vertically-centered' CSS utility class once Firefox add support - * by default for the :has selector, which allows having something like - * - * .parent:has(.vertically-centered) { - * display: grid; - * place-items: center; - * block-size: 100%; - * } - * - * .vertically-centered { inline-size: 100%; } - * - * We can use \@support CSS at rule and use a workaround when :has not available, but somehow - * prefer waiting until Firefox gets support. - * - * To know more, read - * - https://www.w3.org/TR/selectors-4/#relational - * - https://ishadeed.com/article/css-has-parent-selector/ - */ -const Center = ({ children }: React.PropsWithChildren) => ( -
-
{children}
-
-); - -export default Center; diff --git a/web/src/components/layout/index.ts b/web/src/components/layout/index.ts index 0bea58236e..9d32ca00a1 100644 --- a/web/src/components/layout/index.ts +++ b/web/src/components/layout/index.ts @@ -21,7 +21,6 @@ */ export { default as Icon } from "./Icon"; -export { default as Center } from "./Center"; export { default as Loading } from "./Loading"; export { default as Sidebar } from "./Sidebar"; export { default as Header } from "./Header"; From 69eca7e271a464c42c24bafd3526430d49130b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20D=C3=ADaz=20Gonz=C3=A1lez?= Date: Tue, 14 Jan 2025 11:48:46 +0000 Subject: [PATCH 33/33] doc(web): update headers of touched files --- web/src/components/core/Drawer.tsx | 2 +- web/src/components/core/Em.test.jsx | 2 +- web/src/components/core/EmptyState.tsx | 2 +- web/src/components/core/FormReadOnlyField.test.jsx | 2 +- web/src/components/core/InstallButton.tsx | 2 +- web/src/components/core/InstallationFinished.tsx | 2 +- web/src/components/core/IssuesDrawer.tsx | 2 +- web/src/components/core/LoginPage.tsx | 2 +- web/src/components/core/Page.tsx | 2 +- web/src/components/core/PasswordInput.tsx | 2 +- web/src/components/core/Popup.test.tsx | 2 +- web/src/components/core/Popup.tsx | 2 +- web/src/components/core/ProgressReport.tsx | 2 +- web/src/components/core/ServerError.tsx | 2 +- web/src/components/l10n/KeyboardSelection.tsx | 2 +- web/src/components/l10n/LocaleSelection.tsx | 2 +- web/src/components/l10n/TimezoneSelection.tsx | 2 +- web/src/components/layout/Header.tsx | 2 +- web/src/components/layout/Layout.tsx | 2 +- web/src/components/layout/Loading.tsx | 2 +- web/src/components/layout/index.ts | 2 +- web/src/components/network/ConnectionsTable.test.tsx | 2 +- web/src/components/network/WifiConnectionForm.test.tsx | 2 +- web/src/components/network/WifiNetworksListPage.tsx | 2 +- web/src/components/network/WifiSelectorPage.tsx | 2 +- web/src/components/overview/SoftwareSection.tsx | 2 +- web/src/components/overview/StorageSection.tsx | 2 +- web/src/components/product/ProductRegistrationPage.tsx | 2 +- web/src/components/product/ProductSelectionPage.tsx | 2 +- web/src/components/questions/GenericQuestion.tsx | 2 +- web/src/components/questions/LuksActivationQuestion.tsx | 2 +- web/src/components/questions/QuestionWithPassword.tsx | 2 +- web/src/components/storage/BootSelection.tsx | 2 +- web/src/components/storage/EncryptionSettingsDialog.test.tsx | 2 +- web/src/components/storage/ProposalActionsSummary.tsx | 2 +- web/src/components/storage/SnapshotsField.test.tsx | 2 +- web/src/components/storage/SnapshotsField.tsx | 2 +- web/src/components/storage/SpacePolicySelection.tsx | 2 +- web/src/components/storage/VolumeFields.tsx | 2 +- web/src/components/storage/VolumeLocationSelectorTable.tsx | 2 +- web/src/components/storage/dasd/DASDTable.tsx | 2 +- web/src/components/storage/iscsi/TargetsSection.tsx | 2 +- web/src/components/storage/zfcp/ZFCPPage.tsx | 2 +- web/src/components/users/RootAuthMethods.test.tsx | 2 +- web/src/components/users/RootAuthMethodsPage.tsx | 2 +- 45 files changed, 45 insertions(+), 45 deletions(-) diff --git a/web/src/components/core/Drawer.tsx b/web/src/components/core/Drawer.tsx index de18dcaf12..b1ab80a060 100644 --- a/web/src/components/core/Drawer.tsx +++ b/web/src/components/core/Drawer.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Em.test.jsx b/web/src/components/core/Em.test.jsx index 10996c98e9..44be652019 100644 --- a/web/src/components/core/Em.test.jsx +++ b/web/src/components/core/Em.test.jsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/EmptyState.tsx b/web/src/components/core/EmptyState.tsx index e39f656f86..36faeb8a72 100644 --- a/web/src/components/core/EmptyState.tsx +++ b/web/src/components/core/EmptyState.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/FormReadOnlyField.test.jsx b/web/src/components/core/FormReadOnlyField.test.jsx index e9797d0e3a..00706d9ae9 100644 --- a/web/src/components/core/FormReadOnlyField.test.jsx +++ b/web/src/components/core/FormReadOnlyField.test.jsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/InstallButton.tsx b/web/src/components/core/InstallButton.tsx index e6a0f991b6..0faaf87461 100644 --- a/web/src/components/core/InstallButton.tsx +++ b/web/src/components/core/InstallButton.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/InstallationFinished.tsx b/web/src/components/core/InstallationFinished.tsx index 8ba78cd2b7..d510638203 100644 --- a/web/src/components/core/InstallationFinished.tsx +++ b/web/src/components/core/InstallationFinished.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/IssuesDrawer.tsx b/web/src/components/core/IssuesDrawer.tsx index da6ac3c07e..f1a08ef17b 100644 --- a/web/src/components/core/IssuesDrawer.tsx +++ b/web/src/components/core/IssuesDrawer.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/LoginPage.tsx b/web/src/components/core/LoginPage.tsx index dcfc5503d0..0e823a6aa1 100644 --- a/web/src/components/core/LoginPage.tsx +++ b/web/src/components/core/LoginPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Page.tsx b/web/src/components/core/Page.tsx index 1670fe621f..83d3593d61 100644 --- a/web/src/components/core/Page.tsx +++ b/web/src/components/core/Page.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/PasswordInput.tsx b/web/src/components/core/PasswordInput.tsx index 05feed1795..e1352960de 100644 --- a/web/src/components/core/PasswordInput.tsx +++ b/web/src/components/core/PasswordInput.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Popup.test.tsx b/web/src/components/core/Popup.test.tsx index 97004333f4..8582066fce 100644 --- a/web/src/components/core/Popup.test.tsx +++ b/web/src/components/core/Popup.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/Popup.tsx b/web/src/components/core/Popup.tsx index 4ce95db232..8bf1f7fb5b 100644 --- a/web/src/components/core/Popup.tsx +++ b/web/src/components/core/Popup.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/ProgressReport.tsx b/web/src/components/core/ProgressReport.tsx index bbd915dbf3..686b2438a6 100644 --- a/web/src/components/core/ProgressReport.tsx +++ b/web/src/components/core/ProgressReport.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/core/ServerError.tsx b/web/src/components/core/ServerError.tsx index e4b0e80951..1735b4a1fb 100644 --- a/web/src/components/core/ServerError.tsx +++ b/web/src/components/core/ServerError.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/l10n/KeyboardSelection.tsx b/web/src/components/l10n/KeyboardSelection.tsx index bfc323ddf8..dce08d3192 100644 --- a/web/src/components/l10n/KeyboardSelection.tsx +++ b/web/src/components/l10n/KeyboardSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/l10n/LocaleSelection.tsx b/web/src/components/l10n/LocaleSelection.tsx index ed47e8505f..2446a52e09 100644 --- a/web/src/components/l10n/LocaleSelection.tsx +++ b/web/src/components/l10n/LocaleSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/l10n/TimezoneSelection.tsx b/web/src/components/l10n/TimezoneSelection.tsx index 0042704d98..30136056fe 100644 --- a/web/src/components/l10n/TimezoneSelection.tsx +++ b/web/src/components/l10n/TimezoneSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/Header.tsx b/web/src/components/layout/Header.tsx index 69868a91c9..1b65057d0f 100644 --- a/web/src/components/layout/Header.tsx +++ b/web/src/components/layout/Header.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/Layout.tsx b/web/src/components/layout/Layout.tsx index 87fc2cf59d..9f1aa3a4f8 100644 --- a/web/src/components/layout/Layout.tsx +++ b/web/src/components/layout/Layout.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/Loading.tsx b/web/src/components/layout/Loading.tsx index 6a8be0f838..1577b8f012 100644 --- a/web/src/components/layout/Loading.tsx +++ b/web/src/components/layout/Loading.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/layout/index.ts b/web/src/components/layout/index.ts index 9d32ca00a1..ddb595427c 100644 --- a/web/src/components/layout/index.ts +++ b/web/src/components/layout/index.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/ConnectionsTable.test.tsx b/web/src/components/network/ConnectionsTable.test.tsx index 6612f67bf1..025405ead6 100644 --- a/web/src/components/network/ConnectionsTable.test.tsx +++ b/web/src/components/network/ConnectionsTable.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/WifiConnectionForm.test.tsx b/web/src/components/network/WifiConnectionForm.test.tsx index 917c3308cd..c7ce53ff98 100644 --- a/web/src/components/network/WifiConnectionForm.test.tsx +++ b/web/src/components/network/WifiConnectionForm.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/WifiNetworksListPage.tsx b/web/src/components/network/WifiNetworksListPage.tsx index fca7b96b06..b816384f32 100644 --- a/web/src/components/network/WifiNetworksListPage.tsx +++ b/web/src/components/network/WifiNetworksListPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/network/WifiSelectorPage.tsx b/web/src/components/network/WifiSelectorPage.tsx index c0a5c15a51..c650686362 100644 --- a/web/src/components/network/WifiSelectorPage.tsx +++ b/web/src/components/network/WifiSelectorPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/overview/SoftwareSection.tsx b/web/src/components/overview/SoftwareSection.tsx index fe1cfcd043..16beef2502 100644 --- a/web/src/components/overview/SoftwareSection.tsx +++ b/web/src/components/overview/SoftwareSection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/overview/StorageSection.tsx b/web/src/components/overview/StorageSection.tsx index 76d8f32952..ea8d9f2504 100644 --- a/web/src/components/overview/StorageSection.tsx +++ b/web/src/components/overview/StorageSection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/product/ProductRegistrationPage.tsx b/web/src/components/product/ProductRegistrationPage.tsx index 0c0648b6a4..346dbe40c4 100644 --- a/web/src/components/product/ProductRegistrationPage.tsx +++ b/web/src/components/product/ProductRegistrationPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/product/ProductSelectionPage.tsx b/web/src/components/product/ProductSelectionPage.tsx index ca1545bea4..87d680cadd 100644 --- a/web/src/components/product/ProductSelectionPage.tsx +++ b/web/src/components/product/ProductSelectionPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/questions/GenericQuestion.tsx b/web/src/components/questions/GenericQuestion.tsx index b534aba42a..74bea5ff9f 100644 --- a/web/src/components/questions/GenericQuestion.tsx +++ b/web/src/components/questions/GenericQuestion.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/questions/LuksActivationQuestion.tsx b/web/src/components/questions/LuksActivationQuestion.tsx index 5d152d9a1f..48fc7a092a 100644 --- a/web/src/components/questions/LuksActivationQuestion.tsx +++ b/web/src/components/questions/LuksActivationQuestion.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2022-2024] SUSE LLC + * Copyright (c) [2022-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/questions/QuestionWithPassword.tsx b/web/src/components/questions/QuestionWithPassword.tsx index 24f6a2de78..95f2fe0b51 100644 --- a/web/src/components/questions/QuestionWithPassword.tsx +++ b/web/src/components/questions/QuestionWithPassword.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/BootSelection.tsx b/web/src/components/storage/BootSelection.tsx index 7c5f37caac..39946a01e1 100644 --- a/web/src/components/storage/BootSelection.tsx +++ b/web/src/components/storage/BootSelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/EncryptionSettingsDialog.test.tsx b/web/src/components/storage/EncryptionSettingsDialog.test.tsx index 6b32b304c6..62f06d3d9a 100644 --- a/web/src/components/storage/EncryptionSettingsDialog.test.tsx +++ b/web/src/components/storage/EncryptionSettingsDialog.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/ProposalActionsSummary.tsx b/web/src/components/storage/ProposalActionsSummary.tsx index d3a1cc9569..d67b623be9 100644 --- a/web/src/components/storage/ProposalActionsSummary.tsx +++ b/web/src/components/storage/ProposalActionsSummary.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/SnapshotsField.test.tsx b/web/src/components/storage/SnapshotsField.test.tsx index 375e9ffad4..372e81227b 100644 --- a/web/src/components/storage/SnapshotsField.test.tsx +++ b/web/src/components/storage/SnapshotsField.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/SnapshotsField.tsx b/web/src/components/storage/SnapshotsField.tsx index 213ab89396..ed220e1bf4 100644 --- a/web/src/components/storage/SnapshotsField.tsx +++ b/web/src/components/storage/SnapshotsField.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/SpacePolicySelection.tsx b/web/src/components/storage/SpacePolicySelection.tsx index 93d2a18893..b84c31c9f1 100644 --- a/web/src/components/storage/SpacePolicySelection.tsx +++ b/web/src/components/storage/SpacePolicySelection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/VolumeFields.tsx b/web/src/components/storage/VolumeFields.tsx index 95981e8aa2..2bf2198e62 100644 --- a/web/src/components/storage/VolumeFields.tsx +++ b/web/src/components/storage/VolumeFields.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/VolumeLocationSelectorTable.tsx b/web/src/components/storage/VolumeLocationSelectorTable.tsx index f52da531c5..764a9c3e38 100644 --- a/web/src/components/storage/VolumeLocationSelectorTable.tsx +++ b/web/src/components/storage/VolumeLocationSelectorTable.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/dasd/DASDTable.tsx b/web/src/components/storage/dasd/DASDTable.tsx index 5f00f01b28..81b96fb5cc 100644 --- a/web/src/components/storage/dasd/DASDTable.tsx +++ b/web/src/components/storage/dasd/DASDTable.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/iscsi/TargetsSection.tsx b/web/src/components/storage/iscsi/TargetsSection.tsx index eba697fb20..2becbf3c5d 100644 --- a/web/src/components/storage/iscsi/TargetsSection.tsx +++ b/web/src/components/storage/iscsi/TargetsSection.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/storage/zfcp/ZFCPPage.tsx b/web/src/components/storage/zfcp/ZFCPPage.tsx index 00734d6104..25294b981c 100644 --- a/web/src/components/storage/zfcp/ZFCPPage.tsx +++ b/web/src/components/storage/zfcp/ZFCPPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/users/RootAuthMethods.test.tsx b/web/src/components/users/RootAuthMethods.test.tsx index 559fe14a2a..7baa7c11f3 100644 --- a/web/src/components/users/RootAuthMethods.test.tsx +++ b/web/src/components/users/RootAuthMethods.test.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2023-2024] SUSE LLC + * Copyright (c) [2023-2025] SUSE LLC * * All Rights Reserved. * diff --git a/web/src/components/users/RootAuthMethodsPage.tsx b/web/src/components/users/RootAuthMethodsPage.tsx index 0d63309431..4fa898a0ea 100644 --- a/web/src/components/users/RootAuthMethodsPage.tsx +++ b/web/src/components/users/RootAuthMethodsPage.tsx @@ -1,5 +1,5 @@ /* - * Copyright (c) [2024] SUSE LLC + * Copyright (c) [2024-2025] SUSE LLC * * All Rights Reserved. *