mirror of
https://github.com/fleetdm/fleet
synced 2026-04-21 21:47:20 +00:00
relates to #23180 fixes up some issues with showing the correct number of selected software to install and also with the table row selection behaviour. We've had to create a couple new props on the `TableContainer` component; one called `defaultSelectedRows` and the other `persistSelectedRows`. `defaultSelectedRows` will allow you to specify the default rows that are selected in the table on the initial render. This is done with an object with the key being the index of the row and the value being a boolean. ```tsx // the first and third rows will be selected in this case <TableContainer defaultSelectedRows={{0: true, 2: true}} ... /> ``` `persistSelectedRows` will allow the row selections to persist across search query changes. This defaults to false. --------- Co-authored-by: gillespi314 <73313222+gillespi314@users.noreply.github.com>
115 lines
2.8 KiB
TypeScript
115 lines
2.8 KiB
TypeScript
import React from "react";
|
|
import { InjectedRouter } from "react-router";
|
|
import ReactTooltip from "react-tooltip";
|
|
|
|
import { uniqueId } from "lodash";
|
|
|
|
import { ISoftwarePackage } from "interfaces/software";
|
|
|
|
import Icon from "components/Icon";
|
|
import SoftwareIcon from "pages/SoftwarePage/components/icons/SoftwareIcon";
|
|
|
|
import LinkCell from "../LinkCell";
|
|
|
|
const baseClass = "software-name-cell";
|
|
|
|
const InstallIconWithTooltip = ({
|
|
isSelfService,
|
|
}: {
|
|
isSelfService: ISoftwarePackage["self_service"];
|
|
}) => {
|
|
const tooltipId = uniqueId();
|
|
return (
|
|
<div className={`${baseClass}__install-icon-with-tooltip`}>
|
|
<div
|
|
className={`${baseClass}__install-icon-tooltip`}
|
|
data-tip
|
|
data-for={tooltipId}
|
|
>
|
|
<Icon
|
|
name={isSelfService ? "install-self-service" : "install"}
|
|
className={`${baseClass}__install-icon`}
|
|
/>
|
|
</div>
|
|
<ReactTooltip
|
|
className={`${baseClass}__install-tooltip`}
|
|
place="top"
|
|
effect="solid"
|
|
backgroundColor="#3e4771"
|
|
id={tooltipId}
|
|
data-html
|
|
>
|
|
<span className={`${baseClass}__install-tooltip-text`}>
|
|
{isSelfService ? (
|
|
<>
|
|
End users can install from <b>Fleet Desktop {">"} Self-service</b>
|
|
.
|
|
</>
|
|
) : (
|
|
<>
|
|
Install manually on <b>Host details</b> page or automatically with
|
|
policy automations.
|
|
</>
|
|
)}
|
|
</span>
|
|
</ReactTooltip>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
interface ISoftwareNameCellProps {
|
|
name?: string;
|
|
source?: string;
|
|
/** pass in a `path` that this cell will link to */
|
|
path?: string;
|
|
router?: InjectedRouter;
|
|
hasPackage?: boolean;
|
|
isSelfService?: boolean;
|
|
iconUrl?: string;
|
|
}
|
|
|
|
const SoftwareNameCell = ({
|
|
name,
|
|
source,
|
|
path,
|
|
router,
|
|
hasPackage = false,
|
|
isSelfService = false,
|
|
iconUrl,
|
|
}: ISoftwareNameCellProps) => {
|
|
// NO path or router means it's not clickable. return
|
|
// a non-clickable cell early
|
|
if (!router || !path) {
|
|
return (
|
|
<div className={baseClass}>
|
|
<SoftwareIcon name={name} source={source} url={iconUrl} />
|
|
<span className="software-name">{name}</span>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const onClickSoftware = (e: React.MouseEvent) => {
|
|
// Allows for button to be clickable in a clickable row
|
|
e.stopPropagation();
|
|
router.push(path);
|
|
};
|
|
|
|
return (
|
|
<LinkCell
|
|
className={baseClass}
|
|
path={path}
|
|
customOnClick={onClickSoftware}
|
|
value={
|
|
<>
|
|
<SoftwareIcon name={name} source={source} url={iconUrl} />
|
|
<span className="software-name">{name}</span>
|
|
{hasPackage && (
|
|
<InstallIconWithTooltip isSelfService={isSelfService} />
|
|
)}
|
|
</>
|
|
}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default SoftwareNameCell;
|