Skip to content

Conversation

pd-redis
Copy link
Collaborator

Rearrange and Rename Base Components (RI-7231)

Summary

This PR reorganizes and renames custom components in the base directory to improve consistency and maintainability. The implementation standardizes naming conventions and export patterns across the codebase.

Changes

  • Renamed components with consistent 'Ri' prefix (e.g., RiText, RiPopover, RiTooltip)
  • Reorganized directory structure for better component categorization
  • Updated exports from base components (layout, text, tooltip, shared, popover, link)
  • Added GlobalStyle theme component for consistent theming and CSS variables
  • Standardized styling approach using styled-components
  • Updated component imports across the application to use the new structure
  • Fixed tests to accommodate the renamed components

Why

This change improves code organization and maintainability by:

  • Establishing consistent naming conventions for custom components
  • Creating a more intuitive directory structure
  • Centralizing theme variables through GlobalStyle
  • Making component imports more consistent throughout the application

Testing

  • Updated and fixed affected tests to work with the renamed components
  • Verified that all components render correctly with the new structure

pd-redis added 30 commits May 7, 2025 12:28
# Conflicts:
#	redisinsight/ui/src/components/connectivity-error/ConnectivityError.tsx
#	redisinsight/ui/src/components/inline-item-editor/InlineItemEditor.tsx
#	redisinsight/ui/src/components/item-list/components/delete-action/DeleteAction.tsx
#	redisinsight/ui/src/components/item-list/components/export-action/ExportAction.tsx
#	redisinsight/ui/src/components/query/query-actions/QueryActions.tsx
#	redisinsight/ui/src/components/query/query-card/QueryCardHeader/QueryCardHeader.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyHash/AddKeyHash.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyList/AddKeyList.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyReJSON/AddKeyReJSON.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeySet/AddKeySet.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyStream/AddKeyStream.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyString/AddKeyString.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyZset/AddKeyZset.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/add-set-members/AddSetMembers.tsx
#	redisinsight/ui/src/pages/database-analysis/components/header/Header.tsx
#	redisinsight/ui/src/pages/home/components/database-list-header/DatabaseListHeader.tsx
#	redisinsight/ui/src/pages/home/components/database-manage-tags-modal/ManageTagsModal.tsx
#	redisinsight/ui/src/pages/settings/components/cloud-settings/CloudSettings.tsx
#	redisinsight/ui/src/pages/settings/components/cloud-settings/components/user-api-keys-table/UserApiKeysTable.tsx
#	redisinsight/ui/src/pages/slow-log/components/Actions/Actions.tsx
pd-redis added 17 commits August 5, 2025 14:54
…nts-style

