/* * Copyright 2020 EPAM Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import React, { useCallback, useEffect, useMemo, useState, } from "react"; import { Button, HeadlessSelect, Icons, OptionType, sendAlertEvent, } from "@drill4j/ui-kit"; import { Link } from "react-router-dom"; import { motion, AnimatePresence } from "framer-motion"; import tw, { styled } from "twin.macro"; import { BUILD_STATUS } from "common/constants"; import { useActiveBuild, useAgentRouteParams, useFilteredData, useNavigation, usePreviousBuildCoverage, useTestToCodeData, useTestToCodeRouteParams, } from "hooks"; import { ParentBuild } from "types/parent-build"; import { Metrics } from "types/metrics"; import { Filter, Risk, TestTypeSummary } from "types"; import { PageHeader } from "components"; import { useFilterState, useSetFilterDispatch } from "common"; import { applyFilter } from "pages/agent/api"; import { useResultFilterState } from "common/contexts"; import { ActionSection } from "./action-section"; import { QualityGate } from "./quality-gate"; import { ConfigureFilter } from "./global-filter"; import { ConfigureFilterSate, FILTER_STATE } from "./types"; export const CoveragePluginHeader = () => { const [configureFilterState, setConfigureFilter] = useState(null); const { agentId = "" } = useAgentRouteParams(); const { buildVersion } = useTestToCodeRouteParams(); const { getPagePath } = useNavigation(); const { buildVersion: activeBuildVersion = "", buildStatus } = useActiveBuild(agentId) || {}; const { risks: risksCount = 0, tests: testToRunCount = 0 } = useFilteredData("/data/stats") || {}; const initialRisks = useFilteredData("/build/risks") || []; const { version: previousBuildVersion = "" } = useTestToCodeData("/data/parent") || {}; const { byTestType: previousBuildTests = [] } = usePreviousBuildCoverage(previousBuildVersion) || {}; const filters = useTestToCodeData("/build/filters") || []; const realFiltersData = useTestToCodeData("/build/filters"); const testsByType = useFilteredData("/build/summary/tests/by-type") || []; const closeConfigureFilter = useCallback(() => setConfigureFilter(null), [setConfigureFilter]); const setFilter = useSetFilterDispatch(); const { filterId } = useFilterState(); const { isEmptyFilterResult } = useResultFilterState(); const hasTestsInBuild = Boolean(testsByType.length); const isActiveBuild = buildVersion === activeBuildVersion; useEffect(() => { if (filterId && realFiltersData && !realFiltersData.filter(filter => filter.id === filterId).length) { setFilter(null); setConfigureFilter(null); } }, [filterId, realFiltersData]); useEffect(() => { if (activeBuildVersion && !isActiveBuild) { setFilter(null); setConfigureFilter(null); } }, [isActiveBuild, activeBuildVersion]); return ( <>
Test2Code
{Boolean(filters.length) && isActiveBuild && ( ({ label: name, value: id }))} > {({ options, selectedOption, isOpen, selectValue, setIsOpen, }) => { const unSelectFilter = useCallback((e) => { e.stopPropagation(); selectValue(""); setFilter(null); setConfigureFilter(null); }, []); useEffect(() => { selectValue(filterId || ""); }, [filterId]); const sortOpitons = useCallback((a: OptionType, b: OptionType) => { if (a.value === selectedOption?.value) return -1; if (b.value === selectedOption?.value) return 1; return 0; }, [selectedOption]); const sortedOptions = selectedOption ? options.sort(sortOpitons) : options; return ( <>
{selectedOption ? {selectedOption.label} : Select filter} {selectedOption && ( )}
{isOpen && ( {sortedOptions.map(({ label, value }) => ( { await applyFilter(agentId, { id: value }, { onSuccess: () => { selectValue(value); setFilter(value); setConfigureFilter(FILTER_STATE.EDITING); setIsOpen(false); }, onError: (message) => { sendAlertEvent({ type: "ERROR", title: message }); }, }); }} > {label} ))} )} ); }}
)}
{activeBuildVersion === buildVersion && buildStatus === BUILD_STATUS.ONLINE && } {getRisksSection(isEmptyFilterResult, initialRisks, buildVersion, risksCount, getPagePath)} {getTestsToRunSection(isEmptyFilterResult, previousBuildTests, buildVersion, testToRunCount, getPagePath)} {filterId && ( setConfigureFilter(FILTER_STATE.EDITING)} > Show Criteria )}
{configureFilterState && ( )} ); }; const Header = styled(PageHeader)` ${tw`relative grid grid-rows-2 lg:grid-rows-1 grid-cols-4 gap-2 w-full`} @media screen and (min-width: 1024px) { grid-template-columns: max-content auto max-content max-content max-content !important; } `; const Count = styled(Link)` ${tw`flex items-center w-full text-20 leading-32 cursor-pointer`} ${tw`text-monochrome-black hover:text-blue-medium-tint active:text-blue-shade`} `; const ShowCriteria = styled.button` ${tw`border border-monochrome-medium-tint bg-monochrome-white text-blue-default text-10 leading-14 font-bold`} border-radius: 0px 0px 8px 8px ; `; const getTestsToRunSection = (isEmptyFilterResult: boolean, previousBuildTests: TestTypeSummary[], buildVersion: string, testToRunCount: number, getPagePath: any) => { if (isEmptyFilterResult) { return (
n/a
); } if (!previousBuildTests.length) { return (
–
); } return ( {testToRunCount} ); }; const getRisksSection = (isEmptyFilterResult: boolean, initialRisks: Risk[], buildVersion: string, risksCount: number, getPagePath: any) => { if (isEmptyFilterResult) { return (
n/a
); } if (!initialRisks.length) { return ( – ); } return ( {risksCount} ); };