import * as React from 'react'; import { Checkbox, Input, Modal, Switch } from 'antd'; import { CheckboxChangeEvent } from 'antd/lib/checkbox/Checkbox'; import classNames from 'classnames'; import useApplicationConfigStore from '../../stores/ApplicationConfigStore'; import useQueryStore from '../../stores/QueryStore'; import OspreyButton from '../../uikit/OspreyButton'; import Text, { TextSizes, TextWeights, TextColors } from '../../uikit/Text'; import FilterIcon from '../../uikit/icons/FilterIcon'; import ModalFooter from '../common/ModalFooter'; import CustomFeaturesFilter from './CustomFeaturesFilter'; import styles from './FeatureSelectModal.module.css'; const FeatureSelectModal = () => { const customSummaryFeatures = useQueryStore((state) => state.customSummaryFeatures); const updateCustomSummaryFeatures = useQueryStore((state) => state.updateCustomSummaryFeatures); const knownFeatureCategories = useApplicationConfigStore((state) => state.knownFeatureCategories); const [useCustomFeatures, setUseCustomFeatures] = React.useState(customSummaryFeatures != null); const [selectedFeatures, setSelectedFeatures] = React.useState>( customSummaryFeatures != null ? new Set(customSummaryFeatures) : new Set() ); const [isOpen, setIsOpen] = React.useState(false); const [searchInput, setSearchInput] = React.useState(''); const sortedKnownFeatureCategoryEntries = React.useMemo( () => Object.entries(knownFeatureCategories).sort(), [knownFeatureCategories] ); const handleCancel = () => { setUseCustomFeatures(customSummaryFeatures != null); setSelectedFeatures(customSummaryFeatures != null ? new Set(customSummaryFeatures) : new Set()); setIsOpen(false); }; const handleOpenModal = () => { setIsOpen(true); }; const handleSelectFeature = (e: CheckboxChangeEvent) => { const selectedFeature = e.target.value; const updatedFeatures = new Set([...selectedFeatures]); if (selectedFeatures.has(selectedFeature)) { updatedFeatures.delete(selectedFeature); } else { updatedFeatures.add(selectedFeature); } setSelectedFeatures(updatedFeatures); }; const handleSaveSelectedFeatures = () => { const saveVal = useCustomFeatures ? [...selectedFeatures] : null; updateCustomSummaryFeatures(saveVal); setIsOpen(false); }; const handleToggleSwitch = () => { if (useCustomFeatures) { setSelectedFeatures(new Set()); } setUseCustomFeatures(!useCustomFeatures); }; const handleSearchInputChange = (e: React.ChangeEvent) => { setSearchInput(e.currentTarget.value); }; const getReadableFeatureCategory = (featureCategory: string) => { return featureCategory.substring(0, featureCategory.lastIndexOf('.')).replace(/_|\//g, ' '); }; const isSetSelected = (feature: string) => { if (!useCustomFeatures) return true; return selectedFeatures.has(feature as string); }; const renderModalTitle = () => { return ( <> Set Features Set Custom Features setSelectedFeatures(new Set())} onRemoveSelectedFeature={setSelectedFeatures} /> } /> ); }; const renderFeatureCategory = (category: string, features: string[]) => { const filteredFeatures = features.filter((feature) => feature.toUpperCase().includes(searchInput.toUpperCase())); if (filteredFeatures.length === 0) return null; return (
{getReadableFeatureCategory(category)} {filteredFeatures.sort().map((feature) => { return ( {feature} ); })}
); }; return ( <> Select Summary Features } >
{sortedKnownFeatureCategoryEntries.map(([category, features]) => { return renderFeatureCategory(category, features); })}
); }; export default FeatureSelectModal;