diff --git a/pkg/kdump/kdump-view.jsx b/pkg/kdump/kdump-view.jsx
index 76096009571d..906b24071709 100644
--- a/pkg/kdump/kdump-view.jsx
+++ b/pkg/kdump/kdump-view.jsx
@@ -21,8 +21,7 @@ import cockpit from "cockpit";
import React from "react";
import { OnOffSwitch } from "cockpit-components-onoff.jsx";
-import { OverlayTrigger, Tooltip } from "patternfly-react";
-import { Button } from "@patternfly/react-core";
+import { Button, Tooltip, TooltipPosition } from "@patternfly/react-core";
import * as Select from "cockpit-components-select.jsx";
import { show_modal_dialog } from "cockpit-components-dialog.jsx";
@@ -453,20 +452,20 @@ export class KdumpPage extends React.Component {
if (this.props.reservedMemory == 0) {
const tooltip = _("No memory reserved. Append a crashkernel option to the kernel command line (e.g. in /etc/default/grub) to reserve memory at boot time. Example: crashkernel=512M");
serviceHint = (
- {tooltip} } placement="bottom">
+
-
+
);
}
kdumpServiceDetails = ;
} else if (this.props.kdumpStatus && !this.props.kdumpStatus.installed) {
const tooltip = _("Kdump service not installed. Please ensure package kexec-tools is installed.");
kdumpServiceDetails = (
- {tooltip} } placement="bottom">
+
-
+
);
}
var serviceWaiting;
@@ -483,11 +482,11 @@ export class KdumpPage extends React.Component {
} else {
const tooltip = _("Test is only available while the kdump service is running.");
testButton = (
- {tooltip} } placement="top">
+
-
+
);
}
const tooltip_info = _("This will test the kdump configuration by crashing the kernel.");
@@ -511,9 +510,9 @@ export class KdumpPage extends React.Component {
{testButton}
diff --git a/pkg/lib/cockpit-components-privileged.jsx b/pkg/lib/cockpit-components-privileged.jsx
index 6e0b4bcc1c66..36fe6d48be15 100644
--- a/pkg/lib/cockpit-components-privileged.jsx
+++ b/pkg/lib/cockpit-components-privileged.jsx
@@ -19,8 +19,7 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { Button } from '@patternfly/react-core';
-import { OverlayTrigger, Tooltip } from 'patternfly-react';
+import { Button, Tooltip, TooltipPosition } from '@patternfly/react-core';
import cockpit from "cockpit";
@@ -37,10 +36,10 @@ export function Privileged({ excuse, allowed, placement, tooltipId, children })
let contents = { children };
if (!allowed) {
contents = (
- { excuse } }>
+
{ contents }
- );
+ );
}
return contents;
}
diff --git a/pkg/lib/patternfly-4-overrides.scss b/pkg/lib/patternfly-4-overrides.scss
index 9007232c3681..056fc8b5f897 100644
--- a/pkg/lib/patternfly-4-overrides.scss
+++ b/pkg/lib/patternfly-4-overrides.scss
@@ -36,4 +36,4 @@
/* Helper mod to center pf-c-nav__tertiary when it wraps */
.ct-m-nav__tertiary-center {
justify-content: center;
-}
+}
\ No newline at end of file
diff --git a/pkg/machines/components/create-vm-dialog/createVmDialog.jsx b/pkg/machines/components/create-vm-dialog/createVmDialog.jsx
index c9c473771cba..7954e546a122 100644
--- a/pkg/machines/components/create-vm-dialog/createVmDialog.jsx
+++ b/pkg/machines/components/create-vm-dialog/createVmDialog.jsx
@@ -19,8 +19,8 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { FormGroup, HelpBlock, Modal, OverlayTrigger, Tooltip, TypeAheadSelect } from 'patternfly-react';
-import { Button } from '@patternfly/react-core';
+import { FormGroup, HelpBlock, Modal, TypeAheadSelect } from 'patternfly-react';
+import { Button, Tooltip, TooltipPosition } from '@patternfly/react-core';
import cockpit from 'cockpit';
import { MachinesConnectionSelector } from '../machinesConnectionSelector.jsx';
@@ -404,9 +404,9 @@ const UnattendedRow = ({ validationFailed, unattendedDisabled, unattendedInstall
);
if (unattendedDisabled) {
unattendedInstallationCheckbox = (
- { _("The selected Operating System does not support unattended installation") } } placement='left'>
+
{unattendedInstallationCheckbox}
-
+
);
}
@@ -825,9 +825,11 @@ class CreateVmModal extends React.Component {
);
if (this.state.unattendedInstallation) {
startVmCheckbox = (
- { _("Setting the user passwords for unattended installation requires starting the VM when creating it") } } placement='left'>
+
{startVmCheckbox}
-
+
);
}
@@ -1010,21 +1012,18 @@ export class CreateVmAction extends React.Component {
testdata={testdata}
id={this.props.mode == 'create' ? 'create-new-vm' : 'import-vm-disk'}
variant='secondary'
- style={!this.state.virtInstallAvailable ? { pointerEvents: 'none' } : null} // Fixes OverlayTrigger not showing up
onClick={this.open}>
{this.props.mode == 'create' ? _("Create VM") : _("Import VM")}
);
if (!this.state.virtInstallAvailable)
createButton = (
-
- {_("virt-install package needs to be installed on the system in order to create new VMs")}
- } placement='top'>
+
{createButton}
-
+
);
return (
diff --git a/pkg/machines/components/deleteDialog.jsx b/pkg/machines/components/deleteDialog.jsx
index e0529ae384bb..053f747045fc 100644
--- a/pkg/machines/components/deleteDialog.jsx
+++ b/pkg/machines/components/deleteDialog.jsx
@@ -19,8 +19,8 @@
import cockpit from 'cockpit';
import React from 'react';
-import { Modal, OverlayTrigger, Tooltip } from 'patternfly-react';
-import { Button } from '@patternfly/react-core';
+import { Modal } from 'patternfly-react';
+import { Button, Tooltip } from '@patternfly/react-core';
import { vmId } from '../helpers.js';
import { deleteVm } from '../actions/provider-actions.js';
@@ -149,24 +149,21 @@ export class DeleteDialog extends React.Component {
if (!this.props.vm.persistent) {
deleteButton = (
-
- {_("This VM is transient. Shut it down if you wish to delete it.")}
- } placement='top'>
+
-
+
);
}
return (
-
+ <>
{ deleteButton }
@@ -186,7 +183,7 @@ export class DeleteDialog extends React.Component {
-
+ >
);
}
}
diff --git a/pkg/machines/components/deleteResource.jsx b/pkg/machines/components/deleteResource.jsx
index b442b4eedb79..56eeb96e8306 100644
--- a/pkg/machines/components/deleteResource.jsx
+++ b/pkg/machines/components/deleteResource.jsx
@@ -19,8 +19,8 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { Modal, OverlayTrigger, Tooltip } from 'patternfly-react';
-import { Button } from '@patternfly/react-core';
+import { Modal } from 'patternfly-react';
+import { Button, Tooltip } from '@patternfly/react-core';
import cockpit from 'cockpit';
import { ModalError } from 'cockpit-components-inline-notification.jsx';
@@ -90,19 +90,16 @@ DeleteResourceModal.propTypes = {
export const DeleteResourceButton = ({ objectId, disabled, overlayText, actionName, showDialog }) => {
if (disabled) {
return (
-
- { overlayText }
- } placement='top'>
+
-
+
);
} else {
return (
diff --git a/pkg/machines/components/storagePools/storagePool.jsx b/pkg/machines/components/storagePools/storagePool.jsx
index 67ee1e4d71de..b630bed66cfe 100644
--- a/pkg/machines/components/storagePools/storagePool.jsx
+++ b/pkg/machines/components/storagePools/storagePool.jsx
@@ -18,8 +18,7 @@
*/
import React from 'react';
import PropTypes from 'prop-types';
-import { Tooltip, OverlayTrigger, UtilizationBar } from 'patternfly-react';
-import { Button } from '@patternfly/react-core';
+import { Button, Progress, Tooltip } from '@patternfly/react-core';
import { ListingRow } from 'cockpit-components-listing.jsx';
import {
@@ -47,22 +46,13 @@ export class StoragePool extends React.Component {
);
const allocation = parseFloat(convertToUnit(storagePool.allocation, units.B, units.GiB).toFixed(2));
const capacity = parseFloat(convertToUnit(storagePool.capacity, units.B, units.GiB).toFixed(2));
- const availableTooltipFunction = (max, now) => Available {((max - now) / max).toFixed(2) * 100}% ;
- const usedTooltipFunction = (max, now) => Used {(now / max).toFixed(2) * 100}% ;
+ const sizeLabel = String(cockpit.format("$0 / $1 GiB", allocation, capacity));
const size = (
- <>
-
- >
- );
- const sizeLabel = (
- <>
- {`${allocation} / ${capacity} GiB`}
- >
+
);
const state = (
<>
@@ -74,7 +64,6 @@ export class StoragePool extends React.Component {
const cols = [
{ name, header: true },
size,
- sizeLabel,
rephraseUI('connections', storagePool.connectionName),
state,
];
@@ -165,7 +154,6 @@ class StoragePoolActions extends React.Component {
@@ -174,25 +162,24 @@ class StoragePoolActions extends React.Component {
);
if (this.state.operationInProgress) {
deactivateButton = (
- {_("Operation is in progress")} } placement="top">
+
{deactivateButton}
-
+
);
activateButton = (
- {_("Operation is in progress")} } placement="top">
+
{activateButton}
-
+
);
}
diff --git a/pkg/machines/components/storagePools/storagePoolDelete.jsx b/pkg/machines/components/storagePools/storagePoolDelete.jsx
index 8b3276141949..6491252f900a 100644
--- a/pkg/machines/components/storagePools/storagePoolDelete.jsx
+++ b/pkg/machines/components/storagePools/storagePoolDelete.jsx
@@ -18,8 +18,8 @@
*/
import React from 'react';
import PropTypes from 'prop-types';
-import { Modal, OverlayTrigger, Tooltip } from 'patternfly-react';
-import { Button } from '@patternfly/react-core';
+import { Modal } from 'patternfly-react';
+import { Button, Tooltip } from '@patternfly/react-core';
import { getStorageVolumesUsage, storagePoolId } from '../../helpers.js';
import { ModalError } from 'cockpit-components-inline-notification.jsx';
@@ -192,19 +192,16 @@ export class StoragePoolDelete extends React.Component {
if (!canDelete(storagePool, vms) || !storagePool.persistent) {
return (
-
- { tooltipText }
- } placement='top'>
+
-
+
);
} else {
return (
diff --git a/pkg/machines/components/storagePools/storagePoolList.jsx b/pkg/machines/components/storagePools/storagePoolList.jsx
index 9ada25abad19..4955d23b815e 100644
--- a/pkg/machines/components/storagePools/storagePoolList.jsx
+++ b/pkg/machines/components/storagePools/storagePoolList.jsx
@@ -51,7 +51,7 @@ export class StoragePoolList extends React.Component {
{storagePools
diff --git a/pkg/machines/components/storagePools/storageVolumeCreate.jsx b/pkg/machines/components/storagePools/storageVolumeCreate.jsx
index edbbd6be9a15..2dab6a5080db 100644
--- a/pkg/machines/components/storagePools/storageVolumeCreate.jsx
+++ b/pkg/machines/components/storagePools/storageVolumeCreate.jsx
@@ -19,8 +19,8 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { Modal, OverlayTrigger, Tooltip } from 'patternfly-react';
-import { Button } from '@patternfly/react-core';
+import { Modal } from 'patternfly-react';
+import { Button, Tooltip } from '@patternfly/react-core';
import cockpit from 'cockpit';
import { ModalError } from 'cockpit-components-inline-notification.jsx';
@@ -138,19 +138,16 @@ export class StorageVolumeCreate extends React.Component {
);
} else {
return (
-
- {_("Pool type doesn't support volume creation")}
- } placement='top'>
+
-
+
);
}
};
diff --git a/pkg/machines/components/storagePools/storageVolumeDelete.jsx b/pkg/machines/components/storagePools/storageVolumeDelete.jsx
index b643317b5aea..9b94480153ad 100644
--- a/pkg/machines/components/storagePools/storageVolumeDelete.jsx
+++ b/pkg/machines/components/storagePools/storageVolumeDelete.jsx
@@ -19,8 +19,7 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { OverlayTrigger, Tooltip } from 'patternfly-react';
-import { Button } from '@patternfly/react-core';
+import { Button, Tooltip } from '@patternfly/react-core';
import { storageVolumeDelete, storagePoolRefresh } from '../../libvirt-dbus.js';
import cockpit from 'cockpit';
@@ -69,10 +68,9 @@ export class StorageVolumeDelete extends React.Component {
return deleteBtn;
return (
- { _("One or more selected volumes are used by domains. Detach the disks first to allow volume deletion.") }}>
- { deleteBtn }
-
+
+ { deleteBtn }
+
);
}
}
diff --git a/pkg/machines/components/vmOverviewTabLibvirt.jsx b/pkg/machines/components/vmOverviewTabLibvirt.jsx
index e08c5b18b4e8..d0bfcbac3bc3 100644
--- a/pkg/machines/components/vmOverviewTabLibvirt.jsx
+++ b/pkg/machines/components/vmOverviewTabLibvirt.jsx
@@ -19,8 +19,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import cockpit from 'cockpit';
-import { OverlayTrigger, Tooltip } from "patternfly-react";
-import { Button } from "@patternfly/react-core";
+import { Button, Tooltip } from "@patternfly/react-core";
import { VCPUModal } from './vcpuModal.jsx';
import MemoryModal from './vm/memoryModal.jsx';
@@ -211,39 +210,39 @@ class VmOverviewTabLibvirt extends React.Component {
const uefiPaths = this.getOVMFBinariesOnHost(this.state.loaderElems).filter(elem => elem !== undefined);
const firmwareLink = disabled => {
return (
-
+
-
+
);
};
if (vm.state != "shut off") {
if (vm.persistent) {
firmwareLinkWrapper = (
- { _("Shut off the VM in order to edit firmware configuration") } } placement='top'>
+
{firmwareLink(true)}
-
+
);
} else {
firmwareLinkWrapper = (
- { _("Transient VMs don't support editting firmware configuration") } } placement='top'>
+
{firmwareLink(true)}
-
+
);
}
} else if (!supportsUefiXml(this.state.loaderElems[0])) {
firmwareLinkWrapper = (
- { _("Libvirt or hypervisor does not support UEFI") } } placement='top'>
+
{firmwareLink(true)}
-
+
);
} else if (uefiPaths.length == 0) {
firmwareLinkWrapper = (
- { _("Libvirt did not detect any UEFI/OVMF firmware image installed on the host") } } placement='top'>
+
{firmwareLink(true)}
-
+
);
} else {
firmwareLinkWrapper = firmwareLink(false);
diff --git a/pkg/machines/components/warningInactive.jsx b/pkg/machines/components/warningInactive.jsx
index 57cef3a4891f..b45661dc97e3 100644
--- a/pkg/machines/components/warningInactive.jsx
+++ b/pkg/machines/components/warningInactive.jsx
@@ -2,15 +2,15 @@
import React from 'react';
import PropTypes from 'prop-types';
import cockpit from 'cockpit';
-import { OverlayTrigger, Tooltip } from "patternfly-react";
+import { Tooltip } from "@patternfly/react-core";
const _ = cockpit.gettext;
const WarningInactive = ({ iconId, tooltipId }) => {
return (
- { _("Changes will take effect after shutting down the VM") } } placement='top'>
+
-
+
);
};
diff --git a/pkg/networkmanager/firewall.jsx b/pkg/networkmanager/firewall.jsx
index 3f13641b0995..f068220bf310 100644
--- a/pkg/networkmanager/firewall.jsx
+++ b/pkg/networkmanager/firewall.jsx
@@ -24,10 +24,8 @@ import ReactDOM from "react-dom";
import {
ListView,
Modal,
- OverlayTrigger,
- Tooltip
} from "patternfly-react";
-import { Alert, Button } from '@patternfly/react-core';
+import { Alert, Button, Tooltip } from '@patternfly/react-core';
import { ExclamationCircleIcon, TrashIcon } from '@patternfly/react-icons';
import firewall from "./firewall-client.js";
@@ -131,10 +129,11 @@ function ZoneSection(props) {
let deleteButton;
if (props.readonly) {
deleteButton = (
- { _("You are not authorized to modify the firewall.") } }>
-
-
+
+
+
+
+
);
} else {
deleteButton = ;
@@ -876,13 +875,13 @@ export class Firewall extends React.Component {
let firewallOnOff;
if (firewall.readonly) {
- firewallOnOff = { _("You are not authorized to modify the firewall.") } }>
+ firewallOnOff =
- ;
+ ;
} else {
firewallOnOff = i != "_time");
names.sort();
return names.map(n => (
- { n + " " + pkgs[n] } } placement="top">
+
{n}
- )
+ )
);
}
diff --git a/pkg/packagekit/updates.jsx b/pkg/packagekit/updates.jsx
index 9c1cdd14195f..413b26d25e6a 100644
--- a/pkg/packagekit/updates.jsx
+++ b/pkg/packagekit/updates.jsx
@@ -24,8 +24,7 @@ import React, { useState, useEffect } from "react";
import ReactDOM from 'react-dom';
import moment from "moment";
-import { OverlayTrigger, Tooltip } from "patternfly-react";
-import { Button } from '@patternfly/react-core';
+import { Button, Tooltip } from '@patternfly/react-core';
import { RebootingIcon, CheckIcon, ExclamationCircleIcon } from "@patternfly/react-icons";
import { Remarkable } from "remarkable";
@@ -273,26 +272,26 @@ class UpdateItem extends React.Component {
secSeverityURL = {secSeverity};
type = (
<>
- { secSeverity || _("security") } } placement="top">
+
-
+
{ (info.cve_urls && info.cve_urls.length > 0) ? info.cve_urls.length : "" }
>);
} else {
const tip = (info.severity >= PK.Enum.INFO_NORMAL) ? _("bug fix") : _("enhancement");
type = (
<>
- {tip} } placement="top">
+
-
+
{ bugs ? info.bug_urls.length : "" }
>);
}
const pkgList = this.props.pkgNames.map(n => (
- {packageSummaries[n.name] + " (" + n.arch + ")"} } placement="top">
+
{n.name}
- )
+ )
);
const pkgs = insertCommas(pkgList);
let pkgsTruncated = pkgs;
diff --git a/pkg/shell/nav.jsx b/pkg/shell/nav.jsx
index 3af725d0eb0a..5798e8e269a7 100644
--- a/pkg/shell/nav.jsx
+++ b/pkg/shell/nav.jsx
@@ -5,9 +5,9 @@ import PropTypes from 'prop-types';
import {
Nav,
+ Tooltip, TooltipPosition,
} from '@patternfly/react-core';
import { ExclamationCircleIcon, ExclamationTriangleIcon, InfoCircleIcon } from '@patternfly/react-icons';
-import { OverlayTrigger, Tooltip } from 'patternfly-react';
const _ = cockpit.gettext;
@@ -146,13 +146,14 @@ function PageStatus({ status, name }) {
desc = desc.join("-");
return (
- { status.title } }>
+
{status.type == "error" ?
: status.type == "warning" ?
: }
-
+
);
}
diff --git a/pkg/storaged/dialog.jsx b/pkg/storaged/dialog.jsx
index 2fcf42e752a4..5cc0b3f27ee5 100644
--- a/pkg/storaged/dialog.jsx
+++ b/pkg/storaged/dialog.jsx
@@ -214,8 +214,8 @@
import cockpit from "cockpit";
import React from "react";
-import { OverlayTrigger, Tooltip, TypeAheadSelect } from "patternfly-react";
-import { Alert } from "@patternfly/react-core";
+import { TypeAheadSelect } from "patternfly-react";
+import { Alert, Tooltip, TooltipPosition } from "@patternfly/react-core";
import { show_modal_dialog } from "cockpit-components-dialog.jsx";
import { StatelessSelect, SelectEntry } from "cockpit-components-select.jsx";
@@ -693,11 +693,11 @@ const CheckBoxComponent = ({ tag, val, title, tooltip, update_function }) => {
onChange={event => update_function(event.target.checked)} />
{title}
- { tooltip && {tooltip} } placement="right">
+ { tooltip &&
-
+
}
);
diff --git a/pkg/storaged/storage-controls.jsx b/pkg/storaged/storage-controls.jsx
index f81218f2f263..f24ff60af3e6 100644
--- a/pkg/storaged/storage-controls.jsx
+++ b/pkg/storaged/storage-controls.jsx
@@ -18,8 +18,7 @@
*/
import React from "react";
-import { OverlayTrigger, Tooltip } from "patternfly-react";
-import { Button, Progress, ProgressMeasureLocation, ProgressVariant } from '@patternfly/react-core';
+import { Button, Tooltip, TooltipPosition, Progress, ProgressMeasureLocation, ProgressVariant } from '@patternfly/react-core';
import { BarsIcon } from '@patternfly/react-icons';
import cockpit from "cockpit";
@@ -54,12 +53,12 @@ class StorageControl extends React.Component {
if (excuse) {
return (
- {excuse} }
- placement={this.props.excuse_placement || "top"}>
+
{ this.props.content(excuse) }
-
+
);
} else {
return this.props.content();
diff --git a/pkg/systemd/services/service-details.jsx b/pkg/systemd/services/service-details.jsx
index f07dc118eebb..b124a2a7d12b 100644
--- a/pkg/systemd/services/service-details.jsx
+++ b/pkg/systemd/services/service-details.jsx
@@ -20,8 +20,8 @@
import React from "react";
import moment from "moment";
import PropTypes from "prop-types";
-import { Alert, Button } from "@patternfly/react-core";
-import { Modal, OverlayTrigger, Tooltip, DropdownKebab, MenuItem } from 'patternfly-react';
+import { Alert, Button, Tooltip, TooltipPosition } from "@patternfly/react-core";
+import { Modal, DropdownKebab, MenuItem } from 'patternfly-react';
import cockpit from "cockpit";
import { OnOffSwitch } from "cockpit-components-onoff.jsx";
@@ -544,11 +544,11 @@ export class ServiceDetails extends React.Component {
{ this.props.permitted &&
<>
{ !masked && !isStatic &&
- { tooltipMessage } } placement='right'>
+
-
+
}
>
diff --git a/pkg/systemd/services/services-list.jsx b/pkg/systemd/services/services-list.jsx
index 8f7c106ddb1b..31d8260fc5b6 100644
--- a/pkg/systemd/services/services-list.jsx
+++ b/pkg/systemd/services/services-list.jsx
@@ -21,9 +21,8 @@ import React from "react";
import {
DataList, DataListItem, DataListCell, DataListItemRow, DataListItemCells, DataListAction,
- Badge,
+ Tooltip, TooltipPosition, Badge,
} from '@patternfly/react-core';
-import { OverlayTrigger, Tooltip } from 'patternfly-react';
import cockpit from "cockpit";
@@ -101,7 +100,7 @@ class ServicesRow extends React.PureComponent {
{HasFailed && }
{CombinedState}
}
- { tooltipMessage } } placement='left'>{unitFileState}
+ {unitFileState}
diff --git a/pkg/users/account-roles.js b/pkg/users/account-roles.js
index d42b85dd50f0..ff69cd44ca91 100644
--- a/pkg/users/account-roles.js
+++ b/pkg/users/account-roles.js
@@ -19,7 +19,7 @@
import cockpit from 'cockpit';
import React, { useState } from 'react';
-import { OverlayTrigger, Tooltip } from 'patternfly-react';
+import { Tooltip, TooltipPosition } from '@patternfly/react-core';
import { superuser } from "superuser.jsx";
import { show_unexpected_error } from "./dialog-utils.js";
@@ -68,13 +68,10 @@ export function AccountRoles({ account, groups, currently_logged_in }) {
groups.forEach(group => {
if (role_groups[group.name]) {
- const tooltip = (
-
- {cockpit.format(_("Unix group: $0"), group.name)}
- );
roles.push(
-
+
-
+
);
}
});
diff --git a/src/base1/patternfly-overrides.scss b/src/base1/patternfly-overrides.scss
index 330665e27e9c..086c01803894 100644
--- a/src/base1/patternfly-overrides.scss
+++ b/src/base1/patternfly-overrides.scss
@@ -706,15 +706,36 @@ th > label {
/* Readjust the tooltip for our needs */
.tooltip {
- margin: -2.75rem 0 0 -2px !important;
- /* Center horizontally based on its own width */
- transform: translateX(-50%);
- /* Don't trap mouse hovering */
- pointer-events: none;
+ margin: -2.75rem 0 0 -2px !important;
+ /* Center horizontally based on its own width */
+ transform: translateX(-50%);
+ /* Don't trap mouse hovering */
+ pointer-events: none;
}
}
}
+/* Style tooltips to resemble PF4 */
+.tooltip {
+ // Make it 100% opaque
+ &.in { opacity: 1; }
+
+ // Recolor the arrows
+ &.top &-arrow { border-top-color: var(--pf-global--BackgroundColor--dark-100); }
+ &.right &-arrow { border-right-color: var(--pf-global--BackgroundColor--dark-100); }
+ &.bottom &-arrow { border-bottom-color: var(--pf-global--BackgroundColor--dark-100); }
+ &.left &-arrow { border-left-color: var(--pf-global--BackgroundColor--dark-100); }
+
+ // Match content background, padding, fonts, etc. to PF4 tooltips
+ &-inner {
+ background: var(--pf-global--BackgroundColor--dark-100);
+ font-size: var(--pf-global--FontSize--sm);
+ line-height: var(--pf-global--LineHeight--md);
+ padding: var(--pf-global--spacer--sm) var(--pf-global--spacer--md);
+ text-align: center;
+ }
+}
+
/* Round off badges, similar to PF4 */
.badge {
border-radius: 30em;
diff --git a/test/verify/check-host-switching b/test/verify/check-host-switching
index 3d1ec07b957f..e28589253f59 100755
--- a/test/verify/check-host-switching
+++ b/test/verify/check-host-switching
@@ -216,8 +216,11 @@ class TestHostSwitching(MachineCase, HostSwitcherHelpers):
b.wait_not_present("iframe.container-frame[name='cockpit1:10.111.113.3/system']")
b.wait_visible(".nav-item span[data-for='/@10.111.113.3'] .nav-status")
b.wait_visible(".nav-item span[data-for='/@10.111.113.3'] #localhost-error")
- b.mouse("#localhost-error", "mouseover")
- b.wait_in_text("div.tooltip", "Connection Error")
+ if m.image not in ["rhel-8-3-distropkg"]: # changed in PR #14195
+ b.mouse("#localhost-error", "mouseenter")
+ b.wait_in_text(".pf-c-tooltip", "Connection Error")
+ b.mouse("#localhost-error", "mouseleave")
+ b.wait_not_present("div.pf-c-tooltip")
b.click("#nav-hosts .nav-item span[data-for='/@10.111.113.3'] button.nav-action.pf-m-secondary")
b.wait_popup('edit-host-dialog')
diff --git a/test/verify/check-kdump b/test/verify/check-kdump
index 70bd2105e6d2..663dee349bf1 100755
--- a/test/verify/check-kdump
+++ b/test/verify/check-kdump
@@ -77,9 +77,9 @@ class TestKdump(MachineCase):
assertActive(True)
else:
# right now we have no memory reserved
- b.mouse("#app span.popover-ct-kdump", "mouseover")
- b.wait_in_text("div.tooltip", "No memory reserved.")
- b.mouse("#app span.popover-ct-kdump", "mouseout")
+ b.mouse("#app span.popover-ct-kdump", "mouseenter")
+ b.wait_in_text(".pf-c-tooltip", "No memory reserved.")
+ b.mouse("#app span.popover-ct-kdump", "mouseleave")
# service should indicate an error and the button should be off
b.wait_in_text("#app", "Service has an error")
assertActive(False)
diff --git a/test/verify/check-machines b/test/verify/check-machines
index cc2f50d98fbb..4d56d0093444 100755
--- a/test/verify/check-machines
+++ b/test/verify/check-machines
@@ -2708,9 +2708,9 @@ class TestMachines(MachineCase, StorageHelpers, NetworkHelpers):
hack_broken_caps()
- b.mouse("#vm-VmNotInstalled-firmware-tooltip", "mouseover")
- b.wait_in_text("#missing-uefi-images .tooltip-inner", "Libvirt did not detect any UEFI/OVMF firmware image installed on the host")
- b.mouse("#vm-VmNotInstalled-firmware-tooltip", "mouseout")
+ b.mouse("#vm-VmNotInstalled-firmware-tooltip", "mouseenter")
+ b.wait_in_text(".pf-c-tooltip", "Libvirt did not detect any UEFI/OVMF firmware image installed on the host")
+ b.mouse("#vm-VmNotInstalled-firmware-tooltip", "mouseleave")
b.wait_not_present("#missing-uefi-images")
m.execute("umount " + ovmf_path)
diff --git a/test/verify/check-packagekit b/test/verify/check-packagekit
index fa0a9ffffac7..d38e27f5e1df 100755
--- a/test/verify/check-packagekit
+++ b/test/verify/check-packagekit
@@ -87,10 +87,10 @@ class TestUpdates(NoSubManCase):
self.assertEqual(b.text(row + "th > span:nth-of-type(%i)" % idx), pkg)
else:
self.assertEqual(b.text(row + "th span"), pkgname)
- b.mouse(row + "th span", "mouseover")
- b.wait_text("div.tooltip", "dummy " + pkgname + " (" + arch + ")")
- b.mouse(row + "th span", "mouseout")
- b.wait_not_present("div.tooltip")
+ b.mouse(row + "th span", "mouseenter")
+ b.wait_text("div.pf-c-tooltip", "dummy " + pkgname + " (" + arch + ")")
+ b.mouse(row + "th span", "mouseleave")
+ b.wait_not_present("div.pf-c-tooltip")
self.assertEqual(b.text(row + "td:nth-of-type(2)"), version)
# verify type
self.assertTrue(b.is_present(row + "td:nth-of-type(3) span." + severity_to_icon[severity]))
@@ -299,10 +299,10 @@ class TestUpdates(NoSubManCase):
self.assertIn("RHSA-2000:0002", details)
# icon has critical class
self.assertIn("severity-critical", b.attr(sel + " td.type span", "class"))
- b.mouse(sel + " td.type span", "mouseover")
- b.wait_text("div.tooltip", "critical")
- b.mouse(sel + " td.type span", "mouseout")
- b.wait_not_present("div.tooltip")
+ b.mouse(sel + " td.type span", "mouseenter")
+ b.wait_text("div.pf-c-tooltip", "critical")
+ b.mouse(sel + " td.type span", "mouseleave")
+ b.wait_not_present("div.pf-c-tooltip")
# details has link to severity definition
self.assertIn("access.redhat.com", b.attr(sel + " .listing-ct-body dd.severity a:first-of-type", "href"))
@@ -312,12 +312,12 @@ class TestUpdates(NoSubManCase):
ch = b.eval_js('document.querySelector("%s").innerHTML' % (sel + " td.changelog"))
self.assertNotIn("", ch)
self.assertNotIn("*", ch)
- # should show bug fix icon and tooltip
+ # should show bug fix icon and pf-c-tooltip
self.assertIn("fa-bug", b.attr(sel + " td.type span", "class"))
- b.mouse(sel + " td.type span", "mouseover")
- b.wait_text("div.tooltip", "bug fix")
- b.mouse(sel + " td.type span", "mouseout")
- b.wait_not_present("div.tooltip")
+ b.mouse(sel + " td.type span", "mouseenter")
+ b.wait_text("div.pf-c-tooltip", "bug fix")
+ b.mouse(sel + " td.type span", "mouseleave")
+ b.wait_not_present("div.pf-c-tooltip")
# norefs: just changelog, show both binary packages
sel = self.check_nth_update(5, ["norefs-bin", "norefs-doc"], "2-1", self.enhancement_severity,
diff --git a/test/verify/check-pages b/test/verify/check-pages
index 682ea6bca23f..aee89ad08bca 100755
--- a/test/verify/check-pages
+++ b/test/verify/check-pages
@@ -667,8 +667,10 @@ OnCalendar=daily
b.switch_to_top()
b.wait_present("#development-info")
- b.mouse("#development-info", "mouseover")
- b.wait_in_text("div.tooltip", "My Little Page Status")
+ if self.machine.image not in ["rhel-8-3-distropkg"]: # changed in PR #14195
+ b.mouse("#development-info", "mouseenter")
+ b.wait_in_text(".pf-c-tooltip", "My Little Page Status")
+ b.mouse("#development-info", "mouseleave")
b.go("/playground/notifications-receiver")
b.enter_page("/playground/notifications-receiver")
diff --git a/test/verify/check-realms b/test/verify/check-realms
index a6ac860aabb5..6cf25c4e306f 100755
--- a/test/verify/check-realms
+++ b/test/verify/check-realms
@@ -855,9 +855,14 @@ class TestPackageInstall(packagelib.PackageCase):
with b.wait_timeout(4):
def check():
try:
- b.mouse("#system_information_domain_tooltip", "mouseover")
- b.wait_in_text(".tooltip-inner", text)
- b.mouse("#system_information_domain_tooltip", "mouseout")
+ if self.image in ["rhel-8-3-distropkg"]: # changed in PR #14195
+ b.mouse("#system_information_domain_tooltip", "mouseover")
+ b.wait_in_text(".tooltip-inner", text)
+ b.mouse("#system_information_domain_tooltip", "mouseout")
+ else:
+ b.mouse("#system_information_domain_tooltip", "mouseenter")
+ b.wait_in_text("div.pf-c-tooltip", text)
+ b.mouse("#system_information_domain_tooltip", "mouseleave")
return True
except (RuntimeError, Error):
return False
diff --git a/test/verify/check-system-info b/test/verify/check-system-info
index 1ef95a149286..6babcad15ffe 100755
--- a/test/verify/check-system-info
+++ b/test/verify/check-system-info
@@ -610,8 +610,11 @@ fi
self.login_and_go('/system/hwinfo', superuser=False)
b.wait_present('#hwinfo th:contains(CPU)')
b.wait_present('#cpu_mitigations[disabled]')
- b.mouse('#tip-cpu-security', 'mouseover')
- b.wait_text('.tooltip-inner', 'The user admin is not permitted to change cpu security mitigations')
+ if m.image not in ["rhel-8-3-distropkg"]: # changed in PR #14195
+ b.mouse('#tip-cpu-security', 'mouseenter')
+ b.wait_text('.pf-c-tooltip', 'The user admin is not permitted to change cpu security mitigations')
+ b.mouse('#tip-cpu-security', 'mouseleave')
+ b.wait_not_present("div.pf-c-tooltip")
# Behaviour if grub update tools are missing
b.logout()