# Conflicts:
#	jest.config.cjs
#	redisinsight/ui/.eslintrc.js
#	redisinsight/ui/src/components/analytics-tabs/AnalyticsTabs.tsx
#	redisinsight/ui/src/components/auto-refresh/AutoRefresh.tsx
#	redisinsight/ui/src/components/base/display/image/RiImage.tsx
#	redisinsight/ui/src/components/base/display/index.ts
#	redisinsight/ui/src/components/base/display/loading-logo/RiLoadingLogo.tsx
#	redisinsight/ui/src/components/base/display/modal/index.ts
#	redisinsight/ui/src/components/base/display/toast/RiToast.tsx
#	redisinsight/ui/src/components/base/external-link/ExternalLink.tsx
#	redisinsight/ui/src/components/base/forms/buttons/Button.tsx
#	redisinsight/ui/src/components/base/forms/buttons/button.styles.ts
#	redisinsight/ui/src/components/base/forms/buttons/index.ts
#	redisinsight/ui/src/components/base/forms/checkbox/Checkbox.test.tsx
#	redisinsight/ui/src/components/base/forms/combo-box/AutoTag.spec.tsx
#	redisinsight/ui/src/components/base/forms/file-picker/RiFilePicker.tsx
#	redisinsight/ui/src/components/base/forms/file-picker/styles.tsx
#	redisinsight/ui/src/components/base/forms/select/RiSelect.tsx
#	redisinsight/ui/src/components/base/icons/Icon.tsx
#	redisinsight/ui/src/components/base/index.ts
#	redisinsight/ui/src/components/base/inputs/SwitchInput.spec.tsx
#	redisinsight/ui/src/components/base/inputs/index.ts
#	redisinsight/ui/src/components/base/layout/drawer/index.ts
#	redisinsight/ui/src/components/base/layout/empty-prompt/RiEmptyPrompt.tsx
#	redisinsight/ui/src/components/base/layout/flex/flex.styles.ts
#	redisinsight/ui/src/components/base/layout/flex/flex.tsx
#	redisinsight/ui/src/components/base/layout/horizontal-spacer/HorizontalSpacer.spec.tsx
#	redisinsight/ui/src/components/base/layout/horizontal-spacer/horizontal-spacer.styles.ts
#	redisinsight/ui/src/components/base/layout/horizontal-spacer/index.ts
#	redisinsight/ui/src/components/base/layout/index.ts
#	redisinsight/ui/src/components/base/layout/list/RiListItem.tsx
#	redisinsight/ui/src/components/base/layout/list/list.styles.ts
#	redisinsight/ui/src/components/base/layout/menu/index.ts
#	redisinsight/ui/src/components/base/layout/sidebar/index.ts
#	redisinsight/ui/src/components/base/layout/spacer/index.ts
#	redisinsight/ui/src/components/base/layout/spacer/spacer.styles.ts
#	redisinsight/ui/src/components/base/layout/spacer/spacer.tsx
#	redisinsight/ui/src/components/base/layout/table/index.ts
#	redisinsight/ui/src/components/base/layout/tabs/index.ts
#	redisinsight/ui/src/components/base/shared/WindowControlGroup.tsx
#	redisinsight/ui/src/components/base/text/index.ts
#	redisinsight/ui/src/components/base/text/text.styles.ts
#	redisinsight/ui/src/components/base/theme/index.ts
#	redisinsight/ui/src/components/base/theme/types.ts
#	redisinsight/ui/src/components/bottom-group-components/components/bottom-group-minimized/BottomGroupMinimized.tsx
#	redisinsight/ui/src/components/cli/components/cli-body/CliBody/CliBody.spec.tsx
#	redisinsight/ui/src/components/cli/components/cli-body/CliBody/CliBody.tsx
#	redisinsight/ui/src/components/cli/components/cli-header/CliHeader.tsx
#	redisinsight/ui/src/components/code-block/CodeBlock.tsx
#	redisinsight/ui/src/components/command-helper/CommandHelper/CommandHelper.tsx
#	redisinsight/ui/src/components/command-helper/CommandHelperHeader/CommandHelperHeader.tsx
#	redisinsight/ui/src/components/command-helper/CommandHelperWrapper.tsx
#	redisinsight/ui/src/components/command-helper/components/command-helper-info/CHCommandInfo.tsx
#	redisinsight/ui/src/components/command-helper/components/command-helper-search-output/CHSearchOutput.tsx
#	redisinsight/ui/src/components/command-helper/components/command-helper-search/CHSearchFilter/CHSearchFilter.tsx
#	redisinsight/ui/src/components/command-helper/components/command-helper-search/CHSearchInput/CHSearchInput.tsx
#	redisinsight/ui/src/components/connectivity-error/ConnectivityError.tsx
#	redisinsight/ui/src/components/consents-settings/ConsentOption/ConsentOption.tsx
#	redisinsight/ui/src/components/consents-settings/ConsentsNotifications/ConsentsNotifications.tsx
#	redisinsight/ui/src/components/consents-settings/ConsentsPrivacy/ConsentsPrivacy.tsx
#	redisinsight/ui/src/components/consents-settings/ConsentsSettings.tsx
#	redisinsight/ui/src/components/consents-settings/ConsentsSettingsPopup/ConsentsSettingsPopup.tsx
#	redisinsight/ui/src/components/database-list-modules/DatabaseListModules.tsx
#	redisinsight/ui/src/components/database-list-options/DatabaseListOptions.tsx
#	redisinsight/ui/src/components/database-overview/DatabaseOverview.tsx
#	redisinsight/ui/src/components/database-overview/components/OverviewMetrics/MetricItem.tsx
#	redisinsight/ui/src/components/database-overview/components/OverviewMetrics/OverviewMetrics.tsx
#	redisinsight/ui/src/components/explore-guides/ExploreGuides.tsx
#	redisinsight/ui/src/components/explore-guides/icons.ts
#	redisinsight/ui/src/components/field-message/FieldMessage.tsx
#	redisinsight/ui/src/components/form-dialog/FormDialog.spec.tsx
#	redisinsight/ui/src/components/form-dialog/FormDialog.tsx
#	redisinsight/ui/src/components/full-screen/FullScreen.tsx
#	redisinsight/ui/src/components/group-badge/GroupBadge.tsx
#	redisinsight/ui/src/components/home-tabs/HomeTabs.tsx
#	redisinsight/ui/src/components/home-tabs/constants.ts
#	redisinsight/ui/src/components/import-file-modal/ImportFileModal.spec.tsx
#	redisinsight/ui/src/components/import-file-modal/ImportFileModal.tsx
#	redisinsight/ui/src/components/inline-item-editor/InlineItemEditor.styles.tsx
#	redisinsight/ui/src/components/inline-item-editor/InlineItemEditor.tsx
#	redisinsight/ui/src/components/input-field-sentinel/InputFieldSentinel.tsx
#	redisinsight/ui/src/components/instance-header/InstanceHeader.tsx
#	redisinsight/ui/src/components/instance-header/components/ShortInstanceInfo.tsx
#	redisinsight/ui/src/components/instance-header/components/instances-navigation-popover/InstancesNavigationPopover.tsx
#	redisinsight/ui/src/components/instance-header/components/instances-navigation-popover/components/instances-list/InstancesList.tsx
#	redisinsight/ui/src/components/instance-header/components/user-profile/UserProfileBadge.tsx
#	redisinsight/ui/src/components/item-list/components/action-bar/ActionBar.tsx
#	redisinsight/ui/src/components/item-list/components/delete-action/DeleteAction.tsx
#	redisinsight/ui/src/components/item-list/components/export-action/ExportAction.tsx
#	redisinsight/ui/src/components/keyboard-shortcut/KeyboardShortcut.tsx
#	redisinsight/ui/src/components/keys-summary/KeysSummary.tsx
#	redisinsight/ui/src/components/main-router/components/SuspenseLoader.tsx
#	redisinsight/ui/src/components/markdown/CloudLink/CloudLink.tsx
#	redisinsight/ui/src/components/markdown/CodeButtonBlock/CodeButtonBlock.tsx
#	redisinsight/ui/src/components/markdown/CodeButtonBlock/components/RunConfirmationPopover.tsx
#	redisinsight/ui/src/components/markdown/RedisInsightLink/RedisInsightLink.tsx
#	redisinsight/ui/src/components/markdown/RedisUploadButton/RedisUploadButton.tsx
#	redisinsight/ui/src/components/message-bar/MessageBar.tsx
#	redisinsight/ui/src/components/messages/cli-output/cliOutput.tsx
#	redisinsight/ui/src/components/messages/database-not-opened/DatabaseNotOpened.tsx
#	redisinsight/ui/src/components/messages/filter-not-available/FilterNotAvailable.tsx
#	redisinsight/ui/src/components/messages/module-not-loaded-minimalized/ModuleNotLoadedMinimalized.tsx
#	redisinsight/ui/src/components/messages/module-not-loaded/ModuleNotLoaded.tsx
#	redisinsight/ui/src/components/messages/module-not-loaded/ModuleNotLoadedButton.tsx
#	redisinsight/ui/src/components/monaco-editor/MonacoEditor.tsx
#	redisinsight/ui/src/components/monaco-editor/components/dedicated-editor/DedicatedEditor.tsx
#	redisinsight/ui/src/components/monitor/Monitor/Monitor.tsx
#	redisinsight/ui/src/components/monitor/MonitorHeader/MonitorHeader.tsx
#	redisinsight/ui/src/components/monitor/MonitorLog/MonitorLog.tsx
#	redisinsight/ui/src/components/monitor/MonitorOutputList/MonitorOutputList.tsx
#	redisinsight/ui/src/components/multi-search/MultiSearch.tsx
#	redisinsight/ui/src/components/navigation-menu/NavigationMenu.tsx
#	redisinsight/ui/src/components/navigation-menu/app-navigation/AppNavigation.styles.ts
#	redisinsight/ui/src/components/navigation-menu/app-navigation/AppNavigation.tsx
#	redisinsight/ui/src/components/navigation-menu/components/create-cloud/CreateCloud.spec.tsx
#	redisinsight/ui/src/components/navigation-menu/components/create-cloud/CreateCloud.tsx
#	redisinsight/ui/src/components/navigation-menu/components/help-menu/HelpMenu.spec.tsx
#	redisinsight/ui/src/components/navigation-menu/components/help-menu/HelpMenu.tsx
#	redisinsight/ui/src/components/navigation-menu/components/notifications-center/Notification/Notification.tsx
#	redisinsight/ui/src/components/navigation-menu/components/notifications-center/NotificationCenter.tsx
#	redisinsight/ui/src/components/navigation-menu/components/notifications-center/NotificationMenu.spec.tsx
#	redisinsight/ui/src/components/navigation-menu/components/notifications-center/NotificationMenu.tsx
#	redisinsight/ui/src/components/navigation-menu/components/notifications-center/PopoverNotification/PopoverNotification.tsx
#	redisinsight/ui/src/components/navigation-menu/components/redis-logo/RedisLogo.spec.tsx
#	redisinsight/ui/src/components/navigation-menu/components/redis-logo/RedisLogo.tsx
#	redisinsight/ui/src/components/navigation-menu/hooks/useNavigation.ts
#	redisinsight/ui/src/components/navigation-menu/navigation.types.ts
#	redisinsight/ui/src/components/notifications/Notifications.tsx
#	redisinsight/ui/src/components/notifications/components/cloud-capi-unauthorized/CloudCapiUnAuthorizedErrorContent.tsx
#	redisinsight/ui/src/components/notifications/components/default-error-content/DefaultErrorContent.tsx
#	redisinsight/ui/src/components/notifications/components/encryption-error-content/EncryptionErrorContent.tsx
#	redisinsight/ui/src/components/notifications/components/infinite-messages/InfiniteMessages.tsx
#	redisinsight/ui/src/components/notifications/components/rdi-deploy-error-content/RdiDeployErrorContent.tsx
#	redisinsight/ui/src/components/notifications/error-messages.tsx
#	redisinsight/ui/src/components/notifications/success-messages.tsx
#	redisinsight/ui/src/components/oauth/oauth-connect-free-db/OAuthConnectFreeDb.tsx
#	redisinsight/ui/src/components/oauth/oauth-select-account-dialog/OAuthSelectAccountDialog.spec.tsx
#	redisinsight/ui/src/components/oauth/oauth-select-account-dialog/OAuthSelectAccountDialog.tsx
#	redisinsight/ui/src/components/oauth/oauth-select-plan/OAuthSelectPlan.spec.tsx
#	redisinsight/ui/src/components/oauth/oauth-select-plan/OAuthSelectPlan.tsx
#	redisinsight/ui/src/components/oauth/oauth-select-plan/constants.ts
#	redisinsight/ui/src/components/oauth/oauth-sign-in-button/OAuthSignInButton.tsx
#	redisinsight/ui/src/components/oauth/oauth-sso-dialog/OAuthSsoDialog.tsx
#	redisinsight/ui/src/components/oauth/oauth-sso/oauth-autodiscovery/OAuthAutodiscovery.tsx
#	redisinsight/ui/src/components/oauth/oauth-sso/oauth-create-db/OAuthCreateDb.tsx
#	redisinsight/ui/src/components/oauth/oauth-sso/oauth-create-db/styles.module.scss
#	redisinsight/ui/src/components/oauth/oauth-sso/oauth-sign-in/OAuthSignIn.tsx
#	redisinsight/ui/src/components/oauth/oauth-sso/oauth-sign-in/styles.module.scss
#	redisinsight/ui/src/components/oauth/oauth-user-profile/OAuthUserProfile.tsx
#	redisinsight/ui/src/components/oauth/shared/oauth-advantages/OAuthAdvantages.tsx
#	redisinsight/ui/src/components/oauth/shared/oauth-agreement/OAuthAgreement.tsx
#	redisinsight/ui/src/components/oauth/shared/oauth-form/components/oauth-sso-form/OAuthSsoForm.tsx
#	redisinsight/ui/src/components/oauth/shared/oauth-recommended-settings/OAuthRecommendedSettings.tsx
#	redisinsight/ui/src/components/oauth/shared/oauth-social-buttons/OAuthSocialButtons.tsx
#	redisinsight/ui/src/components/onboarding-tour/OnboardingTour.tsx
#	redisinsight/ui/src/components/page-header/PageHeader.tsx
#	redisinsight/ui/src/components/page-placeholder/PagePlaceholder.tsx
#	redisinsight/ui/src/components/promo-link/PromoLink.tsx
#	redisinsight/ui/src/components/query/query-actions/QueryActions.tsx
#	redisinsight/ui/src/components/query/query-card/QueryCard.tsx
#	redisinsight/ui/src/components/query/query-card/QueryCardCliPlugin/QueryCardCliPlugin.tsx
#	redisinsight/ui/src/components/query/query-card/QueryCardCliResultWrapper/QueryCardCliResultWrapper.tsx
#	redisinsight/ui/src/components/query/query-card/QueryCardHeader/QueryCardHeader.tsx
#	redisinsight/ui/src/components/query/query-tutorials/QueryTutorials.tsx
#	redisinsight/ui/src/components/rdi-instance-header/RdiInstanceHeader.tsx
#	redisinsight/ui/src/components/recommendation/badge-icon/BadgeIcon.tsx
#	redisinsight/ui/src/components/recommendation/content-element/ContentElement.tsx
#	redisinsight/ui/src/components/recommendation/internal-link/InternalLink.tsx
#	redisinsight/ui/src/components/recommendation/recommendation-badges/RecommendationBadges.tsx
#	redisinsight/ui/src/components/recommendation/recommendation-copy-component/RecommendationCopyComponent.tsx
#	redisinsight/ui/src/components/recommendation/recommendation-voting/RecommendationVoting.tsx
#	redisinsight/ui/src/components/recommendation/recommendation-voting/components/vote-option/VoteOption.tsx
#	redisinsight/ui/src/components/recommendation/recommendation-voting/components/vote-option/utils.ts
#	redisinsight/ui/src/components/scan-more/ScanMore.tsx
#	redisinsight/ui/src/components/settings-item/SettingItem.tsx
#	redisinsight/ui/src/components/shortcuts-flyout/ShortcutsFlyout.spec.tsx
#	redisinsight/ui/src/components/shortcuts-flyout/ShortcutsFlyout.tsx
#	redisinsight/ui/src/components/side-panels/components/header/Header.tsx
#	redisinsight/ui/src/components/side-panels/components/insights-panel/InsightsPanel.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/assistance-chat/AssistanceChat.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/chats-wrapper/ChatsWrapper.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/expert-chat/components/expert-chat-header/ExpertChatHeader.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/expert-chat/components/no-indexes-initial-message/NoIndexesInitialMessage.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/chat-form/ChatForm.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/chat-history/ChatHistory.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/chat-history/texts.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/error-message/ErrorMessage.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/shared/restart-chat/RestartChat.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/texts.tsx
#	redisinsight/ui/src/components/side-panels/panels/ai-assistant/components/welcome-ai-assistant/WelcomeAiAssistant.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/DeleteTutorialButton/DeleteTutorialButton.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/EmptyPrompt/EmptyPrompt.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/Group/Group.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalLink/InternalLink.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/InternalPage/InternalPage.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/Navigation/Navigation.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/Pagination/Pagination.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/PlainText/PlainText.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/UploadTutorialForm/UploadTutorialForm.tsx
#	redisinsight/ui/src/components/side-panels/panels/enablement-area/EnablementArea/components/WelcomeMyTutorials/WelcomeMyTutorials.tsx
#	redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/LiveTimeRecommendations.tsx
#	redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/popover-run-analyze/PopoverRunAnalyze.tsx
#	redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/recommendation/Recommendation.tsx
#	redisinsight/ui/src/components/side-panels/panels/live-time-recommendations/components/welcome-screen/WelcomeScreen.tsx
#	redisinsight/ui/src/components/table-column-search-trigger/TableColumnSearchTrigger.tsx
#	redisinsight/ui/src/components/table-column-search/TableColumnSearch.tsx
#	redisinsight/ui/src/components/triggers/copilot-trigger/CopilotTrigger.tsx
#	redisinsight/ui/src/components/triggers/insights-trigger/InsightsTrigger.tsx
#	redisinsight/ui/src/components/upload-file/UploadFile.tsx
#	redisinsight/ui/src/components/upload-warning/UploadWarning.tsx
#	redisinsight/ui/src/components/virtual-grid/VirtualGrid.tsx
#	redisinsight/ui/src/components/virtual-table/VirtualTable.tsx
#	redisinsight/ui/src/constants/help-texts.tsx
#	redisinsight/ui/src/constants/modules.ts
#	redisinsight/ui/src/constants/texts.tsx
#	redisinsight/ui/src/constants/themes.tsx
#	redisinsight/ui/src/packages/clients-list/src/components/table-view/TableView.tsx
#	redisinsight/ui/src/packages/redisearch/src/components/TableInfoResult/TableInfoResult.tsx
#	redisinsight/ui/src/packages/redisearch/src/components/TableResult/TableResult.tsx
#	redisinsight/ui/src/packages/redisgraph/src/App.tsx
#	redisinsight/ui/src/packages/redisgraph/src/Graph.tsx
#	redisinsight/ui/src/packages/redistimeseries-app/src/components/Chart/ChartConfigForm.tsx
#	redisinsight/ui/src/packages/ri-explain/src/Explain.tsx
#	redisinsight/ui/src/packages/ri-explain/src/Node.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/RedisCloudDatabasesResult.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/RedisCloudDatabasesResultPage.spec.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases-result/RedisCloudDatabasesResultPage.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/RedisCloudDatabases/RedisCloudDatabases.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/RedisCloudDatabasesPage.spec.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-databases/RedisCloudDatabasesPage.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/RedisCloudSubscriptions/RedisCloudSubscriptions.tsx
#	redisinsight/ui/src/pages/autodiscover-cloud/redis-cloud-subscriptions/RedisCloudSubscriptionsPage.tsx
#	redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/SentinelDatabasesResultPage.tsx
#	redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases-result/components/SentinelDatabasesResult/SentinelDatabasesResult.tsx
#	redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/SentinelDatabasesPage.spec.tsx
#	redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/SentinelDatabasesPage.tsx
#	redisinsight/ui/src/pages/autodiscover-sentinel/sentinel-databases/components/SentinelDatabases/SentinelDatabases.tsx
#	redisinsight/ui/src/pages/browser/BrowserPage.tsx
#	redisinsight/ui/src/pages/browser/components/action-footer/ActionFooter.tsx
#	redisinsight/ui/src/pages/browser/components/actions/Actions.tsx
#	redisinsight/ui/src/pages/browser/components/add-items-actions/AddItemsActions.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKey.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyCommonFields/AddKeyCommonFields.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyHash/AddKeyHash.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyList/AddKeyList.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyReJSON/AddKeyReJSON.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeySet/AddKeySet.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyString/AddKeyString.tsx
#	redisinsight/ui/src/pages/browser/components/add-key/AddKeyZset/AddKeyZset.tsx
#	redisinsight/ui/src/pages/browser/components/add-multiple-fields/AddMultipleFields.tsx
#	redisinsight/ui/src/pages/browser/components/browser-search-panel/BrowserSearchPanel.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionSummary/BulkActionSummary.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActions.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsInfo/BulkActionsInfo.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkActionsTabs/BulkActionsTabs.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDelete.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteContent/BulkDeleteContent.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteFooter/BulkDeleteFooter.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummary/BulkDeleteSummary.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkDelete/BulkDeleteSummaryButton/BulkDeleteSummaryButton.tsx
#	redisinsight/ui/src/pages/browser/components/bulk-actions/BulkUpload/BulkUpload.tsx
#	redisinsight/ui/src/pages/browser/components/create-redisearch-index/CreateRedisearchIndex.tsx
#	redisinsight/ui/src/pages/browser/components/create-redisearch-index/CreateRedisearchIndexWrapper.tsx
#	redisinsight/ui/src/pages/browser/components/delete-key-popover/DeleteKeyPopover.tsx
#	redisinsight/ui/src/pages/browser/components/filter-key-type/FilterKeyType.tsx
#	redisinsight/ui/src/pages/browser/components/key-row-name/KeyRowName.tsx
#	redisinsight/ui/src/pages/browser/components/key-row-size/KeyRowSize.tsx
#	redisinsight/ui/src/pages/browser/components/key-row-ttl/KeyRowTTL.tsx
#	redisinsight/ui/src/pages/browser/components/key-tree/KeyTreeSettings/KeyTreeSettings.tsx
#	redisinsight/ui/src/pages/browser/components/keys-header/KeysHeader.tsx
#	redisinsight/ui/src/pages/browser/components/load-sample-data/LoadSampleData.tsx
#	redisinsight/ui/src/pages/browser/components/no-keys-found/NoKeysFound.tsx
#	redisinsight/ui/src/pages/browser/components/onboarding-start-popover/OnboardingStartPopover.tsx
#	redisinsight/ui/src/pages/browser/components/popover-delete/PopoverDelete.tsx
#	redisinsight/ui/src/pages/browser/components/redisearch-key-list/RediSearchIndexesList.tsx
#	redisinsight/ui/src/pages/browser/components/search-key-list/SearchKeyList.tsx
#	redisinsight/ui/src/pages/browser/components/virtual-tree/VirtualTree.tsx
#	redisinsight/ui/src/pages/browser/components/virtual-tree/components/Node/Node.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details-header/KeyDetailsHeader.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-delete/KeyDetailsHeaderDelete.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.styles.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-formatter/KeyDetailsHeaderFormatter.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-name/KeyDetailsHeaderName.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-size-length/KeyDetailsHeaderSizeLength.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details-header/components/key-details-header-ttl/KeyDetailsHeaderTTL.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/change-editor-type-button/ChangeEditorTypeButton.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/HashDetails.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/add-hash-fields/AddHashFields.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/hash-details/hash-details-table/HashDetailsTable.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-actions/add-items-action/AddItemsAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-actions/edit-item-action/EditItemAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-actions/remove-items-action/RemoveItemsAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-actions/stream-items-action/StreamItemsAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/key-details-subheader/KeyDetailsSubheader.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/add-list-elements/AddListElements.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/list-details-table/ListDetailsTable.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/list-details/remove-list-elements/RemoveListElements.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/modules-type-details/ModulesTypeDetails.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/no-key-selected/NoKeySelected.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/RejsonDetailsWrapper.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item-field-action/AddItemFieldAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/ConfirmOverwrite.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-entire-item-action/EditEntireItemAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/edit-item-field-action/EditItemFieldAction.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/monaco-editor/MonacoEditor.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-details/RejsonDetails.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/rejson-object/RejsonObject.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/add-set-members/AddSetMembers.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/set-details/set-details-table/SetDetailsTable.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/AddStreamEntries.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-entity/StreamEntryFields/StreamEntryFields.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/add-stream-group/AddStreamGroup.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/consumers-view/ConsumersViewWrapper.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/groups-view/GroupsViewWrapper.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageAckPopover/MessageAckPopover.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessageClaimPopover/MessageClaimPopover.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/messages-view/MessagesViewWrapper.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-data-view/StreamDataViewWrapper.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-details-body/StreamDetailsBody.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/stream-details/stream-tabs/StreamTabs.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/string-details/string-details-value/StringDetailsValue.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/text-details-wrapper/TextDetailsWrapper.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/too-long-key-name-details/TooLongKeyNameDetails.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/unsupported-type-details/UnsupportedTypeDetails.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/ZSetDetails.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/add-zset-members/AddZsetMembers.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/zset-details/zset-details-table/ZSetDetailsTable.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-input/EditableInput.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-popover/EditablePopover.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/EditableTextArea.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/shared/editable-textarea/styles.module.scss
#	redisinsight/ui/src/pages/cluster-details/components/cluser-nodes-table/ClusterNodesTable.tsx
#	redisinsight/ui/src/pages/cluster-details/components/cluster-details-graphics/ClusterDetailsGraphics.tsx
#	redisinsight/ui/src/pages/cluster-details/components/cluster-details-header/ClusterDetailsHeader.tsx
#	redisinsight/ui/src/pages/database-analysis/components/analysis-ttl-view/ExpirationGroupsView.tsx
#	redisinsight/ui/src/pages/database-analysis/components/base/TableTextBtn.tsx
#	redisinsight/ui/src/pages/database-analysis/components/base/TextBtn.tsx
#	redisinsight/ui/src/pages/database-analysis/components/data-nav-tabs/DatabaseAnalysisTabs.tsx
#	redisinsight/ui/src/pages/database-analysis/components/empty-analysis-message/EmptyAnalysisMessage.tsx
#	redisinsight/ui/src/pages/database-analysis/components/header/Header.tsx
#	redisinsight/ui/src/pages/database-analysis/components/recommendations-view/Recommendations.tsx
#	redisinsight/ui/src/pages/database-analysis/components/summary-per-data/SummaryPerData.tsx
#	redisinsight/ui/src/pages/database-analysis/components/top-keys/Table.tsx
#	redisinsight/ui/src/pages/database-analysis/components/top-keys/TopKeys.tsx
#	redisinsight/ui/src/pages/database-analysis/components/top-namespace/Table.tsx
#	redisinsight/ui/src/pages/database-analysis/components/top-namespace/TopNamespace.tsx
#	redisinsight/ui/src/pages/home/HomePage.tsx
#	redisinsight/ui/src/pages/home/components/add-database-screen/AddDatabaseScreen.tsx
#	redisinsight/ui/src/pages/home/components/add-database-screen/components/connection-url/ConnectionUrl.tsx
#	redisinsight/ui/src/pages/home/components/add-database-screen/components/connectivity-options/ConnectivityOptions.tsx
#	redisinsight/ui/src/pages/home/components/add-database-screen/constants.tsx
#	redisinsight/ui/src/pages/home/components/cloud-connection/CloudConnectionFormWrapper.tsx
#	redisinsight/ui/src/pages/home/components/cloud-connection/cloud-connection-form/CloudConnectionForm.tsx
#	redisinsight/ui/src/pages/home/components/cluster-connection/ClusterConnectionFormWrapper.tsx
#	redisinsight/ui/src/pages/home/components/cluster-connection/cluster-connection-form/ClusterConnectionForm.tsx
#	redisinsight/ui/src/pages/home/components/database-alias/DatabaseAlias.tsx
#	redisinsight/ui/src/pages/home/components/database-list-component/DatabasesListWrapper.tsx
#	redisinsight/ui/src/pages/home/components/database-list-header/DatabaseListHeader.tsx
#	redisinsight/ui/src/pages/home/components/database-manage-tags-modal/ManageTagsModal.spec.tsx
#	redisinsight/ui/src/pages/home/components/database-manage-tags-modal/ManageTagsModal.tsx
#	redisinsight/ui/src/pages/home/components/database-manage-tags-modal/TagInputField.tsx
#	redisinsight/ui/src/pages/home/components/database-manage-tags-modal/TagSuggestions.tsx
#	redisinsight/ui/src/pages/home/components/database-panel-dialog/DatabasePanelDialog.spec.tsx
#	redisinsight/ui/src/pages/home/components/database-panel-dialog/DatabasePanelDialog.tsx
#	redisinsight/ui/src/pages/home/components/db-status/DbStatus.tsx
#	redisinsight/ui/src/pages/home/components/db-status/texts.tsx
#	redisinsight/ui/src/pages/home/components/empty-message/EmptyMessage.tsx
#	redisinsight/ui/src/pages/home/components/form/DatabaseForm.tsx
#	redisinsight/ui/src/pages/home/components/form/DbCompressor.tsx
#	redisinsight/ui/src/pages/home/components/form/DbIndex.tsx
#	redisinsight/ui/src/pages/home/components/form/DbInfo.tsx
#	redisinsight/ui/src/pages/home/components/form/ForceStandalone.tsx
#	redisinsight/ui/src/pages/home/components/form/KeyFormatSelector.tsx
#	redisinsight/ui/src/pages/home/components/form/Messages.tsx
#	redisinsight/ui/src/pages/home/components/form/SSHDetails.tsx
#	redisinsight/ui/src/pages/home/components/form/TlsDetails.tsx
#	redisinsight/ui/src/pages/home/components/form/sentinel/DbInfoSentinel.tsx
#	redisinsight/ui/src/pages/home/components/form/sentinel/PrimaryGroupSentinel.tsx
#	redisinsight/ui/src/pages/home/components/form/sentinel/SentinelHostPort.tsx
#	redisinsight/ui/src/pages/home/components/form/sentinel/SentinelMasterDatabase.tsx
#	redisinsight/ui/src/pages/home/components/import-database/ImportDatabase.tsx
#	redisinsight/ui/src/pages/home/components/import-database/components/ResultsLog/ResultsLog.tsx
#	redisinsight/ui/src/pages/home/components/import-database/components/TableResult/TableResult.tsx
#	redisinsight/ui/src/pages/home/components/manual-connection/manual-connection-form/ManualConnectionForm.tsx
#	redisinsight/ui/src/pages/home/components/manual-connection/manual-connection-form/components/CloneConnection.tsx
#	redisinsight/ui/src/pages/home/components/manual-connection/manual-connection-form/components/FooterActions.tsx
#	redisinsight/ui/src/pages/home/components/manual-connection/manual-connection-form/constants.ts
#	redisinsight/ui/src/pages/home/components/manual-connection/manual-connection-form/forms/EditSentinelConnection.tsx
#	redisinsight/ui/src/pages/home/components/search-databases-list/SearchDatabasesList.tsx
#	redisinsight/ui/src/pages/home/components/sentinel-connection/SentinelConnectionWrapper.tsx
#	redisinsight/ui/src/pages/home/components/sentinel-connection/sentinel-connection-form/SentinelConnectionForm.tsx
#	redisinsight/ui/src/pages/home/components/tags-cell/TagsCell.tsx
#	redisinsight/ui/src/pages/home/components/tags-cell/TagsCellHeader.tsx
#	redisinsight/ui/src/pages/not-found-error/NotFoundErrorPage.tsx
#	redisinsight/ui/src/pages/pub-sub/PubSubPage.tsx
#	redisinsight/ui/src/pages/pub-sub/components/messages-list/EmptyMessagesList/EmptyMessagesList.tsx
#	redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/MessagesList.tsx
#	redisinsight/ui/src/pages/pub-sub/components/publish-message/PublishMessage.tsx
#	redisinsight/ui/src/pages/pub-sub/components/subscription-panel/SubscriptionPanel.tsx
#	redisinsight/ui/src/pages/pub-sub/components/subscription-panel/components/clickable-append-info/ClickableAppendInfo.tsx
#	redisinsight/ui/src/pages/pub-sub/components/subscription-panel/components/patternsInfo/PatternsInfo.tsx
#	redisinsight/ui/src/pages/rdi/components/confirmation-popover/ConfirmationPopover.tsx
#	redisinsight/ui/src/pages/rdi/home/RdiPage.spec.tsx
#	redisinsight/ui/src/pages/rdi/home/RdiPage.tsx
#	redisinsight/ui/src/pages/rdi/home/connection-form/ConnectionForm.tsx
#	redisinsight/ui/src/pages/rdi/home/connection-form/ConnectionFormWrapper.spec.tsx
#	redisinsight/ui/src/pages/rdi/home/connection-form/ConnectionFormWrapper.tsx
#	redisinsight/ui/src/pages/rdi/home/empty-message/EmptyMessage.tsx
#	redisinsight/ui/src/pages/rdi/home/header/RdiHeader.tsx
#	redisinsight/ui/src/pages/rdi/home/instance-list/RdiInstancesListWrapper.tsx
#	redisinsight/ui/src/pages/rdi/home/search/SearchRdiList.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/download/Download.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/buttons/deploy-pipeline-button/DeployPipelineButton.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/buttons/reset-pipeline-button/ResetPipelineButton.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/buttons/start-pipeline-button/StartPipelineButton.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/buttons/stop-pipeline-button/StopPipelineButton.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/current-pipeline-status/CurrentPipelineStatus.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/fetch-pipeline-popover/FetchPipelinePopover.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/pipeline-actions/PipelineActions.tsx
#	redisinsight/ui/src/pages/rdi/instance/components/header/components/rdi-config-file-action-menu/RdiConfigFileActionMenu.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/jobs-panel/Panel.spec.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/jobs-panel/Panel.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/jobs-tree/JobsTree.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/navigation/Navigation.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.spec.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/source-pipeline-dialog/SourcePipelineModal.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/tab/Tab.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/template-button/TemplateButton.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/template-form/TemplateForm.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/template-popover/TemplatePopover.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/test-connections-log/TestConnectionsLog.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/test-connections-panel/TestConnectionsPanel.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/test-connections-table/TestConnectionsTable.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/upload-modal/UploadModal.spec.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/upload-modal/components/upload-dialog/UploadDialog.spec.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/components/upload-modal/components/upload-dialog/UploadDialog.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/pages/config/Config.tsx
#	redisinsight/ui/src/pages/rdi/pipeline-management/pages/job/Job.tsx
#	redisinsight/ui/src/pages/rdi/statistics/StatisticsPage.tsx
#	redisinsight/ui/src/pages/rdi/statistics/clients/Clients.tsx
#	redisinsight/ui/src/pages/rdi/statistics/data-streams/DataStreams.tsx
#	redisinsight/ui/src/pages/rdi/statistics/empty/Empty.tsx
#	redisinsight/ui/src/pages/rdi/statistics/status/Status.tsx
#	redisinsight/ui/src/pages/rdi/statistics/target-connections/TargetConnections.tsx
#	redisinsight/ui/src/pages/redis-cluster/RedisClusterDatabases.tsx
#	redisinsight/ui/src/pages/redis-cluster/RedisClusterDatabasesPage.tsx
#	redisinsight/ui/src/pages/redis-cluster/RedisClusterDatabasesResult.tsx
#	redisinsight/ui/src/pages/settings/SettingsPage.tsx
#	redisinsight/ui/src/pages/settings/components/cloud-settings/CloudSettings.tsx
#	redisinsight/ui/src/pages/settings/components/cloud-settings/components/user-api-keys-table/UserApiKeysTable.tsx
#	redisinsight/ui/src/pages/settings/components/general-settings/datetime-formatter/DateTimeFormatter.tsx
#	redisinsight/ui/src/pages/settings/components/general-settings/datetime-formatter/components/datetime-form/DatetimeForm.tsx
#	redisinsight/ui/src/pages/settings/components/general-settings/datetime-formatter/components/timezone-form/TimezoneForm.tsx
#	redisinsight/ui/src/pages/settings/components/theme-settings/ThemeSettings.tsx
#	redisinsight/ui/src/pages/settings/components/workbench-settings/WorkbenchSettings.tsx
#	redisinsight/ui/src/pages/slow-log/SlowLogPage.tsx
#	redisinsight/ui/src/pages/slow-log/components/Actions/Actions.tsx
#	redisinsight/ui/src/pages/slow-log/components/EmptySlowLog/EmptySlowLog.tsx
#	redisinsight/ui/src/pages/slow-log/components/SlowLogConfig/SlowLogConfig.tsx
#	redisinsight/ui/src/pages/slow-log/components/SlowLogTable/SlowLogTable.tsx
#	redisinsight/ui/src/pages/workbench/components/wb-no-results-message/WbNoResultsMessage.tsx
#	redisinsight/ui/src/pages/workbench/components/wb-results/WBResults/WBResults.tsx
#	redisinsight/ui/src/pages/workbench/constants.ts
#	redisinsight/ui/src/services/tests/routing.spec.tsx
#	redisinsight/ui/src/templates/instance-page-template/InstancePageTemplate.tsx
#	redisinsight/ui/src/utils/test-utils.tsx
#	yarn.lock
…nts-style

