From a8faba4b8616283ad00a41c09d50be53a03b04d7 Mon Sep 17 00:00:00 2001 From: Dhruvik Neharia Date: Sat, 22 Jul 2023 11:27:18 +0530 Subject: [PATCH] feat: Widget Discoverability (#24934) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Grouping the widgets into categories to make it easier for people to find widgets. This will be behind the feature flag `release_widgetdiscovery_enabled` Project home [here on Notion](https://www.notion.so/appsmith/Widget-Discoverability-755cf059a1904950888304b90b74106f?d=8bc3059134984787900a69963dd13d90#27967092cfa74505bab55bd163d28c18). #### PR fixes following issue(s) #24865 #24867 #24868 #24869 #### Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video > > #### Type of change > Please delete options that are not relevant. - Bug fix (non-breaking change which fixes an issue) - New feature (non-breaking change which adds functionality) - Breaking change (fix or feature that would cause existing functionality to not work as expected) - Chore (housekeeping or task changes that don't impact user perception) - This change requires a documentation update > > > ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [x] Manual - [ ] Jest - [x] Cypress > > #### Test Plan > (https://github.com/appsmithorg/TestSmith/issues/2440) > > #### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) > > > ## Checklist: #### Dev activity - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#speedbreakers-) have been covered - [x] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans#areas-of-interest-) - [x] Test plan has been peer reviewed by project stakeholders and other QA members - [x] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [x] Cypress test cases have been added and approved by SDET/manual QA - [ ] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed --- .../ExplorerTests/Widgets_Sidebar.ts | 198 ++++++++++++++++++ ...Listv2_BasicChildWidgetInteraction_spec.js | 1 + .../Widgets/Modal/Modal_focus_spec.js | 8 +- .../cypress/support/Objects/CommonLocators.ts | 3 + .../cypress/support/Pages/EntityExplorer.ts | 6 + app/client/cypress/support/commands.js | 4 + app/client/package.json | 2 +- app/client/src/ce/entities/FeatureFlag.ts | 2 + app/client/src/constants/WidgetConstants.tsx | 29 +++ .../src/pages/Editor/Explorer/Pages/index.tsx | 8 +- .../src/pages/Editor/Explorer/index.tsx | 16 +- app/client/src/pages/Editor/WidgetCard.tsx | 31 +-- app/client/src/pages/Editor/WidgetSidebar.tsx | 1 - .../pages/Editor/WidgetSidebarWithTags.tsx | 160 ++++++++++++++ app/client/src/pages/Editor/utils.ts | 29 ++- app/client/src/selectors/editorSelectors.tsx | 2 + .../src/utils/WidgetRegisterHelpers.tsx | 1 + .../src/widgets/AudioRecorderWidget/icon.svg | 5 +- .../src/widgets/AudioRecorderWidget/index.ts | 3 +- app/client/src/widgets/AudioWidget/icon.svg | 9 +- app/client/src/widgets/AudioWidget/index.tsx | 3 +- .../src/widgets/BaseInputWidget/icon.svg | 5 +- app/client/src/widgets/BaseWidget.tsx | 2 + .../src/widgets/ButtonGroupWidget/icon.svg | 10 +- .../src/widgets/ButtonGroupWidget/index.ts | 2 + app/client/src/widgets/ButtonWidget/icon.svg | 4 +- app/client/src/widgets/ButtonWidget/index.ts | 3 +- app/client/src/widgets/CameraWidget/icon.svg | 4 +- app/client/src/widgets/CameraWidget/index.ts | 2 + .../src/widgets/CategorySliderWidget/icon.svg | 10 +- .../src/widgets/CategorySliderWidget/index.ts | 3 +- app/client/src/widgets/ChartWidget/icon.svg | 6 +- app/client/src/widgets/ChartWidget/index.ts | 3 +- .../src/widgets/CheckboxGroupWidget/icon.svg | 8 +- .../src/widgets/CheckboxGroupWidget/index.ts | 3 +- .../src/widgets/CheckboxWidget/icon.svg | 4 +- .../src/widgets/CheckboxWidget/index.ts | 3 +- .../src/widgets/CodeScannerWidget/icon.svg | 4 +- .../src/widgets/CodeScannerWidget/index.ts | 2 + .../src/widgets/ContainerWidget/icon.svg | 15 +- .../src/widgets/ContainerWidget/index.ts | 7 +- .../src/widgets/CurrencyInputWidget/icon.svg | 5 +- .../src/widgets/CurrencyInputWidget/index.ts | 3 +- .../src/widgets/DatePickerWidget2/icon.svg | 13 +- .../src/widgets/DatePickerWidget2/index.ts | 3 +- app/client/src/widgets/DividerWidget/icon.svg | 4 +- app/client/src/widgets/DividerWidget/index.ts | 3 +- .../src/widgets/DocumentViewerWidget/icon.svg | 7 +- .../src/widgets/DocumentViewerWidget/index.ts | 2 + .../src/widgets/FilePickerWidgetV2/icon.svg | 4 +- .../src/widgets/FilePickerWidgetV2/index.ts | 3 +- app/client/src/widgets/FormWidget/icon.svg | 8 +- app/client/src/widgets/FormWidget/index.ts | 3 +- .../src/widgets/IconButtonWidget/icon.svg | 4 +- .../src/widgets/IconButtonWidget/index.ts | 2 + app/client/src/widgets/IframeWidget/icon.svg | 4 +- app/client/src/widgets/IframeWidget/index.ts | 2 + app/client/src/widgets/ImageWidget/icon.svg | 6 +- app/client/src/widgets/ImageWidget/index.ts | 2 + app/client/src/widgets/InputWidgetV2/icon.svg | 5 +- app/client/src/widgets/InputWidgetV2/index.ts | 2 + .../src/widgets/JSONFormWidget/icon.svg | 8 +- .../src/widgets/JSONFormWidget/index.ts | 2 + app/client/src/widgets/ListWidgetV2/icon.svg | 4 +- app/client/src/widgets/ListWidgetV2/index.ts | 3 +- .../src/widgets/MapChartWidget/icon.svg | 7 +- .../src/widgets/MapChartWidget/index.ts | 3 +- app/client/src/widgets/MapWidget/icon.svg | 5 +- app/client/src/widgets/MapWidget/index.ts | 3 +- .../src/widgets/MenuButtonWidget/icon.svg | 6 +- .../src/widgets/MenuButtonWidget/index.ts | 2 + app/client/src/widgets/ModalWidget/icon.svg | 6 +- app/client/src/widgets/ModalWidget/index.ts | 4 +- .../widgets/MultiSelectTreeWidget/icon.svg | 9 +- .../widgets/MultiSelectTreeWidget/index.ts | 3 +- .../src/widgets/MultiSelectWidgetV2/icon.svg | 11 +- .../src/widgets/MultiSelectWidgetV2/index.ts | 3 +- .../src/widgets/NumberSliderWidget/icon.svg | 10 +- .../src/widgets/NumberSliderWidget/index.ts | 3 +- .../src/widgets/PhoneInputWidget/icon.svg | 5 +- .../src/widgets/PhoneInputWidget/index.ts | 3 +- .../src/widgets/ProgressWidget/icon.svg | 9 +- .../src/widgets/ProgressWidget/index.ts | 2 + .../src/widgets/RadioGroupWidget/icon.svg | 5 +- .../src/widgets/RadioGroupWidget/index.ts | 3 +- .../src/widgets/RangeSliderWidget/icon.svg | 12 +- .../src/widgets/RangeSliderWidget/index.ts | 3 +- app/client/src/widgets/RateWidget/icon.svg | 4 +- app/client/src/widgets/RateWidget/index.ts | 2 + .../src/widgets/RichTextEditorWidget/icon.svg | 4 +- .../src/widgets/RichTextEditorWidget/index.ts | 3 +- app/client/src/widgets/SelectWidget/icon.svg | 4 +- app/client/src/widgets/SelectWidget/index.ts | 2 + .../widgets/SingleSelectTreeWidget/icon.svg | 4 +- .../widgets/SingleSelectTreeWidget/index.ts | 3 +- app/client/src/widgets/StatboxWidget/icon.svg | 4 +- app/client/src/widgets/StatboxWidget/index.ts | 4 +- .../src/widgets/SwitchGroupWidget/icon.svg | 10 +- .../src/widgets/SwitchGroupWidget/index.ts | 3 +- app/client/src/widgets/SwitchWidget/icon.svg | 5 +- app/client/src/widgets/SwitchWidget/index.ts | 3 +- app/client/src/widgets/TableWidgetV2/icon.svg | 8 +- app/client/src/widgets/TableWidgetV2/index.ts | 2 + app/client/src/widgets/TabsWidget/icon.svg | 4 +- app/client/src/widgets/TabsWidget/index.ts | 8 +- app/client/src/widgets/TextWidget/icon.svg | 4 +- app/client/src/widgets/TextWidget/index.ts | 3 +- app/client/src/widgets/VideoWidget/icon.svg | 5 +- app/client/src/widgets/VideoWidget/index.ts | 2 + app/client/src/widgets/constants.ts | 2 + app/client/yarn.lock | 10 +- 111 files changed, 816 insertions(+), 127 deletions(-) create mode 100644 app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Widgets_Sidebar.ts create mode 100644 app/client/src/pages/Editor/WidgetSidebarWithTags.tsx mode change 100755 => 100644 app/client/src/widgets/CameraWidget/icon.svg mode change 100755 => 100644 app/client/src/widgets/MapChartWidget/icon.svg mode change 100755 => 100644 app/client/src/widgets/SwitchGroupWidget/icon.svg diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Widgets_Sidebar.ts b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Widgets_Sidebar.ts new file mode 100644 index 0000000000..c2e7f6e5d3 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Widgets_Sidebar.ts @@ -0,0 +1,198 @@ +import { featureFlagIntercept } from "../../../../support/Objects/FeatureFlags"; +import { + entityExplorer, + agHelper, + locators, +} from "../../../../support/Objects/ObjectsCore"; + +describe("Entity explorer tests related to widgets and validation", function () { + // Taken from here appsmith/app/client/src/constants/WidgetConstants.tsx + const WIDGET_TAGS: Record = { + SUGGESTED_WIDGETS: "Suggested", + INPUTS: "Inputs", + BUTTONS: "Buttons", + SELECT: "Select", + DISPLAY: "Display", + LAYOUT: "Layout", + MEDIA: "Media", + TOGGLES: "Toggles", + SLIDERS: "Sliders", + CONTENT: "Content", + EXTERNAL: "External", + }; + + // Taken from here appsmith/app/client/src/constants/WidgetConstants.tsx + const SUGGESTED_WIDGETS_ORDER: Record = { + TABLE_WIDGET_V2: 1, + JSON_FORM_WIDGET: 2, + INPUT_WIDGET_V2: 3, + TEXT_WIDGET: 4, + SELECT_WIDGET: 5, + LIST_WIDGET_V2: 6, + }; + + // When adding a new widget or tag, we need to manually add it to this list. + const WIDGETS_CATALOG: Record = { + Suggested: ["Input", "JSON Form", "List", "Select", "Table", "Text"], + Inputs: [ + "Currency Input", + "DatePicker", + "FilePicker", + "Input", + "Phone Input", + "Rich Text Editor", + ], + Buttons: ["Button", "Button Group", "Icon button", "Menu button"], + Select: ["Multi TreeSelect", "MultiSelect", "Select", "TreeSelect"], + Display: ["Chart", "Iframe", "List", "Map Chart", "Stats Box", "Table"], + Layout: ["Container", "Divider", "Form", "JSON Form", "Modal", "Tabs"], + Media: ["Audio", "Document Viewer", "Image", "Video"], + Toggles: [ + "Checkbox", + "Checkbox Group", + "Radio Group", + "Switch", + "Switch Group", + ], + Sliders: ["Category Slider", "Number Slider", "Range Slider"], + Content: ["Map", "Progress", "Rating", "Text"], + External: ["Audio Recorder", "Camera", "Code Scanner"], + }; + + before(() => { + featureFlagIntercept( + { + release_widgetdiscovery_enabled: true, + }, + false, + ); + agHelper.RefreshPage(); + }); + + const getTotalNumberOfWidgets = () => { + return Object.values(WIDGETS_CATALOG).reduce( + (totalLength, widgets) => totalLength + widgets.length, + 0, + ); + }; + + it("1. All widget tags should be visible and open by default.", () => { + entityExplorer.NavigateToSwitcher("Widgets"); + + agHelper.AssertElementLength( + entityExplorer._widgetTagsList, + Object.keys(WIDGET_TAGS).length, + ); + + agHelper.GetElement(entityExplorer._widgetTagsList).each(($widgetTag) => { + cy.wrap($widgetTag) + .find(locators._adsV2Content) + .should("have.css", "display", "flex"); + }); + }); + + it("2. All widgets should be present within their tags and these tags should be collapsible", () => { + agHelper.GetElement(entityExplorer._widgetTagsList).each(($widgetTag) => { + // check that tags are collapsible + cy.wrap($widgetTag).find(locators._adsV2CollapsibleHeader).click({ + force: true, + }); + cy.wrap($widgetTag) + .find(locators._adsV2Content) + .should("have.css", "display", "none"); + cy.wrap($widgetTag).find(locators._adsV2CollapsibleHeader).click({ + force: true, + }); + + // check that all widgets are present within their tags + const widgetsInThisTag: string[] = []; + + cy.wrap($widgetTag) + .find(entityExplorer._widgetCardTitle) + .each(($widgetName) => { + const value = $widgetName.text(); + + widgetsInThisTag.push(value); + }) + .then(() => { + cy.wrap($widgetTag) + .find( + `${locators._adsV2CollapsibleHeader} span${locators._adsV2Text}`, + ) + .then(($widgetTagTitle) => { + const expectedWidgetsInThisTag = + WIDGETS_CATALOG[$widgetTagTitle.text()].sort(); + widgetsInThisTag.sort(); + + expect(widgetsInThisTag).to.deep.eq(expectedWidgetsInThisTag); + }); + }); + }); + }); + + it("3. All widgets should be ordered alphabetically within their tags, except Essential widgets, which should be sorted by their static rank.", () => { + agHelper + .GetElement( + `${entityExplorer._widgetTagsList}:not(${entityExplorer._widgetTagSuggestedWidgets})`, + ) + .each(($widgetTag) => { + const widgetsInThisTag: string[] = []; + + cy.wrap($widgetTag) + .find(entityExplorer._widgetCardTitle) + .each(($widgetName) => { + const value = $widgetName.text(); + + widgetsInThisTag.push(value); + }) + .then(() => { + const sortedWidgetsInThisTag = [...widgetsInThisTag].sort(); + + expect(widgetsInThisTag).to.deep.eq(sortedWidgetsInThisTag); + }); + }); + + const widgetsInEssentialWidgetsTag: string[] = []; + agHelper + .GetElement( + `${entityExplorer._widgetTagsList}${entityExplorer._widgetTagSuggestedWidgets}`, + ) + .find(entityExplorer._widgetCardTitle) + .each(($widgetName) => { + const value = $widgetName.text(); + + widgetsInEssentialWidgetsTag.push(value); + }) + .then(() => { + const sortedWidgetsInEssentialWidgetsTag = [ + ...widgetsInEssentialWidgetsTag, + ].sort( + (a, b) => SUGGESTED_WIDGETS_ORDER[a] - SUGGESTED_WIDGETS_ORDER[b], + ); + + expect(widgetsInEssentialWidgetsTag).to.deep.eq( + sortedWidgetsInEssentialWidgetsTag, + ); + }); + }); + + it("4. Widget search should work", () => { + agHelper.TypeText(entityExplorer._widgetSearchInput, "text"); + agHelper.AssertElementLength(entityExplorer._widgetCards, 3); + + agHelper.TypeText(entityExplorer._widgetSearchInput, "p"); + agHelper.AssertElementLength(entityExplorer._widgetCards, 2); + + agHelper.ClearTextField(entityExplorer._widgetSearchInput); + + agHelper.TypeText(entityExplorer._widgetSearchInput, "cypress"); + agHelper.AssertElementLength(entityExplorer._widgetCards, 0); + + agHelper.ClearTextField(entityExplorer._widgetSearchInput); + + agHelper.AssertElementLength( + entityExplorer._widgetCards, + getTotalNumberOfWidgets(), + ); + }); +}); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicChildWidgetInteraction_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicChildWidgetInteraction_spec.js index 8228188d87..49beb328a4 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicChildWidgetInteraction_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicChildWidgetInteraction_spec.js @@ -10,6 +10,7 @@ function dragAndDropToWidget(widgetType, destinationWidget, { x, y }) { const selector = `.t--widget-card-draggable-${widgetType}`; cy.wait(800); cy.get(selector) + .first() .scrollIntoView() .trigger("dragstart", { force: true }) .trigger("mousemove", x, y, { force: true }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Modal/Modal_focus_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Modal/Modal_focus_spec.js index 502d6b37f5..856828265f 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Modal/Modal_focus_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Modal/Modal_focus_spec.js @@ -23,9 +23,11 @@ describe("Modal focus", function () { cy.wait(500); //drag input field into modal - cy.get(".t--widget-card-draggable-inputwidgetv2").trigger("dragstart", { - force: true, - }); + cy.get(".t--widget-card-draggable-inputwidgetv2") + .first() + .trigger("dragstart", { + force: true, + }); cy.get(widgets.modalWidget) .scrollIntoView() diff --git a/app/client/cypress/support/Objects/CommonLocators.ts b/app/client/cypress/support/Objects/CommonLocators.ts index 1d8c0bda1c..6b0f70e545 100644 --- a/app/client/cypress/support/Objects/CommonLocators.ts +++ b/app/client/cypress/support/Objects/CommonLocators.ts @@ -259,6 +259,9 @@ export class CommonLocators { _pagination = ".rc-pagination"; _controlOption = ".t--property-control-options"; _canvasBody = "[data-testid='div-selection-0']"; + _adsV2Content = ".ads-v2__content"; + _adsV2CollapsibleHeader = ".ads-v2-collapsible__header"; + _adsV2Text = ".ads-v2-text"; _svg = "svg"; public ds_editor_env_filter = (envName: string) => diff --git a/app/client/cypress/support/Pages/EntityExplorer.ts b/app/client/cypress/support/Pages/EntityExplorer.ts index 1de036be78..b1d84293c7 100644 --- a/app/client/cypress/support/Pages/EntityExplorer.ts +++ b/app/client/cypress/support/Pages/EntityExplorer.ts @@ -86,6 +86,12 @@ export class EntityExplorer { "//span[text()='" + dbName + "']/following-sibling::div[contains(@class, 't--entity') and contains(@class, 'action')]//div[contains(@class, 't--entity-name')]"; + _widgetTagsList = + "[data-testid='widget-sidebar-scrollable-wrapper'] .widget-tag-collapisble"; + _widgetCards = ".t--widget-card-draggable"; + _widgetSearchInput = "#entity-explorer-search"; + _widgetCardTitle = ".t--widget-card-draggable span.ads-v2-text"; + _widgetTagSuggestedWidgets = ".widget-tag-collapisble-suggested"; public SelectEntityByName( entityNameinLeftSidebar: string, diff --git a/app/client/cypress/support/commands.js b/app/client/cypress/support/commands.js index 290ea2b3af..3570a24235 100644 --- a/app/client/cypress/support/commands.js +++ b/app/client/cypress/support/commands.js @@ -788,6 +788,7 @@ Cypress.Commands.add("dragAndDropToCanvas", (widgetType, { x, y }) => { const selector = `.t--widget-card-draggable-${widgetType}`; cy.wait(500); cy.get(selector) + .first() .trigger("dragstart", { force: true }) .trigger("mousemove", x, y, { force: true }); @@ -806,11 +807,13 @@ Cypress.Commands.add( const selector = `.t--widget-card-draggable-${widgetType}`; cy.wait(800); cy.get(selector) + .first() .scrollIntoView() .trigger("dragstart", { force: true }) .trigger("mousemove", x, y, { force: true }); const selector2 = `.t--draggable-${destinationWidget}`; cy.get(selector2) + .first() .scrollIntoView() .trigger("mousemove", x, y, { eventConstructor: "MouseEvent" }) .trigger("mousemove", x, y, { eventConstructor: "MouseEvent" }) @@ -824,6 +827,7 @@ Cypress.Commands.add( const selector = `.t--widget-card-draggable-${widgetType}`; cy.wait(800); cy.get(selector) + .first() .scrollIntoView() .trigger("dragstart", { force: true }) .trigger("mousemove", x, y, { force: true }); diff --git a/app/client/package.json b/app/client/package.json index 7fe053b007..f8c534063e 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -93,7 +93,7 @@ "cypress-log-to-output": "^1.1.2", "dayjs": "^1.10.6", "deep-diff": "^1.0.2", - "design-system": "npm:@appsmithorg/design-system@2.1.16", + "design-system": "npm:@appsmithorg/design-system@2.1.17", "design-system-old": "npm:@appsmithorg/design-system-old@1.1.11", "downloadjs": "^1.4.7", "fast-deep-equal": "^3.1.3", diff --git a/app/client/src/ce/entities/FeatureFlag.ts b/app/client/src/ce/entities/FeatureFlag.ts index 42fd4f7039..f42f174173 100644 --- a/app/client/src/ce/entities/FeatureFlag.ts +++ b/app/client/src/ce/entities/FeatureFlag.ts @@ -13,6 +13,7 @@ export const FEATURE_FLAG = { ab_ds_schema_enabled: "ab_ds_schema_enabled", ab_ds_binding_enabled: "ab_ds_binding_enabled", release_scim_provisioning_enabled: "release_scim_provisioning_enabled", + release_widgetdiscovery_enabled: "release_widgetdiscovery_enabled", } as const; export type FeatureFlag = keyof typeof FEATURE_FLAG; @@ -30,6 +31,7 @@ export const DEFAULT_FEATURE_FLAG_VALUE: FeatureFlags = { ab_ds_schema_enabled: false, ab_ds_binding_enabled: false, release_scim_provisioning_enabled: false, + release_widgetdiscovery_enabled: false, }; export const AB_TESTING_EVENT_KEYS = { diff --git a/app/client/src/constants/WidgetConstants.tsx b/app/client/src/constants/WidgetConstants.tsx index 000e4c29bd..38b7ee6213 100644 --- a/app/client/src/constants/WidgetConstants.tsx +++ b/app/client/src/constants/WidgetConstants.tsx @@ -1,6 +1,7 @@ import type { SupportedLayouts } from "reducers/entityReducers/pageListReducer"; import type { WidgetType as FactoryWidgetType } from "utils/WidgetFactory"; import { THEMEING_TEXT_SIZES } from "./ThemeConstants"; +import type { WidgetCardProps } from "widgets/BaseWidget"; export type WidgetType = FactoryWidgetType; export const SKELETON_WIDGET_TYPE = "SKELETON_WIDGET"; @@ -209,6 +210,7 @@ export const WIDGET_PROPS_TO_SKIP_FROM_EVAL = { displayName: true, topRowBeforeCollapse: false, bottomRowBeforeCollapse: false, + tags: false, }; /** @@ -223,3 +225,30 @@ export const FLEXBOX_PADDING = 4; export const MAX_MODAL_WIDTH_FROM_MAIN_WIDTH = 0.95; export const FILE_SIZE_LIMIT_FOR_BLOBS = 5000 * 1024; // 5MB + +export const WIDGET_TAGS = { + SUGGESTED_WIDGETS: "Suggested", + INPUTS: "Inputs", + BUTTONS: "Buttons", + SELECT: "Select", + DISPLAY: "Display", + LAYOUT: "Layout", + MEDIA: "Media", + TOGGLES: "Toggles", + SLIDERS: "Sliders", + CONTENT: "Content", + EXTERNAL: "External", +} as const; + +export type WidgetTags = (typeof WIDGET_TAGS)[keyof typeof WIDGET_TAGS]; + +export type WidgetCardsGroupedByTags = Record; + +export const SUGGESTED_WIDGETS_ORDER: Record = { + TABLE_WIDGET_V2: 1, + JSON_FORM_WIDGET: 2, + INPUT_WIDGET_V2: 3, + TEXT_WIDGET: 4, + SELECT_WIDGET: 5, + LIST_WIDGET_V2: 6, +}; diff --git a/app/client/src/pages/Editor/Explorer/Pages/index.tsx b/app/client/src/pages/Editor/Explorer/Pages/index.tsx index 6329109798..36c8ec22e7 100644 --- a/app/client/src/pages/Editor/Explorer/Pages/index.tsx +++ b/app/client/src/pages/Editor/Explorer/Pages/index.tsx @@ -43,6 +43,8 @@ import { import type { AppState } from "@appsmith/reducers"; import { getCurrentWorkspaceId } from "@appsmith/selectors/workspaceSelectors"; import { getInstanceId } from "@appsmith//selectors/tenantSelectors"; +import classNames from "classnames"; +import { selectFeatureFlags } from "@appsmith/selectors/featureFlagsSelectors"; const ENTITY_HEIGHT = 36; const MIN_PAGES_HEIGHT = 60; @@ -94,6 +96,7 @@ function Pages() { const storedHeightKey = "pagesContainerHeight_" + applicationId; const storedHeight = localStorage.getItem(storedHeightKey); const location = useLocation(); + const featureFlags = useSelector(selectFeatureFlags); const resizeAfterCallback = (data: CallbackResponseType) => { localStorage.setItem(storedHeightKey, data.height.toString()); @@ -223,7 +226,10 @@ function Pages() { state.ui.onBoarding.forceOpenWidgetPanel; @@ -39,6 +41,7 @@ function ExplorerContent() { const pageId = useSelector(getCurrentPageId); const location = useLocation(); const activeSwitchIndex = useSelector(getExplorerSwitchIndex); + const featureFlags = useSelector(selectFeatureFlags); const setActiveSwitchIndex = (index: number) => { dispatch(setExplorerSwitchIndex(index)); @@ -79,14 +82,23 @@ function ExplorerContent() {
-
+
- + + {featureFlags.release_widgetdiscovery_enabled ? ( + + ) : ( + + )} +
); diff --git a/app/client/src/pages/Editor/WidgetCard.tsx b/app/client/src/pages/Editor/WidgetCard.tsx index b236f0e99b..bbf35b5c9d 100644 --- a/app/client/src/pages/Editor/WidgetCard.tsx +++ b/app/client/src/pages/Editor/WidgetCard.tsx @@ -6,22 +6,23 @@ import AnalyticsUtil from "utils/AnalyticsUtil"; import { generateReactKey } from "utils/generators"; import { useWidgetSelection } from "utils/hooks/useWidgetSelection"; import { IconWrapper } from "constants/IconConstants"; +import { Text } from "design-system"; type CardProps = { details: WidgetCardProps; }; export const Wrapper = styled.div` - padding: 10px 5px 10px 5px; border-radius: var(--ads-v2-border-radius); border: none; position: relative; color: var(--ads-v2-color-fg); - height: 72px; + min-height: 70px; display: flex; - align-items: center; + align-items: flex-start; justify-content: center; cursor: grab; + img { cursor: grab; } @@ -31,6 +32,8 @@ export const Wrapper = styled.div` flex-direction: column; align-items: center; justify-content: center; + margin-bottom: 2px; + text-align: center; } &:hover { @@ -54,21 +57,6 @@ export const BetaLabel = styled.div` right: -2%; `; -export const IconLabel = styled.h5` - min-height: 32px; - text-align: center; - margin: 0; - /* text-transform: uppercase; */ - font-weight: ${(props) => props.theme.fontWeights[1]}; - flex-shrink: 1; - font-size: 11px; - line-height: ${(props) => props.theme.lineHeights[2]}px; - - &::selection { - background: none; - } -`; - function WidgetCard(props: CardProps) { const { setDraggingNewWidget } = useWidgetDragResize(); const { deselectAll } = useWidgetSelection(); @@ -89,7 +77,8 @@ function WidgetCard(props: CardProps) { }; const type = `${props.details.type.split("_").join("").toLowerCase()}`; - const className = `t--widget-card-draggable-${type}`; + const className = `t--widget-card-draggable t--widget-card-draggable-${type}`; + return ( -
+
- {props.details.displayName} + {props.details.displayName} {props.details.isBeta && Beta}
diff --git a/app/client/src/pages/Editor/WidgetSidebar.tsx b/app/client/src/pages/Editor/WidgetSidebar.tsx index 36f4c0a4b0..c652f7eb38 100644 --- a/app/client/src/pages/Editor/WidgetSidebar.tsx +++ b/app/client/src/pages/Editor/WidgetSidebar.tsx @@ -3,7 +3,6 @@ import { useSelector } from "react-redux"; import WidgetCard from "./WidgetCard"; import { getWidgetCards } from "selectors/editorSelectors"; import { SearchInput } from "design-system"; - import { ENTITY_EXPLORER_SEARCH_ID } from "constants/Explorer"; import { debounce } from "lodash"; import { diff --git a/app/client/src/pages/Editor/WidgetSidebarWithTags.tsx b/app/client/src/pages/Editor/WidgetSidebarWithTags.tsx new file mode 100644 index 0000000000..a1b1c52d17 --- /dev/null +++ b/app/client/src/pages/Editor/WidgetSidebarWithTags.tsx @@ -0,0 +1,160 @@ +import React, { useEffect, useMemo, useRef, useState } from "react"; +import { useSelector } from "react-redux"; +import WidgetCard from "./WidgetCard"; +import { getWidgetCards } from "selectors/editorSelectors"; +import { ENTITY_EXPLORER_SEARCH_ID } from "constants/Explorer"; +import { debounce, sortBy } from "lodash"; +import Fuse from "fuse.js"; +import type { WidgetCardProps } from "widgets/BaseWidget"; +import AnalyticsUtil from "utils/AnalyticsUtil"; +import { + SUGGESTED_WIDGETS_ORDER, + WIDGET_TAGS, + type WidgetCardsGroupedByTags, + type WidgetTags, +} from "constants/WidgetConstants"; +import { groupWidgetCardsByTags } from "./utils"; +import { + Collapsible, + CollapsibleHeader, + CollapsibleContent, + SearchInput, + Text, +} from "design-system"; + +function WidgetSidebarWithTags({ isActive }: { isActive: boolean }) { + const cards = useSelector(getWidgetCards); + const groupedCards = useMemo(() => groupWidgetCardsByTags(cards), [cards]); + const [filteredCards, setFilteredCards] = + useState(groupedCards); + const searchInputRef = useRef(null); + const [isSearching, setIsSearching] = useState(false); + + const fuse = useMemo(() => { + const options = { + keys: [ + { + name: "displayName", + weight: 0.8, + }, + { + name: "searchTags", + weight: 0.1, + }, + { + name: "tags", + weight: 0.1, + }, + ], + threshold: 0.2, + distance: 100, + }; + + return new Fuse(cards, options); + }, [cards]); + + const sendWidgetSearchAnalytics = debounce((value: string) => { + if (value !== "") { + AnalyticsUtil.logEvent("WIDGET_SEARCH", { value }); + } + }, 1000); + + const filterCards = (keyword: string) => { + setIsSearching(true); + sendWidgetSearchAnalytics(keyword); + + if (keyword.trim().length > 0) { + const searchResult = fuse.search(keyword); + setFilteredCards(groupWidgetCardsByTags(searchResult)); + } else { + setFilteredCards(groupedCards); + setIsSearching(false); + } + }; + + useEffect(() => { + if (isActive) searchInputRef.current?.focus(); + }, [isActive]); + + const search = debounce((value: string) => { + filterCards(value.toLowerCase()); + }, 300); + + return ( +
+
+ +
+
+
+ {Object.keys(filteredCards).map((tag) => { + const cardsForThisTag: WidgetCardProps[] = + filteredCards[tag as WidgetTags]; + + if (!cardsForThisTag?.length) { + return null; + } + + // We don't need to show suggested widgets when the user is searching + if (isSearching && tag === WIDGET_TAGS.SUGGESTED_WIDGETS) { + return null; + } + + return ( + + + + {tag} + + + + +
+ {tag === WIDGET_TAGS.SUGGESTED_WIDGETS + ? sortBy(cardsForThisTag, (widget) => { + return SUGGESTED_WIDGETS_ORDER[widget.type]; + }).map((card) => ( + + )) + : cardsForThisTag.map((card) => ( + + ))} +
+
+
+ ); + })} +
+
+
+ ); +} + +WidgetSidebarWithTags.displayName = "WidgetSidebarWithTags"; + +export default WidgetSidebarWithTags; diff --git a/app/client/src/pages/Editor/utils.ts b/app/client/src/pages/Editor/utils.ts index c2a3d2b544..6d20da013a 100644 --- a/app/client/src/pages/Editor/utils.ts +++ b/app/client/src/pages/Editor/utils.ts @@ -3,7 +3,12 @@ import _, { debounce, random } from "lodash"; import { useEffect, useMemo, useState } from "react"; import ReactDOM from "react-dom"; import { useLocation } from "react-router"; -import type { WidgetType } from "constants/WidgetConstants"; +import type { + WidgetCardsGroupedByTags, + WidgetTags, + WidgetType, +} from "constants/WidgetConstants"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; import ResizeObserver from "resize-observer-polyfill"; import WidgetFactory from "utils/WidgetFactory"; import { @@ -13,6 +18,7 @@ import { import type { URLBuilderParams } from "RouteBuilder"; import { useSelector } from "react-redux"; import { getCurrentPageId } from "selectors/editorSelectors"; +import type { WidgetCardProps } from "widgets/BaseWidget"; export const draggableElement = ( id: string, @@ -305,3 +311,24 @@ export const generateRandomNumbers = ( ) => { return random(lowerBound, upperBound, allowFloating); }; + +export const groupWidgetCardsByTags = (widgetCards: WidgetCardProps[]) => { + const tagsOrder = Object.values(WIDGET_TAGS); + const groupedCards: WidgetCardsGroupedByTags = {} as WidgetCardsGroupedByTags; + + tagsOrder.forEach((tag: WidgetTags) => { + groupedCards[tag] = []; + }); + + widgetCards.forEach((item) => { + if (item.tags) { + item.tags.forEach((tag) => { + if (groupedCards[tag]) { + groupedCards[tag].push(item); + } + }); + } + }); + + return groupedCards; +}; diff --git a/app/client/src/selectors/editorSelectors.tsx b/app/client/src/selectors/editorSelectors.tsx index 39dddac3b7..2b75733d34 100644 --- a/app/client/src/selectors/editorSelectors.tsx +++ b/app/client/src/selectors/editorSelectors.tsx @@ -349,6 +349,7 @@ export const getWidgetCards = createSelector( iconSVG, key, searchTags, + tags, type, } = config; let { columns, rows } = config; @@ -368,6 +369,7 @@ export const getWidgetCards = createSelector( displayName, icon: iconSVG, searchTags, + tags, isDynamicHeight: isAutoHeightEnabledForWidget(config as WidgetProps), }; }); diff --git a/app/client/src/utils/WidgetRegisterHelpers.tsx b/app/client/src/utils/WidgetRegisterHelpers.tsx index 3f7c3259f9..8d381ec588 100644 --- a/app/client/src/utils/WidgetRegisterHelpers.tsx +++ b/app/client/src/utils/WidgetRegisterHelpers.tsx @@ -91,6 +91,7 @@ export const configureWidget = (config: WidgetConfiguration) => { ...config.defaults, ...features, searchTags: config.searchTags, + tags: config.tags, type: config.type, hideCard: !!config.hideCard || !config.iconSVG, isDeprecated: !!config.isDeprecated, diff --git a/app/client/src/widgets/AudioRecorderWidget/icon.svg b/app/client/src/widgets/AudioRecorderWidget/icon.svg index 08ba4a1a48..7bdf175b62 100644 --- a/app/client/src/widgets/AudioRecorderWidget/icon.svg +++ b/app/client/src/widgets/AudioRecorderWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/AudioRecorderWidget/index.ts b/app/client/src/widgets/AudioRecorderWidget/index.ts index 51079a3d1f..c0af9ce64f 100644 --- a/app/client/src/widgets/AudioRecorderWidget/index.ts +++ b/app/client/src/widgets/AudioRecorderWidget/index.ts @@ -1,13 +1,14 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Audio Recorder", iconSVG: IconSVG, + tags: [WIDGET_TAGS.EXTERNAL], needsMeta: true, searchTags: ["sound recorder", "voice recorder"], defaults: { diff --git a/app/client/src/widgets/AudioWidget/icon.svg b/app/client/src/widgets/AudioWidget/icon.svg index d3479b78da..3f260be11a 100644 --- a/app/client/src/widgets/AudioWidget/icon.svg +++ b/app/client/src/widgets/AudioWidget/icon.svg @@ -1 +1,8 @@ - \ No newline at end of file + + + + + + + + diff --git a/app/client/src/widgets/AudioWidget/index.tsx b/app/client/src/widgets/AudioWidget/index.tsx index b25fc97a61..e6dccf0658 100644 --- a/app/client/src/widgets/AudioWidget/index.tsx +++ b/app/client/src/widgets/AudioWidget/index.tsx @@ -1,15 +1,16 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; import { ASSETS_CDN_URL } from "constants/ThirdPartyConstants"; import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Audio", iconSVG: IconSVG, + tags: [WIDGET_TAGS.MEDIA], needsMeta: true, searchTags: ["mp3", "sound", "wave", "player"], defaults: { diff --git a/app/client/src/widgets/BaseInputWidget/icon.svg b/app/client/src/widgets/BaseInputWidget/icon.svg index 0a1b6d938f..6e3c1fdaef 100644 --- a/app/client/src/widgets/BaseInputWidget/icon.svg +++ b/app/client/src/widgets/BaseInputWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/BaseWidget.tsx b/app/client/src/widgets/BaseWidget.tsx index e0d15e9049..a7d5b777e1 100644 --- a/app/client/src/widgets/BaseWidget.tsx +++ b/app/client/src/widgets/BaseWidget.tsx @@ -22,6 +22,7 @@ import type { CSSUnit, PositionType, RenderMode, + WidgetTags, WidgetType, } from "constants/WidgetConstants"; import { FLEXBOX_PADDING } from "constants/WidgetConstants"; @@ -911,6 +912,7 @@ export interface WidgetCardProps { displayName: string; icon: string; isBeta?: boolean; + tags?: WidgetTags[]; } export const WidgetOperations = { diff --git a/app/client/src/widgets/ButtonGroupWidget/icon.svg b/app/client/src/widgets/ButtonGroupWidget/icon.svg index 9e40c5f3b7..f7a2e1551b 100644 --- a/app/client/src/widgets/ButtonGroupWidget/icon.svg +++ b/app/client/src/widgets/ButtonGroupWidget/icon.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + + diff --git a/app/client/src/widgets/ButtonGroupWidget/index.ts b/app/client/src/widgets/ButtonGroupWidget/index.ts index 777f81705f..a8e2673b90 100644 --- a/app/client/src/widgets/ButtonGroupWidget/index.ts +++ b/app/client/src/widgets/ButtonGroupWidget/index.ts @@ -8,6 +8,7 @@ import { BlueprintOperationTypes } from "widgets/constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; import type { ButtonGroupWidgetProps } from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), @@ -16,6 +17,7 @@ export const CONFIG = { 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"], + tags: [WIDGET_TAGS.BUTTONS], defaults: { rows: 4, columns: 24, diff --git a/app/client/src/widgets/ButtonWidget/icon.svg b/app/client/src/widgets/ButtonWidget/icon.svg index 9693e6f256..4ab2c2bf20 100644 --- a/app/client/src/widgets/ButtonWidget/icon.svg +++ b/app/client/src/widgets/ButtonWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/ButtonWidget/index.ts b/app/client/src/widgets/ButtonWidget/index.ts index 45d487f558..2e5593744c 100644 --- a/app/client/src/widgets/ButtonWidget/index.ts +++ b/app/client/src/widgets/ButtonWidget/index.ts @@ -5,14 +5,15 @@ import { } from "components/constants"; import { BUTTON_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Button", iconSVG: IconSVG, + tags: [WIDGET_TAGS.BUTTONS], needsMeta: true, searchTags: ["click", "submit"], defaults: { diff --git a/app/client/src/widgets/CameraWidget/icon.svg b/app/client/src/widgets/CameraWidget/icon.svg old mode 100755 new mode 100644 index fd82880c93..f43f27bdde --- a/app/client/src/widgets/CameraWidget/icon.svg +++ b/app/client/src/widgets/CameraWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/CameraWidget/index.ts b/app/client/src/widgets/CameraWidget/index.ts index 7623becfb8..6fbb8da877 100644 --- a/app/client/src/widgets/CameraWidget/index.ts +++ b/app/client/src/widgets/CameraWidget/index.ts @@ -2,11 +2,13 @@ import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { CameraModeTypes } from "./constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Camera", // The display name which will be made in uppercase and show in the widgets panel ( can have spaces ) iconSVG: IconSVG, + tags: [WIDGET_TAGS.EXTERNAL], 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"], diff --git a/app/client/src/widgets/CategorySliderWidget/icon.svg b/app/client/src/widgets/CategorySliderWidget/icon.svg index 404f252df2..e3cc799f5a 100644 --- a/app/client/src/widgets/CategorySliderWidget/icon.svg +++ b/app/client/src/widgets/CategorySliderWidget/icon.svg @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/app/client/src/widgets/CategorySliderWidget/index.ts b/app/client/src/widgets/CategorySliderWidget/index.ts index 782ffb6f60..ef36c6c212 100644 --- a/app/client/src/widgets/CategorySliderWidget/index.ts +++ b/app/client/src/widgets/CategorySliderWidget/index.ts @@ -1,9 +1,9 @@ import { Alignment } from "@blueprintjs/core"; import { LabelPosition } from "components/constants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), @@ -11,6 +11,7 @@ export const CONFIG = { needsMeta: true, searchTags: ["range"], iconSVG: IconSVG, + tags: [WIDGET_TAGS.SLIDERS], defaults: { options: [ { label: "xs", value: "xs" }, diff --git a/app/client/src/widgets/ChartWidget/icon.svg b/app/client/src/widgets/ChartWidget/icon.svg index 99d96c3943..4a7a52081f 100644 --- a/app/client/src/widgets/ChartWidget/icon.svg +++ b/app/client/src/widgets/ChartWidget/icon.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/app/client/src/widgets/ChartWidget/index.ts b/app/client/src/widgets/ChartWidget/index.ts index cca85c6846..486a3d6589 100644 --- a/app/client/src/widgets/ChartWidget/index.ts +++ b/app/client/src/widgets/ChartWidget/index.ts @@ -1,16 +1,17 @@ import { Colors } from "constants/Colors"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import { generateReactKey } from "widgets/WidgetUtils"; import { LabelOrientation } from "./constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Chart", iconSVG: IconSVG, + tags: [WIDGET_TAGS.DISPLAY], needsMeta: true, searchTags: ["graph", "visuals", "visualisations"], defaults: { diff --git a/app/client/src/widgets/CheckboxGroupWidget/icon.svg b/app/client/src/widgets/CheckboxGroupWidget/icon.svg index 41f4be4a23..a0a3a45d85 100644 --- a/app/client/src/widgets/CheckboxGroupWidget/icon.svg +++ b/app/client/src/widgets/CheckboxGroupWidget/icon.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + + diff --git a/app/client/src/widgets/CheckboxGroupWidget/index.ts b/app/client/src/widgets/CheckboxGroupWidget/index.ts index 69ed7038a4..c2b526d1d5 100644 --- a/app/client/src/widgets/CheckboxGroupWidget/index.ts +++ b/app/client/src/widgets/CheckboxGroupWidget/index.ts @@ -1,8 +1,8 @@ import { Alignment } from "@blueprintjs/core"; import { LabelPosition } from "components/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -14,6 +14,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Checkbox Group", iconSVG: IconSVG, + tags: [WIDGET_TAGS.TOGGLES], needsMeta: true, defaults: { rows: 6, diff --git a/app/client/src/widgets/CheckboxWidget/icon.svg b/app/client/src/widgets/CheckboxWidget/icon.svg index c11a95f19d..a56d336f43 100644 --- a/app/client/src/widgets/CheckboxWidget/icon.svg +++ b/app/client/src/widgets/CheckboxWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/CheckboxWidget/index.ts b/app/client/src/widgets/CheckboxWidget/index.ts index bde08937ce..da20f1e752 100644 --- a/app/client/src/widgets/CheckboxWidget/index.ts +++ b/app/client/src/widgets/CheckboxWidget/index.ts @@ -2,9 +2,9 @@ import { LabelPosition } from "components/constants"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { AlignWidgetTypes } from "widgets/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -16,6 +16,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Checkbox", iconSVG: IconSVG, + tags: [WIDGET_TAGS.TOGGLES], needsMeta: true, searchTags: ["boolean"], defaults: { diff --git a/app/client/src/widgets/CodeScannerWidget/icon.svg b/app/client/src/widgets/CodeScannerWidget/icon.svg index 6cc3351836..a0adb33dc3 100644 --- a/app/client/src/widgets/CodeScannerWidget/icon.svg +++ b/app/client/src/widgets/CodeScannerWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/CodeScannerWidget/index.ts b/app/client/src/widgets/CodeScannerWidget/index.ts index cc0daf2bcc..656583cf70 100644 --- a/app/client/src/widgets/CodeScannerWidget/index.ts +++ b/app/client/src/widgets/CodeScannerWidget/index.ts @@ -3,11 +3,13 @@ import Widget from "./widget"; import { ButtonPlacementTypes } from "components/constants"; import { ScannerLayout } from "./constants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Code Scanner", iconSVG: IconSVG, + tags: [WIDGET_TAGS.EXTERNAL], needsMeta: true, searchTags: [ "barcode scanner", diff --git a/app/client/src/widgets/ContainerWidget/icon.svg b/app/client/src/widgets/ContainerWidget/icon.svg index f640b365e1..2fa53849eb 100644 --- a/app/client/src/widgets/ContainerWidget/icon.svg +++ b/app/client/src/widgets/ContainerWidget/icon.svg @@ -1 +1,14 @@ - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/app/client/src/widgets/ContainerWidget/index.ts b/app/client/src/widgets/ContainerWidget/index.ts index b070471e9d..eee14756d8 100644 --- a/app/client/src/widgets/ContainerWidget/index.ts +++ b/app/client/src/widgets/ContainerWidget/index.ts @@ -1,7 +1,11 @@ import { ButtonBoxShadowTypes } from "components/constants"; import { Colors } from "constants/Colors"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; -import { GridDefaults, WidgetHeightLimits } from "constants/WidgetConstants"; +import { + GridDefaults, + WIDGET_TAGS, + WidgetHeightLimits, +} from "constants/WidgetConstants"; import { FlexVerticalAlignment, ResponsiveBehavior, @@ -15,6 +19,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Container", iconSVG: IconSVG, + tags: [WIDGET_TAGS.LAYOUT], isCanvas: true, features: { dynamicHeight: { diff --git a/app/client/src/widgets/CurrencyInputWidget/icon.svg b/app/client/src/widgets/CurrencyInputWidget/icon.svg index cf52885dcd..d723545078 100644 --- a/app/client/src/widgets/CurrencyInputWidget/icon.svg +++ b/app/client/src/widgets/CurrencyInputWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/CurrencyInputWidget/index.ts b/app/client/src/widgets/CurrencyInputWidget/index.ts index da32522a39..dbb54436f0 100644 --- a/app/client/src/widgets/CurrencyInputWidget/index.ts +++ b/app/client/src/widgets/CurrencyInputWidget/index.ts @@ -3,10 +3,10 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { DynamicHeight } from "utils/WidgetFeatures"; import { CONFIG as BaseConfig } from "widgets/BaseInputWidget"; - import { getDefaultCurrency } from "./component/CurrencyCodeDropdown"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -19,6 +19,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Currency Input", iconSVG: IconSVG, + tags: [WIDGET_TAGS.INPUTS], needsMeta: true, searchTags: ["amount", "total"], defaults: { diff --git a/app/client/src/widgets/DatePickerWidget2/icon.svg b/app/client/src/widgets/DatePickerWidget2/icon.svg index 34c6eb2658..5ed7be4cb4 100644 --- a/app/client/src/widgets/DatePickerWidget2/icon.svg +++ b/app/client/src/widgets/DatePickerWidget2/icon.svg @@ -1 +1,12 @@ - \ No newline at end of file + + + + + + + + + + + + diff --git a/app/client/src/widgets/DatePickerWidget2/index.ts b/app/client/src/widgets/DatePickerWidget2/index.ts index 3d09c11aa6..2d6df97373 100644 --- a/app/client/src/widgets/DatePickerWidget2/index.ts +++ b/app/client/src/widgets/DatePickerWidget2/index.ts @@ -4,10 +4,10 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import moment from "moment"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { DynamicHeight } from "utils/WidgetFeatures"; - import { TimePrecision } from "./constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -20,6 +20,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "DatePicker", iconSVG: IconSVG, + tags: [WIDGET_TAGS.INPUTS], needsMeta: true, searchTags: ["calendar"], defaults: { diff --git a/app/client/src/widgets/DividerWidget/icon.svg b/app/client/src/widgets/DividerWidget/icon.svg index 50ead98217..01a001920d 100644 --- a/app/client/src/widgets/DividerWidget/icon.svg +++ b/app/client/src/widgets/DividerWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/DividerWidget/index.ts b/app/client/src/widgets/DividerWidget/index.ts index fab597e67b..0c9e5fdc75 100644 --- a/app/client/src/widgets/DividerWidget/index.ts +++ b/app/client/src/widgets/DividerWidget/index.ts @@ -1,14 +1,15 @@ import { Colors } from "constants/Colors"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Divider", iconSVG: IconSVG, + tags: [WIDGET_TAGS.LAYOUT], searchTags: ["line"], defaults: { rows: 4, diff --git a/app/client/src/widgets/DocumentViewerWidget/icon.svg b/app/client/src/widgets/DocumentViewerWidget/icon.svg index 3e55ae9a89..c653707541 100644 --- a/app/client/src/widgets/DocumentViewerWidget/icon.svg +++ b/app/client/src/widgets/DocumentViewerWidget/icon.svg @@ -1 +1,6 @@ - \ No newline at end of file + + + + + + diff --git a/app/client/src/widgets/DocumentViewerWidget/index.ts b/app/client/src/widgets/DocumentViewerWidget/index.ts index 12453f71fe..c59e5cb9d0 100644 --- a/app/client/src/widgets/DocumentViewerWidget/index.ts +++ b/app/client/src/widgets/DocumentViewerWidget/index.ts @@ -2,6 +2,7 @@ import { ResponsiveBehavior } from "utils/autoLayout/constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; import { isAirgapped } from "@appsmith/utils/airgapHelpers"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; const isAirgappedInstance = isAirgapped(); @@ -9,6 +10,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Document Viewer", // The display name which will be made in uppercase and show in the widgets panel ( can have spaces ) iconSVG: IconSVG, + tags: [WIDGET_TAGS.MEDIA], 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"], diff --git a/app/client/src/widgets/FilePickerWidgetV2/icon.svg b/app/client/src/widgets/FilePickerWidgetV2/icon.svg index efa2c15d91..4c70beb61c 100644 --- a/app/client/src/widgets/FilePickerWidgetV2/icon.svg +++ b/app/client/src/widgets/FilePickerWidgetV2/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/FilePickerWidgetV2/index.ts b/app/client/src/widgets/FilePickerWidgetV2/index.ts index b2c069bdf7..2af2a05718 100644 --- a/app/client/src/widgets/FilePickerWidgetV2/index.ts +++ b/app/client/src/widgets/FilePickerWidgetV2/index.ts @@ -1,14 +1,15 @@ import { BUTTON_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import FileDataTypes from "./constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "FilePicker", iconSVG: IconSVG, + tags: [WIDGET_TAGS.INPUTS], needsMeta: true, searchTags: ["upload"], defaults: { diff --git a/app/client/src/widgets/FormWidget/icon.svg b/app/client/src/widgets/FormWidget/icon.svg index f531012a99..3be596da65 100644 --- a/app/client/src/widgets/FormWidget/icon.svg +++ b/app/client/src/widgets/FormWidget/icon.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + + diff --git a/app/client/src/widgets/FormWidget/index.ts b/app/client/src/widgets/FormWidget/index.ts index b3da849112..92899aa828 100644 --- a/app/client/src/widgets/FormWidget/index.ts +++ b/app/client/src/widgets/FormWidget/index.ts @@ -1,7 +1,7 @@ import { ButtonVariantTypes, RecaptchaTypes } from "components/constants"; import { Colors } from "constants/Colors"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; -import { GridDefaults } from "constants/WidgetConstants"; +import { GridDefaults, WIDGET_TAGS } from "constants/WidgetConstants"; import get from "lodash/get"; import type { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; import type { FlexLayer } from "utils/autoLayout/autoLayoutTypes"; @@ -22,6 +22,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Form", iconSVG: IconSVG, + tags: [WIDGET_TAGS.LAYOUT], needsMeta: true, isCanvas: true, features: { diff --git a/app/client/src/widgets/IconButtonWidget/icon.svg b/app/client/src/widgets/IconButtonWidget/icon.svg index c858edda82..5a7a953e1a 100644 --- a/app/client/src/widgets/IconButtonWidget/icon.svg +++ b/app/client/src/widgets/IconButtonWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/IconButtonWidget/index.ts b/app/client/src/widgets/IconButtonWidget/index.ts index 7477c33660..b4fdda362e 100644 --- a/app/client/src/widgets/IconButtonWidget/index.ts +++ b/app/client/src/widgets/IconButtonWidget/index.ts @@ -4,11 +4,13 @@ import { ICON_BUTTON_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Icon button", iconSVG: IconSVG, + tags: [WIDGET_TAGS.BUTTONS], searchTags: ["click", "submit"], defaults: { iconName: IconNames.PLUS, diff --git a/app/client/src/widgets/IframeWidget/icon.svg b/app/client/src/widgets/IframeWidget/icon.svg index 191660a4c8..2fa18b72d0 100644 --- a/app/client/src/widgets/IframeWidget/icon.svg +++ b/app/client/src/widgets/IframeWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/IframeWidget/index.ts b/app/client/src/widgets/IframeWidget/index.ts index d952a90287..1d06e97e58 100644 --- a/app/client/src/widgets/IframeWidget/index.ts +++ b/app/client/src/widgets/IframeWidget/index.ts @@ -2,6 +2,7 @@ import { ResponsiveBehavior } from "utils/autoLayout/constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; import { isAirgapped } from "@appsmith/utils/airgapHelpers"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; const isAirgappedInstance = isAirgapped(); @@ -13,6 +14,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Iframe", iconSVG: IconSVG, + tags: [WIDGET_TAGS.DISPLAY], needsMeta: true, searchTags: ["embed"], defaults: { diff --git a/app/client/src/widgets/ImageWidget/icon.svg b/app/client/src/widgets/ImageWidget/icon.svg index d31a19152f..326ddedaff 100644 --- a/app/client/src/widgets/ImageWidget/icon.svg +++ b/app/client/src/widgets/ImageWidget/icon.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/app/client/src/widgets/ImageWidget/index.ts b/app/client/src/widgets/ImageWidget/index.ts index 6c9654c591..50839a7fab 100644 --- a/app/client/src/widgets/ImageWidget/index.ts +++ b/app/client/src/widgets/ImageWidget/index.ts @@ -2,11 +2,13 @@ import { ASSETS_CDN_URL } from "constants/ThirdPartyConstants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Image", iconSVG: IconSVG, + tags: [WIDGET_TAGS.MEDIA], defaults: { defaultImage: getAssetUrl(`${ASSETS_CDN_URL}/widgets/default.png`), imageShape: "RECTANGLE", diff --git a/app/client/src/widgets/InputWidgetV2/icon.svg b/app/client/src/widgets/InputWidgetV2/icon.svg index 0a1b6d938f..d0b51d3c4c 100644 --- a/app/client/src/widgets/InputWidgetV2/icon.svg +++ b/app/client/src/widgets/InputWidgetV2/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/InputWidgetV2/index.ts b/app/client/src/widgets/InputWidgetV2/index.ts index d67f93f220..a6280f4e69 100644 --- a/app/client/src/widgets/InputWidgetV2/index.ts +++ b/app/client/src/widgets/InputWidgetV2/index.ts @@ -7,6 +7,7 @@ import type { BaseInputWidgetProps } from "widgets/BaseInputWidget/widget"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -19,6 +20,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Input", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SUGGESTED_WIDGETS, WIDGET_TAGS.INPUTS], needsMeta: true, searchTags: ["form", "text input", "number", "textarea"], defaults: { diff --git a/app/client/src/widgets/JSONFormWidget/icon.svg b/app/client/src/widgets/JSONFormWidget/icon.svg index 31b0490f7c..0f8c2b8e39 100644 --- a/app/client/src/widgets/JSONFormWidget/icon.svg +++ b/app/client/src/widgets/JSONFormWidget/icon.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + + diff --git a/app/client/src/widgets/JSONFormWidget/index.ts b/app/client/src/widgets/JSONFormWidget/index.ts index 6a00d0a192..16f784650f 100644 --- a/app/client/src/widgets/JSONFormWidget/index.ts +++ b/app/client/src/widgets/JSONFormWidget/index.ts @@ -8,6 +8,7 @@ import { BlueprintOperationTypes } from "widgets/constants"; import IconSVG from "./icon.svg"; import type { JSONFormWidgetProps } from "./widget"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; const SUBMIT_BUTTON_DEFAULT_STYLES = { buttonVariant: ButtonVariantTypes.PRIMARY, @@ -28,6 +29,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "JSON Form", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SUGGESTED_WIDGETS, WIDGET_TAGS.LAYOUT], needsMeta: true, defaults: { responsiveBehavior: ResponsiveBehavior.Fill, diff --git a/app/client/src/widgets/ListWidgetV2/icon.svg b/app/client/src/widgets/ListWidgetV2/icon.svg index 30a7889027..dfc7c7458f 100644 --- a/app/client/src/widgets/ListWidgetV2/icon.svg +++ b/app/client/src/widgets/ListWidgetV2/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/ListWidgetV2/index.ts b/app/client/src/widgets/ListWidgetV2/index.ts index 5cf58099f0..fdd468cf07 100644 --- a/app/client/src/widgets/ListWidgetV2/index.ts +++ b/app/client/src/widgets/ListWidgetV2/index.ts @@ -12,7 +12,7 @@ import { } from "./widget/helper"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { getWidgetBluePrintUpdates } from "utils/WidgetBlueprintUtils"; -import { GridDefaults } from "constants/WidgetConstants"; +import { GridDefaults, WIDGET_TAGS } from "constants/WidgetConstants"; import type { FlexLayer } from "utils/autoLayout/autoLayoutTypes"; import type { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; import { @@ -48,6 +48,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "List", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SUGGESTED_WIDGETS, WIDGET_TAGS.DISPLAY], needsMeta: true, isCanvas: true, defaults: { diff --git a/app/client/src/widgets/MapChartWidget/icon.svg b/app/client/src/widgets/MapChartWidget/icon.svg old mode 100755 new mode 100644 index 3dd1187871..9a46c04656 --- a/app/client/src/widgets/MapChartWidget/icon.svg +++ b/app/client/src/widgets/MapChartWidget/icon.svg @@ -1 +1,6 @@ - \ No newline at end of file + + + + + + diff --git a/app/client/src/widgets/MapChartWidget/index.ts b/app/client/src/widgets/MapChartWidget/index.ts index 5ca523df7b..608afba08c 100644 --- a/app/client/src/widgets/MapChartWidget/index.ts +++ b/app/client/src/widgets/MapChartWidget/index.ts @@ -1,14 +1,15 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import { dataSetForWorld, MapTypes } from "./constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Map Chart", // The display name which will be made in uppercase and show in the widgets panel ( can have spaces ) iconSVG: IconSVG, + tags: [WIDGET_TAGS.DISPLAY], 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"], diff --git a/app/client/src/widgets/MapWidget/icon.svg b/app/client/src/widgets/MapWidget/icon.svg index fd3273cdd8..ffb0542f32 100644 --- a/app/client/src/widgets/MapWidget/icon.svg +++ b/app/client/src/widgets/MapWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/MapWidget/index.ts b/app/client/src/widgets/MapWidget/index.ts index 059d323999..86b4dc2218 100644 --- a/app/client/src/widgets/MapWidget/index.ts +++ b/app/client/src/widgets/MapWidget/index.ts @@ -1,13 +1,14 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Map", iconSVG: IconSVG, + tags: [WIDGET_TAGS.CONTENT], needsMeta: true, defaults: { rows: 40, diff --git a/app/client/src/widgets/MenuButtonWidget/icon.svg b/app/client/src/widgets/MenuButtonWidget/icon.svg index dcf2c1c012..96b9ef06d9 100644 --- a/app/client/src/widgets/MenuButtonWidget/icon.svg +++ b/app/client/src/widgets/MenuButtonWidget/icon.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/app/client/src/widgets/MenuButtonWidget/index.ts b/app/client/src/widgets/MenuButtonWidget/index.ts index 90d7400b5d..ddb6448b4f 100644 --- a/app/client/src/widgets/MenuButtonWidget/index.ts +++ b/app/client/src/widgets/MenuButtonWidget/index.ts @@ -2,11 +2,13 @@ import Widget from "./widget"; import IconSVG from "./icon.svg"; import { ButtonPlacementTypes, ButtonVariantTypes } from "components/constants"; import { MenuItemsSource } from "./constants"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Menu button", iconSVG: IconSVG, + tags: [WIDGET_TAGS.BUTTONS], defaults: { label: "Open Menu", menuVariant: ButtonVariantTypes.PRIMARY, diff --git a/app/client/src/widgets/ModalWidget/icon.svg b/app/client/src/widgets/ModalWidget/icon.svg index f0cc7fcc1b..f805488be7 100644 --- a/app/client/src/widgets/ModalWidget/icon.svg +++ b/app/client/src/widgets/ModalWidget/icon.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/app/client/src/widgets/ModalWidget/index.ts b/app/client/src/widgets/ModalWidget/index.ts index d525eda785..b50956e413 100644 --- a/app/client/src/widgets/ModalWidget/index.ts +++ b/app/client/src/widgets/ModalWidget/index.ts @@ -4,11 +4,10 @@ import { ButtonBorderRadiusTypes, ButtonVariantTypes, } from "components/constants"; -import { GridDefaults } from "constants/WidgetConstants"; +import { GridDefaults, WIDGET_TAGS } from "constants/WidgetConstants"; import type { WidgetProps } from "widgets/BaseWidget"; import type { FlattenedWidgetProps } from "widgets/constants"; import { BlueprintOperationTypes } from "widgets/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; import type { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; @@ -27,6 +26,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Modal", iconSVG: IconSVG, + tags: [WIDGET_TAGS.LAYOUT], needsMeta: true, isCanvas: true, features: { diff --git a/app/client/src/widgets/MultiSelectTreeWidget/icon.svg b/app/client/src/widgets/MultiSelectTreeWidget/icon.svg index 6070abfb26..8f1d1bb2b5 100644 --- a/app/client/src/widgets/MultiSelectTreeWidget/icon.svg +++ b/app/client/src/widgets/MultiSelectTreeWidget/icon.svg @@ -1 +1,8 @@ - \ No newline at end of file + + + + + + + + diff --git a/app/client/src/widgets/MultiSelectTreeWidget/index.ts b/app/client/src/widgets/MultiSelectTreeWidget/index.ts index b37a9e116d..c113f9aa4a 100644 --- a/app/client/src/widgets/MultiSelectTreeWidget/index.ts +++ b/app/client/src/widgets/MultiSelectTreeWidget/index.ts @@ -3,9 +3,9 @@ import { LabelPosition } from "components/constants"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { DynamicHeight } from "utils/WidgetFeatures"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -18,6 +18,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Multi TreeSelect", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SELECT], needsMeta: true, searchTags: ["dropdown", "multiselecttree"], defaults: { diff --git a/app/client/src/widgets/MultiSelectWidgetV2/icon.svg b/app/client/src/widgets/MultiSelectWidgetV2/icon.svg index 1e067f7c8a..616b798288 100644 --- a/app/client/src/widgets/MultiSelectWidgetV2/icon.svg +++ b/app/client/src/widgets/MultiSelectWidgetV2/icon.svg @@ -1 +1,10 @@ - \ No newline at end of file + + + + + + + + + + diff --git a/app/client/src/widgets/MultiSelectWidgetV2/index.ts b/app/client/src/widgets/MultiSelectWidgetV2/index.ts index a4ee15ef09..36be5e3db7 100644 --- a/app/client/src/widgets/MultiSelectWidgetV2/index.ts +++ b/app/client/src/widgets/MultiSelectWidgetV2/index.ts @@ -3,9 +3,9 @@ import { LabelPosition } from "components/constants"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { DynamicHeight } from "utils/WidgetFeatures"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -18,6 +18,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "MultiSelect", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SELECT], needsMeta: true, searchTags: ["dropdown", "tags"], defaults: { diff --git a/app/client/src/widgets/NumberSliderWidget/icon.svg b/app/client/src/widgets/NumberSliderWidget/icon.svg index b9152342c6..16f934c8b2 100644 --- a/app/client/src/widgets/NumberSliderWidget/icon.svg +++ b/app/client/src/widgets/NumberSliderWidget/icon.svg @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/app/client/src/widgets/NumberSliderWidget/index.ts b/app/client/src/widgets/NumberSliderWidget/index.ts index 2ae47fc308..141eb77dcd 100644 --- a/app/client/src/widgets/NumberSliderWidget/index.ts +++ b/app/client/src/widgets/NumberSliderWidget/index.ts @@ -1,9 +1,9 @@ import { Alignment } from "@blueprintjs/core"; import { LabelPosition } from "components/constants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), @@ -11,6 +11,7 @@ export const CONFIG = { needsMeta: true, searchTags: ["range"], iconSVG: IconSVG, + tags: [WIDGET_TAGS.SLIDERS], defaults: { min: 0, max: 100, diff --git a/app/client/src/widgets/PhoneInputWidget/icon.svg b/app/client/src/widgets/PhoneInputWidget/icon.svg index ef98535fdf..082afc9dde 100644 --- a/app/client/src/widgets/PhoneInputWidget/icon.svg +++ b/app/client/src/widgets/PhoneInputWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/PhoneInputWidget/index.ts b/app/client/src/widgets/PhoneInputWidget/index.ts index 7217ab5ed1..5ee0ec5b77 100644 --- a/app/client/src/widgets/PhoneInputWidget/index.ts +++ b/app/client/src/widgets/PhoneInputWidget/index.ts @@ -3,10 +3,10 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { DynamicHeight } from "utils/WidgetFeatures"; import { CONFIG as BaseConfig } from "widgets/BaseInputWidget"; - import { getDefaultISDCode } from "./component/ISDCodeDropdown"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -19,6 +19,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Phone Input", iconSVG: IconSVG, + tags: [WIDGET_TAGS.INPUTS], needsMeta: true, searchTags: ["call"], defaults: { diff --git a/app/client/src/widgets/ProgressWidget/icon.svg b/app/client/src/widgets/ProgressWidget/icon.svg index c44feb9613..78063d6c8e 100644 --- a/app/client/src/widgets/ProgressWidget/icon.svg +++ b/app/client/src/widgets/ProgressWidget/icon.svg @@ -1 +1,8 @@ - \ No newline at end of file + + + + + + + + diff --git a/app/client/src/widgets/ProgressWidget/index.ts b/app/client/src/widgets/ProgressWidget/index.ts index 67aa3c3fc3..eed53631bb 100644 --- a/app/client/src/widgets/ProgressWidget/index.ts +++ b/app/client/src/widgets/ProgressWidget/index.ts @@ -3,11 +3,13 @@ import IconSVG from "./icon.svg"; import { ProgressType } from "./constants"; import { Colors } from "constants/Colors"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Progress", // The display name which will be made in uppercase and show in the widgets panel ( can have spaces ) iconSVG: IconSVG, + tags: [WIDGET_TAGS.CONTENT], 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"], diff --git a/app/client/src/widgets/RadioGroupWidget/icon.svg b/app/client/src/widgets/RadioGroupWidget/icon.svg index d37974e2cc..5a03e7ef7f 100644 --- a/app/client/src/widgets/RadioGroupWidget/icon.svg +++ b/app/client/src/widgets/RadioGroupWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/RadioGroupWidget/index.ts b/app/client/src/widgets/RadioGroupWidget/index.ts index 65c896d855..2064dcec98 100644 --- a/app/client/src/widgets/RadioGroupWidget/index.ts +++ b/app/client/src/widgets/RadioGroupWidget/index.ts @@ -1,13 +1,14 @@ import { Alignment } from "@blueprintjs/core"; import { LabelPosition } from "components/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Radio Group", iconSVG: IconSVG, + tags: [WIDGET_TAGS.TOGGLES], needsMeta: true, features: { dynamicHeight: { diff --git a/app/client/src/widgets/RangeSliderWidget/icon.svg b/app/client/src/widgets/RangeSliderWidget/icon.svg index 1217360de9..e975db3e75 100644 --- a/app/client/src/widgets/RangeSliderWidget/icon.svg +++ b/app/client/src/widgets/RangeSliderWidget/icon.svg @@ -1,7 +1,7 @@ - - - - - - + + + + + + diff --git a/app/client/src/widgets/RangeSliderWidget/index.ts b/app/client/src/widgets/RangeSliderWidget/index.ts index 115d7f4ffe..e721f9b0f6 100644 --- a/app/client/src/widgets/RangeSliderWidget/index.ts +++ b/app/client/src/widgets/RangeSliderWidget/index.ts @@ -1,15 +1,16 @@ import { Alignment } from "@blueprintjs/core"; import { LabelPosition } from "components/constants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Range Slider", needsMeta: true, iconSVG: IconSVG, + tags: [WIDGET_TAGS.SLIDERS], defaults: { min: 0, max: 100, diff --git a/app/client/src/widgets/RateWidget/icon.svg b/app/client/src/widgets/RateWidget/icon.svg index 5983aec8d1..f37964d7fa 100644 --- a/app/client/src/widgets/RateWidget/icon.svg +++ b/app/client/src/widgets/RateWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/RateWidget/index.ts b/app/client/src/widgets/RateWidget/index.ts index 15007fd5f2..b69c83b4db 100644 --- a/app/client/src/widgets/RateWidget/index.ts +++ b/app/client/src/widgets/RateWidget/index.ts @@ -2,6 +2,7 @@ import { Colors } from "constants/Colors"; import IconSVG from "./icon.svg"; import Widget from "./widget"; import type { RateWidgetProps } from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -13,6 +14,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Rating", iconSVG: IconSVG, + tags: [WIDGET_TAGS.CONTENT], needsMeta: true, searchTags: ["stars"], defaults: { diff --git a/app/client/src/widgets/RichTextEditorWidget/icon.svg b/app/client/src/widgets/RichTextEditorWidget/icon.svg index e156dc53f6..34be522764 100644 --- a/app/client/src/widgets/RichTextEditorWidget/icon.svg +++ b/app/client/src/widgets/RichTextEditorWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/RichTextEditorWidget/index.ts b/app/client/src/widgets/RichTextEditorWidget/index.ts index 29d77cacec..92afa75f3a 100644 --- a/app/client/src/widgets/RichTextEditorWidget/index.ts +++ b/app/client/src/widgets/RichTextEditorWidget/index.ts @@ -3,14 +3,15 @@ import { LabelPosition } from "components/constants"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { DynamicHeight } from "utils/WidgetFeatures"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Rich Text Editor", iconSVG: IconSVG, + tags: [WIDGET_TAGS.INPUTS], needsMeta: true, searchTags: ["input", "rte"], features: { diff --git a/app/client/src/widgets/SelectWidget/icon.svg b/app/client/src/widgets/SelectWidget/icon.svg index 76103d58e5..2f000394a4 100644 --- a/app/client/src/widgets/SelectWidget/icon.svg +++ b/app/client/src/widgets/SelectWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/SelectWidget/index.ts b/app/client/src/widgets/SelectWidget/index.ts index 1b2bc749df..56fa1beb54 100644 --- a/app/client/src/widgets/SelectWidget/index.ts +++ b/app/client/src/widgets/SelectWidget/index.ts @@ -6,6 +6,7 @@ import { DynamicHeight } from "utils/WidgetFeatures"; import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -18,6 +19,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Select", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SUGGESTED_WIDGETS, WIDGET_TAGS.SELECT], needsMeta: true, searchTags: ["dropdown"], defaults: { diff --git a/app/client/src/widgets/SingleSelectTreeWidget/icon.svg b/app/client/src/widgets/SingleSelectTreeWidget/icon.svg index 76103d58e5..2f000394a4 100644 --- a/app/client/src/widgets/SingleSelectTreeWidget/icon.svg +++ b/app/client/src/widgets/SingleSelectTreeWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/SingleSelectTreeWidget/index.ts b/app/client/src/widgets/SingleSelectTreeWidget/index.ts index 140b0b28d0..ff70d5e876 100644 --- a/app/client/src/widgets/SingleSelectTreeWidget/index.ts +++ b/app/client/src/widgets/SingleSelectTreeWidget/index.ts @@ -3,9 +3,9 @@ import { LabelPosition } from "components/constants"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { DynamicHeight } from "utils/WidgetFeatures"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -19,6 +19,7 @@ export const CONFIG = { name: "TreeSelect", searchTags: ["dropdown", "singleselecttree"], iconSVG: IconSVG, + tags: [WIDGET_TAGS.SELECT], needsMeta: true, defaults: { rows: 7, diff --git a/app/client/src/widgets/StatboxWidget/icon.svg b/app/client/src/widgets/StatboxWidget/icon.svg index 91f1ccc011..59ea1a42e9 100644 --- a/app/client/src/widgets/StatboxWidget/icon.svg +++ b/app/client/src/widgets/StatboxWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/StatboxWidget/index.ts b/app/client/src/widgets/StatboxWidget/index.ts index 54f9edb62b..d8972e258c 100644 --- a/app/client/src/widgets/StatboxWidget/index.ts +++ b/app/client/src/widgets/StatboxWidget/index.ts @@ -5,9 +5,8 @@ import { Positioning, ResponsiveBehavior, } from "utils/autoLayout/constants"; -import { GridDefaults } from "constants/WidgetConstants"; +import { GridDefaults, WIDGET_TAGS } from "constants/WidgetConstants"; import type { WidgetProps } from "widgets/BaseWidget"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; import type { FlattenedWidgetProps } from "widgets/constants"; @@ -28,6 +27,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Stats Box", iconSVG: IconSVG, + tags: [WIDGET_TAGS.DISPLAY], needsMeta: true, searchTags: ["statbox"], isCanvas: true, diff --git a/app/client/src/widgets/SwitchGroupWidget/icon.svg b/app/client/src/widgets/SwitchGroupWidget/icon.svg old mode 100755 new mode 100644 index e54e2cfb73..7c7ac4a9e8 --- a/app/client/src/widgets/SwitchGroupWidget/icon.svg +++ b/app/client/src/widgets/SwitchGroupWidget/icon.svg @@ -1 +1,9 @@ - \ No newline at end of file + + + + + + + + + diff --git a/app/client/src/widgets/SwitchGroupWidget/index.ts b/app/client/src/widgets/SwitchGroupWidget/index.ts index 503b38a3e5..6b3da47a40 100644 --- a/app/client/src/widgets/SwitchGroupWidget/index.ts +++ b/app/client/src/widgets/SwitchGroupWidget/index.ts @@ -1,8 +1,8 @@ import { Alignment } from "@blueprintjs/core"; import { LabelPosition } from "components/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -14,6 +14,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Switch Group", // The display name which will be made in uppercase and show in the widgets panel ( can have spaces ) iconSVG: IconSVG, + tags: [WIDGET_TAGS.TOGGLES], 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 defaults: { diff --git a/app/client/src/widgets/SwitchWidget/icon.svg b/app/client/src/widgets/SwitchWidget/icon.svg index 758b098d6c..7956f14c73 100644 --- a/app/client/src/widgets/SwitchWidget/icon.svg +++ b/app/client/src/widgets/SwitchWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/SwitchWidget/index.ts b/app/client/src/widgets/SwitchWidget/index.ts index 25fcb9394b..5a901a812b 100644 --- a/app/client/src/widgets/SwitchWidget/index.ts +++ b/app/client/src/widgets/SwitchWidget/index.ts @@ -1,9 +1,9 @@ import { LabelPosition } from "components/constants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { AlignWidgetTypes } from "widgets/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { features: { @@ -15,6 +15,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Switch", iconSVG: IconSVG, + tags: [WIDGET_TAGS.TOGGLES], needsMeta: true, searchTags: ["boolean"], defaults: { diff --git a/app/client/src/widgets/TableWidgetV2/icon.svg b/app/client/src/widgets/TableWidgetV2/icon.svg index 03b6cb5841..b295ad0a34 100644 --- a/app/client/src/widgets/TableWidgetV2/icon.svg +++ b/app/client/src/widgets/TableWidgetV2/icon.svg @@ -1 +1,7 @@ - \ No newline at end of file + + + + + + + diff --git a/app/client/src/widgets/TableWidgetV2/index.ts b/app/client/src/widgets/TableWidgetV2/index.ts index 61b9813f9b..1af42c05fb 100644 --- a/app/client/src/widgets/TableWidgetV2/index.ts +++ b/app/client/src/widgets/TableWidgetV2/index.ts @@ -10,11 +10,13 @@ import type { WidgetQueryConfig, WidgetQueryGenerationFormConfig, } from "WidgetQueryGenerators/types"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Table", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SUGGESTED_WIDGETS, WIDGET_TAGS.DISPLAY], needsMeta: true, needsHeightForContent: true, defaults: { diff --git a/app/client/src/widgets/TabsWidget/icon.svg b/app/client/src/widgets/TabsWidget/icon.svg index 5c0317ba43..1710a90782 100644 --- a/app/client/src/widgets/TabsWidget/icon.svg +++ b/app/client/src/widgets/TabsWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/TabsWidget/index.ts b/app/client/src/widgets/TabsWidget/index.ts index 833b53a4bf..779db046fe 100644 --- a/app/client/src/widgets/TabsWidget/index.ts +++ b/app/client/src/widgets/TabsWidget/index.ts @@ -1,10 +1,13 @@ import { Positioning, ResponsiveBehavior } from "utils/autoLayout/constants"; import { Colors } from "constants/Colors"; import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; -import { GridDefaults, WidgetHeightLimits } from "constants/WidgetConstants"; +import { + GridDefaults, + WIDGET_TAGS, + WidgetHeightLimits, +} from "constants/WidgetConstants"; import type { WidgetProps } from "widgets/BaseWidget"; import { BlueprintOperationTypes } from "widgets/constants"; - import IconSVG from "./icon.svg"; import Widget from "./widget"; @@ -12,6 +15,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Tabs", iconSVG: IconSVG, + tags: [WIDGET_TAGS.LAYOUT], needsMeta: true, isCanvas: true, // TODO(abhinav): Default config like these are not serializable diff --git a/app/client/src/widgets/TextWidget/icon.svg b/app/client/src/widgets/TextWidget/icon.svg index 1ec6fd41ce..a4058c4d93 100644 --- a/app/client/src/widgets/TextWidget/icon.svg +++ b/app/client/src/widgets/TextWidget/icon.svg @@ -1 +1,3 @@ - \ No newline at end of file + + + diff --git a/app/client/src/widgets/TextWidget/index.ts b/app/client/src/widgets/TextWidget/index.ts index fd4a7f79b0..439fb19a0d 100644 --- a/app/client/src/widgets/TextWidget/index.ts +++ b/app/client/src/widgets/TextWidget/index.ts @@ -1,5 +1,5 @@ import { FILL_WIDGET_MIN_WIDTH } from "constants/minWidthConstants"; -import { DEFAULT_FONT_SIZE } from "constants/WidgetConstants"; +import { DEFAULT_FONT_SIZE, WIDGET_TAGS } from "constants/WidgetConstants"; import { ResponsiveBehavior } from "utils/autoLayout/constants"; import { OverflowTypes } from "./constants"; import IconSVG from "./icon.svg"; @@ -21,6 +21,7 @@ export const CONFIG = { type: Widget.getWidgetType(), name: "Text", iconSVG: IconSVG, + tags: [WIDGET_TAGS.SUGGESTED_WIDGETS, WIDGET_TAGS.CONTENT], searchTags: ["typography", "paragraph", "label"], defaults: { text: "Hello {{appsmith.user.name || appsmith.user.email}}", diff --git a/app/client/src/widgets/VideoWidget/icon.svg b/app/client/src/widgets/VideoWidget/icon.svg index 3b1de8947c..0bd8a81ab6 100644 --- a/app/client/src/widgets/VideoWidget/icon.svg +++ b/app/client/src/widgets/VideoWidget/icon.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/app/client/src/widgets/VideoWidget/index.ts b/app/client/src/widgets/VideoWidget/index.ts index fdb63f8172..23703202a4 100644 --- a/app/client/src/widgets/VideoWidget/index.ts +++ b/app/client/src/widgets/VideoWidget/index.ts @@ -3,11 +3,13 @@ import { ResponsiveBehavior } from "utils/autoLayout/constants"; import IconSVG from "./icon.svg"; import Widget from "./widget"; import { getAssetUrl } from "@appsmith/utils/airgapHelpers"; +import { WIDGET_TAGS } from "constants/WidgetConstants"; export const CONFIG = { type: Widget.getWidgetType(), name: "Video", iconSVG: IconSVG, + tags: [WIDGET_TAGS.MEDIA], needsMeta: true, searchTags: ["youtube"], defaults: { diff --git a/app/client/src/widgets/constants.ts b/app/client/src/widgets/constants.ts index 9c5e60c5ab..94fdcd9ff3 100644 --- a/app/client/src/widgets/constants.ts +++ b/app/client/src/widgets/constants.ts @@ -1,6 +1,7 @@ import { IconNames } from "@blueprintjs/icons"; import type { Theme } from "constants/DefaultTheme"; import type { PropertyPaneConfig } from "constants/PropertyControlConstants"; +import type { WidgetTags } from "constants/WidgetConstants"; import { WIDGET_STATIC_PROPS } from "constants/WidgetConstants"; import type { Stylesheet } from "entities/AppTheming"; import { omit } from "lodash"; @@ -62,6 +63,7 @@ export interface WidgetConfiguration { features?: WidgetFeatures; canvasHeightOffset?: (props: WidgetProps) => number; searchTags?: string[]; + tags?: WidgetTags[]; needsHeightForContent?: boolean; properties: { config?: PropertyPaneConfig[]; diff --git a/app/client/yarn.lock b/app/client/yarn.lock index e3b4eae8ff..6054e01c72 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -9660,7 +9660,7 @@ __metadata: cypress-xpath: ^1.6.0 dayjs: ^1.10.6 deep-diff: ^1.0.2 - design-system: "npm:@appsmithorg/design-system@2.1.16" + design-system: "npm:@appsmithorg/design-system@2.1.17" design-system-old: "npm:@appsmithorg/design-system-old@1.1.11" diff: ^5.0.0 dotenv: ^8.1.0 @@ -13735,9 +13735,9 @@ __metadata: languageName: node linkType: hard -"design-system@npm:@appsmithorg/design-system@2.1.16": - version: 2.1.16 - resolution: "@appsmithorg/design-system@npm:2.1.16" +"design-system@npm:@appsmithorg/design-system@2.1.17": + version: 2.1.17 + resolution: "@appsmithorg/design-system@npm:2.1.17" dependencies: "@radix-ui/react-dialog": ^1.0.2 "@radix-ui/react-dropdown-menu": ^2.0.4 @@ -13762,7 +13762,7 @@ __metadata: react-dom: ^17.0.2 react-router-dom: ^5.0.0 styled-components: ^5.3.6 - checksum: 240eef526e8021a0f146430e89f1983e2e125d2a74835326240afcf72e1f4ee41d941f2fd2499345dff3cc9c603c2180971c079b78aeddc3c2a04cdcda96c433 + checksum: d53278dbe53c0a827f1778851b41f9d84565a502fc99e192b9b312908061943aecfae523e3bc2c044d56997af650ac437b06083edc0d58ce58fe16b808d10391 languageName: node linkType: hard