diff --git a/src/webview/view/components/gallery/GalleryView.tsx b/src/webview/view/components/gallery/GalleryView.tsx index f7b6f84..a612e26 100644 --- a/src/webview/view/components/gallery/GalleryView.tsx +++ b/src/webview/view/components/gallery/GalleryView.tsx @@ -15,12 +15,18 @@ export const GalleryView: React.FunctionComponent = ({ }: Rea const [samples, versions, search] = useSamples(); const [query, setQuery] = useState(''); const [spfxVersions, setSPFxVersions] = useState(); + const [showOnlyScenarios, setShowOnlyScenarios] = useState(false); const [componentTypes, setComponentTypes] = useState(); const onSearchTextboxChange = (event: any) => { const input: string = event.target.value; setQuery(input); - search(input, componentTypes ?? [], spfxVersions ?? []); + search(input, componentTypes ?? [], spfxVersions ?? [], showOnlyScenarios); + }; + + const onFilterOnlyScenariosChange = () => { + setShowOnlyScenarios(!showOnlyScenarios); + search(query, componentTypes ?? [], spfxVersions ?? [], !showOnlyScenarios); }; const onFilterBySPFxVersionChange = (event: any, option?: IDropdownOption) => { @@ -32,7 +38,7 @@ export const GalleryView: React.FunctionComponent = ({ }: Rea } setSPFxVersions(spfxVersionsInput); - search(query, componentTypes ?? [], spfxVersionsInput); + search(query, componentTypes ?? [], spfxVersionsInput, showOnlyScenarios); }; const onFilterByComponentTypeChange = (event: any, option?: IDropdownOption) => { @@ -44,7 +50,7 @@ export const GalleryView: React.FunctionComponent = ({ }: Rea } setComponentTypes(componentTypesInput); - search(query, componentTypesInput, spfxVersions ?? []); + search(query, componentTypesInput, spfxVersions ?? [], showOnlyScenarios); }; const getSPFxVersions = (): IDropdownOption[] => { @@ -74,6 +80,7 @@ export const GalleryView: React.FunctionComponent = ({ }: Rea onSearchTextboxChange={(event) => onSearchTextboxChange(event)} onFilterBySPFxVersionChange={(event, option) => onFilterBySPFxVersionChange(event, option)} onFilterByComponentTypeChange={(event, option) => onFilterByComponentTypeChange(event, option)} + onFilterOnlyScenariosChange={() => onFilterOnlyScenariosChange()} initialQuery={query} spfxVersions={getSPFxVersions()} /> diff --git a/src/webview/view/components/gallery/SearchBar.tsx b/src/webview/view/components/gallery/SearchBar.tsx index d938ebf..7bde3af 100644 --- a/src/webview/view/components/gallery/SearchBar.tsx +++ b/src/webview/view/components/gallery/SearchBar.tsx @@ -1,4 +1,4 @@ -import { VSCodeTextField } from '@vscode/webview-ui-toolkit/react'; +import { VSCodeCheckbox, VSCodeTextField } from '@vscode/webview-ui-toolkit/react'; import * as React from 'react'; import { useEffect, useState } from 'react'; import { SearchIcon } from '../icons'; @@ -13,11 +13,13 @@ export interface ISearchBarProps { onFilterBySPFxVersionChange: (event: any, option?: IDropdownOption) => void; // eslint-disable-next-line no-unused-vars onFilterByComponentTypeChange: (event: any, option?: IDropdownOption) => void; + // eslint-disable-next-line no-unused-vars + onFilterOnlyScenariosChange: (event: any) => void; initialQuery?: string; spfxVersions: IDropdownOption[]; } -export const SearchBar: React.FunctionComponent = ({ onSearchTextboxChange, onFilterBySPFxVersionChange, onFilterByComponentTypeChange, initialQuery, spfxVersions }: React.PropsWithChildren) => { +export const SearchBar: React.FunctionComponent = ({ onSearchTextboxChange, onFilterBySPFxVersionChange, onFilterByComponentTypeChange, onFilterOnlyScenariosChange, initialQuery, spfxVersions }: React.PropsWithChildren) => { const [query, setQuery] = useState(''); useEffect(() => { @@ -52,6 +54,9 @@ export const SearchBar: React.FunctionComponent = ({ onSearchTe
+
+ show only scenarios +
); diff --git a/src/webview/view/hooks/useSamples.tsx b/src/webview/view/hooks/useSamples.tsx index d99ac50..1d0a7ea 100644 --- a/src/webview/view/hooks/useSamples.tsx +++ b/src/webview/view/hooks/useSamples.tsx @@ -7,7 +7,7 @@ import { Sample } from '../../../models'; const SAMPLES_URL = 'https://raw.githubusercontent.com/pnp/vscode-viva/dev/data/sp-dev-fx-samples.json'; // eslint-disable-next-line no-unused-vars -export default function useSamples(): [Sample[], string[], ((query: string, componentTypes: string[], spfxVersions: string[]) => void)] { +export default function useSamples(): [Sample[], string[], ((query: string, componentTypes: string[], spfxVersions: string[], showOnlyScenarios: boolean) => void)] { const [allSamples, setAllSamples] = useState(undefined); const [samples, setSamples] = useState(undefined); const state = Messenger.getState() as any || {}; @@ -68,12 +68,15 @@ export default function useSamples(): [Sample[], string[], ((query: string, comp }); }, [allSamples]); - const search = (query: string, componentTypes: string[], spfxVersions: string[]) => { + const search = (query: string, componentTypes: string[], spfxVersions: string[], showOnlyScenarios: boolean) => { const currentSamples: Sample[] = state['samples']; const samplesByTitle: Sample[] = currentSamples!.filter((sample: Sample) => sample.title.toString().toLowerCase().includes(query.toLowerCase())); const samplesByTag: Sample[] = currentSamples!.filter((sample: Sample) => sample.tags.some(tag => tag.toString().toLowerCase().includes(query.toLowerCase()))); const samplesByAuthor: Sample[] = currentSamples!.filter((sample: Sample) => sample.authors.some(author => author.name.toString().toLowerCase().includes(query.toLowerCase()))); - const newSamples: Sample[] = samplesByTitle.concat(samplesByTag).concat(samplesByAuthor); + let newSamples: Sample[] = samplesByTitle.concat(samplesByTag).concat(samplesByAuthor); + if (showOnlyScenarios){ + newSamples = newSamples.filter((sample: Sample) => sample.sampleType === 'scenarios'); + } const distinctSamples = newSamples.filter((value, index, self) => index === self.findIndex((v) => v.name === value.name) );