# Conflicts:
#	jest.config.cjs
#	redisinsight/ui/src/components/base/tooltip/HoverContent.tsx
#	redisinsight/ui/src/components/query/query-card/QueryCardHeader/QueryCardHeader.tsx
#	redisinsight/ui/src/pages/browser/modules/key-details/components/rejson-details/components/add-item/AddItem.tsx
…nts-style

# Conflicts:
#	redisinsight/ui/src/pages/vector-search/query/HeaderActions.styles.ts
#	redisinsight/ui/src/pages/vector-search/query/HeaderActions.tsx
Copy link
Contributor

Code Coverage - Frontend unit tests

St.
Category Percentage Covered / Total
🟢 Statements 81.77% 19702/24094
🟡 Branches 67.23% 8541/12705
🟡 Functions 75.55% 5222/6912
🟢 Lines 82.2% 19287/23464

Test suite run success

5089 tests passing in 666 suites.

Report generated by 🧪jest coverage report action from 9e2833e

:root {
// spacing
//2.5px/0.2rem
--size-xxs: ${({ theme }) => theme.core.space.space025};
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! I think that in a separate effort we can remove all these "--size-xxs" variables and just replace the in the components we use theme with the theme ones. Components are not that much I think (list, horizontal rule, horizontal spacer, loading content, spacer and few more occurrences), and since you've mapped the values here it would be easy to just replace.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, purely for brevity using var(--size-s) is far shorter to type than ${({ theme }) => theme.core.space.space025} so I am not sure which one to leave in.

This is all open for discussion.


import { useTheme } from '@redis-ui/styles'

import { RiPopover, RiTooltip } from 'uiBase/index'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see this uiBase/index is used here and few more places. Is there a reason why not just use uiBase/display instead?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No reason, just that EVERYTHING is exported in index and this is one thing that we should decide on

@dantovska
Copy link
Collaborator

I know this is draft and not ready for merge, but few small things I noticed breaking:
image
image

Comment on lines +338 to +340
<UploadModal>
<div>test</div>
</UploadModal>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

and not to forget to remove this 😄

alias: {
uiSrc: path.resolve(__dirname, '../ui/src'),
apiSrc: path.resolve(__dirname, '../api/src'),
uiBase: path.resolve(__dirname, '../ui/src/components/base'),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uh, nice! ❤️

import React from 'react'
import { Banner } from '@redis-ui/components'

export type CallOutProps = Omit<React.ComponentProps<typeof Banner>, 'show'> & {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we keep the props with the same name convention as components? A.k.a. RiCallOutProps?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is probably not a bad idea!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

},
},
}
export const GlobalStyle = createGlobalStyle<{ theme: Theme }>`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need something that resets all the browser defaults for margins, paddings, etc.. Something like https://www.npmjs.com/package/reset-css

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think redis ui styles have something like that -

import '@redis-ui/styles/normalized-styles.css'

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But never actually looked at the css, so ti can be something entirely different

Comment on lines +19 to 21
const SummaryContainer = styled(RiRow)`
padding-top: 18px;
`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm just brainstorming here, but what if we introduce https://www.npmjs.com/package/styled-system ?

What is the problem that bugs me: We'll introduce (and we already did) a lot of components with small styling fixes, causing a lot of boilerplate:

const RiRow = ... // this is OK

// This is necessary because we can't use <RiRow pt="18px" />
const SummaryContainer = styled(RiRow)`
  padding-top: 18px;
