diff --git a/packages/editor/src/components/ComponentsList/ComponentFilter.tsx b/packages/editor/src/components/ComponentsList/ComponentFilter.tsx new file mode 100644 index 00000000..c8785bc0 --- /dev/null +++ b/packages/editor/src/components/ComponentsList/ComponentFilter.tsx @@ -0,0 +1,120 @@ +import { + Button, + Popover, + Checkbox, + PopoverContent, + chakra, + PopoverTrigger, + createIcon, +} from '@chakra-ui/react'; +import React from 'react'; + +const FilterIcon = createIcon({ + displayName: 'FilterIcon', + viewBox: '0 0 24 24', + path: [ + , + , + , + , + ], +}); + +type FilterProps = { + versions: string[]; + checkedVersions: string[]; + setCheckedVersions: React.Dispatch>; +}; + +export const ComponentFilter: React.FC = ({ + versions, + checkedVersions, + setCheckedVersions, +}) => { + const handleChange = (e: React.ChangeEvent) => { + const checked = e.target.checked; + const value = e.target.value; + const newCheckedVersions = [...checkedVersions]; + if (checked) { + newCheckedVersions.push(value); + } else { + const idx = newCheckedVersions.findIndex(c => c === value); + newCheckedVersions.splice(idx, 1); + } + setCheckedVersions(newCheckedVersions); + }; + + return ( + + + + + + + {versions.map(version => { + return ( + + {version} + + ); + })} + + + + ); +}; diff --git a/packages/editor/src/components/ComponentsList/ComponentList.tsx b/packages/editor/src/components/ComponentsList/ComponentList.tsx index d7593d71..7f515e1a 100644 --- a/packages/editor/src/components/ComponentsList/ComponentList.tsx +++ b/packages/editor/src/components/ComponentsList/ComponentList.tsx @@ -8,15 +8,22 @@ import { AccordionButton, AccordionIcon, Input, + InputGroup, + InputRightElement, Tag, } from '@chakra-ui/react'; import { DROP_EXAMPLE_SIZE_PREFIX } from '@sunmao-ui/runtime'; -import { encodeDragDataTransfer, CoreComponentName, CORE_VERSION } from '@sunmao-ui/shared'; +import { + encodeDragDataTransfer, + CoreComponentName, + CORE_VERSION, +} from '@sunmao-ui/shared'; import { groupBy, sortBy } from 'lodash-es'; import { EditorServices } from '../../types'; import { ExplorerMenuTabs } from '../../constants/enum'; import { RuntimeComponent } from '@sunmao-ui/core'; import { css } from '@emotion/css'; +import { ComponentFilter } from './ComponentFilter'; type Props = { services: EditorServices; @@ -56,15 +63,31 @@ const tagStyle = css` white-space: nowrap; `; -const IGNORE_COMPONENTS: string[] = [CoreComponentName.Dummy]; +const IGNORE_COMPONENTS: string[] = [ + CoreComponentName.Dummy, + CoreComponentName.GridLayout, +]; export const ComponentList: React.FC = ({ services }) => { const { registry, editorStore } = services; const [filterText, setFilterText] = useState(''); + const [checkedVersions, setCheckedVersions] = useState([]); + + const versions = useMemo(() => { + const versions: Record = {}; + registry.getAllComponents().forEach(c => { + versions[c.version] = ''; + }); + return Object.keys(versions); + }, [registry]); + const categories = useMemo(() => { const grouped = groupBy( registry.getAllComponents().filter(c => { - if (IGNORE_COMPONENTS.includes(c.metadata.name)) { + if ( + IGNORE_COMPONENTS.includes(c.metadata.name) || + (checkedVersions.length && !checkedVersions.includes(c.version)) + ) { return false; } else if (!filterText) { return true; @@ -80,15 +103,24 @@ export const ComponentList: React.FC = ({ services }) => { })), c => -getCategoryOrder(c.name) ); - }, [filterText, registry]); + }, [filterText, registry, checkedVersions]); return ( <> - setFilterText(evt.currentTarget.value)} - /> + + setFilterText(evt.currentTarget.value)} + /> + + + + idx)}> {categories.map(category => { return (