diff --git a/api-editor/gui/src/common/MenuBar.tsx b/api-editor/gui/src/common/MenuBar.tsx index 43cfe43a0..8d4fd4945 100644 --- a/api-editor/gui/src/common/MenuBar.tsx +++ b/api-editor/gui/src/common/MenuBar.tsx @@ -38,6 +38,7 @@ import { DeleteAllAnnotations } from './DeleteAllAnnotations'; import { GenerateAdapters } from './GenerateAdapters'; import { FilterInput } from './FilterInput'; import { selectNumberOfMatchedNodes } from '../features/packageData/apiSlice'; +import { useNavigate } from 'react-router-dom'; interface MenuBarProps { displayInferErrors: (errors: string[]) => void; @@ -46,6 +47,7 @@ interface MenuBarProps { export const MenuBar: React.FC = function ({ displayInferErrors }) { const { colorMode, toggleColorMode } = useColorMode(); const dispatch = useAppDispatch(); + const navigate = useNavigate(); const annotationStore = useAppSelector(selectAnnotations); const sortingMode = useAppSelector(selectSortingMode); @@ -61,6 +63,10 @@ export const MenuBar: React.FC = function ({ displayInferErrors }) a.click(); }; + const setStatisticsViewPath = () => { + navigate(`/statisticsView`); + }; + const colorModeArray: string[] = []; if (colorMode === 'dark') { colorModeArray.push('darkMode'); @@ -142,6 +148,10 @@ export const MenuBar: React.FC = function ({ displayInferErrors }) + + Statistics + + + + + + + + + ); + } if (!declaration) { return null; diff --git a/api-editor/gui/src/features/packageData/selectionView/StatisticsView.tsx b/api-editor/gui/src/features/packageData/selectionView/StatisticsView.tsx new file mode 100644 index 000000000..7d9137122 --- /dev/null +++ b/api-editor/gui/src/features/packageData/selectionView/StatisticsView.tsx @@ -0,0 +1,111 @@ +import { Button, Heading, VStack, Wrap, WrapItem } from '@chakra-ui/react'; +import React from 'react'; +import { selectAnnotations } from '../../annotations/annotationSlice'; +import { useAppDispatch, useAppSelector } from '../../../app/hooks'; +import { selectFilterString, setFilterString } from '../../ui/uiSlice'; + +export const StatisticsView: React.FC = function () { + const annotations = useAppSelector(selectAnnotations); + const filterString = useAppSelector(selectFilterString); + const dispatch = useAppDispatch(); + + const boundariesSize = Object.keys(annotations.boundaries).length; + const constantsSize = Object.keys(annotations.constants).length; + const descriptionSize = Object.keys(annotations.descriptions).length; + const enumsSize = Object.keys(annotations.enums).length; + const optionalsSize = Object.keys(annotations.optionals).length; + const movesSize = Object.keys(annotations.moves).length; + const groupsSize = Object.keys(annotations.groups).length; + const calledAftersSize = Object.keys(annotations.calledAfters).length; + const attributesSize = Object.keys(annotations.attributes).length; + const puresSize = Object.keys(annotations.pures).length; + const renamingsSize = Object.keys(annotations.renamings).length; + const requiredsSize = Object.keys(annotations.requireds).length; + const removesSize = Object.keys(annotations.removes).length; + const todoSize = Object.keys(annotations.todos).length; + + const filterAction = (annotation: string) => { + const annotationFilterPrefix = 'annotation:@'; + const annotationFilterString = annotationFilterPrefix + annotation; + + //Remove existing annotation filter + const filterList = filterString.split(' '); + let newFilter = ''; + for (const element of filterList) { + if (!element.startsWith(annotationFilterPrefix)) { + newFilter += element; + newFilter += ' '; + } + } + + newFilter += annotationFilterString; + dispatch(setFilterString(newFilter)); + }; + + return ( + + + Statistics + + + Annotations + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {' '} + + + + + + ); +};