`

// Our end goal would be to remove the hardcoded pixels
<RiRow pt="small" /> or <RiRow pt={3} />

So what do you think?

Ofc, this is dead project, so as styled-components, but I guess it will help us if we migrate to something similar to tailwindcss in the future.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issue I have with this is where we stop with the props.
Do we do margins, font styles, colors etc too?
There will always be edge cases. I would love for us to have a lego style design system, where you have just predefined components and props and only ever use that ( i think this is @ArtemHoruzhenko's dream)
But the design and dev effort required makes me think it is not going to happen.

But I am very much open to suggestions. Abstracting the components the way we did means, that changing them in one place will be reflected everywhere so that is already a small win

Comment on lines +5 to +9
export * from './layout'
export * from './display'
export * from './forms'
export * from './text'
export * from './shared/WindowControlGroup'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so is this barrel file going to be used for accessing the base components?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is possible to access them all from here, unfortunatelly it has to be like from "@uiBase/index" and honestly I still like it more like import {RiRow, RiTable} from "@uiBase/layout" it makes it grouped more contextual.
BUT - if most of the team prefers base barrel file, then we'll use it

Comment on lines +3 to +7
import { ChevronDownIcon, RefreshIcon, RiIcon } from 'uiBase/icons'
import { RiIconButton } from 'uiBase/forms'
import { RiColorText } from 'uiBase/text'
import { RiSwitchInput } from 'uiBase/inputs'
import { RiPopover, RiTooltip } from 'uiBase/index'
Copy link
Collaborator

@KrumTy KrumTy Aug 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

barrel or no barrel imports; mix is a bit confusing imo

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All imports here are barrel imports, the only confising thing for me is why inputs are not part of the forms subtree, but the reallity is that I don't care that much where are things stored

<StyledImage src={src} alt={alt} $size={$size} {...rest} />
)

export default RiImage
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

default export + a single barrel file that does export { default as RiImage } from ... could resolve the suggested auto import issue

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or just export const ...
why introduce extra files that don't do anything meaningful? Single file per single export ....

border-bottom: 1px solid
${({ theme }: { theme: ReturnType<typeof useTheme> }) =>
theme.color.gray400};
theme.color.gray400};
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like you need to run format on the branch

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

format runs on safe, but will do it again

} from '@redis-ui/components'

export type RedisFormFieldProps = ComponentProps<typeof RedisFormField> & {
infoIconProps?: any
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can this have a type?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure, I don't think I have implemented this one

Comment on lines +1 to +7
import React from 'react'
import { BaseButton } from './Button'
import { ButtonProps } from './button.styles'

export const RiPrimaryButton = (props: ButtonProps) => (
<BaseButton {...props} variant="primary" />
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see my comment in RiDestructiveButton.tsx

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, a design system is the one that has defined looks for primary, secondary, success, failure, danger, info states and typing RiPri will give you this button instead a button where you have to then add variant, then select the variant.
This is both more semantic and more ergonomic and there are 3-4 button variants, I don't think you will sturggle that much remembering them.
And finally, there is export for the BaseButton and if you hate that much semantic buttons feel free to use that one.

Comment on lines +1 to +7
import React from 'react'
import { ButtonProps } from './button.styles'
import { BaseButton } from './Button'

export const RiDestructiveButton = (props: ButtonProps) => (
<BaseButton {...props} variant="destructive" />
)
Copy link
Collaborator

@KrumTy KrumTy Aug 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is the reason behind these button wrappers? Is it to prevent the consumer from passing variant prop?
If so, it might be better to have a single RiButton wrapper on our end with allowed variants and their implementations

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope, it is to avoid variants.
To me this is more semantic than <RIButton variant="danger"

import { LinkProps } from '@redis-ui/components'
import { StyledLink } from './link.styles'

export const RiLink = ({ color, ...props }: LinkProps) => (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow up on the following suggestion https://github.com/redis/RedisInsight/pull/4841/files#r2292865447

Looking at this example, here we don't alter the base interface in any way, but since we're implementing RiComponents as a middle layer between RedisInsight and the outer world, does it make sense to define our own interfaces for each component we wrap?

export interface RiLinkProps extends LinkProps {}

export const RiLink = ({ color, ...props }: RiLinkProps) => (

This way, our codebase will be bound to RiLinkProps and in case we need to switch the components library (once again), we'll do it in a single place (in theory).

Yes, it will look a bit meaningless, but I'm thinking out loud.


export const HoverContent = ({ title, content }: RiTooltipContentProps) => (
<RiCol>
{title && <RiTitle size="S">{title}</RiTitle>}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: I see we prefer using mostly string literal union types (size: "S" | "M" | "L"), and I see it to be inconsistent across the codebase and the different components.

Here, in this component, the size is with a capital "S". In other components, we rely on lowercase strings (without a union type). In other components, we do lowercase everything and then apply some custom handling to transform the size into rem/px.

And while it's not a big deal, I feel it will look way more consistent if we use enums. Yes, it's my own personal preference, maybe, but we'll no longer care whether it's a capital or lowercase "S", and even if it's type checked or we entered something invalid. We simply put Size.M and that's all.

PS: This is not related in any way to the changes introduced in this pull request, it's a general note.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the inconsistency in casing is because EUI uses lowercase, redis-ui upper case - hence the mix
And with or without enums, you will have to transofrm the logic to px, em or whatever - if you want to use theme values


const ASC = 'asc'
const DESC = 'desc'
export type Direction = typeof ASC | typeof DESC
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I've already mentioned this in other comment, but this is a great example in which using enum will make it simpler.

And yes, it's a subjective statement, I'm aware of that "more readable" is not a strong argument 😀

export enum Direction {
  Asc = 'asc',
  Desc = 'desc'
}

Copy link
Member

@valkirilov valkirilov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tremendous effort, nice job! I really like how things are getting more organized now!

Looking at this changeset, I think it could be helpful if we wrote down some of these internal conventions so we can follow them consistently in the future. Maybe something simple like an inline README in markdown that acts as a mini style guide.

It doesn’t need to be complex, just a quick reference with things like:

  • prefixing components with RiComponent
  • how to structure and export files
  • how to handle interfaces
  • and maybe generic patterns we want to follow

That way, it's easy to get started, or to check later on how we prefer to do things.

Additionally, I know we've raised this a few times, but I think it would really help to have a place where we can see all the components we have and how to use them. Having an internal Storybook might be too much effort to maintain (though it would be a great addition), but even just bringing back the playground you prepared would be a solid starting point.

This is, of course, an additional task, complementary to this refactoring. I'm just mentioning it as a reminder so we can decide which path we want to follow and plan accordingly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants