All files / publisher-admin/pages/Releases TrackDropdown.tsx

13.33% Statements 2/15
5.55% Branches 1/18
14.28% Functions 1/7
13.33% Lines 2/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102                                            6x 6x                                                                                                                                                            
import { Button } from "@canonical/react-components";
import { Dispatch, useState } from "react";
 
type TrackDropdownProps = {
  defaultTrack?: string;
  tracks: string[];
  selectedTrack: string;
  setSelectedTrack: Dispatch<React.SetStateAction<string>>;
  hasGuardrails?: boolean;
  onAddTrack?: () => void;
  onRequestTrack?: () => void;
};
 
export function TrackDropdown({
  defaultTrack,
  tracks,
  selectedTrack,
  setSelectedTrack,
  hasGuardrails,
  onAddTrack,
  onRequestTrack,
}: TrackDropdownProps) {
  const [isOpen, setIsOpen] = useState(false);
  return (
    <>
      <label htmlFor="track-dropdown">Track: </label>
 
      <div className="track-dropdown" role="listbox">
        <div
          className="dropdown-toggle"
          onClick={() => setIsOpen(!isOpen)}
          role="button"
          aria-haspopup="true"
          id="track-dropdown"
          tabIndex={0}
          aria-expanded={isOpen}
          onKeyDown={(e) => {
            if (e.key === "Enter" || e.key === " ") {
              setIsOpen(!isOpen);
            }
          }}
        >
          {selectedTrack}
          <i className="p-icon--chevron-down u-float-right"></i>
        </div>
        {isOpen && (
          <div className="dropdown-menu">
            <div className="options-container">
              {tracks.map((option, index) => (
                <div
                  key={index}
                  role="option"
                  className="dropdown-item"
                  tabIndex={0}
                  aria-selected={option === selectedTrack}
                  onClick={() => {
                    setSelectedTrack(option);
                    setIsOpen(false);
                  }}
                  onKeyDown={(e) => {
                    if (e.key === "Enter" || e.key === " ") {
                      setSelectedTrack(option);
                      setIsOpen(false);
                    }
                  }}
                >
                  <div>
                    {option}
                    {option === defaultTrack && (
                      <div className="p-status-label">Default</div>
                    )}
                  </div>
                  {option === selectedTrack && (
                    <i className="p-icon--task-outstanding u-float-right"></i>
                  )}
                </div>
              ))}
            </div>
            <div className="track-button">
              <Button
                className="p-button has-icon new-track-button"
                type="button"
                onClick={() => {
                  if (hasGuardrails) {
                    onAddTrack?.();
                  } else {
                    onRequestTrack?.();
                  }
                  setIsOpen(false);
                }}
              >
                <i className="p-icon--plus"></i>
                <span>{hasGuardrails ? "Add" : "Request"} track</span>
              </Button>
            </div>
          </div>
        )}
      </div>
    </>
  );
}