diff --git a/website/src/metadata_parser.js b/website/src/metadata_parser.js
index fab943d66..f0a70babb 100644
--- a/website/src/metadata_parser.js
+++ b/website/src/metadata_parser.js
@@ -1,4 +1,4 @@
-const ALLOW_MANY = ['by', 'url', 'genre', 'license'];
+const ALLOW_MANY = ['by', 'url', 'genre', 'license', 'tag'];
export function getMetadata(raw_code) {
if (raw_code == null) {
diff --git a/website/src/repl/components/panel/PatternsTab.jsx b/website/src/repl/components/panel/PatternsTab.jsx
index 5e0d50e72..588f8f39e 100644
--- a/website/src/repl/components/panel/PatternsTab.jsx
+++ b/website/src/repl/components/panel/PatternsTab.jsx
@@ -18,6 +18,7 @@ import { Pagination } from '../pagination/Pagination.jsx';
import { useState } from 'react';
import { useDebounce } from '../usedebounce.jsx';
import cx from '@src/cx.mjs';
+import { Textbox } from '../textbox/Textbox.jsx';
export function PatternLabel({ pattern } /* : { pattern: Tables<'code'> } */) {
const meta = useMemo(() => getMetadata(pattern.code), [pattern]);
@@ -33,7 +34,7 @@ export function PatternLabel({ pattern } /* : { pattern: Tables<'code'> } */) {
}
const author = Array.isArray(meta.by) ? meta.by.join(',') : 'Anonymous';
- return <>{`${pattern.id}: ${title} by ${author.slice(0, 100)}`.slice(0, 60)}>;
+ return <>{`${title} by ${author.slice(0, 100)}`.slice(0, 60)}>;
}
function PatternButton({ showOutline, onClick, pattern, showHiglight }) {
@@ -79,73 +80,117 @@ const updateCodeWindow = (context, patternData, reset = false) => {
context.handleUpdate(patternData, reset);
};
-function UserPatterns({ context }) {
+export function PatternsTab({ context }) {
+ const [search, setSearch] = useState('');
const activePattern = useActivePattern();
const viewingPatternStore = useViewingPatternData();
const viewingPatternData = parseJSON(viewingPatternStore);
- const { userPatterns, patternFilter, patternAutoStart } = useSettings();
+ const { userPatterns, patternAutoStart } = useSettings();
const viewingPatternID = viewingPatternData?.id;
- return (
-
-
+ const visiblePatterns = useMemo(() => {
+ return Object.fromEntries(
+ Object.entries(userPatterns).filter(([_key, pattern]) => {
+ if (!search) {
+ return true;
+ }
-
- {/* {patternFilter === patternFilterName.user && ( */}
-
{
- updateCodeWindow(context, { ...userPatterns[id], collection: userPattern.collection }, patternAutoStart);
+ const meta = getMetadata(pattern.code);
- if (context.started && activePattern === id) {
- context.handleEvaluate();
+ // Search for specific meta keys
+ const searchTrimmed = search.trim();
+ if (searchTrimmed.includes(':')) {
+ const [metaKey, metaSearch] = searchTrimmed.split(':');
+ if (metaKey !== undefined && metaSearch !== undefined && metaKey in meta) {
+ const metaValues = meta[metaKey];
+ if (Array.isArray(metaValues)) {
+ return metaValues.some((metaValue) => metaValue.toLowerCase().includes(metaSearch.trim().toLowerCase()));
+ } else if (typeof metaValues === 'string') {
+ return metaValues.toLowerCase().includes(metaSearch.trim().toLowerCase());
+ } else {
+ return false;
}
- }}
- patterns={userPatterns}
- started={context.started}
- activePattern={activePattern}
- viewingPatternID={viewingPatternID}
- />
- {/* )} */}
+ }
+ }
+ const title = meta.title ? meta.title : 'unnamed';
+ const authors = meta.by ? meta.by : ['anonymous'];
+ const tags = meta.tag ? meta.tag : [];
+ const lowerCaseSearch = search.toLowerCase();
+ return (
+ title.toLowerCase().includes(lowerCaseSearch) ||
+ authors.some((author) => author.toLowerCase().includes(lowerCaseSearch)) ||
+ tags.some((tag) => tag.toLowerCase().includes(lowerCaseSearch))
+ );
+ }),
+ );
+ }, [search, viewingPatternStore]);
+
+ return (
+
+
+
+
+
+
+
+
+ {/* {patternFilter === patternFilterName.user && ( */}
+
{
+ updateCodeWindow(context, { ...userPatterns[id], collection: userPattern.collection }, patternAutoStart);
+
+ if (context.started && activePattern === id) {
+ context.handleEvaluate();
+ }
+ }}
+ patterns={visiblePatterns}
+ started={context.started}
+ activePattern={activePattern}
+ viewingPatternID={viewingPatternID}
+ />
+ {/* )} */}
+
);
@@ -232,28 +277,3 @@ function PublicPatterns({ context }) {
}
return ;
}
-
-export function PatternsTab({ context }) {
- const { patternFilter } = useSettings();
-
- return (
-
-
-
- );
- /* return (
-
-
settingsMap.setKey('patternFilter', value)}
- items={patternFilterName}
- >
-
- {patternFilter === patternFilterName.user ? (
-
- ) : (
-
- )}
-
- ); */
-}