Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade admin and account console to PatternFly 5 #28196

Merged
merged 1 commit into from
Apr 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 8 additions & 8 deletions js/CODING_GUIDELINES.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,28 +141,28 @@ For the Admin UI, we modify the PatternFly convention to namespace the classes a
**Example of a CSS custom property**
```css
// Modify the height of the brand image
--keycloak-admin--brand--Height: var(--pf-global--spacer--xl);
--keycloak-admin--brand--Height: var(--pf-v5-global--spacer--xl);
```

**Example**
```css
// Don’t increase specificity
// Don’t use pixel values
.keycloak-admin--manage-columns__modal .pf-c-dropdown {
.keycloak-admin--manage-columns__modal .pf-v5-c-dropdown {
margin-bottom: 24px
}

// Do use a new class
// Do use a PatternFly global spacer variable
.keycloak-admin--manage-columns__dropdown {
margin-bottom: var(--pf-global--spacer--xl);
margin-bottom: var(--pf-v5-global--spacer--xl);
}
```
### Using utility classes

Utility classes can be used to add specific styling to a component, such as margin-bottom or padding. However, their use should be limited to one-off styling needs.

For example, instead of using the utility class for margin-right multiple times, we should define a new Admin UI class that adds this *margin-right: var(--pf-global--spacer--sm);* and in this example, the new class can set the color appropriately as well.
For example, instead of using the utility class for margin-right multiple times, we should define a new Admin UI class that adds this *margin-right: var(--pf-v5-global--spacer--sm);* and in this example, the new class can set the color appropriately as well.

