diff --git a/app/client/src/pages/Editor/WidgetSidebar.tsx b/app/client/src/pages/Editor/WidgetSidebar.tsx index c7b9ea4ef5..5105215d60 100644 --- a/app/client/src/pages/Editor/WidgetSidebar.tsx +++ b/app/client/src/pages/Editor/WidgetSidebar.tsx @@ -4,28 +4,35 @@ import WidgetCard from "./WidgetCard"; import { getWidgetCards } from "selectors/editorSelectors"; import ExplorerSearch from "./Explorer/ExplorerSearch"; import { debounce } from "lodash"; -import produce from "immer"; import { createMessage, WIDGET_SIDEBAR_CAPTION, } from "@appsmith/constants/messages"; +import Fuse from "fuse.js"; +import { WidgetCardProps } from "widgets/BaseWidget"; function WidgetSidebar({ isActive }: { isActive: boolean }) { const cards = useSelector(getWidgetCards); const [filteredCards, setFilteredCards] = useState(cards); const searchInputRef = useRef(null); + + let fuse: Fuse>; + + useEffect(() => { + fuse = new Fuse(cards, { + keys: ["displayName", "searchTags"], + threshold: 0.5, + distance: 20, + }); + }, [cards]); + const filterCards = (keyword: string) => { - let filteredCards = cards; if (keyword.trim().length > 0) { - filteredCards = produce(cards, (draft) => { - cards.forEach((card, index) => { - if (card.displayName.toLowerCase().indexOf(keyword) === -1) { - delete draft[index]; - } - }); - }); + const searchResult = fuse.search(keyword); + setFilteredCards(searchResult as WidgetCardProps[]); + } else { + setFilteredCards(cards); } - setFilteredCards(filteredCards); }; useEffect(() => { diff --git a/app/client/src/selectors/editorSelectors.tsx b/app/client/src/selectors/editorSelectors.tsx index fc434306e3..f246b308de 100644 --- a/app/client/src/selectors/editorSelectors.tsx +++ b/app/client/src/selectors/editorSelectors.tsx @@ -2,7 +2,7 @@ import { createSelector } from "reselect"; import { AppState } from "reducers"; import { WidgetConfigReducerState } from "reducers/entityReducers/widgetConfigReducer"; -import { WidgetProps } from "widgets/BaseWidget"; +import { WidgetCardProps, WidgetProps } from "widgets/BaseWidget"; import { CanvasWidgetsReduxState, FlattenedWidgetProps, @@ -206,7 +206,7 @@ export const getWidgetCards = createSelector( (config) => !config.hideCard, ); - const _cards = cards.map((config) => { + const _cards: WidgetCardProps[] = cards.map((config) => { const { columns, detachFromLayout = false, @@ -214,6 +214,7 @@ export const getWidgetCards = createSelector( iconSVG, key, rows, + searchTags, type, } = config; return { @@ -224,6 +225,7 @@ export const getWidgetCards = createSelector( detachFromLayout, displayName, icon: iconSVG, + searchTags, }; }); const sortedCards = sortBy(_cards, ["displayName"]); diff --git a/app/client/src/utils/WidgetRegisterHelpers.tsx b/app/client/src/utils/WidgetRegisterHelpers.tsx index 1ca1a8efd1..75a759c929 100644 --- a/app/client/src/utils/WidgetRegisterHelpers.tsx +++ b/app/client/src/utils/WidgetRegisterHelpers.tsx @@ -52,6 +52,7 @@ export const configureWidget = (config: WidgetConfiguration) => { const _config = { ...features, ...config.defaults, + searchTags: config.searchTags, type: config.type, hideCard: !!config.hideCard || !config.iconSVG, isDeprecated: !!config.isDeprecated, diff --git a/app/client/src/widgets/AudioRecorderWidget/index.ts b/app/client/src/widgets/AudioRecorderWidget/index.ts index d4d32166fe..fd362b35f1 100644 --- a/app/client/src/widgets/AudioRecorderWidget/index.ts +++ b/app/client/src/widgets/AudioRecorderWidget/index.ts @@ -6,6 +6,7 @@ export const CONFIG = { name: "Audio Recorder", iconSVG: IconSVG, needsMeta: true, + searchTags: ["sound recorder", "voice recorder"], defaults: { iconColor: "white", isDisabled: false, diff --git a/app/client/src/widgets/AudioWidget/index.tsx b/app/client/src/widgets/AudioWidget/index.tsx index 547c8f854f..b2c592e7c8 100644 --- a/app/client/src/widgets/AudioWidget/index.tsx +++ b/app/client/src/widgets/AudioWidget/index.tsx @@ -6,6 +6,7 @@ export const CONFIG = { name: "Audio", iconSVG: IconSVG, needsMeta: true, + searchTags: ["mp3", "sound", "wave", "player"], defaults: { rows: 4, columns: 28, diff --git a/app/client/src/widgets/ButtonGroupWidget/index.ts b/app/client/src/widgets/ButtonGroupWidget/index.ts index d63a69e632..d7e52e9673 100644 --- a/app/client/src/widgets/ButtonGroupWidget/index.ts +++ b/app/client/src/widgets/ButtonGroupWidget/index.ts @@ -12,6 +12,7 @@ export const CONFIG = { iconSVG: IconSVG, needsMeta: false, // Defines if this widget adds any meta properties isCanvas: false, // Defines if this widget has a canvas within in which we can drop other widgets + searchTags: ["click", "submit"], defaults: { rows: 4, columns: 24, diff --git a/app/client/src/widgets/ButtonWidget/index.ts b/app/client/src/widgets/ButtonWidget/index.ts index 01e032dd4a..59aed7fc31 100644 --- a/app/client/src/widgets/ButtonWidget/index.ts +++ b/app/client/src/widgets/ButtonWidget/index.ts @@ -11,6 +11,7 @@ export const CONFIG = { name: "Button", iconSVG: IconSVG, needsMeta: true, + searchTags: ["click", "submit"], defaults: { animateLoading: true, text: "Submit", diff --git a/app/client/src/widgets/CameraWidget/index.ts b/app/client/src/widgets/CameraWidget/index.ts index 1db67bd358..ed20b6f4b6 100644 --- a/app/client/src/widgets/CameraWidget/index.ts +++ b/app/client/src/widgets/CameraWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { iconSVG: IconSVG, needsMeta: true, // Defines if this widget adds any meta properties isCanvas: false, // Defines if this widget has a canvas within in which we can drop other widgets + searchTags: ["photo", "video recorder"], defaults: { widgetName: "Camera", rows: 33, diff --git a/app/client/src/widgets/ChartWidget/index.ts b/app/client/src/widgets/ChartWidget/index.ts index 7b23bbfa23..0969bad061 100644 --- a/app/client/src/widgets/ChartWidget/index.ts +++ b/app/client/src/widgets/ChartWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Chart", iconSVG: IconSVG, needsMeta: true, + searchTags: ["graph", "visuals", "visualisations"], defaults: { rows: 32, columns: 24, diff --git a/app/client/src/widgets/CheckboxWidget/index.ts b/app/client/src/widgets/CheckboxWidget/index.ts index ff3dd1531b..f1468597aa 100644 --- a/app/client/src/widgets/CheckboxWidget/index.ts +++ b/app/client/src/widgets/CheckboxWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Checkbox", iconSVG: IconSVG, needsMeta: true, + searchTags: ["boolean"], defaults: { rows: 4, columns: 7, diff --git a/app/client/src/widgets/ContainerWidget/index.ts b/app/client/src/widgets/ContainerWidget/index.ts index 03fbb3a9d3..cb924867ef 100644 --- a/app/client/src/widgets/ContainerWidget/index.ts +++ b/app/client/src/widgets/ContainerWidget/index.ts @@ -7,6 +7,7 @@ export const CONFIG = { name: "Container", iconSVG: IconSVG, isCanvas: true, + searchTags: ["div", "parent", "group"], defaults: { backgroundColor: "#FFFFFF", rows: 40, diff --git a/app/client/src/widgets/CurrencyInputWidget/index.ts b/app/client/src/widgets/CurrencyInputWidget/index.ts index 0a6100301e..c8154fef82 100644 --- a/app/client/src/widgets/CurrencyInputWidget/index.ts +++ b/app/client/src/widgets/CurrencyInputWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Currency Input", iconSVG: IconSVG, needsMeta: true, + searchTags: ["amount", "total"], defaults: { ...BaseConfig.defaults, widgetName: "CurrencyInput", diff --git a/app/client/src/widgets/DatePickerWidget2/index.ts b/app/client/src/widgets/DatePickerWidget2/index.ts index 106c9b2929..ad961402f4 100644 --- a/app/client/src/widgets/DatePickerWidget2/index.ts +++ b/app/client/src/widgets/DatePickerWidget2/index.ts @@ -10,6 +10,7 @@ export const CONFIG = { name: "DatePicker", iconSVG: IconSVG, needsMeta: true, + searchTags: ["calendar"], defaults: { isDisabled: false, datePickerType: "DATE_PICKER", diff --git a/app/client/src/widgets/DividerWidget/index.ts b/app/client/src/widgets/DividerWidget/index.ts index fe058115a2..520f013fa5 100644 --- a/app/client/src/widgets/DividerWidget/index.ts +++ b/app/client/src/widgets/DividerWidget/index.ts @@ -6,6 +6,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Divider", iconSVG: IconSVG, + searchTags: ["line"], defaults: { rows: 4, columns: 20, diff --git a/app/client/src/widgets/DocumentViewerWidget/index.ts b/app/client/src/widgets/DocumentViewerWidget/index.ts index ab9e2eb211..337f96bd31 100644 --- a/app/client/src/widgets/DocumentViewerWidget/index.ts +++ b/app/client/src/widgets/DocumentViewerWidget/index.ts @@ -7,6 +7,7 @@ export const CONFIG = { iconSVG: IconSVG, needsMeta: false, // Defines if this widget adds any meta properties isCanvas: false, // Defines if this widget has a canvas within in which we can drop other widgets + searchTags: ["pdf"], defaults: { widgetName: "DocumentViewer", docUrl: diff --git a/app/client/src/widgets/FilePickerWidgetV2/index.ts b/app/client/src/widgets/FilePickerWidgetV2/index.ts index 843212db07..5cf23797e8 100644 --- a/app/client/src/widgets/FilePickerWidgetV2/index.ts +++ b/app/client/src/widgets/FilePickerWidgetV2/index.ts @@ -7,6 +7,7 @@ export const CONFIG = { name: "FilePicker", iconSVG: IconSVG, needsMeta: true, + searchTags: ["upload"], defaults: { rows: 4, files: [], diff --git a/app/client/src/widgets/FormWidget/index.ts b/app/client/src/widgets/FormWidget/index.ts index 5713ca2dec..dec3702900 100644 --- a/app/client/src/widgets/FormWidget/index.ts +++ b/app/client/src/widgets/FormWidget/index.ts @@ -9,6 +9,7 @@ export const CONFIG = { iconSVG: IconSVG, needsMeta: true, isCanvas: true, + searchTags: ["group"], defaults: { rows: 40, columns: 24, diff --git a/app/client/src/widgets/IconButtonWidget/index.ts b/app/client/src/widgets/IconButtonWidget/index.ts index 01d1795c79..4ac60a62e8 100644 --- a/app/client/src/widgets/IconButtonWidget/index.ts +++ b/app/client/src/widgets/IconButtonWidget/index.ts @@ -7,6 +7,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Icon Button", iconSVG: IconSVG, + searchTags: ["click", "submit"], defaults: { iconName: IconNames.PLUS, buttonVariant: ButtonVariantTypes.PRIMARY, diff --git a/app/client/src/widgets/IframeWidget/index.ts b/app/client/src/widgets/IframeWidget/index.ts index 033eee741c..388ba8782d 100644 --- a/app/client/src/widgets/IframeWidget/index.ts +++ b/app/client/src/widgets/IframeWidget/index.ts @@ -6,6 +6,7 @@ export const CONFIG = { name: "Iframe", iconSVG: IconSVG, needsMeta: true, + searchTags: ["embed"], defaults: { source: "https://www.example.com", borderOpacity: 100, diff --git a/app/client/src/widgets/InputWidgetV2/index.ts b/app/client/src/widgets/InputWidgetV2/index.ts index 8b0c99c80c..b345eff0c8 100644 --- a/app/client/src/widgets/InputWidgetV2/index.ts +++ b/app/client/src/widgets/InputWidgetV2/index.ts @@ -7,6 +7,7 @@ export const CONFIG = { name: "Input", iconSVG: IconSVG, needsMeta: true, + searchTags: ["form", "text input", "number", "textarea"], defaults: { ...BaseConfig.defaults, inputType: "TEXT", diff --git a/app/client/src/widgets/MapChartWidget/index.ts b/app/client/src/widgets/MapChartWidget/index.ts index b6c031ef19..99c230d59a 100644 --- a/app/client/src/widgets/MapChartWidget/index.ts +++ b/app/client/src/widgets/MapChartWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { iconSVG: IconSVG, needsMeta: true, // Defines if this widget adds any meta properties isCanvas: false, // Defines if this widget has a canvas within in which we can drop other widgets + searchTags: ["graph", "visuals", "visualisations"], defaults: { rows: 32, columns: 24, diff --git a/app/client/src/widgets/ModalWidget/index.ts b/app/client/src/widgets/ModalWidget/index.ts index 6bbafb3bbd..b3b4cde5cc 100644 --- a/app/client/src/widgets/ModalWidget/index.ts +++ b/app/client/src/widgets/ModalWidget/index.ts @@ -20,6 +20,7 @@ export const CONFIG = { iconSVG: IconSVG, needsMeta: true, isCanvas: true, + searchTags: ["dialog", "popup", "notification"], defaults: { rows: 24, columns: 24, diff --git a/app/client/src/widgets/MultiSelectTreeWidget/index.ts b/app/client/src/widgets/MultiSelectTreeWidget/index.ts index be39dde30c..2bbd7adccf 100644 --- a/app/client/src/widgets/MultiSelectTreeWidget/index.ts +++ b/app/client/src/widgets/MultiSelectTreeWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Multi TreeSelect", iconSVG: IconSVG, needsMeta: true, + searchTags: ["dropdown"], defaults: { rows: 4, columns: 20, diff --git a/app/client/src/widgets/MultiSelectWidgetV2/index.ts b/app/client/src/widgets/MultiSelectWidgetV2/index.ts index 90d3a18f78..a25a8fb635 100644 --- a/app/client/src/widgets/MultiSelectWidgetV2/index.ts +++ b/app/client/src/widgets/MultiSelectWidgetV2/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "MultiSelect", iconSVG: IconSVG, needsMeta: true, + searchTags: ["dropdown", "tags"], defaults: { rows: 4, columns: 20, diff --git a/app/client/src/widgets/PhoneInputWidget/index.ts b/app/client/src/widgets/PhoneInputWidget/index.ts index fcda29881c..72baef92a3 100644 --- a/app/client/src/widgets/PhoneInputWidget/index.ts +++ b/app/client/src/widgets/PhoneInputWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Phone Input", iconSVG: IconSVG, needsMeta: true, + searchTags: ["call"], defaults: { ...BaseConfig.defaults, widgetName: "PhoneInput", diff --git a/app/client/src/widgets/ProgressWidget/index.ts b/app/client/src/widgets/ProgressWidget/index.ts index 48396b190f..b97212d180 100644 --- a/app/client/src/widgets/ProgressWidget/index.ts +++ b/app/client/src/widgets/ProgressWidget/index.ts @@ -9,6 +9,7 @@ export const CONFIG = { iconSVG: IconSVG, needsMeta: false, // Defines if this widget adds any meta properties isCanvas: false, // Defines if this widget has a canvas within in which we can drop other widgets + searchTags: ["percent"], defaults: { widgetName: "Progress", rows: 4, diff --git a/app/client/src/widgets/RadioGroupWidget/index.ts b/app/client/src/widgets/RadioGroupWidget/index.ts index 8dded249fe..cf64e9f869 100644 --- a/app/client/src/widgets/RadioGroupWidget/index.ts +++ b/app/client/src/widgets/RadioGroupWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Radio Group", iconSVG: IconSVG, needsMeta: true, + searchTags: ["choice"], defaults: { rows: 8, columns: 20, diff --git a/app/client/src/widgets/RateWidget/index.ts b/app/client/src/widgets/RateWidget/index.ts index 48f1aff9b1..5a9dea34aa 100644 --- a/app/client/src/widgets/RateWidget/index.ts +++ b/app/client/src/widgets/RateWidget/index.ts @@ -7,6 +7,7 @@ export const CONFIG = { name: "Rating", iconSVG: IconSVG, needsMeta: true, + searchTags: ["stars"], defaults: { rows: 4, columns: 10, diff --git a/app/client/src/widgets/RichTextEditorWidget/index.ts b/app/client/src/widgets/RichTextEditorWidget/index.ts index cacbee6602..de253f67f4 100644 --- a/app/client/src/widgets/RichTextEditorWidget/index.ts +++ b/app/client/src/widgets/RichTextEditorWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Rich Text Editor", iconSVG: IconSVG, needsMeta: true, + searchTags: ["input", "rte"], defaults: { defaultText: "This is the initial content of the editor", rows: 20, diff --git a/app/client/src/widgets/SelectWidget/index.ts b/app/client/src/widgets/SelectWidget/index.ts index 4dc37b5778..32ca54c64c 100644 --- a/app/client/src/widgets/SelectWidget/index.ts +++ b/app/client/src/widgets/SelectWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Select", iconSVG: IconSVG, needsMeta: true, + searchTags: ["dropdown"], defaults: { rows: 4, columns: 20, diff --git a/app/client/src/widgets/SingleSelectTreeWidget/index.ts b/app/client/src/widgets/SingleSelectTreeWidget/index.ts index a7a740d608..5e00d936e4 100644 --- a/app/client/src/widgets/SingleSelectTreeWidget/index.ts +++ b/app/client/src/widgets/SingleSelectTreeWidget/index.ts @@ -6,6 +6,7 @@ import Widget from "./widget"; export const CONFIG = { type: Widget.getWidgetType(), name: "TreeSelect", + searchTags: ["dropdown"], iconSVG: IconSVG, needsMeta: true, defaults: { diff --git a/app/client/src/widgets/SwitchWidget/index.ts b/app/client/src/widgets/SwitchWidget/index.ts index e39d316b60..9b94ec470f 100644 --- a/app/client/src/widgets/SwitchWidget/index.ts +++ b/app/client/src/widgets/SwitchWidget/index.ts @@ -8,6 +8,7 @@ export const CONFIG = { name: "Switch", iconSVG: IconSVG, needsMeta: true, + searchTags: ["boolean"], defaults: { label: "Label", rows: 4, diff --git a/app/client/src/widgets/TableWidget/index.ts b/app/client/src/widgets/TableWidget/index.ts index 34bb036303..c19d23f8e7 100644 --- a/app/client/src/widgets/TableWidget/index.ts +++ b/app/client/src/widgets/TableWidget/index.ts @@ -14,6 +14,7 @@ export const CONFIG = { name: "Table", iconSVG: IconSVG, needsMeta: true, + searchTags: ["datagrid"], defaults: { rows: 28, columns: 34, diff --git a/app/client/src/widgets/TextWidget/index.ts b/app/client/src/widgets/TextWidget/index.ts index c6de20ffdb..c675710c74 100644 --- a/app/client/src/widgets/TextWidget/index.ts +++ b/app/client/src/widgets/TextWidget/index.ts @@ -7,6 +7,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Text", iconSVG: IconSVG, + searchTags: ["typography", "paragraph"], defaults: { text: "Label", fontSize: DEFAULT_FONT_SIZE, diff --git a/app/client/src/widgets/VideoWidget/index.ts b/app/client/src/widgets/VideoWidget/index.ts index 74960b1dc6..e3885baaf2 100644 --- a/app/client/src/widgets/VideoWidget/index.ts +++ b/app/client/src/widgets/VideoWidget/index.ts @@ -6,6 +6,7 @@ export const CONFIG = { name: "Video", iconSVG: IconSVG, needsMeta: true, + searchTags: ["youtube"], defaults: { rows: 28, columns: 24, diff --git a/app/client/src/widgets/constants.ts b/app/client/src/widgets/constants.ts index dd9adf1feb..392a3e1b74 100644 --- a/app/client/src/widgets/constants.ts +++ b/app/client/src/widgets/constants.ts @@ -14,6 +14,7 @@ export interface WidgetConfiguration { isCanvas?: boolean; needsMeta?: boolean; features?: WidgetFeatures; + searchTags?: string[]; properties: { config: PropertyPaneConfig[]; default: Record;