fleet/frontend/pages/admin/components/SideNav/SideNav.tsx
Scott Gress e985d20b1d
UI for scheduling batch scripts (#31885)
# Details

This PR merges the feature branch for the scheduled scripts UI into
main. This includes the following previously-approved PRs:

* https://github.com/fleetdm/fleet/pull/31750
* https://github.com/fleetdm/fleet/pull/31604
* https://github.com/fleetdm/fleet/pull/31797


# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [X] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

## Testing

- [X] Added/updated automated tests
- [X] Where appropriate, [automated tests simulate multiple hosts and
test for host
isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing)
(updates to one hosts's records do not affect another)

- [X] QA'd all new/changed functionality manually

---------

Co-authored-by: jacobshandling <61553566+jacobshandling@users.noreply.github.com>
Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
2025-08-14 10:10:45 -05:00

53 lines
1.2 KiB
TypeScript

import React from "react";
import classnames from "classnames";
import { IAppConfigFormProps } from "pages/admin/OrgSettingsPage/cards/constants";
import SideNavItem from "../SideNavItem";
const baseClass = "side-nav";
export interface ISideNavItem<T> {
title: string;
urlSection: string;
path: string;
Card: React.ComponentType<T>;
}
interface ISideNavProps<T> {
navItems: ISideNavItem<T>[];
activeItem: string;
CurrentCard: React.ReactNode;
className?: string;
}
function SideNav<T = IAppConfigFormProps>({
navItems,
activeItem,
CurrentCard,
className,
}: ISideNavProps<T>) {
const classes = classnames(baseClass, className);
return (
<div className={classes}>
<div className={`${baseClass}__container`}>
<nav aria-label="settings">
<ul className={`${baseClass}__nav-list`}>
{navItems.map((navItem) => (
<SideNavItem
key={navItem.title}
title={navItem.title}
path={navItem.path}
isActive={navItem.urlSection === activeItem}
/>
))}
</ul>
</nav>
<div className={`${baseClass}__card-container`}>{CurrentCard}</div>
</div>
</div>
);
}
export default SideNav;