/* * SonarQube * Copyright (C) 2009-2023 SonarSource SA * mailto:info AT sonarsource DOT com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import { RadioButton } from 'design-system/lib'; import { noop } from 'lodash'; import * as React from 'react'; import { useEffect } from 'react'; import { getNewCodePeriod } from '../../api/newCodePeriod'; import { translate } from '../../helpers/l10n'; import { isNewCodeDefinitionCompliant } from '../../helpers/periods'; import { NewCodePeriod, NewCodePeriodSettingType, NewCodePeriodWithCompliance, } from '../../types/types'; import RadioCard from '../controls/RadioCard'; import Tooltip from '../controls/Tooltip'; import { Alert } from '../ui/Alert'; import GlobalNewCodeDefinitionDescription from './GlobalNewCodeDefinitionDescription'; import NewCodeDefinitionDaysOption from './NewCodeDefinitionDaysOption'; import NewCodeDefinitionPreviousVersionOption from './NewCodeDefinitionPreviousVersionOption'; interface Props { canAdmin: boolean | undefined; onNcdChanged: (ncd: NewCodePeriodWithCompliance) => void; } const INITIAL_DAYS = '30'; export default function NewCodeDefinitionSelector(props: Props) { const { canAdmin, onNcdChanged } = props; const [globalNcd, setGlobalNcd] = React.useState(null); const [selectedNcdType, setSelectedNcdType] = React.useState( null ); const [days, setDays] = React.useState(INITIAL_DAYS); const iGlobalNcdCompliant = React.useMemo( () => Boolean(globalNcd && isNewCodeDefinitionCompliant(globalNcd)), [globalNcd] ); const isChanged = React.useMemo( () => selectedNcdType === NewCodePeriodSettingType.NUMBER_OF_DAYS && days !== INITIAL_DAYS, [selectedNcdType, days] ); const isCompliant = React.useMemo( () => !!selectedNcdType && isNewCodeDefinitionCompliant({ type: selectedNcdType, value: days, }), [selectedNcdType, days] ); useEffect(() => { function fetchGlobalNcd() { getNewCodePeriod().then(setGlobalNcd, noop); } fetchGlobalNcd(); }, []); useEffect(() => { if (selectedNcdType) { const type = selectedNcdType === NewCodePeriodSettingType.INHERITED ? undefined : selectedNcdType; const value = selectedNcdType === NewCodePeriodSettingType.NUMBER_OF_DAYS ? days : undefined; onNcdChanged({ isCompliant, type, value }); } }, [selectedNcdType, days, isCompliant, onNcdChanged]); return ( <>

{translate('new_code_definition.question')}

setSelectedNcdType(NewCodePeriodSettingType.INHERITED)} value="general" > {translate('new_code_definition.global_setting')}
{globalNcd && ( )}
setSelectedNcdType(NewCodePeriodSettingType.PREVIOUS_VERSION)} value="specific" > {translate('new_code_definition.specific_setting')}
setSelectedNcdType(NewCodePeriodSettingType.REFERENCE_BRANCH)} selected={selectedNcdType === NewCodePeriodSettingType.REFERENCE_BRANCH} title={translate('new_code_definition.reference_branch')} >

{translate('new_code_definition.reference_branch.description')}

{translate('new_code_definition.reference_branch.usecase')}

{selectedNcdType === NewCodePeriodSettingType.REFERENCE_BRANCH && ( {translate('new_code_definition.reference_branch.notice')} )}
); }