LCOV - code coverage report
Current view: top level - pkg/systemd - service-tabs.tsx Coverage Total Hit
Test: cockpit Lines: 100.0 % 41 41
Test Date: 2026-06-16 14:09:37

            Line data    Source code
       1              : /*
       2              :  * Copyright (C) 2020 Red Hat, Inc.
       3              :  * SPDX-License-Identifier: LGPL-2.1-or-later
       4              :  */
       5              : 
       6           30 : import React, { useState } from "react";
       7              : import { Button } from "@patternfly/react-core/dist/esm/components/Button/index.js";
       8              : import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/esm/components/Nav/index.js";
       9              : import { Icon } from "@patternfly/react-core/dist/esm/components/Icon/index.js";
      10              : import { ExclamationCircleIcon } from '@patternfly/react-icons';
      11              : 
      12           30 : import cockpit from "cockpit";
      13              : 
      14           30 : const _ = cockpit.gettext;
      15              : 
      16           30 : export const service_tabs_suffixes = ["service", "target", "socket", "timer", "path"];
      17              : 
      18              : type TabKey = "service" | "target" | "socket" | "timer" | "path";
      19              : 
      20           30 : const service_tabs: Map<TabKey, string> = new Map([
      21           30 :     ["service", _("Services")],
      22           30 :     ["target", _("Targets")],
      23           30 :     ["socket", _("Sockets")],
      24           30 :     ["timer", _("Timers")],
      25           30 :     ["path", _("Paths")],
      26           30 : ]);
      27              : // TODO: switch Iterator.prototype.map (requires ES2027)
      28              : // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator/map
      29           30 : const service_tabs_keys = [...service_tabs.keys()];
      30              : 
      31           27 : export function ServiceTabs({
      32           27 :     onChange,
      33           27 :     activeTab,
      34           27 :     tabErrors
      35           27 : }: {
      36              :     onChange: (tab: TabKey) => void;
      37              :     activeTab: TabKey;
      38              :     tabErrors: Record<TabKey, boolean>;
      39           27 : }) {
      40           27 :     const [activeItem, setActiveItem] = useState(activeTab);
      41              : 
      42           27 :     return (
      43           27 :         <Nav variant="horizontal-subnav" id="services-filter"
      44            7 :              onSelect={(_event, result) => {
      45            7 :                  const selectedTabKey = result.itemId as TabKey;
      46            7 :                  setActiveItem(selectedTabKey); onChange(selectedTabKey);
      47            7 :              }}>
      48           27 :             <NavList>
      49           27 :                 {service_tabs_keys.map(key => {
      50           27 :                     return (
      51           27 :                         <NavItem itemId={key}
      52           27 :                                  key={key}
      53           27 :                                  preventDefault
      54           27 :                                  isActive={activeItem == key}>
      55           27 :                             <Button variant="link" component="a">
      56           27 :                                 {service_tabs.get(key)}
      57            8 :                                 {tabErrors[key] ? <Icon status="danger"><ExclamationCircleIcon className="ct-exclamation-circle" /></Icon> : null}
      58           27 :                             </Button>
      59           27 :                         </NavItem>
      60              :                     );
      61           27 :                 })}
      62           27 :             </NavList>
      63           27 :         </Nav>
      64              :     );
      65           27 : }
        

Generated by: LCOV version 2.0-1