**Using a utility class **
```css
Expand All @@ -171,8 +171,8 @@ switch (titleStatus) {
return (
<>
<InfoCircleIcon
className="pf-u-mr-sm" // utility class
color="var(--pf-global--info-color--100)"
className="pf-v5-u-mr-sm" // utility class
color="var(--pf-v5-global--info-color--100)"
/>{" "}
{titleText}{" "}
</>
Expand All @@ -181,8 +181,8 @@ switch (titleStatus) {
return (
<>
<InfoCircleIcon
className="pf-u-mr-sm"
color="var(--pf-global--danger-color--100)"
className="pf-v5-u-mr-sm"
color="var(--pf-v5-global--danger-color--100)"
/>{" "}
{titleText}{" "}
</>
Expand Down
8 changes: 4 additions & 4 deletions js/apps/account-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
"test": "wireit"
},
"dependencies": {
"@patternfly/patternfly": "^4.224.5",
"@patternfly/react-core": "^4.278.0",
"@patternfly/react-icons": "^4.93.7",
"@patternfly/react-table": "^4.113.6",
"@patternfly/patternfly": "^5.2.1",
"@patternfly/react-core": "^5.2.3",
"@patternfly/react-icons": "^5.2.1",
"@patternfly/react-table": "^5.2.4",
"i18next": "^23.10.1",
"i18next-http-backend": "^2.5.0",
"keycloak-js": "workspace:*",
Expand Down
20 changes: 14 additions & 6 deletions js/apps/account-ui/src/account-security/AccountRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import {
DataListItem,
DataListItemCells,
DataListItemRow,
Icon,
Label,
Split,
SplitItem,
} from "@patternfly/react-core";
import { LinkIcon, UnlinkIcon } from "@patternfly/react-icons";
import { useTranslation } from "react-i18next";
import { IconMapper, useAlerts } from "ui-shared";

import { linkAccount, unLinkAccount } from "../api/methods";
import { LinkedAccountRepresentation } from "../api/representations";
import { useEnvironment } from "../root/KeycloakContext";
Expand Down Expand Up @@ -64,10 +66,10 @@ export const AccountRow = ({
dataListCells={[
<DataListCell key="idp">
<Split>
<SplitItem className="pf-u-mr-sm">
<SplitItem className="pf-v5-u-mr-sm">
<IconMapper icon={account.providerName} />
</SplitItem>
<SplitItem className="pf-u-my-xs" isFilled>
<SplitItem className="pf-v5-u-my-xs" isFilled>
<span id={`${account.providerAlias}-idp-name`}>
{account.displayName}
</span>
Expand All @@ -76,7 +78,7 @@ export const AccountRow = ({
</DataListCell>,
<DataListCell key="label">
<Split>
<SplitItem className="pf-u-my-xs" isFilled>
<SplitItem className="pf-v5-u-my-xs" isFilled>
<span id={`${account.providerAlias}-idp-label`}>
<Label color={account.social ? "blue" : "green"}>
{t(account.social ? "socialLogin" : "systemDefined")}
Expand All @@ -87,7 +89,7 @@ export const AccountRow = ({
</DataListCell>,
<DataListCell key="username" width={5}>
<Split>
<SplitItem className="pf-u-my-xs" isFilled>
<SplitItem className="pf-v5-u-my-xs" isFilled>
<span id={`${account.providerAlias}-idp-username`}>
{account.linkedUsername}
</span>
Expand All @@ -107,7 +109,10 @@ export const AccountRow = ({
variant="link"
onClick={() => unLink(account)}
>
<UnlinkIcon size="sm" /> {t("unLink")}
<Icon size="sm">
<UnlinkIcon />
</Icon>{" "}
{t("unLink")}
</Button>
)}
{!isLinked && (
Expand All @@ -116,7 +121,10 @@ export const AccountRow = ({
variant="link"
onClick={() => link(account)}
>
<LinkIcon size="sm" /> {t("link")}
<Icon size="sm">
<LinkIcon />
</Icon>{" "}
{t("link")}
</Button>
)}
</DataListAction>
Expand Down
8 changes: 4 additions & 4 deletions js/apps/account-ui/src/account-security/DeviceActivity.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export const DeviceActivity = () => {
title={t("deviceActivity")}
description={t("signedInDevicesExplanation")}
>
<Split hasGutter className="pf-u-mb-lg">
<Split hasGutter className="pf-v5-u-mb-lg">
<SplitItem isFilled>
<Title headingLevel="h2" size="xl">
{t("signedInDevices")}
Expand Down Expand Up @@ -149,14 +149,14 @@ export const DeviceActivity = () => {
<DataListItemRow key={device.id} data-testid={`row-${index}`}>
<DataListContent
aria-label="device-sessions-content"
className="pf-u-flex-grow-1"
className="pf-v5-u-flex-grow-1"
>
<Grid hasGutter>
<GridItem span={1} rowSpan={2}>
{device.mobile ? <MobileAltIcon /> : <DesktopIcon />}
</GridItem>
<GridItem sm={8} md={9} span={10}>
<span className="pf-u-mr-md session-title">
<span className="pf-v5-u-mr-md session-title">
{device.os.toLowerCase().includes("unknown")
? t("unknownOperatingSystem")
: device.os}{" "}
Expand All @@ -169,7 +169,7 @@ export const DeviceActivity = () => {
)}
</GridItem>
<GridItem
className="pf-u-text-align-right"
className="pf-v5-u-text-align-right"
sm={3}
md={2}
span={1}
Expand Down
8 changes: 6 additions & 2 deletions js/apps/account-ui/src/account-security/LinkedAccounts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export const LinkedAccounts = () => {
>
<Stack hasGutter>
<StackItem>
<Title headingLevel="h2" className="pf-u-mb-lg" size="xl">
<Title headingLevel="h2" className="pf-v5-u-mb-lg" size="xl">
{t("linkedLoginProviders")}
</Title>
<DataList id="linked-idps" aria-label={t("linkedLoginProviders")}>
Expand All @@ -57,7 +57,11 @@ export const LinkedAccounts = () => {
</DataList>
</StackItem>
<StackItem>
<Title headingLevel="h2" className="pf-u-mt-xl pf-u-mb-lg" size="xl">
<Title
headingLevel="h2"
className="pf-v5-u-mt-xl pf-v5-u-mb-lg"
size="xl"
>
{t("unlinkedLoginProviders")}
</Title>
<DataList id="unlinked-idps" aria-label={t("unlinkedLoginProviders")}>
Expand Down
36 changes: 20 additions & 16 deletions js/apps/account-ui/src/account-security/SigningIn.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,17 @@ import {
DataListItem,
DataListItemCells,
DataListItemRow,
Dropdown,
DropdownItem,
KebabToggle,
PageSection,
Spinner,
Split,
SplitItem,
Title,
} from "@patternfly/react-core";
import {
Dropdown,
DropdownItem,
KebabToggle,
} from "@patternfly/react-core/deprecated";
import { CSSProperties, useState } from "react";
import { Trans, useTranslation } from "react-i18next";
import { ContinueCancelModal, useAlerts } from "ui-shared";
Expand Down Expand Up @@ -44,8 +46,8 @@ const MobileLink = ({ title, onClick, testid }: MobileLinkProps) => {
<Dropdown
isPlain
position="right"
toggle={<KebabToggle onToggle={setOpen} />}
className="pf-u-display-none-on-lg"
toggle={<KebabToggle onToggle={(_event, val) => setOpen(val)} />}
className="pf-v5-u-display-none-on-lg"
isOpen={open}
dropdownItems={[
<DropdownItem key="1" onClick={onClick}>
Expand All @@ -56,7 +58,7 @@ const MobileLink = ({ title, onClick, testid }: MobileLinkProps) => {
<Button
variant="link"
onClick={onClick}
className="pf-u-display-none pf-u-display-inline-flex-on-lg"
className="pf-v5-u-display-none pf-v5-u-display-inline-flex-on-lg"
data-testid={testid}
>
{title}
Expand All @@ -83,12 +85,14 @@ export const SigningIn = () => {
credMetadata: CredentialMetadataRepresentation,
) => {
const credential = credMetadata.credential;
const maxWidth = { "--pf-u-max-width--MaxWidth": "300px" } as CSSProperties;
const maxWidth = {
"--pf-v5-u-max-width--MaxWidth": "300px",
} as CSSProperties;
const items = [
<DataListCell
key="title"
data-testrole="label"
className="pf-u-max-width"
className="pf-v5-u-max-width"
style={maxWidth}
>
{credential.userLabel || t(credential.type as TFuncKey)}
Expand All @@ -102,7 +106,7 @@ export const SigningIn = () => {
data-testrole="created-at"
>
<Trans i18nKey="credentialCreatedAt">
<strong className="pf-u-mr-md"></strong>
<strong className="pf-v5-u-mr-md"></strong>
{{ date: formatDate(new Date(credential.createdDate)) }}
</Trans>
</DataListCell>,
Expand All @@ -125,24 +129,24 @@ export const SigningIn = () => {
return (
<Page title={t("signingIn")} description={t("signingInDescription")}>
{credentialUniqueCategories.map((category) => (
<PageSection key={category} variant="light" className="pf-u-px-0">
<PageSection key={category} variant="light" className="pf-v5-u-px-0">
<Title headingLevel="h2" size="xl" id={`${category}-categ-title`}>
{t(category as TFuncKey)}
</Title>
{credentials
.filter((cred) => cred.category == category)
.map((container) => (
<>
<Split className="pf-u-mt-lg pf-u-mb-lg">
<Split className="pf-v5-u-mt-lg pf-v5-u-mb-lg">
<SplitItem>
<Title
headingLevel="h3"
size="md"
className="pf-u-mb-md"
className="pf-v5-u-mb-md"
data-testid={`${container.type}/help`}
>
<span
className="cred-title pf-u-display-block"
className="cred-title pf-v5-u-display-block"
data-testid={`${container.type}/title`}
>
{t(container.displayName as TFuncKey)}
Expand All @@ -154,7 +158,7 @@ export const SigningIn = () => {
</SplitItem>
{container.createAction && (
<SplitItem isFilled>
<div className="pf-u-float-right">
<div className="pf-v5-u-float-right">
<MobileLink
onClick={() =>
login({
Expand All @@ -175,7 +179,7 @@ export const SigningIn = () => {

<DataList
aria-label="credential list"
className="pf-u-mb-xl"
className="pf-v5-u-mb-xl"
data-testid={`${container.type}/credential-list`}
>
{container.userCredentialMetadatas.length === 0 && (
Expand All @@ -191,7 +195,7 @@ export const SigningIn = () => {
<DataListItem key={meta.credential.id}>
<DataListItemRow id={`cred-${meta.credential.id}`}>
<DataListItemCells
className="pf-u-py-0"
className="pf-v5-u-py-0"
dataListCells={[
...credentialRowCells(meta),
<DataListAction
Expand Down
14 changes: 7 additions & 7 deletions js/apps/account-ui/src/applications/Applications.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -91,21 +91,21 @@ export const Applications = () => {
<DataListCell
key="applications-list-client-id-header"
width={2}
className="pf-u-pt-md"
className="pf-v5-u-pt-md"
>
<strong>{t("name")}</strong>
</DataListCell>,
<DataListCell
key="applications-list-app-type-header"
width={2}
className="pf-u-pt-md"
className="pf-v5-u-pt-md"
>
<strong>{t("applicationType")}</strong>
</DataListCell>,
<DataListCell
key="applications-list-status"
width={2}
className="pf-u-pt-md"
className="pf-v5-u-pt-md"
>
<strong>{t("status")}</strong>
</DataListCell>,
Expand All @@ -120,20 +120,20 @@ export const Applications = () => {
data-testid="applications-list-item"
isExpanded={application.open}
>
<DataListItemRow className="pf-u-align-items-center">
<DataListItemRow className="pf-v5-u-align-items-center">
<DataListToggle
onClick={() => toggleOpen(application.clientId)}
isExpanded={application.open}
id={`toggle-${application.clientId}`}
aria-controls={`content-${application.clientId}`}
/>
<DataListItemCells
className="pf-u-align-items-center"
className="pf-v5-u-align-items-center"
dataListCells={[
<DataListCell width={2} key={`client${application.clientId}`}>
{application.effectiveUrl && (
<Button
className="pf-u-pl-0 title-case"
className="pf-v5-u-pl-0 title-case"
component="a"
variant="link"
onClick={() => window.open(application.effectiveUrl)}
Expand Down Expand Up @@ -166,7 +166,7 @@ export const Applications = () => {

<DataListContent
id={`content-${application.clientId}`}
className="pf-u-pl-4xl"
className="pf-v5-u-pl-4xl"
aria-label={t("applicationDetails", {
clientId: application.clientId,
})}
Expand Down
2 changes: 1 addition & 1 deletion js/apps/account-ui/src/components/datalist/EmptyRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ type EmptyRowProps = {

export const EmptyRow = ({ message, ...props }: EmptyRowProps) => {
return (
<DataListItem className="pf-u-align-items-center pf-p-b-0">
<DataListItem className="pf-v5-u-align-items-center pf-p-b-0">
<DataListItemRow>
<DataListItemCells
dataListCells={[
Expand Down
2 changes: 1 addition & 1 deletion js/apps/account-ui/src/groups/Groups.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export const Groups = () => {
id="directMembership-checkbox"
data-testid="directMembership-checkbox"
isChecked={directMembership}
onChange={(checked) => setDirectMembership(checked)}
onChange={(_event, checked) => setDirectMembership(checked)}
/>
</DataListCell>,
]}
Expand Down