diff --git a/frontend/components/EmptyState/EmptyState.stories.tsx b/frontend/components/EmptyState/EmptyState.stories.tsx index c52858df32..9995ca213a 100644 --- a/frontend/components/EmptyState/EmptyState.stories.tsx +++ b/frontend/components/EmptyState/EmptyState.stories.tsx @@ -98,9 +98,10 @@ export const HeaderList: Story = { export const HeaderListWithButton: Story = { args: { variant: "header-list", - header: "Add your certificate authority (CA)", - info: "Help your end users connect to Wi-Fi or VPNs.", - primaryButton: , + header: "No certificate authorities", + info: + "Add a certificate authority (CA) to help end users connect to Wi-Fi or VPNs.", + primaryButton: , }, }; diff --git a/frontend/components/TabNav/_styles.scss b/frontend/components/TabNav/_styles.scss index 9fd4030049..92597e3ff3 100644 --- a/frontend/components/TabNav/_styles.scss +++ b/frontend/components/TabNav/_styles.scss @@ -4,7 +4,6 @@ // ManageControlsPage omits the key here and uses __fade (keyed by tab index) // so only top-level tab switches animate, not sub-route navigation. .tab-nav-routed-content { - margin-top: $gap-page-component; // Mirror .react-tabs__tab-panel--selected animation: fade-in 250ms ease-out; &__fade { diff --git a/frontend/pages/admin/IntegrationsPage/IntegrationNavItems.tsx b/frontend/pages/admin/IntegrationsPage/IntegrationNavItems.tsx index 0ae039af01..c9bd80057c 100644 --- a/frontend/pages/admin/IntegrationsPage/IntegrationNavItems.tsx +++ b/frontend/pages/admin/IntegrationsPage/IntegrationNavItems.tsx @@ -1,7 +1,7 @@ import PATHS from "router/paths"; import { ISideNavItem } from "../components/SideNav/SideNav"; -import Integrations from "./cards/Integrations"; +import TicketDestinations from "./cards/Integrations"; import MdmSettings from "./cards/MdmSettings"; import Calendars from "./cards/Calendars"; import ChangeManagement from "./cards/ChangeManagement"; @@ -17,7 +17,7 @@ const getIntegrationSettingsNavItems = (): ISideNavItem[] => { title: "Ticket destinations", urlSection: "ticket-destinations", path: PATHS.ADMIN_INTEGRATIONS_TICKET_DESTINATIONS, - Card: Integrations, + Card: TicketDestinations, }, { title: "MDM", diff --git a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/CertificateAuthorities.tsx b/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/CertificateAuthorities.tsx index 765884f1dc..20821fde31 100644 --- a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/CertificateAuthorities.tsx +++ b/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/CertificateAuthorities.tsx @@ -13,8 +13,11 @@ import PremiumFeatureMessage from "components/PremiumFeatureMessage"; import Spinner from "components/Spinner"; import DataError from "components/DataError"; +import Button from "components/buttons/Button"; +import EmptyState from "components/EmptyState"; +import GitOpsModeTooltipWrapper from "components/GitOpsModeTooltipWrapper"; + import CertificateAuthorityList from "./components/CertificateAuthorityList"; -import AddCertAuthorityCard from "./components/AddCertAuthorityCard"; import DeleteCertificateAuthorityModal from "./components/DeleteCertificateAuthorityModal"; import AddCertAuthorityModal from "./components/AddCertAuthorityModal"; import EditCertAuthorityModal from "./components/EditCertAuthorityModal"; @@ -117,7 +120,23 @@ const CertificateAuthorities = () => { return ( <> {pageDescription} - + ( + + )} + /> + } + /> ); } diff --git a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/AddCertAuthorityCard.tsx b/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/AddCertAuthorityCard.tsx deleted file mode 100644 index 6d6cd6718e..0000000000 --- a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/AddCertAuthorityCard.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React from "react"; - -import Button from "components/buttons/Button"; -import EmptyState from "components/EmptyState"; -import GitOpsModeTooltipWrapper from "components/GitOpsModeTooltipWrapper"; - -interface IAddCertAuthoityCardProps { - onAddCertAuthority: () => void; -} - -const AddCertAuthorityCard = ({ - onAddCertAuthority, -}: IAddCertAuthoityCardProps) => { - return ( - ( - - )} - /> - } - /> - ); -}; - -export default AddCertAuthorityCard; diff --git a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/_styles.scss b/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/_styles.scss deleted file mode 100644 index 2ec834415c..0000000000 --- a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/_styles.scss +++ /dev/null @@ -1 +0,0 @@ -// Styles now handled by EmptyState component diff --git a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/index.ts b/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/index.ts deleted file mode 100644 index 45aa0e07e2..0000000000 --- a/frontend/pages/admin/IntegrationsPage/cards/CertificateAuthorities/components/AddCertAuthorityCard/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./AddCertAuthorityCard"; diff --git a/frontend/pages/admin/IntegrationsPage/cards/IdentityProviders/components/IdentityProviderSection/IdentityProviderSection.tsx b/frontend/pages/admin/IntegrationsPage/cards/IdentityProviders/components/IdentityProviderSection/IdentityProviderSection.tsx index f49eba6290..a87d31fa48 100644 --- a/frontend/pages/admin/IntegrationsPage/cards/IdentityProviders/components/IdentityProviderSection/IdentityProviderSection.tsx +++ b/frontend/pages/admin/IntegrationsPage/cards/IdentityProviders/components/IdentityProviderSection/IdentityProviderSection.tsx @@ -4,11 +4,12 @@ import { useQuery } from "react-query"; import { AppContext } from "context/app"; import { dateAgo } from "utilities/date_format"; import { internationalTimeFormat } from "utilities/helpers"; -import { DEFAULT_USE_QUERY_OPTIONS } from "utilities/constants"; +import { + DEFAULT_USE_QUERY_OPTIONS, + LEARN_MORE_ABOUT_BASE_LINK, +} from "utilities/constants"; import idpAPI from "services/entities/idp"; -import PATHS from "router/paths"; - import SettingsSection from "pages/admin/components/SettingsSection"; import DataError from "components/DataError"; import Spinner from "components/Spinner"; @@ -16,6 +17,7 @@ import CustomLink from "components/CustomLink"; import TooltipWrapper from "components/TooltipWrapper"; import PremiumFeatureMessage from "components/PremiumFeatureMessage"; import PageDescription from "components/PageDescription"; +import EmptyState from "components/EmptyState"; import SectionCard from "../../../MdmSettings/components/SectionCard"; @@ -23,22 +25,16 @@ const baseClass = "identity-provider-section"; const AddEndUserInfoCard = () => { return ( - } - > -

- Fleet can be connected to Okta, Entra ID, or another Identity Provider - (IdP). -

-
+ /> ); }; @@ -56,8 +52,7 @@ const ReceivedEndUserInfoCard = ({ } > @@ -94,8 +89,7 @@ const FailedEndUserInfoCard = ({ } > @@ -165,23 +159,8 @@ const IdentityProviderSection = () => { - Connect your IdP to populate IdP host vitals and delete{" "} - - A Fleet user manages Fleet. - - } - > - Fleet users - {" "} - when they are removed from your IdP. To configure authentication - for Fleet users and end users, head to{" "} - - . + Connect Fleet to your IdP to sync end user information (e.g. + groups) to hosts. } variant="right-panel" diff --git a/frontend/pages/admin/IntegrationsPage/cards/Integrations/Integrations.tsx b/frontend/pages/admin/IntegrationsPage/cards/Integrations/TicketDestinations.tsx similarity index 84% rename from frontend/pages/admin/IntegrationsPage/cards/Integrations/Integrations.tsx rename to frontend/pages/admin/IntegrationsPage/cards/Integrations/TicketDestinations.tsx index f06b2d18bb..c4f3df46ea 100644 --- a/frontend/pages/admin/IntegrationsPage/cards/Integrations/Integrations.tsx +++ b/frontend/pages/admin/IntegrationsPage/cards/Integrations/TicketDestinations.tsx @@ -14,14 +14,17 @@ import { IApiError } from "interfaces/errors"; import configAPI from "services/entities/config"; +import { LEARN_MORE_ABOUT_BASE_LINK } from "utilities/constants"; +import Button from "components/buttons/Button"; +import CustomLink from "components/CustomLink"; +import EmptyState from "components/EmptyState"; import TableContainer from "components/TableContainer"; import TableDataError from "components/DataError"; import Spinner from "components/Spinner"; import SettingsSection from "pages/admin/components/SettingsSection"; import PageDescription from "components/PageDescription"; -import AddIntegrationModal from "./components/AddIntegrationModal"; +import AddTicketDestinationModal from "./components/AddIntegrationModal"; import DeleteIntegrationModal from "./components/DeleteIntegrationModal"; -import EmptyIntegrationsTable from "./components/EmptyIntegrationsTable"; import { generateTableHeaders, @@ -29,7 +32,6 @@ import { } from "./IntegrationsTableConfig"; const baseClass = "integrations-management"; -const noIntegrationsClass = "no-integrations"; const VALIDATION_FAILED_ERROR = "There was a problem with the information you provided."; @@ -38,10 +40,13 @@ const BAD_REQUEST_ERROR = const UNKNOWN_ERROR = "We experienced an error when attempting to connect. Please try again later."; -const Integrations = (): JSX.Element => { +const TicketDestinations = (): JSX.Element => { const { renderFlash } = useContext(NotificationContext); - const [showAddIntegrationModal, setShowAddIntegrationModal] = useState(false); + const [ + showAddTicketDestinationModal, + setShowAddTicketDestinationModal, + ] = useState(false); const [showDeleteIntegrationModal, setShowDeleteIntegrationModal] = useState( false ); @@ -80,12 +85,12 @@ const Integrations = (): JSX.Element => { ); // TODO: Cleanup useCallbacks, add missing dependencies, use state setter functions, e.g., - // `setShowAddIntegrationModal((prevState) => !prevState)`, instead of including state + // `setShowAddTicketDestinationModal((prevState) => !prevState)`, instead of including state // variables as dependencies for toggles, etc. - const toggleAddIntegrationModal = useCallback(() => { - setShowAddIntegrationModal(!showAddIntegrationModal); - }, [showAddIntegrationModal, setShowAddIntegrationModal]); + const toggleAddTicketDestinationModal = useCallback(() => { + setShowAddTicketDestinationModal(!showAddTicketDestinationModal); + }, [showAddTicketDestinationModal, setShowAddTicketDestinationModal]); const toggleDeleteIntegrationModal = useCallback( (integration?: IIntegrationTableData) => { @@ -134,7 +139,7 @@ const Integrations = (): JSX.Element => { ); - toggleAddIntegrationModal(); + toggleAddTicketDestinationModal(); refetchIntegrations(); }) .catch((addError: { data: IApiError }) => { @@ -186,7 +191,7 @@ const Integrations = (): JSX.Element => { setTestingConnection(false); }); }, - [toggleAddIntegrationModal] + [toggleAddTicketDestinationModal] ); const onDeleteSubmit = useCallback(() => { @@ -286,14 +291,19 @@ const Integrations = (): JSX.Element => { name: "add integration", buttonText: "Add integration", variant: "default", - onClick: toggleAddIntegrationModal, + onClick: toggleAddTicketDestinationModal, hideButton: !tableData?.length, }} resultsTitle="integrations" emptyComponent={() => ( - + Add ticket destination + + } /> )} showMarkAllPages={false} @@ -306,14 +316,23 @@ const Integrations = (): JSX.Element => { return ( + Add or edit integrations to create tickets when Fleet detects new + vulnerabilities.{" "} + + + } variant="right-panel" /> {renderTable()} - {showAddIntegrationModal && ( - { ); }; -export default Integrations; +export default TicketDestinations; diff --git a/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/AddIntegrationModal.tsx b/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/AddTicketDestinationModal.tsx similarity index 93% rename from frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/AddIntegrationModal.tsx rename to frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/AddTicketDestinationModal.tsx index 9e517721e7..842ef61f1c 100644 --- a/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/AddIntegrationModal.tsx +++ b/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/AddTicketDestinationModal.tsx @@ -13,7 +13,7 @@ import IntegrationForm from "../IntegrationForm"; const baseClass = "add-integration-modal"; -interface IAddIntegrationModalProps { +interface IAddTicketDestinationModalProps { onCancel: () => void; onSubmit: ( integrationSubmitData: IIntegration[], @@ -28,12 +28,12 @@ const destinationOptions = [ { label: "Zendesk", value: "zendesk" }, ]; -const AddIntegrationModal = ({ +const AddTicketDestinationModal = ({ onCancel, onSubmit, integrations, testingConnection, -}: IAddIntegrationModalProps): JSX.Element => { +}: IAddTicketDestinationModalProps): JSX.Element => { const gitOpsModeEnabled = useContext(AppContext).config?.gitops .gitops_mode_enabled; @@ -89,4 +89,4 @@ const AddIntegrationModal = ({ ); }; -export default AddIntegrationModal; +export default AddTicketDestinationModal; diff --git a/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/index.ts b/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/index.ts index 0b09f343a9..8f6fa35bdb 100644 --- a/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/index.ts +++ b/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/AddIntegrationModal/index.ts @@ -1 +1 @@ -export { default } from "./AddIntegrationModal"; +export { default } from "./AddTicketDestinationModal"; diff --git a/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/EmptyIntegrationsTable.tsx b/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/EmptyIntegrationsTable.tsx deleted file mode 100644 index f44daf5e10..0000000000 --- a/frontend/pages/admin/IntegrationsPage/cards/Integrations/components/EmptyIntegrationsTable.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from "react"; - -import Button from "components/buttons/Button"; -import EmptyState from "components/EmptyState"; -import CustomLink from "components/CustomLink"; - -const EmptyIntegrationsTable = ({ - className, - onActionButtonClick, -}: { - className: string; - onActionButtonClick: () => void; -}) => { - return ( - - Want to learn more?  - - - } - primaryButton={ - - } - /> - ); -}; - -export default EmptyIntegrationsTable; diff --git a/frontend/pages/admin/IntegrationsPage/cards/Integrations/index.ts b/frontend/pages/admin/IntegrationsPage/cards/Integrations/index.ts index 7a9dcd4f6a..5a4f871b1c 100644 --- a/frontend/pages/admin/IntegrationsPage/cards/Integrations/index.ts +++ b/frontend/pages/admin/IntegrationsPage/cards/Integrations/index.ts @@ -1 +1 @@ -export { default } from "./Integrations"; +export { default } from "./TicketDestinations"; diff --git a/frontend/pages/admin/TeamManagementPage/TeamTableConfig.tsx b/frontend/pages/admin/ManageFleetsPage/FleetTableConfig.tsx similarity index 82% rename from frontend/pages/admin/TeamManagementPage/TeamTableConfig.tsx rename to frontend/pages/admin/ManageFleetsPage/FleetTableConfig.tsx index 317a49e215..729ac4ec2a 100644 --- a/frontend/pages/admin/TeamManagementPage/TeamTableConfig.tsx +++ b/frontend/pages/admin/ManageFleetsPage/FleetTableConfig.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { ITeam } from "interfaces/team"; +import { ITeam as IFleet } from "interfaces/team"; import { IDropdownOption } from "interfaces/dropdownOption"; import PATHS from "router/paths"; @@ -18,7 +18,7 @@ interface IHeaderProps { interface IRowProps { row: { - original: ITeam; + original: IFleet; }; } interface ICellProps extends IRowProps { @@ -45,14 +45,14 @@ interface IDataColumn { sortType?: string; } -interface ITeamTableData extends ITeam { +interface IFleetTableData extends IFleet { actions: IDropdownOption[]; } // NOTE: cellProps come from react-table // more info here https://react-table.tanstack.com/docs/api/useTable#cell-properties const generateTableHeaders = ( - actionSelectHandler: (value: string, team: ITeam) => void + actionSelectHandler: (value: string, fleet: IFleet) => void ): IDataColumn[] => { return [ { @@ -99,8 +99,8 @@ const generateTableHeaders = (
{ ]; }; -const enhanceTeamData = (teams: ITeam[]): ITeamTableData[] => { - return Object.values(teams).map((team) => { +const enhanceFleetData = (fleets: IFleet[]): IFleetTableData[] => { + return Object.values(fleets).map((fleet) => { return { - description: team.description, - name: team.name, - host_count: team.host_count, - user_count: team.user_count, + description: fleet.description, + name: fleet.name, + host_count: fleet.host_count, + user_count: fleet.user_count, actions: generateActionDropdownOptions(), - id: team.id, + id: fleet.id, }; }); }; -const generateDataSet = (teams: ITeam[]): ITeamTableData[] => { - return [...enhanceTeamData(teams)]; +const generateDataSet = (fleets: IFleet[]): IFleetTableData[] => { + return [...enhanceFleetData(fleets)]; }; export { generateTableHeaders, generateDataSet }; diff --git a/frontend/pages/admin/ManageFleetsPage/ManageFleetsPage.tsx b/frontend/pages/admin/ManageFleetsPage/ManageFleetsPage.tsx new file mode 100644 index 0000000000..72cb0be7d3 --- /dev/null +++ b/frontend/pages/admin/ManageFleetsPage/ManageFleetsPage.tsx @@ -0,0 +1,378 @@ +import React, { useState, useCallback, useContext, useMemo } from "react"; +import { useQuery } from "react-query"; +import { useErrorHandler } from "react-error-boundary"; + +import { LEARN_MORE_ABOUT_BASE_LINK, PRIMO_TOOLTIP } from "utilities/constants"; +import { getGitOpsModeTipContent } from "utilities/helpers"; + +import { NotificationContext } from "context/notification"; +import { AppContext } from "context/app"; +import { ITeam as IFleet } from "interfaces/team"; +import { IApiError } from "interfaces/errors"; +import usersAPI, { IGetMeResponse } from "services/entities/users"; +import teamsAPI, { + ILoadTeamsResponse, + ITeamFormData as IFleetFormData, +} from "services/entities/teams"; + +import TableContainer from "components/TableContainer"; +import TableDataError from "components/DataError"; +import TableCount from "components/TableContainer/TableCount"; +import Button from "components/buttons/Button"; +import CustomLink from "components/CustomLink"; +import EmptyState from "components/EmptyState"; +import PageDescription from "components/PageDescription"; +import TooltipWrapper from "components/TooltipWrapper"; + +import CreateFleetModal from "./components/CreateFleetModal"; +import DeleteFleetModal from "./components/DeleteFleetModal"; +import RenameFleetModal from "./components/RenameFleetModal"; + +import { generateTableHeaders, generateDataSet } from "./FleetTableConfig"; + +const baseClass = "manage-fleets"; +const noFleetsClass = "no-fleets"; + +const ManageFleetsPage = (): JSX.Element => { + const { renderFlash } = useContext(NotificationContext); + const { + currentTeam, + setCurrentTeam, + setCurrentUser, + setAvailableTeams, + setUserSettings, + config, + } = useContext(AppContext); + + const [isUpdatingFleets, setIsUpdatingFleets] = useState(false); + const [showCreateFleetModal, setShowCreateFleetModal] = useState(false); + const [showDeleteFleetModal, setShowDeleteFleetModal] = useState(false); + const [showRenameFleetModal, setShowRenameFleetModal] = useState(false); + const [fleetEditing, setFleetEditing] = useState(); + const [backendValidators, setBackendValidators] = useState<{ + [key: string]: string; + }>({}); + const handlePageError = useErrorHandler(); + + const { refetch: refetchMe } = useQuery(["me"], () => usersAPI.me(), { + enabled: false, + onSuccess: ({ user, available_teams, settings }: IGetMeResponse) => { + setCurrentUser(user); + setAvailableTeams(user, available_teams); + setUserSettings(settings); + }, + }); + + const { + data: fleets, + isFetching: isFetchingFleets, + error: loadingFleetsError, + refetch: refetchFleets, + } = useQuery( + ["teams"], + () => teamsAPI.loadAll(), + { + select: (data: ILoadTeamsResponse) => data.teams, + onError: (error) => handlePageError(error), + } + ); + + // TODO: Cleanup useCallbacks, add missing dependencies, use state setter functions, e.g., + // `setShowCreateFleetModal((prevState) => !prevState)`, instead of including state + // variables as dependencies for toggles, etc. + + const toggleCreateFleetModal = useCallback(() => { + setShowCreateFleetModal(!showCreateFleetModal); + setBackendValidators({}); + }, [showCreateFleetModal, setShowCreateFleetModal, setBackendValidators]); + + const toggleDeleteFleetModal = useCallback( + (fleet?: IFleet) => { + setShowDeleteFleetModal(!showDeleteFleetModal); + fleet ? setFleetEditing(fleet) : setFleetEditing(undefined); + }, + [showDeleteFleetModal, setShowDeleteFleetModal, setFleetEditing] + ); + + const toggleRenameFleetModal = useCallback( + (fleet?: IFleet) => { + setShowRenameFleetModal(!showRenameFleetModal); + setBackendValidators({}); + fleet ? setFleetEditing(fleet) : setFleetEditing(undefined); + }, + [ + showRenameFleetModal, + setShowRenameFleetModal, + setFleetEditing, + setBackendValidators, + ] + ); + + const onCreateSubmit = useCallback( + (formData: IFleetFormData) => { + setIsUpdatingFleets(true); + teamsAPI + .create(formData) + .then(() => { + renderFlash("success", `Successfully created ${formData.name}.`); + setBackendValidators({}); + toggleCreateFleetModal(); + refetchMe(); + refetchFleets(); + }) + .catch((createError: { data: IApiError }) => { + const rawReason = createError.data.errors[0].reason; + const errMsg = rawReason.toLowerCase(); + if (errMsg.includes("must differ")) { + setBackendValidators({ name: rawReason }); + } else if (errMsg.includes("duplicate")) { + setBackendValidators({ + name: "A fleet with this name already exists", + }); + } else if ( + errMsg.includes("all teams") || + errMsg.includes("all fleets") || + errMsg.includes("no team") || + errMsg.includes("unassigned") + ) { + setBackendValidators({ + name: `"${formData.name}" is a reserved fleet name. Please try another name.`, + }); + } else { + renderFlash("error", "Could not create fleet. Please try again."); + toggleCreateFleetModal(); + } + }) + .finally(() => { + setIsUpdatingFleets(false); + }); + }, + [toggleCreateFleetModal, refetchMe, refetchFleets, renderFlash] + ); + + const onDeleteSubmit = useCallback(() => { + if (fleetEditing) { + setIsUpdatingFleets(true); + teamsAPI + .destroy(fleetEditing.id) + .then(() => { + renderFlash("success", `Successfully deleted ${fleetEditing.name}.`); + if (currentTeam?.id === fleetEditing.id) { + setCurrentTeam(undefined); + } + }) + .catch(() => { + renderFlash( + "error", + `Could not delete ${fleetEditing.name}. Please try again.` + ); + }) + .finally(() => { + setIsUpdatingFleets(false); + refetchMe(); + refetchFleets(); + toggleDeleteFleetModal(); + }); + } + }, [ + currentTeam, + fleetEditing, + refetchMe, + refetchFleets, + renderFlash, + setCurrentTeam, + toggleDeleteFleetModal, + ]); + + const onRenameSubmit = useCallback( + (formData: IFleetFormData) => { + if (formData.name === fleetEditing?.name) { + toggleRenameFleetModal(); + } else if (fleetEditing) { + setIsUpdatingFleets(true); + teamsAPI + .update(formData, fleetEditing.id) + .then(() => { + renderFlash( + "success", + `Successfully updated fleet name to ${formData.name}.` + ); + setBackendValidators({}); + toggleRenameFleetModal(); + refetchFleets(); + }) + .catch((updateError: { data: IApiError }) => { + console.error(updateError); + const rawReason = updateError.data.errors[0].reason; + const errMsg = rawReason.toLowerCase(); + if (errMsg.includes("must differ")) { + setBackendValidators({ name: rawReason }); + } else if (errMsg.includes("duplicate")) { + setBackendValidators({ + name: "A fleet with this name already exists", + }); + } else if ( + errMsg.includes("all teams") || + errMsg.includes("all fleets") + ) { + setBackendValidators({ + name: `"All fleets" is a reserved fleet name.`, + }); + } else if ( + errMsg.includes("no team") || + errMsg.includes("unassigned") + ) { + setBackendValidators({ + name: `"Unassigned" is a reserved fleet name. Please try another name.`, + }); + } else { + renderFlash( + "error", + `Could not rename ${fleetEditing.name}. Please try again.` + ); + } + }) + .finally(() => { + setIsUpdatingFleets(false); + }); + } + }, + [fleetEditing, toggleRenameFleetModal, refetchFleets, renderFlash] + ); + + const onActionSelection = useCallback( + (action: string, fleet: IFleet): void => { + switch (action) { + case "rename": + toggleRenameFleetModal(fleet); + break; + case "delete": + toggleDeleteFleetModal(fleet); + break; + default: + } + }, + [toggleRenameFleetModal, toggleDeleteFleetModal] + ); + + const tableHeaders = useMemo(() => generateTableHeaders(onActionSelection), [ + onActionSelection, + ]); + const tableData = useMemo(() => (fleets ? generateDataSet(fleets) : []), [ + fleets, + ]); + + const renderFleetCount = useCallback(() => { + return ; + }, [fleets]); + + const disabledPrimaryActionTooltip = (() => { + if (config?.partnerships?.enable_primo) { + return PRIMO_TOOLTIP; + } + if (config?.gitops?.gitops_mode_enabled && config?.gitops?.repository_url) { + return getGitOpsModeTipContent(config.gitops.repository_url); + } + return null; + })(); + + return ( +
+ + Use fleets to group hosts together with their own controls, reports, + and policies.{" "} + + + } + /> + {loadingFleetsError ? ( + + ) : ( + { + const rawButton = ( + + ); + const primaryButton = disabledPrimaryActionTooltip ? ( + + {rawButton} + + ) : ( + rawButton + ); + return ( + + ); + }} + showMarkAllPages={false} + isAllPagesSelected={false} + isClientSidePagination + renderCount={renderFleetCount} + /> + )} + {showCreateFleetModal && ( + + )} + {showDeleteFleetModal && ( + + )} + {showRenameFleetModal && ( + + )} +
+ ); +}; + +export default ManageFleetsPage; diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/AgentOptionsPage/AgentOptionsPage.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/_styles.scss b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/AgentOptionsPage/_styles.scss similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/AgentOptionsPage/_styles.scss diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/AgentOptionsPage/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/AgentOptionsPage/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamDetailsWrapper.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamDetailsWrapper.tsx similarity index 92% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamDetailsWrapper.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamDetailsWrapper.tsx index 5882ded05c..2d68d20f15 100644 --- a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamDetailsWrapper.tsx +++ b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamDetailsWrapper.tsx @@ -29,8 +29,8 @@ import TabText from "components/TabText"; import BackButton from "components/BackButton"; import TeamsDropdown from "components/TeamsDropdown"; import MainContent from "components/MainContent"; -import DeleteTeamModal from "../components/DeleteTeamModal"; -import RenameTeamModal from "../components/RenameTeamModal"; +import DeleteFleetModal from "../components/DeleteFleetModal"; +import RenameFleetModal from "../components/RenameFleetModal"; import DeleteSecretModal from "../../../../components/EnrollSecrets/DeleteSecretModal"; import SecretEditorModal from "../../../../components/EnrollSecrets/SecretEditorModal"; import AddHostsModal from "../../../../components/AddHostsModal"; @@ -134,8 +134,8 @@ const TeamDetailsWrapper = ({ const [showDeleteSecretModal, setShowDeleteSecretModal] = useState(false); const [showEnrollSecretModal, setShowEnrollSecretModal] = useState(false); const [showSecretEditorModal, setShowSecretEditorModal] = useState(false); - const [showDeleteTeamModal, setShowDeleteTeamModal] = useState(false); - const [showRenameTeamModal, setShowRenameTeamModal] = useState(false); + const [showDeleteFleetModal, setShowDeleteFleetModal] = useState(false); + const [showRenameFleetModal, setShowRenameFleetModal] = useState(false); const [backendValidators, setBackendValidators] = useState<{ [key: string]: string; }>({}); @@ -225,14 +225,14 @@ const TeamDetailsWrapper = ({ showEnrollSecretModal, ]); - const toggleDeleteTeamModal = useCallback(() => { - setShowDeleteTeamModal(!showDeleteTeamModal); - }, [showDeleteTeamModal, setShowDeleteTeamModal]); + const toggleDeleteFleetModal = useCallback(() => { + setShowDeleteFleetModal(!showDeleteFleetModal); + }, [showDeleteFleetModal, setShowDeleteFleetModal]); - const toggleRenameTeamModal = useCallback(() => { - setShowRenameTeamModal(!showRenameTeamModal); + const toggleRenameFleetModal = useCallback(() => { + setShowRenameFleetModal(!showRenameFleetModal); setBackendValidators({}); - }, [showRenameTeamModal, setShowRenameTeamModal, setBackendValidators]); + }, [showRenameFleetModal, setShowRenameFleetModal, setBackendValidators]); const onSaveSecret = async (enrollSecretString: string) => { // Creates new list of secrets removing selected secret and adding new secret @@ -306,10 +306,10 @@ const TeamDetailsWrapper = ({ renderFlash("error", "Something went wrong removing the fleet"); console.error(response); } finally { - toggleDeleteTeamModal(); + toggleDeleteFleetModal(); setIsUpdatingTeams(false); } - }, [teamIdForApi, renderFlash, router, toggleDeleteTeamModal]); + }, [teamIdForApi, renderFlash, router, toggleDeleteFleetModal]); const onEditSubmit = useCallback( async (formData: ITeamFormData) => { @@ -319,7 +319,7 @@ const TeamDetailsWrapper = ({ const updatedAttrs = generateUpdateData(currentTeamDetails, formData); // no updates, so no need for a request. if (!updatedAttrs) { - toggleRenameTeamModal(); + toggleRenameFleetModal(); return; } @@ -333,7 +333,7 @@ const TeamDetailsWrapper = ({ setBackendValidators({}); refetchTeams(); refetchMe(); - toggleRenameTeamModal(); + toggleRenameFleetModal(); } catch (response) { console.error(response); const errorObject = formatErrorResponse(response); @@ -358,7 +358,7 @@ const TeamDetailsWrapper = ({ }, [ currentTeamDetails, - toggleRenameTeamModal, + toggleRenameFleetModal, teamIdForApi, renderFlash, refetchTeams, @@ -437,7 +437,7 @@ const TeamDetailsWrapper = ({ label: "Rename fleet", buttonVariant: "inverse", iconName: "pencil", - onClick: toggleRenameTeamModal, + onClick: toggleRenameFleetModal, gitOpsModeCompatible: true, }, { @@ -446,7 +446,7 @@ const TeamDetailsWrapper = ({ buttonVariant: "inverse", iconName: "trash", hideAction: !isGlobalAdmin, - onClick: toggleDeleteTeamModal, + onClick: toggleDeleteFleetModal, gitOpsModeCompatible: true, }, ]} @@ -511,21 +511,21 @@ const TeamDetailsWrapper = ({ isUpdatingSecret={isUpdatingSecret} /> )} - {showDeleteTeamModal && ( - )} - {showRenameTeamModal && ( - )}
diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/TeamSettings.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/TeamSettings.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/TeamSettings.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/TeamSettings.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/_styles.scss b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/_styles.scss similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/_styles.scss diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tests.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tests.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tests.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tests.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/HistoricalDataTeamControls.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/HistoricalDataTeamControls/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tests.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tests.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tests.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tests.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/TeamHostExpiryToggle.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/_styles.scss b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/_styles.scss similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/_styles.scss diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/components/TeamHostExpiryToggle/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/UsersPage.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/UsersPage.tsx similarity index 98% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/UsersPage.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/UsersPage.tsx index 60c1e13f35..6f2d237109 100644 --- a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/UsersPage.tsx +++ b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/UsersPage.tsx @@ -19,13 +19,13 @@ import Spinner from "components/Spinner"; import PageDescription from "components/PageDescription"; import CustomLink from "components/CustomLink"; import TableCount from "components/TableContainer/TableCount"; -import AddUserModal from "pages/admin/UserManagementPage/components/AddUserModal"; -import EditUserModal from "../../../UserManagementPage/components/EditUserModal"; +import AddUserModal from "pages/admin/ManageUsersPage/components/AddUserModal"; +import EditUserModal from "../../../ManageUsersPage/components/EditUserModal"; import { IUserFormData, NewUserType, -} from "../../../UserManagementPage/components/UserForm/UserForm"; -import userManagementHelpers from "../../../UserManagementPage/helpers"; +} from "../../../ManageUsersPage/components/UserForm/UserForm"; +import userManagementHelpers from "../../../ManageUsersPage/helpers"; import EmptyMembersTable from "./components/EmptyUsersTable"; import AddUsersModal from "./components/AddUsersModal/AddUsersModal"; import RemoveUserModal from "./components/RemoveUserModal/RemoveUserModal"; diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/UsersPageTableConfig.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/UsersPageTableConfig.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/UsersPageTableConfig.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/UsersPageTableConfig.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/_styles.scss b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/_styles.scss similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/_styles.scss diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/AddUsersModal.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/AddUsersModal.tsx similarity index 94% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/AddUsersModal.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/AddUsersModal.tsx index 5c79a551e5..4ca38cf3d7 100644 --- a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/AddUsersModal.tsx +++ b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/AddUsersModal.tsx @@ -4,7 +4,7 @@ import { INewTeamUser, INewTeamUsersBody, ITeam } from "interfaces/team"; import endpoints from "utilities/endpoints"; import Modal from "components/Modal"; import Button from "components/buttons/Button"; -import AutocompleteDropdown from "pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown"; +import AutocompleteDropdown from "pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown"; import { IDropdownOption } from "interfaces/dropdownOption"; const baseClass = "add-user-modal"; diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AddUsersModal/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/AutocompleteDropdown.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/AutocompleteDropdown.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/AutocompleteDropdown.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/AutocompleteDropdown.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/_styles.scss b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/_styles.scss similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/_styles.scss diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/AutocompleteDropdown/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/EmptyUsersTable.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/EmptyUsersTable.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/EmptyUsersTable.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/EmptyUsersTable.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/RemoveUserModal.tsx b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/RemoveUserModal.tsx similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/RemoveUserModal.tsx rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/RemoveUserModal.tsx diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/_styles.scss b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/_styles.scss similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/_styles.scss diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/components/RemoveUserModal/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/_styles.scss b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/_styles.scss similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/_styles.scss diff --git a/frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/index.ts b/frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/index.ts similarity index 100% rename from frontend/pages/admin/TeamManagementPage/TeamDetailsWrapper/index.ts rename to frontend/pages/admin/ManageFleetsPage/TeamDetailsWrapper/index.ts diff --git a/frontend/pages/admin/TeamManagementPage/_styles.scss b/frontend/pages/admin/ManageFleetsPage/_styles.scss similarity index 92% rename from frontend/pages/admin/TeamManagementPage/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/_styles.scss index 7ddf9f9c88..c5b418ae4a 100644 --- a/frontend/pages/admin/TeamManagementPage/_styles.scss +++ b/frontend/pages/admin/ManageFleetsPage/_styles.scss @@ -1,4 +1,6 @@ -.team-management { +.manage-fleets { + @include vertical-page-layout; + .data-table-block { .data-table__table { thead { @@ -35,7 +37,7 @@ } .actions__cell { - .team-actions-wrapper { + .fleet-actions-wrapper { display: flex; align-items: center; } diff --git a/frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/CreateTeamModal.tests.tsx b/frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/CreateFleetModal.tests.tsx similarity index 85% rename from frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/CreateTeamModal.tests.tsx rename to frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/CreateFleetModal.tests.tsx index 87b6ee0dfc..e61a1fb986 100644 --- a/frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/CreateTeamModal.tests.tsx +++ b/frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/CreateFleetModal.tests.tsx @@ -3,14 +3,14 @@ import { screen, waitFor } from "@testing-library/react"; import { createCustomRenderer } from "test/test-utils"; import userEvent from "@testing-library/user-event"; -import CreateTeamModal from "./CreateTeamModal"; +import CreateFleetModal from "./CreateFleetModal"; -describe("CreateTeamModal", () => { +describe("CreateFleetModal", () => { const defaultProps = { onCancel: jest.fn(), onSubmit: jest.fn(), backendValidators: {}, - isUpdatingTeams: false, + isUpdatingFleets: false, }; const render = createCustomRenderer(); @@ -20,14 +20,14 @@ describe("CreateTeamModal", () => { }); it("renders the modal with the create button disabled initially", () => { - render(); + render(); const createButton = screen.getByRole("button", { name: "Create" }); expect(createButton).toBeDisabled(); }); it("enables the create button when a valid name is entered", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, "Engineering"); @@ -37,7 +37,7 @@ describe("CreateTeamModal", () => { }); it("keeps the create button disabled when only spaces are entered", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, " "); @@ -47,7 +47,7 @@ describe("CreateTeamModal", () => { }); it("keeps the create button disabled when only tabs are entered", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, "\t\t\t"); @@ -57,7 +57,7 @@ describe("CreateTeamModal", () => { }); it("calls onSubmit with trimmed name when a valid name is submitted", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.type(nameInput, " Engineering "); @@ -75,7 +75,7 @@ describe("CreateTeamModal", () => { ...defaultProps, backendValidators: { name: "Team name already exists" }, }; - render(); + render(); expect(screen.getByText("Team name already exists")).toBeInTheDocument(); }); @@ -85,7 +85,7 @@ describe("CreateTeamModal", () => { ...defaultProps, backendValidators: { name: "Team name already exists" }, }; - render(); + render(); expect(screen.getByText("Team name already exists")).toBeInTheDocument(); diff --git a/frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/CreateTeamModal.tsx b/frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/CreateFleetModal.tsx similarity index 81% rename from frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/CreateTeamModal.tsx rename to frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/CreateFleetModal.tsx index 1d19e25331..7e3ee326b9 100644 --- a/frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/CreateTeamModal.tsx +++ b/frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/CreateFleetModal.tsx @@ -1,27 +1,27 @@ import React, { useState, useCallback, useEffect } from "react"; -import { ITeamFormData } from "services/entities/teams"; +import { ITeamFormData as IFleetFormData } from "services/entities/teams"; import Modal from "components/Modal"; import Button from "components/buttons/Button"; import InputField from "components/forms/fields/InputField"; -const baseClass = "create-team-modal"; +const baseClass = "create-fleet-modal"; -interface ICreateTeamModalProps { +interface ICreateFleetModalProps { onCancel: () => void; - onSubmit: (formData: ITeamFormData) => void; + onSubmit: (formData: IFleetFormData) => void; backendValidators: { [key: string]: string }; - isUpdatingTeams: boolean; + isUpdatingFleets: boolean; } -const CreateTeamModal = ({ +const CreateFleetModal = ({ onCancel, onSubmit, backendValidators, - isUpdatingTeams, -}: ICreateTeamModalProps): JSX.Element => { + isUpdatingFleets, +}: ICreateFleetModalProps): JSX.Element => { const [name, setName] = useState(""); const [errors, setErrors] = useState<{ [key: string]: string }>( backendValidators @@ -74,7 +74,7 @@ const CreateTeamModal = ({ type="submit" disabled={name.trim() === ""} className="create-loading" - isLoading={isUpdatingTeams} + isLoading={isUpdatingFleets} > Create @@ -87,4 +87,4 @@ const CreateTeamModal = ({ ); }; -export default CreateTeamModal; +export default CreateFleetModal; diff --git a/frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/index.ts b/frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/index.ts new file mode 100644 index 0000000000..deeb3d3183 --- /dev/null +++ b/frontend/pages/admin/ManageFleetsPage/components/CreateFleetModal/index.ts @@ -0,0 +1 @@ +export { default } from "./CreateFleetModal"; diff --git a/frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/DeleteTeamModal.tsx b/frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/DeleteFleetModal.tsx similarity index 77% rename from frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/DeleteTeamModal.tsx rename to frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/DeleteFleetModal.tsx index ecc9a199a7..0da8c4a2bf 100644 --- a/frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/DeleteTeamModal.tsx +++ b/frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/DeleteFleetModal.tsx @@ -3,21 +3,21 @@ import React from "react"; import Modal from "components/Modal"; import Button from "components/buttons/Button"; -const baseClass = "delete-team-modal"; +const baseClass = "delete-fleet-modal"; -interface IDeleteTeamModalProps { +interface IDeleteFleetModalProps { name: string; - isUpdatingTeams: boolean; + isUpdatingFleets: boolean; onSubmit: () => void; onCancel: () => void; } -const DeleteTeamModal = ({ +const DeleteFleetModal = ({ name, - isUpdatingTeams, + isUpdatingFleets, onSubmit, onCancel, -}: IDeleteTeamModalProps): JSX.Element => { +}: IDeleteFleetModalProps): JSX.Element => { return ( Delete @@ -51,4 +51,4 @@ const DeleteTeamModal = ({ ); }; -export default DeleteTeamModal; +export default DeleteFleetModal; diff --git a/frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/_styles.scss b/frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/_styles.scss similarity index 79% rename from frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/_styles.scss rename to frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/_styles.scss index f110fbf146..e001f22888 100644 --- a/frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/_styles.scss +++ b/frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/_styles.scss @@ -1,4 +1,4 @@ -.delete-team-modal { +.delete-fleet-modal { &__name { font-weight: $bold; } diff --git a/frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/index.ts b/frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/index.ts new file mode 100644 index 0000000000..fbc901aada --- /dev/null +++ b/frontend/pages/admin/ManageFleetsPage/components/DeleteFleetModal/index.ts @@ -0,0 +1 @@ +export { default } from "./DeleteFleetModal"; diff --git a/frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/RenameTeamModal.tests.tsx b/frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/RenameFleetModal.tests.tsx similarity index 82% rename from frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/RenameTeamModal.tests.tsx rename to frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/RenameFleetModal.tests.tsx index 503addcb0c..f871801b9e 100644 --- a/frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/RenameTeamModal.tests.tsx +++ b/frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/RenameFleetModal.tests.tsx @@ -3,15 +3,15 @@ import { screen } from "@testing-library/react"; import { createCustomRenderer } from "test/test-utils"; import userEvent from "@testing-library/user-event"; -import RenameTeamModal from "./RenameTeamModal"; +import RenameFleetModal from "./RenameFleetModal"; -describe("RenameTeamModal", () => { +describe("RenameFleetModal", () => { const defaultProps = { onCancel: jest.fn(), onSubmit: jest.fn(), - defaultName: "Existing Team", + defaultName: "Existing Fleet Name", backendValidators: {}, - isUpdatingTeams: false, + isUpdatingFleets: false, }; const render = createCustomRenderer(); @@ -21,14 +21,14 @@ describe("RenameTeamModal", () => { }); it("renders the modal with the save button enabled for the default name", () => { - render(); + render(); const saveButton = screen.getByRole("button", { name: "Save" }); expect(saveButton).toBeEnabled(); }); it("disables the save button when the name is cleared", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.clear(nameInput); @@ -38,7 +38,7 @@ describe("RenameTeamModal", () => { }); it("disables the save button when only spaces are entered", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.clear(nameInput); @@ -49,7 +49,7 @@ describe("RenameTeamModal", () => { }); it("calls onSubmit with trimmed name", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.clear(nameInput); @@ -62,7 +62,7 @@ describe("RenameTeamModal", () => { }); it("does not call onSubmit when name is whitespace-only", async () => { - render(); + render(); const nameInput = screen.getByLabelText("Fleet name"); await userEvent.clear(nameInput); diff --git a/frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/RenameTeamModal.tsx b/frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/RenameFleetModal.tsx similarity index 81% rename from frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/RenameTeamModal.tsx rename to frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/RenameFleetModal.tsx index 672d8ff5ea..86383268db 100644 --- a/frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/RenameTeamModal.tsx +++ b/frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/RenameFleetModal.tsx @@ -1,28 +1,28 @@ import React, { useState, useCallback, useEffect } from "react"; -import { ITeamFormData } from "services/entities/teams"; +import { ITeamFormData as IFleetFormData } from "services/entities/teams"; import Modal from "components/Modal"; import InputField from "components/forms/fields/InputField"; import Button from "components/buttons/Button"; -const baseClass = "edit-team-modal"; +const baseClass = "rename-fleet-modal"; -interface IRenameTeamModalProps { +interface IRenameFleetModalProps { onCancel: () => void; - onSubmit: (formData: ITeamFormData) => void; + onSubmit: (formData: IFleetFormData) => void; defaultName: string; backendValidators: { [key: string]: string }; - isUpdatingTeams: boolean; + isUpdatingFleets: boolean; } -const RenameTeamModal = ({ +const RenameFleetModal = ({ onCancel, onSubmit, defaultName, backendValidators, - isUpdatingTeams, -}: IRenameTeamModalProps): JSX.Element => { + isUpdatingFleets, +}: IRenameFleetModalProps): JSX.Element => { const [name, setName] = useState(defaultName); const [errors, setErrors] = useState<{ [key: string]: string }>( backendValidators @@ -70,7 +70,7 @@ const RenameTeamModal = ({ type="submit" disabled={name.trim() === ""} className="save-loading" - isLoading={isUpdatingTeams} + isLoading={isUpdatingFleets} > Save @@ -83,4 +83,4 @@ const RenameTeamModal = ({ ); }; -export default RenameTeamModal; +export default RenameFleetModal; diff --git a/frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/index.ts b/frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/index.ts new file mode 100644 index 0000000000..1d24267f31 --- /dev/null +++ b/frontend/pages/admin/ManageFleetsPage/components/RenameFleetModal/index.ts @@ -0,0 +1 @@ +export { default } from "./RenameFleetModal"; diff --git a/frontend/pages/admin/ManageFleetsPage/index.ts b/frontend/pages/admin/ManageFleetsPage/index.ts new file mode 100644 index 0000000000..a651d677ba --- /dev/null +++ b/frontend/pages/admin/ManageFleetsPage/index.ts @@ -0,0 +1 @@ +export { default } from "./ManageFleetsPage"; diff --git a/frontend/pages/admin/UserManagementPage/CreateApiUserPage/CreateApiUserPage.tsx b/frontend/pages/admin/ManageUsersPage/CreateApiUserPage/CreateApiUserPage.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/CreateApiUserPage/CreateApiUserPage.tsx rename to frontend/pages/admin/ManageUsersPage/CreateApiUserPage/CreateApiUserPage.tsx diff --git a/frontend/pages/admin/UserManagementPage/CreateApiUserPage/index.ts b/frontend/pages/admin/ManageUsersPage/CreateApiUserPage/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/CreateApiUserPage/index.ts rename to frontend/pages/admin/ManageUsersPage/CreateApiUserPage/index.ts diff --git a/frontend/pages/admin/UserManagementPage/CreateUserPage/CreateUserPage.tsx b/frontend/pages/admin/ManageUsersPage/CreateUserPage/CreateUserPage.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/CreateUserPage/CreateUserPage.tsx rename to frontend/pages/admin/ManageUsersPage/CreateUserPage/CreateUserPage.tsx diff --git a/frontend/pages/admin/UserManagementPage/CreateUserPage/index.ts b/frontend/pages/admin/ManageUsersPage/CreateUserPage/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/CreateUserPage/index.ts rename to frontend/pages/admin/ManageUsersPage/CreateUserPage/index.ts diff --git a/frontend/pages/admin/UserManagementPage/EditUserPage/EditUserPage.tsx b/frontend/pages/admin/ManageUsersPage/EditUserPage/EditUserPage.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/EditUserPage/EditUserPage.tsx rename to frontend/pages/admin/ManageUsersPage/EditUserPage/EditUserPage.tsx diff --git a/frontend/pages/admin/UserManagementPage/EditUserPage/index.ts b/frontend/pages/admin/ManageUsersPage/EditUserPage/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/EditUserPage/index.ts rename to frontend/pages/admin/ManageUsersPage/EditUserPage/index.ts diff --git a/frontend/pages/admin/UserManagementPage/UserManagementPage.tsx b/frontend/pages/admin/ManageUsersPage/ManageUsersPage.tsx similarity index 50% rename from frontend/pages/admin/UserManagementPage/UserManagementPage.tsx rename to frontend/pages/admin/ManageUsersPage/ManageUsersPage.tsx index a68c6d92c1..13988edca0 100644 --- a/frontend/pages/admin/UserManagementPage/UserManagementPage.tsx +++ b/frontend/pages/admin/ManageUsersPage/ManageUsersPage.tsx @@ -1,19 +1,22 @@ import React from "react"; import { InjectedRouter } from "react-router"; + +import PageDescription from "components/PageDescription"; import UsersTable from "./components/UsersTable"; -const baseClass = "user-management"; +const baseClass = "manage-users"; interface IUserManagementProps { router: InjectedRouter; // v3 } -const UserManagementPage = ({ router }: IUserManagementProps): JSX.Element => { +const ManageUsersPage = ({ router }: IUserManagementProps): JSX.Element => { return (
+
); }; -export default UserManagementPage; +export default ManageUsersPage; diff --git a/frontend/pages/admin/UserManagementPage/_styles.scss b/frontend/pages/admin/ManageUsersPage/_styles.scss similarity index 99% rename from frontend/pages/admin/UserManagementPage/_styles.scss rename to frontend/pages/admin/ManageUsersPage/_styles.scss index be6644bfeb..a0cfbc4585 100644 --- a/frontend/pages/admin/UserManagementPage/_styles.scss +++ b/frontend/pages/admin/ManageUsersPage/_styles.scss @@ -1,4 +1,6 @@ -.user-management { +.manage-users { + @include vertical-page-layout; + .data-table-block { .data-table__table { thead { diff --git a/frontend/pages/admin/UserManagementPage/components/AddUserModal/AddUserModal.tsx b/frontend/pages/admin/ManageUsersPage/components/AddUserModal/AddUserModal.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/AddUserModal/AddUserModal.tsx rename to frontend/pages/admin/ManageUsersPage/components/AddUserModal/AddUserModal.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/AddUserModal/index.ts b/frontend/pages/admin/ManageUsersPage/components/AddUserModal/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/AddUserModal/index.ts rename to frontend/pages/admin/ManageUsersPage/components/AddUserModal/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/ApiAccessSection/ApiAccessSection.tsx b/frontend/pages/admin/ManageUsersPage/components/ApiAccessSection/ApiAccessSection.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiAccessSection/ApiAccessSection.tsx rename to frontend/pages/admin/ManageUsersPage/components/ApiAccessSection/ApiAccessSection.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/ApiAccessSection/index.ts b/frontend/pages/admin/ManageUsersPage/components/ApiAccessSection/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiAccessSection/index.ts rename to frontend/pages/admin/ManageUsersPage/components/ApiAccessSection/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/ApiEndpointSelectorTable/ApiEndpointSelectorTable.tsx b/frontend/pages/admin/ManageUsersPage/components/ApiEndpointSelectorTable/ApiEndpointSelectorTable.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiEndpointSelectorTable/ApiEndpointSelectorTable.tsx rename to frontend/pages/admin/ManageUsersPage/components/ApiEndpointSelectorTable/ApiEndpointSelectorTable.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/ApiEndpointSelectorTable/index.ts b/frontend/pages/admin/ManageUsersPage/components/ApiEndpointSelectorTable/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiEndpointSelectorTable/index.ts rename to frontend/pages/admin/ManageUsersPage/components/ApiEndpointSelectorTable/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/ApiKeyDisplay/ApiKeyDisplay.tsx b/frontend/pages/admin/ManageUsersPage/components/ApiKeyDisplay/ApiKeyDisplay.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiKeyDisplay/ApiKeyDisplay.tsx rename to frontend/pages/admin/ManageUsersPage/components/ApiKeyDisplay/ApiKeyDisplay.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/ApiKeyDisplay/index.ts b/frontend/pages/admin/ManageUsersPage/components/ApiKeyDisplay/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiKeyDisplay/index.ts rename to frontend/pages/admin/ManageUsersPage/components/ApiKeyDisplay/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/ApiUserForm/ApiUserForm.tsx b/frontend/pages/admin/ManageUsersPage/components/ApiUserForm/ApiUserForm.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiUserForm/ApiUserForm.tsx rename to frontend/pages/admin/ManageUsersPage/components/ApiUserForm/ApiUserForm.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/ApiUserForm/index.ts b/frontend/pages/admin/ManageUsersPage/components/ApiUserForm/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ApiUserForm/index.ts rename to frontend/pages/admin/ManageUsersPage/components/ApiUserForm/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/DeleteUserModal/DeleteUserModal.tsx b/frontend/pages/admin/ManageUsersPage/components/DeleteUserModal/DeleteUserModal.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/DeleteUserModal/DeleteUserModal.tsx rename to frontend/pages/admin/ManageUsersPage/components/DeleteUserModal/DeleteUserModal.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/DeleteUserModal/_styles.scss b/frontend/pages/admin/ManageUsersPage/components/DeleteUserModal/_styles.scss similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/DeleteUserModal/_styles.scss rename to frontend/pages/admin/ManageUsersPage/components/DeleteUserModal/_styles.scss diff --git a/frontend/pages/admin/UserManagementPage/components/DeleteUserModal/index.ts b/frontend/pages/admin/ManageUsersPage/components/DeleteUserModal/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/DeleteUserModal/index.ts rename to frontend/pages/admin/ManageUsersPage/components/DeleteUserModal/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/EditUserModal/EditUserModal.tsx b/frontend/pages/admin/ManageUsersPage/components/EditUserModal/EditUserModal.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/EditUserModal/EditUserModal.tsx rename to frontend/pages/admin/ManageUsersPage/components/EditUserModal/EditUserModal.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/EditUserModal/index.ts b/frontend/pages/admin/ManageUsersPage/components/EditUserModal/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/EditUserModal/index.ts rename to frontend/pages/admin/ManageUsersPage/components/EditUserModal/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/ResetPasswordModal/ResetPasswordModal.tsx b/frontend/pages/admin/ManageUsersPage/components/ResetPasswordModal/ResetPasswordModal.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ResetPasswordModal/ResetPasswordModal.tsx rename to frontend/pages/admin/ManageUsersPage/components/ResetPasswordModal/ResetPasswordModal.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/ResetPasswordModal/index.ts b/frontend/pages/admin/ManageUsersPage/components/ResetPasswordModal/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ResetPasswordModal/index.ts rename to frontend/pages/admin/ManageUsersPage/components/ResetPasswordModal/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/ResetSessionsModal/ResetSessionsModal.tsx b/frontend/pages/admin/ManageUsersPage/components/ResetSessionsModal/ResetSessionsModal.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ResetSessionsModal/ResetSessionsModal.tsx rename to frontend/pages/admin/ManageUsersPage/components/ResetSessionsModal/ResetSessionsModal.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/ResetSessionsModal/index.ts b/frontend/pages/admin/ManageUsersPage/components/ResetSessionsModal/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/ResetSessionsModal/index.ts rename to frontend/pages/admin/ManageUsersPage/components/ResetSessionsModal/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/SelectRoleForm/SelectRoleForm.tsx b/frontend/pages/admin/ManageUsersPage/components/SelectRoleForm/SelectRoleForm.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/SelectRoleForm/SelectRoleForm.tsx rename to frontend/pages/admin/ManageUsersPage/components/SelectRoleForm/SelectRoleForm.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/SelectedTeamsForm/SelectedTeamsForm.tests.tsx b/frontend/pages/admin/ManageUsersPage/components/SelectedTeamsForm/SelectedTeamsForm.tests.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/SelectedTeamsForm/SelectedTeamsForm.tests.tsx rename to frontend/pages/admin/ManageUsersPage/components/SelectedTeamsForm/SelectedTeamsForm.tests.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/SelectedTeamsForm/SelectedTeamsForm.tsx b/frontend/pages/admin/ManageUsersPage/components/SelectedTeamsForm/SelectedTeamsForm.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/SelectedTeamsForm/SelectedTeamsForm.tsx rename to frontend/pages/admin/ManageUsersPage/components/SelectedTeamsForm/SelectedTeamsForm.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/SelectedTeamsForm/_styles.scss b/frontend/pages/admin/ManageUsersPage/components/SelectedTeamsForm/_styles.scss similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/SelectedTeamsForm/_styles.scss rename to frontend/pages/admin/ManageUsersPage/components/SelectedTeamsForm/_styles.scss diff --git a/frontend/pages/admin/UserManagementPage/components/UserForm/UserForm.tests.tsx b/frontend/pages/admin/ManageUsersPage/components/UserForm/UserForm.tests.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/UserForm/UserForm.tests.tsx rename to frontend/pages/admin/ManageUsersPage/components/UserForm/UserForm.tests.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/UserForm/UserForm.tsx b/frontend/pages/admin/ManageUsersPage/components/UserForm/UserForm.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/UserForm/UserForm.tsx rename to frontend/pages/admin/ManageUsersPage/components/UserForm/UserForm.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/UserForm/_styles.scss b/frontend/pages/admin/ManageUsersPage/components/UserForm/_styles.scss similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/UserForm/_styles.scss rename to frontend/pages/admin/ManageUsersPage/components/UserForm/_styles.scss diff --git a/frontend/pages/admin/UserManagementPage/components/UserForm/index.ts b/frontend/pages/admin/ManageUsersPage/components/UserForm/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/UserForm/index.ts rename to frontend/pages/admin/ManageUsersPage/components/UserForm/index.ts diff --git a/frontend/pages/admin/UserManagementPage/components/UsersTable/UsersTable.tsx b/frontend/pages/admin/ManageUsersPage/components/UsersTable/UsersTable.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/UsersTable/UsersTable.tsx rename to frontend/pages/admin/ManageUsersPage/components/UsersTable/UsersTable.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/UsersTable/UsersTableConfig.tsx b/frontend/pages/admin/ManageUsersPage/components/UsersTable/UsersTableConfig.tsx similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/UsersTable/UsersTableConfig.tsx rename to frontend/pages/admin/ManageUsersPage/components/UsersTable/UsersTableConfig.tsx diff --git a/frontend/pages/admin/UserManagementPage/components/UsersTable/index.ts b/frontend/pages/admin/ManageUsersPage/components/UsersTable/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/components/UsersTable/index.ts rename to frontend/pages/admin/ManageUsersPage/components/UsersTable/index.ts diff --git a/frontend/pages/admin/UserManagementPage/helpers/index.ts b/frontend/pages/admin/ManageUsersPage/helpers/index.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/helpers/index.ts rename to frontend/pages/admin/ManageUsersPage/helpers/index.ts diff --git a/frontend/pages/admin/UserManagementPage/helpers/userManagementHelpers.tests.ts b/frontend/pages/admin/ManageUsersPage/helpers/userManagementHelpers.tests.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/helpers/userManagementHelpers.tests.ts rename to frontend/pages/admin/ManageUsersPage/helpers/userManagementHelpers.tests.ts diff --git a/frontend/pages/admin/UserManagementPage/helpers/userManagementHelpers.ts b/frontend/pages/admin/ManageUsersPage/helpers/userManagementHelpers.ts similarity index 100% rename from frontend/pages/admin/UserManagementPage/helpers/userManagementHelpers.ts rename to frontend/pages/admin/ManageUsersPage/helpers/userManagementHelpers.ts diff --git a/frontend/pages/admin/ManageUsersPage/index.ts b/frontend/pages/admin/ManageUsersPage/index.ts new file mode 100644 index 0000000000..2d17645aa5 --- /dev/null +++ b/frontend/pages/admin/ManageUsersPage/index.ts @@ -0,0 +1 @@ +export { default } from "./ManageUsersPage"; diff --git a/frontend/pages/admin/TeamManagementPage/TeamManagementPage.tsx b/frontend/pages/admin/TeamManagementPage/TeamManagementPage.tsx deleted file mode 100644 index ece9135eb8..0000000000 --- a/frontend/pages/admin/TeamManagementPage/TeamManagementPage.tsx +++ /dev/null @@ -1,354 +0,0 @@ -import React, { useState, useCallback, useContext, useMemo } from "react"; -import { useQuery } from "react-query"; -import { useErrorHandler } from "react-error-boundary"; - -import { PRIMO_TOOLTIP } from "utilities/constants"; -import { getGitOpsModeTipContent } from "utilities/helpers"; - -import { NotificationContext } from "context/notification"; -import { AppContext } from "context/app"; -import { ITeam } from "interfaces/team"; -import { IApiError } from "interfaces/errors"; -import usersAPI, { IGetMeResponse } from "services/entities/users"; -import teamsAPI, { - ILoadTeamsResponse, - ITeamFormData, -} from "services/entities/teams"; - -import TableContainer from "components/TableContainer"; -import TableDataError from "components/DataError"; -import TableCount from "components/TableContainer/TableCount"; -import SandboxGate from "components/Sandbox/SandboxGate"; -import SandboxMessage from "components/Sandbox/SandboxMessage"; - -import CreateTeamModal from "./components/CreateTeamModal"; -import DeleteTeamModal from "./components/DeleteTeamModal"; -import RenameTeamModal from "./components/RenameTeamModal"; -import EmptyTeamsTable from "./components/EmptyTeamsTable"; - -import { generateTableHeaders, generateDataSet } from "./TeamTableConfig"; - -const baseClass = "team-management"; -const noTeamsClass = "no-teams"; - -const TeamManagementPage = (): JSX.Element => { - const { renderFlash } = useContext(NotificationContext); - const { - currentTeam, - setCurrentTeam, - setCurrentUser, - setAvailableTeams, - setUserSettings, - config, - } = useContext(AppContext); - - const [isUpdatingTeams, setIsUpdatingTeams] = useState(false); - const [showCreateTeamModal, setShowCreateTeamModal] = useState(false); - const [showDeleteTeamModal, setShowDeleteTeamModal] = useState(false); - const [showRenameTeamModal, setShowRenameTeamModal] = useState(false); - const [teamEditing, setTeamEditing] = useState(); - const [backendValidators, setBackendValidators] = useState<{ - [key: string]: string; - }>({}); - const handlePageError = useErrorHandler(); - - const { refetch: refetchMe } = useQuery(["me"], () => usersAPI.me(), { - enabled: false, - onSuccess: ({ user, available_teams, settings }: IGetMeResponse) => { - setCurrentUser(user); - setAvailableTeams(user, available_teams); - setUserSettings(settings); - }, - }); - - const { - data: teams, - isFetching: isFetchingTeams, - error: loadingTeamsError, - refetch: refetchTeams, - } = useQuery( - ["teams"], - () => teamsAPI.loadAll(), - { - select: (data: ILoadTeamsResponse) => data.teams, - onError: (error) => handlePageError(error), - } - ); - - // TODO: Cleanup useCallbacks, add missing dependencies, use state setter functions, e.g., - // `setShowCreateTeamModal((prevState) => !prevState)`, instead of including state - // variables as dependencies for toggles, etc. - - const toggleCreateTeamModal = useCallback(() => { - setShowCreateTeamModal(!showCreateTeamModal); - setBackendValidators({}); - }, [showCreateTeamModal, setShowCreateTeamModal, setBackendValidators]); - - const toggleDeleteTeamModal = useCallback( - (team?: ITeam) => { - setShowDeleteTeamModal(!showDeleteTeamModal); - team ? setTeamEditing(team) : setTeamEditing(undefined); - }, - [showDeleteTeamModal, setShowDeleteTeamModal, setTeamEditing] - ); - - const toggleRenameTeamModal = useCallback( - (team?: ITeam) => { - setShowRenameTeamModal(!showRenameTeamModal); - setBackendValidators({}); - team ? setTeamEditing(team) : setTeamEditing(undefined); - }, - [ - showRenameTeamModal, - setShowRenameTeamModal, - setTeamEditing, - setBackendValidators, - ] - ); - - const onCreateSubmit = useCallback( - (formData: ITeamFormData) => { - setIsUpdatingTeams(true); - teamsAPI - .create(formData) - .then(() => { - renderFlash("success", `Successfully created ${formData.name}.`); - setBackendValidators({}); - toggleCreateTeamModal(); - refetchMe(); - refetchTeams(); - }) - .catch((createError: { data: IApiError }) => { - const rawReason = createError.data.errors[0].reason; - const errMsg = rawReason.toLowerCase(); - if (errMsg.includes("must differ")) { - setBackendValidators({ name: rawReason }); - } else if (errMsg.includes("duplicate")) { - setBackendValidators({ - name: "A fleet with this name already exists", - }); - } else if ( - errMsg.includes("all teams") || - errMsg.includes("all fleets") || - errMsg.includes("no team") || - errMsg.includes("unassigned") - ) { - setBackendValidators({ - name: `"${formData.name}" is a reserved fleet name. Please try another name.`, - }); - } else { - renderFlash("error", "Could not create fleet. Please try again."); - toggleCreateTeamModal(); - } - }) - .finally(() => { - setIsUpdatingTeams(false); - }); - }, - [toggleCreateTeamModal, refetchMe, refetchTeams, renderFlash] - ); - - const onDeleteSubmit = useCallback(() => { - if (teamEditing) { - setIsUpdatingTeams(true); - teamsAPI - .destroy(teamEditing.id) - .then(() => { - renderFlash("success", `Successfully deleted ${teamEditing.name}.`); - if (currentTeam?.id === teamEditing.id) { - setCurrentTeam(undefined); - } - }) - .catch(() => { - renderFlash( - "error", - `Could not delete ${teamEditing.name}. Please try again.` - ); - }) - .finally(() => { - setIsUpdatingTeams(false); - refetchMe(); - refetchTeams(); - toggleDeleteTeamModal(); - }); - } - }, [ - currentTeam, - teamEditing, - refetchMe, - refetchTeams, - renderFlash, - setCurrentTeam, - toggleDeleteTeamModal, - ]); - - const onRenameSubmit = useCallback( - (formData: ITeamFormData) => { - if (formData.name === teamEditing?.name) { - toggleRenameTeamModal(); - } else if (teamEditing) { - setIsUpdatingTeams(true); - teamsAPI - .update(formData, teamEditing.id) - .then(() => { - renderFlash( - "success", - `Successfully updated fleet name to ${formData.name}.` - ); - setBackendValidators({}); - toggleRenameTeamModal(); - refetchTeams(); - }) - .catch((updateError: { data: IApiError }) => { - console.error(updateError); - const rawReason = updateError.data.errors[0].reason; - const errMsg = rawReason.toLowerCase(); - if (errMsg.includes("must differ")) { - setBackendValidators({ name: rawReason }); - } else if (errMsg.includes("duplicate")) { - setBackendValidators({ - name: "A fleet with this name already exists", - }); - } else if ( - errMsg.includes("all teams") || - errMsg.includes("all fleets") - ) { - setBackendValidators({ - name: `"All fleets" is a reserved fleet name.`, - }); - } else if ( - errMsg.includes("no team") || - errMsg.includes("unassigned") - ) { - setBackendValidators({ - name: `"Unassigned" is a reserved fleet name. Please try another name.`, - }); - } else { - renderFlash( - "error", - `Could not rename ${teamEditing.name}. Please try again.` - ); - } - }) - .finally(() => { - setIsUpdatingTeams(false); - }); - } - }, - [teamEditing, toggleRenameTeamModal, refetchTeams, renderFlash] - ); - - const onActionSelection = useCallback( - (action: string, team: ITeam): void => { - switch (action) { - case "rename": - toggleRenameTeamModal(team); - break; - case "delete": - toggleDeleteTeamModal(team); - break; - default: - } - }, - [toggleRenameTeamModal, toggleDeleteTeamModal] - ); - - const tableHeaders = useMemo(() => generateTableHeaders(onActionSelection), [ - onActionSelection, - ]); - const tableData = useMemo(() => (teams ? generateDataSet(teams) : []), [ - teams, - ]); - - const renderTeamCount = useCallback(() => { - if (teams?.length === 0) { - return <>; - } - - return ; - }, [teams]); - - const disabledPrimaryActionTooltip = (() => { - if (config?.partnerships?.enable_primo) { - return PRIMO_TOOLTIP; - } - if (config?.gitops?.gitops_mode_enabled && config?.gitops?.repository_url) { - return getGitOpsModeTipContent(config.gitops.repository_url); - } - return null; - })(); - - return ( -
- ( - - )} - > - {loadingTeamsError ? ( - - ) : ( - ( - - )} - showMarkAllPages={false} - isAllPagesSelected={false} - isClientSidePagination - renderCount={renderTeamCount} - /> - )} - {showCreateTeamModal && ( - - )} - {showDeleteTeamModal && ( - - )} - {showRenameTeamModal && ( - - )} - -
- ); -}; - -export default TeamManagementPage; diff --git a/frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/index.ts b/frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/index.ts deleted file mode 100644 index 3069b4413c..0000000000 --- a/frontend/pages/admin/TeamManagementPage/components/CreateTeamModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./CreateTeamModal"; diff --git a/frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/index.ts b/frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/index.ts deleted file mode 100644 index 6707d8962d..0000000000 --- a/frontend/pages/admin/TeamManagementPage/components/DeleteTeamModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./DeleteTeamModal"; diff --git a/frontend/pages/admin/TeamManagementPage/components/EmptyTeamsTable.tsx b/frontend/pages/admin/TeamManagementPage/components/EmptyTeamsTable.tsx deleted file mode 100644 index 1e3b1630d3..0000000000 --- a/frontend/pages/admin/TeamManagementPage/components/EmptyTeamsTable.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import React from "react"; - -import Button from "components/buttons/Button"; -import EmptyState from "components/EmptyState"; -import CustomLink from "components/CustomLink"; -import TooltipWrapper from "components/TooltipWrapper"; - -const EmptyTeamsTable = ({ - className, - onActionButtonClick, - disabledPrimaryActionTooltip, -}: { - className: string; - onActionButtonClick: () => void; - // covers both disabling teams UI for Primo and GitOps mode, with correct precedence - disabledPrimaryActionTooltip: React.ReactNode; -}) => { - const rawButton = ( - - ); - const primaryButton = disabledPrimaryActionTooltip ? ( - - {rawButton} - - ) : ( - rawButton - ); - - return ( - - {" "} - Want to learn more?  - - - } - primaryButton={primaryButton} - /> - ); -}; - -export default EmptyTeamsTable; diff --git a/frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/index.ts b/frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/index.ts deleted file mode 100644 index 89752243c8..0000000000 --- a/frontend/pages/admin/TeamManagementPage/components/RenameTeamModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./RenameTeamModal"; diff --git a/frontend/pages/admin/TeamManagementPage/index.ts b/frontend/pages/admin/TeamManagementPage/index.ts deleted file mode 100644 index 62720ce3ef..0000000000 --- a/frontend/pages/admin/TeamManagementPage/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./TeamManagementPage"; diff --git a/frontend/pages/admin/UserManagementPage/index.ts b/frontend/pages/admin/UserManagementPage/index.ts deleted file mode 100644 index 543845c50e..0000000000 --- a/frontend/pages/admin/UserManagementPage/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./UserManagementPage"; diff --git a/frontend/router/index.tsx b/frontend/router/index.tsx index 6131e68c21..d0800ce778 100644 --- a/frontend/router/index.tsx +++ b/frontend/router/index.tsx @@ -16,12 +16,12 @@ import { import OrgSettingsPage from "pages/admin/OrgSettingsPage"; import AdminIntegrationsPage from "pages/admin/IntegrationsPage"; -import AdminUserManagementPage from "pages/admin/UserManagementPage"; -import CreateUserPage from "pages/admin/UserManagementPage/CreateUserPage"; -import CreateApiUserPage from "pages/admin/UserManagementPage/CreateApiUserPage"; -import EditUserPage from "pages/admin/UserManagementPage/EditUserPage"; -import AdminTeamManagementPage from "pages/admin/TeamManagementPage"; -import TeamDetailsWrapper from "pages/admin/TeamManagementPage/TeamDetailsWrapper"; +import AdminManageUsersPage from "pages/admin/ManageUsersPage"; +import CreateUserPage from "pages/admin/ManageUsersPage/CreateUserPage"; +import CreateApiUserPage from "pages/admin/ManageUsersPage/CreateApiUserPage"; +import EditUserPage from "pages/admin/ManageUsersPage/EditUserPage"; +import AdminManageFleetsPage from "pages/admin/ManageFleetsPage"; +import TeamDetailsWrapper from "pages/admin/ManageFleetsPage/TeamDetailsWrapper"; import App from "components/App"; import ConfirmInvitePage from "pages/ConfirmInvitePage"; import ConfirmSSOInvitePage from "pages/ConfirmSSOInvitePage"; @@ -61,8 +61,8 @@ import Fleet404 from "pages/errors/Fleet404"; import AccountPage from "pages/AccountPage"; import SettingsWrapper from "pages/admin/AdminWrapper"; import ManageControlsPage from "pages/ManageControlsPage/ManageControlsPage"; -import UsersPage from "pages/admin/TeamManagementPage/TeamDetailsWrapper/UsersPage/UsersPage"; -import AgentOptionsPage from "pages/admin/TeamManagementPage/TeamDetailsWrapper/AgentOptionsPage"; +import UsersPage from "pages/admin/ManageFleetsPage/TeamDetailsWrapper/UsersPage/UsersPage"; +import AgentOptionsPage from "pages/admin/ManageFleetsPage/TeamDetailsWrapper/AgentOptionsPage"; import OSUpdates from "pages/ManageControlsPage/OSUpdates"; import OSSettings from "pages/ManageControlsPage/OSSettings"; import SetupExperience from "pages/ManageControlsPage/SetupExperience/SetupExperience"; @@ -82,7 +82,7 @@ import SoftwareVulnerabilities from "pages/SoftwarePage/SoftwareVulnerabilities" import SoftwareLibrary from "pages/SoftwarePage/SoftwareLibrary"; import SoftwareTitleDetailsPage from "pages/SoftwarePage/SoftwareTitleDetailsPage"; import SoftwareVersionDetailsPage from "pages/SoftwarePage/SoftwareVersionDetailsPage"; -import TeamSettings from "pages/admin/TeamManagementPage/TeamDetailsWrapper/TeamSettings"; +import TeamSettings from "pages/admin/ManageFleetsPage/TeamDetailsWrapper/TeamSettings"; import SoftwareOSDetailsPage from "pages/SoftwarePage/SoftwareOSDetailsPage"; import SoftwareVulnerabilityDetailsPage from "pages/SoftwarePage/SoftwareVulnerabilityDetailsPage"; import SoftwareAddPage from "pages/SoftwarePage/SoftwareAddPage"; @@ -215,11 +215,11 @@ const routes = ( component={AdminIntegrationsPage} /> - + - + diff --git a/website/config/routes.js b/website/config/routes.js index 426b9434b7..bd14a9ce7f 100644 --- a/website/config/routes.js +++ b/website/config/routes.js @@ -1297,6 +1297,7 @@ module.exports.routes = { 'GET /learn-more-about/enrollment-profiles': 'https://developer.apple.com/documentation/devicemanagement/profile?changes=l_11_5', 'GET /learn-more-about/psso-local-account': '/guides/setup-experience#platform-sso', 'GET /learn-more-about/deploy-fleet': '/docs/deploy/deploy-fleet', + 'GET /learn-more-about/fleets': '/guides/fleets', 'GET /learn-more-about/vulnerability-exposure-cves': 'https://github.com/fleetdm/fleet/blob/1ea1fddfd62f66fd14de65cbeceb4f7a9d0167ec/server/chart/internal/mysql/charts.go#L111-L138', // Sitemap