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 (