gitextract_b07d1bqv/ ├── .ci/ │ ├── Dockerfile.cypress │ ├── compose.ci.yaml │ ├── compose.cypress.yaml │ ├── docker_build │ ├── pack │ └── update_version ├── .coveragerc ├── .dockerignore ├── .editorconfig ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── ---bug_report.md │ │ └── --anything_else.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── config.yml │ ├── weekly-digest.yml │ └── workflows/ │ ├── ci.yml │ ├── periodic-snapshot.yml │ ├── preview-image.yml │ └── restyled.yml ├── .gitignore ├── .npmrc ├── .nvmrc ├── .pre-commit-config.yaml ├── .restyled.yaml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── LICENSE.borders ├── Makefile ├── README.md ├── SECURITY.md ├── bin/ │ ├── docker-entrypoint │ ├── get_changes.py │ ├── release_manager.py │ └── run ├── client/ │ ├── .babelrc │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── app/ │ │ ├── .eslintrc.js │ │ ├── __tests__/ │ │ │ ├── enzyme_setup.js │ │ │ └── mocks.js │ │ ├── assets/ │ │ │ ├── css/ │ │ │ │ └── login.css │ │ │ ├── images/ │ │ │ │ └── illustrations/ │ │ │ │ └── readme.md │ │ │ ├── less/ │ │ │ │ ├── STYLING-README.md │ │ │ │ ├── ant.less │ │ │ │ ├── inc/ │ │ │ │ │ ├── 404.less │ │ │ │ │ ├── ace-editor.less │ │ │ │ │ ├── alert.less │ │ │ │ │ ├── ant-variables.less │ │ │ │ │ ├── base.less │ │ │ │ │ ├── bootstrap-overrides.less │ │ │ │ │ ├── breadcrumb.less │ │ │ │ │ ├── button.less │ │ │ │ │ ├── carousel.less │ │ │ │ │ ├── chart.less │ │ │ │ │ ├── dropdown.less │ │ │ │ │ ├── edit-in-place.less │ │ │ │ │ ├── flex.less │ │ │ │ │ ├── font.less │ │ │ │ │ ├── form.less │ │ │ │ │ ├── generics.less │ │ │ │ │ ├── header.less │ │ │ │ │ ├── ie-warning.less │ │ │ │ │ ├── jumbotron.less │ │ │ │ │ ├── label.less │ │ │ │ │ ├── less-plugins/ │ │ │ │ │ │ └── for.less │ │ │ │ │ ├── list-group.less │ │ │ │ │ ├── list.less │ │ │ │ │ ├── login.less │ │ │ │ │ ├── media.less │ │ │ │ │ ├── messages.less │ │ │ │ │ ├── misc.less │ │ │ │ │ ├── mixins.less │ │ │ │ │ ├── modal.less │ │ │ │ │ ├── panel.less │ │ │ │ │ ├── photos.less │ │ │ │ │ ├── popover.less │ │ │ │ │ ├── pricing-table.less │ │ │ │ │ ├── print.less │ │ │ │ │ ├── profile.less │ │ │ │ │ ├── progress-bar.less │ │ │ │ │ ├── schema-browser.less │ │ │ │ │ ├── sidebar.less │ │ │ │ │ ├── table.less │ │ │ │ │ ├── tile.less │ │ │ │ │ ├── tooltips.less │ │ │ │ │ ├── variables.less │ │ │ │ │ ├── visualizations/ │ │ │ │ │ │ ├── box.less │ │ │ │ │ │ ├── map.less │ │ │ │ │ │ ├── misc.less │ │ │ │ │ │ └── pivot-table.less │ │ │ │ │ ├── well.less │ │ │ │ │ └── widgets.less │ │ │ │ ├── main.less │ │ │ │ ├── redash/ │ │ │ │ │ ├── css-logo.less │ │ │ │ │ ├── loading-indicator.less │ │ │ │ │ ├── query.less │ │ │ │ │ ├── redash-table.less │ │ │ │ │ └── tags-control.less │ │ │ │ └── server.less │ │ │ └── robots.txt │ │ ├── components/ │ │ │ ├── AceEditorInput.jsx │ │ │ ├── AceEditorInput.less │ │ │ ├── ApplicationArea/ │ │ │ │ ├── ApplicationLayout/ │ │ │ │ │ ├── DesktopNavbar.jsx │ │ │ │ │ ├── DesktopNavbar.less │ │ │ │ │ ├── MobileNavbar.jsx │ │ │ │ │ ├── MobileNavbar.less │ │ │ │ │ ├── VersionInfo.jsx │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.less │ │ │ │ ├── ErrorMessage.jsx │ │ │ │ ├── ErrorMessage.less │ │ │ │ ├── ErrorMessage.test.js │ │ │ │ ├── ErrorMessageDetails.jsx │ │ │ │ ├── Router.jsx │ │ │ │ ├── handleNavigationIntent.js │ │ │ │ ├── index.jsx │ │ │ │ ├── navigateTo.js │ │ │ │ ├── routeWithApiKeySession.jsx │ │ │ │ └── routeWithUserSession.tsx │ │ │ ├── BeaconConsent.jsx │ │ │ ├── BigMessage.jsx │ │ │ ├── CodeBlock.jsx │ │ │ ├── CodeBlock.less │ │ │ ├── Collapse.jsx │ │ │ ├── CreateSourceDialog.jsx │ │ │ ├── DateInput.jsx │ │ │ ├── DateRangeInput.jsx │ │ │ ├── DateTimeInput.jsx │ │ │ ├── DateTimeRangeInput.jsx │ │ │ ├── DialogWrapper.d.ts │ │ │ ├── DialogWrapper.jsx │ │ │ ├── DynamicComponent.jsx │ │ │ ├── EditInPlace.jsx │ │ │ ├── EditParameterSettingsDialog.jsx │ │ │ ├── EditParameterSettingsDialog.less │ │ │ ├── EditVisualizationButton/ │ │ │ │ ├── QueryControlDropdown.jsx │ │ │ │ ├── QueryResultsLink.jsx │ │ │ │ └── index.jsx │ │ │ ├── EmailSettingsWarning.jsx │ │ │ ├── FavoritesControl.jsx │ │ │ ├── Filters.jsx │ │ │ ├── HelpTrigger.jsx │ │ │ ├── HelpTrigger.less │ │ │ ├── InputWithCopy.jsx │ │ │ ├── Link.tsx │ │ │ ├── NoTaggedObjectsFound.jsx │ │ │ ├── PageHeader/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.less │ │ │ ├── Paginator.jsx │ │ │ ├── ParameterApplyButton.jsx │ │ │ ├── ParameterMappingInput.jsx │ │ │ ├── ParameterMappingInput.less │ │ │ ├── ParameterValueInput.jsx │ │ │ ├── ParameterValueInput.less │ │ │ ├── Parameters.jsx │ │ │ ├── Parameters.less │ │ │ ├── PermissionsEditorDialog/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.less │ │ │ ├── PlainButton.less │ │ │ ├── PlainButton.tsx │ │ │ ├── PreviewCard.jsx │ │ │ ├── QueryBasedParameterInput.jsx │ │ │ ├── QueryLink.jsx │ │ │ ├── QueryLink.less │ │ │ ├── QuerySelector.jsx │ │ │ ├── Resizable/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.less │ │ │ ├── SelectItemsDialog.jsx │ │ │ ├── SelectItemsDialog.less │ │ │ ├── SelectWithVirtualScroll.tsx │ │ │ ├── SettingsWrapper.jsx │ │ │ ├── TagsList.less │ │ │ ├── TagsList.tsx │ │ │ ├── TimeAgo.jsx │ │ │ ├── Timer.jsx │ │ │ ├── Tooltip.tsx │ │ │ ├── UserGroups.jsx │ │ │ ├── UserGroups.less │ │ │ ├── admin/ │ │ │ │ ├── Layout.jsx │ │ │ │ ├── RQStatus.jsx │ │ │ │ ├── StatusBlock.jsx │ │ │ │ └── layout.less │ │ │ ├── cards-list/ │ │ │ │ ├── CardsList.less │ │ │ │ └── CardsList.tsx │ │ │ ├── dashboards/ │ │ │ │ ├── AddWidgetDialog.jsx │ │ │ │ ├── AutoHeightController.js │ │ │ │ ├── CreateDashboardDialog.jsx │ │ │ │ ├── DashboardGrid.jsx │ │ │ │ ├── EditParameterMappingsDialog.jsx │ │ │ │ ├── ExpandedWidgetDialog.jsx │ │ │ │ ├── TextboxDialog.jsx │ │ │ │ ├── TextboxDialog.less │ │ │ │ ├── dashboard-grid.less │ │ │ │ └── dashboard-widget/ │ │ │ │ ├── RestrictedWidget.jsx │ │ │ │ ├── TextboxWidget.jsx │ │ │ │ ├── VisualizationWidget.jsx │ │ │ │ ├── Widget.jsx │ │ │ │ ├── Widget.less │ │ │ │ └── index.js │ │ │ ├── dynamic-form/ │ │ │ │ ├── DynamicForm.jsx │ │ │ │ ├── DynamicForm.less │ │ │ │ ├── DynamicFormField.jsx │ │ │ │ ├── dynamicFormHelper.js │ │ │ │ ├── fields/ │ │ │ │ │ ├── AceEditorField.jsx │ │ │ │ │ ├── CheckboxField.jsx │ │ │ │ │ ├── ContentField.jsx │ │ │ │ │ ├── FileField.jsx │ │ │ │ │ ├── InputField.jsx │ │ │ │ │ ├── NumberField.jsx │ │ │ │ │ ├── SelectField.jsx │ │ │ │ │ ├── TextAreaField.jsx │ │ │ │ │ └── index.js │ │ │ │ └── getFieldLabel.js │ │ │ ├── dynamic-parameters/ │ │ │ │ ├── DateParameter.jsx │ │ │ │ ├── DateRangeParameter.jsx │ │ │ │ ├── DynamicButton.jsx │ │ │ │ ├── DynamicButton.less │ │ │ │ ├── DynamicDatePicker.jsx │ │ │ │ ├── DynamicDateRangePicker.jsx │ │ │ │ └── DynamicParameters.less │ │ │ ├── empty-state/ │ │ │ │ ├── EmptyState.d.ts │ │ │ │ ├── EmptyState.jsx │ │ │ │ └── empty-state.less │ │ │ ├── groups/ │ │ │ │ ├── CreateGroupDialog.jsx │ │ │ │ ├── DeleteGroupButton.jsx │ │ │ │ ├── DetailsPageSidebar.jsx │ │ │ │ ├── GroupName.jsx │ │ │ │ └── ListItemAddon.jsx │ │ │ ├── items-list/ │ │ │ │ ├── ItemsList.tsx │ │ │ │ ├── classes/ │ │ │ │ │ ├── ItemsFetcher.js │ │ │ │ │ ├── ItemsSource.d.ts │ │ │ │ │ ├── ItemsSource.js │ │ │ │ │ ├── Paginator.js │ │ │ │ │ ├── Sorter.js │ │ │ │ │ └── StateStorage.js │ │ │ │ ├── components/ │ │ │ │ │ ├── EmptyState.jsx │ │ │ │ │ ├── ItemsTable.jsx │ │ │ │ │ ├── LoadingState.jsx │ │ │ │ │ └── Sidebar.jsx │ │ │ │ └── hooks/ │ │ │ │ └── useItemsListExtraActions.js │ │ │ ├── layouts/ │ │ │ │ ├── ContentWithSidebar.jsx │ │ │ │ └── content-with-sidebar.less │ │ │ ├── proptypes.js │ │ │ ├── queries/ │ │ │ │ ├── AddToDashboardDialog.jsx │ │ │ │ ├── ApiKeyDialog/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.less │ │ │ │ ├── EmbedQueryDialog.jsx │ │ │ │ ├── EmbedQueryDialog.less │ │ │ │ ├── QueryEditor/ │ │ │ │ │ ├── AutoLimitCheckbox.jsx │ │ │ │ │ ├── AutocompleteToggle.jsx │ │ │ │ │ ├── QueryEditorControls.jsx │ │ │ │ │ ├── QueryEditorControls.less │ │ │ │ │ ├── ace.js │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.less │ │ │ │ ├── ScheduleDialog.css │ │ │ │ ├── ScheduleDialog.jsx │ │ │ │ ├── ScheduleDialog.test.js │ │ │ │ ├── SchedulePhrase.jsx │ │ │ │ ├── SchemaBrowser.jsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── ScheduleDialog.test.js.snap │ │ │ │ ├── add-to-dashboard-dialog.less │ │ │ │ └── editor-components/ │ │ │ │ ├── databricks/ │ │ │ │ │ ├── DatabricksSchemaBrowser.jsx │ │ │ │ │ ├── DatabricksSchemaBrowser.less │ │ │ │ │ └── useDatabricksSchema.js │ │ │ │ ├── editorComponents.js │ │ │ │ └── index.js │ │ │ ├── query-snippets/ │ │ │ │ └── QuerySnippetDialog.jsx │ │ │ ├── tags-control/ │ │ │ │ ├── EditTagsDialog.jsx │ │ │ │ └── TagsControl.jsx │ │ │ └── visualizations/ │ │ │ ├── EditVisualizationDialog.jsx │ │ │ ├── EditVisualizationDialog.less │ │ │ ├── VisualizationName.jsx │ │ │ ├── VisualizationName.less │ │ │ ├── VisualizationRenderer.jsx │ │ │ └── visualizationComponents.jsx │ │ ├── config/ │ │ │ ├── antd-spinner.jsx │ │ │ ├── dashboard-grid-options.js │ │ │ └── index.js │ │ ├── extensions/ │ │ │ └── .gitkeep │ │ ├── index.html │ │ ├── index.js │ │ ├── lib/ │ │ │ ├── accessibility.ts │ │ │ ├── calculateTextWidth.ts │ │ │ ├── hooks/ │ │ │ │ ├── useFullscreenHandler.js │ │ │ │ ├── useImmutableCallback.js │ │ │ │ ├── useLazyRef.ts │ │ │ │ ├── useSearchResults.js │ │ │ │ └── useUniqueId.ts │ │ │ ├── localOptions.js │ │ │ ├── pagination/ │ │ │ │ ├── index.js │ │ │ │ └── paginator.js │ │ │ ├── queryFormat.test.js │ │ │ ├── queryFormat.ts │ │ │ ├── useQueryResultData.js │ │ │ └── utils.js │ │ ├── multi_org.html │ │ ├── pages/ │ │ │ ├── admin/ │ │ │ │ ├── Jobs.jsx │ │ │ │ ├── OutdatedQueries.jsx │ │ │ │ ├── SystemStatus.jsx │ │ │ │ └── system-status.less │ │ │ ├── alert/ │ │ │ │ ├── Alert.jsx │ │ │ │ ├── AlertEdit.jsx │ │ │ │ ├── AlertNew.jsx │ │ │ │ ├── AlertView.jsx │ │ │ │ └── components/ │ │ │ │ ├── AlertDestinations.jsx │ │ │ │ ├── AlertDestinations.less │ │ │ │ ├── Criteria.jsx │ │ │ │ ├── Criteria.less │ │ │ │ ├── HorizontalFormItem.jsx │ │ │ │ ├── MenuButton.jsx │ │ │ │ ├── NotificationTemplate.jsx │ │ │ │ ├── NotificationTemplate.less │ │ │ │ ├── Query.jsx │ │ │ │ ├── Query.less │ │ │ │ ├── Rearm.jsx │ │ │ │ ├── Rearm.less │ │ │ │ ├── Title.jsx │ │ │ │ └── Title.less │ │ │ ├── alerts/ │ │ │ │ └── AlertsList.jsx │ │ │ ├── dashboards/ │ │ │ │ ├── DashboardList.jsx │ │ │ │ ├── DashboardPage.jsx │ │ │ │ ├── DashboardPage.less │ │ │ │ ├── PublicDashboardPage.jsx │ │ │ │ ├── PublicDashboardPage.less │ │ │ │ ├── components/ │ │ │ │ │ ├── DashboardHeader.jsx │ │ │ │ │ ├── DashboardHeader.less │ │ │ │ │ ├── DashboardListEmptyState.tsx │ │ │ │ │ └── ShareDashboardDialog.jsx │ │ │ │ ├── dashboard-list.css │ │ │ │ └── hooks/ │ │ │ │ ├── useDashboard.js │ │ │ │ ├── useDataSources.js │ │ │ │ ├── useDuplicateDashboard.js │ │ │ │ ├── useEditModeHandler.js │ │ │ │ └── useRefreshRateHandler.js │ │ │ ├── data-sources/ │ │ │ │ ├── DataSourcesList.jsx │ │ │ │ └── EditDataSource.jsx │ │ │ ├── destinations/ │ │ │ │ ├── DestinationsList.jsx │ │ │ │ └── EditDestination.jsx │ │ │ ├── groups/ │ │ │ │ ├── GroupDataSources.jsx │ │ │ │ ├── GroupMembers.jsx │ │ │ │ └── GroupsList.jsx │ │ │ ├── home/ │ │ │ │ ├── Home.jsx │ │ │ │ ├── Home.less │ │ │ │ └── components/ │ │ │ │ └── FavoritesList.jsx │ │ │ ├── index.js │ │ │ ├── queries/ │ │ │ │ ├── QuerySource.jsx │ │ │ │ ├── QuerySource.less │ │ │ │ ├── QueryView.jsx │ │ │ │ ├── QueryView.less │ │ │ │ ├── VisualizationEmbed.jsx │ │ │ │ ├── components/ │ │ │ │ │ ├── QueryExecutionMetadata.jsx │ │ │ │ │ ├── QueryExecutionMetadata.less │ │ │ │ │ ├── QueryExecutionStatus.jsx │ │ │ │ │ ├── QueryMetadata.jsx │ │ │ │ │ ├── QueryMetadata.less │ │ │ │ │ ├── QueryPageHeader.jsx │ │ │ │ │ ├── QueryPageHeader.less │ │ │ │ │ ├── QuerySourceAlerts.jsx │ │ │ │ │ ├── QuerySourceAlerts.less │ │ │ │ │ ├── QuerySourceDropdown.jsx │ │ │ │ │ ├── QuerySourceDropdownItem.jsx │ │ │ │ │ ├── QuerySourceTypeIcon.jsx │ │ │ │ │ ├── QueryViewButton.jsx │ │ │ │ │ ├── QueryVisualizationTabs.jsx │ │ │ │ │ ├── QueryVisualizationTabs.less │ │ │ │ │ └── wrapQueryPage.jsx │ │ │ │ └── hooks/ │ │ │ │ ├── useAddNewParameterDialog.js │ │ │ │ ├── useAddToDashboardDialog.js │ │ │ │ ├── useAddVisualizationDialog.js │ │ │ │ ├── useApiKeyDialog.js │ │ │ │ ├── useArchiveQuery.jsx │ │ │ │ ├── useAutoLimitFlags.js │ │ │ │ ├── useAutocompleteFlags.js │ │ │ │ ├── useDataSourceSchema.js │ │ │ │ ├── useDeleteVisualization.js │ │ │ │ ├── useDuplicateQuery.js │ │ │ │ ├── useEditScheduleDialog.js │ │ │ │ ├── useEditVisualizationDialog.js │ │ │ │ ├── useEmbedDialog.js │ │ │ │ ├── usePermissionsEditorDialog.js │ │ │ │ ├── usePublishQuery.js │ │ │ │ ├── useQuery.js │ │ │ │ ├── useQueryDataSources.js │ │ │ │ ├── useQueryExecute.js │ │ │ │ ├── useQueryFlags.js │ │ │ │ ├── useQueryParameters.js │ │ │ │ ├── useRenameQuery.js │ │ │ │ ├── useUnpublishQuery.js │ │ │ │ ├── useUnsavedChangesAlert.js │ │ │ │ ├── useUpdateQuery.jsx │ │ │ │ ├── useUpdateQueryDescription.js │ │ │ │ ├── useUpdateQueryTags.js │ │ │ │ └── useVisualizationTabHandler.js │ │ │ ├── queries-list/ │ │ │ │ ├── QueriesList.jsx │ │ │ │ ├── QueriesListEmptyState.jsx │ │ │ │ └── queries-list.css │ │ │ ├── query-snippets/ │ │ │ │ ├── QuerySnippetsList.jsx │ │ │ │ └── QuerySnippetsList.less │ │ │ ├── settings/ │ │ │ │ ├── OrganizationSettings.jsx │ │ │ │ ├── components/ │ │ │ │ │ ├── AuthSettings/ │ │ │ │ │ │ ├── GoogleLoginSettings.jsx │ │ │ │ │ │ ├── PasswordLoginSettings.jsx │ │ │ │ │ │ ├── SAMLSettings.jsx │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── GeneralSettings/ │ │ │ │ │ │ ├── BeaconConsentSettings.jsx │ │ │ │ │ │ ├── FeatureFlagsSettings.jsx │ │ │ │ │ │ ├── FormatSettings.jsx │ │ │ │ │ │ ├── PlotlySettings.jsx │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── prop-types.js │ │ │ │ └── hooks/ │ │ │ │ └── useOrganizationSettings.js │ │ │ └── users/ │ │ │ ├── UserProfile.jsx │ │ │ ├── UsersList.jsx │ │ │ ├── components/ │ │ │ │ ├── ApiKeyForm.jsx │ │ │ │ ├── CreateUserDialog.jsx │ │ │ │ ├── EditableUserProfile.jsx │ │ │ │ ├── PasswordForm/ │ │ │ │ │ ├── ChangePasswordDialog.jsx │ │ │ │ │ ├── PasswordLinkAlert.jsx │ │ │ │ │ ├── PasswordResetForm.jsx │ │ │ │ │ ├── ResendInvitationForm.jsx │ │ │ │ │ └── index.jsx │ │ │ │ ├── ReadOnlyUserProfile.jsx │ │ │ │ ├── ReadOnlyUserProfile.test.js │ │ │ │ ├── ToggleUserForm.jsx │ │ │ │ ├── UserInfoForm.jsx │ │ │ │ └── __snapshots__/ │ │ │ │ └── ReadOnlyUserProfile.test.js.snap │ │ │ ├── hooks/ │ │ │ │ └── useUserGroups.js │ │ │ └── settings.less │ │ ├── redash-font/ │ │ │ ├── style.less │ │ │ └── variables.less │ │ ├── services/ │ │ │ ├── KeyboardShortcuts.js │ │ │ ├── alert-subscription.js │ │ │ ├── alert.js │ │ │ ├── auth.js │ │ │ ├── auth.test.js │ │ │ ├── axios.js │ │ │ ├── dashboard.js │ │ │ ├── data-source.js │ │ │ ├── databricks-data-source.js │ │ │ ├── destination.js │ │ │ ├── getTags.js │ │ │ ├── group.js │ │ │ ├── location.js │ │ │ ├── notification.d.ts │ │ │ ├── notification.js │ │ │ ├── notifications.js │ │ │ ├── offline-listener.js │ │ │ ├── organizationSettings.js │ │ │ ├── organizationStatus.js │ │ │ ├── parameters/ │ │ │ │ ├── DateParameter.js │ │ │ │ ├── DateRangeParameter.js │ │ │ │ ├── EnumParameter.js │ │ │ │ ├── NumberParameter.js │ │ │ │ ├── Parameter.js │ │ │ │ ├── QueryBasedDropdownParameter.js │ │ │ │ ├── TextParameter.js │ │ │ │ ├── TextPatternParameter.js │ │ │ │ ├── index.js │ │ │ │ └── tests/ │ │ │ │ ├── DateParameter.test.js │ │ │ │ ├── DateRangeParameter.test.js │ │ │ │ ├── EnumParameter.test.js │ │ │ │ ├── NumberParameter.test.js │ │ │ │ ├── Parameter.test.js │ │ │ │ ├── QueryBasedDropdownParameter.test.js │ │ │ │ ├── TextParameter.test.js │ │ │ │ └── TextPatternParameter.test.js │ │ │ ├── policy/ │ │ │ │ ├── DefaultPolicy.js │ │ │ │ └── index.js │ │ │ ├── query-result.js │ │ │ ├── query-result.test.js │ │ │ ├── query-snippet.js │ │ │ ├── query.js │ │ │ ├── recordEvent.js │ │ │ ├── resizeObserver.js │ │ │ ├── restoreSession.jsx │ │ │ ├── routes.ts │ │ │ ├── sanitize.js │ │ │ ├── settingsMenu.js │ │ │ ├── settingsMenu.test.js │ │ │ ├── url.js │ │ │ ├── user.js │ │ │ ├── utils.js │ │ │ ├── visualization.js │ │ │ └── widget.js │ │ ├── styles/ │ │ │ ├── formStyle.less │ │ │ └── formStyle.ts │ │ ├── unsupported.html │ │ ├── unsupportedRedirect.js │ │ └── version.json │ ├── cypress/ │ │ ├── .eslintrc.js │ │ ├── cypress.js │ │ ├── integration/ │ │ │ ├── alert/ │ │ │ │ ├── create_alert_spec.js │ │ │ │ ├── edit_alert_spec.js │ │ │ │ └── view_alert_spec.js │ │ │ ├── dashboard/ │ │ │ │ ├── dashboard_list.js │ │ │ │ ├── dashboard_spec.js │ │ │ │ ├── dashboard_tags_spec.js │ │ │ │ ├── filters_spec.js │ │ │ │ ├── grid_compliant_widgets_spec.js │ │ │ │ ├── parameter_spec.js │ │ │ │ ├── sharing_spec.js │ │ │ │ ├── textbox_spec.js │ │ │ │ └── widget_spec.js │ │ │ ├── data-source/ │ │ │ │ ├── create_data_source_spec.js │ │ │ │ └── edit_data_source_spec.js │ │ │ ├── destination/ │ │ │ │ └── create_destination_spec.js │ │ │ ├── embed/ │ │ │ │ └── share_embed_spec.js │ │ │ ├── group/ │ │ │ │ ├── edit_group_spec.js │ │ │ │ └── group_list_spec.js │ │ │ ├── query/ │ │ │ │ ├── create_query_spec.js │ │ │ │ ├── filters_spec.js │ │ │ │ ├── parameter_spec.js │ │ │ │ └── query_tags_spec.js │ │ │ ├── query-snippets/ │ │ │ │ └── create_query_snippet_spec.js │ │ │ ├── settings/ │ │ │ │ ├── organization_settings_spec.js │ │ │ │ └── settings_tabs_spec.js │ │ │ ├── user/ │ │ │ │ ├── create_user_spec.js │ │ │ │ ├── edit_profile_spec.js │ │ │ │ ├── login_spec.js │ │ │ │ ├── logout_spec.js │ │ │ │ └── user_list_spec.js │ │ │ └── visualizations/ │ │ │ ├── box_plot_spec.js │ │ │ ├── chart_spec.js │ │ │ ├── choropleth_spec.js │ │ │ ├── cohort_spec.js │ │ │ ├── counter_spec.js │ │ │ ├── edit_visualization_dialog_spec.js │ │ │ ├── funnel_spec.js │ │ │ ├── map_spec.js │ │ │ ├── pivot_spec.js │ │ │ ├── sankey_sunburst_spec.js │ │ │ ├── table/ │ │ │ │ ├── .mocks/ │ │ │ │ │ ├── all-cell-types.js │ │ │ │ │ ├── large-dataset.js │ │ │ │ │ ├── multi-column-sort.js │ │ │ │ │ └── search-in-data.js │ │ │ │ └── table_spec.js │ │ │ └── word_cloud_spec.js │ │ ├── seed-data.js │ │ ├── support/ │ │ │ ├── commands.js │ │ │ ├── dashboard/ │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── parameters.js │ │ │ ├── redash-api/ │ │ │ │ └── index.js │ │ │ ├── tags/ │ │ │ │ └── index.js │ │ │ └── visualizations/ │ │ │ ├── chart.js │ │ │ └── table.js │ │ └── tsconfig.json │ ├── prettier.config.js │ └── tsconfig.json ├── codecov.yml ├── compose.yaml ├── cypress.config.js ├── manage.py ├── migrations/ │ ├── 0001_warning.py │ ├── README │ ├── alembic.ini │ ├── env.py │ ├── script.py.mako │ └── versions/ │ ├── 0ec979123ba4_.py │ ├── 0f740a081d20_inline_tags.py │ ├── 1038c2174f5d_make_case_insensitive_hash_of_query_text.py │ ├── 1655999df5e3_default_alert_selector.py │ ├── 1daa601d3ae5_add_columns_for_disabled_users.py │ ├── 5ec5c84ba61e_.py │ ├── 640888ce445d_.py │ ├── 65fc9ede4746_add_is_draft_status_to_queries_and_.py │ ├── 6b5be7e0a0ef_.py │ ├── 71477dadd6ef_favorites_unique_constraint.py │ ├── 7205816877ec_change_type_of_json_fields_from_varchar_.py │ ├── 73beceabb948_bring_back_null_schedule.py │ ├── 7671dca4e604_.py │ ├── 7ce5925f832b_create_sqlalchemy_searchable_expressions.py │ ├── 89bc7873a3e0_fix_multiple_heads.py │ ├── 969126bd800f_.py │ ├── 98af61feea92_add_encrypted_options_to_data_sources.py │ ├── 9e8c841d1a30_fix_hash.py │ ├── a92d92aa678e_inline_tags.py │ ├── d1eae8b9893e_.py │ ├── d4c798575877_create_favorites.py │ ├── d7d747033183_encrypt_alert_destinations.py │ ├── db0aca1ebd32_12_column_dashboard_layout.py │ ├── e5c7a4e2df4d_remove_query_tracker_keys.py │ ├── e7004224f284_add_org_id_to_favorites.py │ ├── e7f8a917aa8e_add_user_details_json_column.py │ └── fd4fc850d7ea_.py ├── netlify.toml ├── package.json ├── pnpm-workspace.yaml ├── pyproject.toml ├── pytest.ini ├── redash/ │ ├── __init__.py │ ├── app.py │ ├── authentication/ │ │ ├── __init__.py │ │ ├── account.py │ │ ├── google_oauth.py │ │ ├── jwt_auth.py │ │ ├── ldap_auth.py │ │ ├── org_resolving.py │ │ ├── remote_user_auth.py │ │ └── saml_auth.py │ ├── cli/ │ │ ├── __init__.py │ │ ├── data_sources.py │ │ ├── database.py │ │ ├── groups.py │ │ ├── organization.py │ │ ├── queries.py │ │ ├── rq.py │ │ └── users.py │ ├── destinations/ │ │ ├── __init__.py │ │ ├── asana.py │ │ ├── chatwork.py │ │ ├── datadog.py │ │ ├── discord.py │ │ ├── email.py │ │ ├── hangoutschat.py │ │ ├── mattermost.py │ │ ├── microsoft_teams_webhook.py │ │ ├── pagerduty.py │ │ ├── slack.py │ │ ├── webex.py │ │ └── webhook.py │ ├── handlers/ │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── alerts.py │ │ ├── api.py │ │ ├── authentication.py │ │ ├── base.py │ │ ├── dashboards.py │ │ ├── data_sources.py │ │ ├── databricks.py │ │ ├── destinations.py │ │ ├── embed.py │ │ ├── events.py │ │ ├── favorites.py │ │ ├── groups.py │ │ ├── organization.py │ │ ├── permissions.py │ │ ├── queries.py │ │ ├── query_results.py │ │ ├── query_snippets.py │ │ ├── settings.py │ │ ├── setup.py │ │ ├── static.py │ │ ├── users.py │ │ ├── visualizations.py │ │ ├── webpack.py │ │ └── widgets.py │ ├── metrics/ │ │ ├── __init__.py │ │ ├── database.py │ │ └── request.py │ ├── models/ │ │ ├── __init__.py │ │ ├── base.py │ │ ├── changes.py │ │ ├── mixins.py │ │ ├── organizations.py │ │ ├── parameterized_query.py │ │ ├── types.py │ │ └── users.py │ ├── monitor.py │ ├── permissions.py │ ├── query_runner/ │ │ ├── __init__.py │ │ ├── amazon_elasticsearch.py │ │ ├── arango.py │ │ ├── athena.py │ │ ├── axibase_tsd.py │ │ ├── azure_kusto.py │ │ ├── big_query.py │ │ ├── big_query_gce.py │ │ ├── cass.py │ │ ├── clickhouse.py │ │ ├── cloudwatch.py │ │ ├── cloudwatch_insights.py │ │ ├── corporate_memory.py │ │ ├── couchbase.py │ │ ├── csv.py │ │ ├── databend.py │ │ ├── databricks.py │ │ ├── db2.py │ │ ├── dgraph.py │ │ ├── drill.py │ │ ├── druid.py │ │ ├── duckdb.py │ │ ├── e6data.py │ │ ├── elasticsearch.py │ │ ├── elasticsearch2.py │ │ ├── exasol.py │ │ ├── excel.py │ │ ├── files/ │ │ │ ├── rds-combined-ca-bundle.pem │ │ │ └── redshift-ca-bundle.crt │ │ ├── google_analytics.py │ │ ├── google_analytics4.py │ │ ├── google_search_console.py │ │ ├── google_spanner.py │ │ ├── google_spreadsheets.py │ │ ├── graphite.py │ │ ├── hive_ds.py │ │ ├── ignite.py │ │ ├── impala_ds.py │ │ ├── influx_db.py │ │ ├── influx_db_v2.py │ │ ├── jql.py │ │ ├── json_ds.py │ │ ├── kylin.py │ │ ├── memsql_ds.py │ │ ├── mongodb.py │ │ ├── mssql.py │ │ ├── mssql_odbc.py │ │ ├── mysql.py │ │ ├── nz.py │ │ ├── oracle.py │ │ ├── pg.py │ │ ├── phoenix.py │ │ ├── pinot.py │ │ ├── presto.py │ │ ├── prometheus.py │ │ ├── python.py │ │ ├── query_results.py │ │ ├── risingwave.py │ │ ├── rockset.py │ │ ├── salesforce.py │ │ ├── script.py │ │ ├── snowflake.py │ │ ├── sparql_endpoint.py │ │ ├── sqlite.py │ │ ├── tinybird.py │ │ ├── treasuredata.py │ │ ├── trino.py │ │ ├── uptycs.py │ │ ├── url.py │ │ ├── vertica.py │ │ ├── yandex_disk.py │ │ └── yandex_metrica.py │ ├── security.py │ ├── serializers/ │ │ ├── __init__.py │ │ └── query_result.py │ ├── settings/ │ │ ├── __init__.py │ │ ├── dynamic_settings.py │ │ ├── helpers.py │ │ └── organization.py │ ├── tasks/ │ │ ├── __init__.py │ │ ├── alerts.py │ │ ├── databricks.py │ │ ├── failure_report.py │ │ ├── general.py │ │ ├── queries/ │ │ │ ├── __init__.py │ │ │ ├── execution.py │ │ │ └── maintenance.py │ │ ├── schedule.py │ │ └── worker.py │ ├── templates/ │ │ ├── _includes/ │ │ │ ├── signed_out_tail.html │ │ │ └── tail.html │ │ ├── emails/ │ │ │ ├── alert.html │ │ │ ├── failures.html │ │ │ ├── failures.txt │ │ │ ├── invite.html │ │ │ ├── invite.txt │ │ │ ├── layout.html │ │ │ ├── reset.html │ │ │ ├── reset.txt │ │ │ ├── reset_disabled.html │ │ │ ├── reset_disabled.txt │ │ │ ├── verify.html │ │ │ └── verify.txt │ │ ├── error.html │ │ ├── forgot.html │ │ ├── invite.html │ │ ├── layouts/ │ │ │ └── signed_out.html │ │ ├── login.html │ │ ├── reset.html │ │ ├── setup.html │ │ └── verify.html │ ├── utils/ │ │ ├── __init__.py │ │ ├── configuration.py │ │ ├── human_time.py │ │ ├── pandas.py │ │ ├── query_order.py │ │ ├── requests_session.py │ │ └── sentry.py │ ├── version_check.py │ ├── worker.py │ └── wsgi.py ├── scripts/ │ └── README.md ├── setup/ │ └── README.md ├── tests/ │ ├── __init__.py │ ├── destinations/ │ │ └── test_webhook.py │ ├── factories.py │ ├── handlers/ │ │ ├── __init__.py │ │ ├── test_alerts.py │ │ ├── test_authentication.py │ │ ├── test_dashboards.py │ │ ├── test_data_sources.py │ │ ├── test_destinations.py │ │ ├── test_embed.py │ │ ├── test_favorites.py │ │ ├── test_groups.py │ │ ├── test_order_results.py │ │ ├── test_paginate.py │ │ ├── test_permissions.py │ │ ├── test_queries.py │ │ ├── test_query_results.py │ │ ├── test_query_snippets.py │ │ ├── test_settings.py │ │ ├── test_users.py │ │ ├── test_visualizations.py │ │ └── test_widgets.py │ ├── metrics/ │ │ ├── __init__.py │ │ ├── test_database.py │ │ └── test_request.py │ ├── models/ │ │ ├── __init__.py │ │ ├── test_alerts.py │ │ ├── test_api_keys.py │ │ ├── test_changes.py │ │ ├── test_dashboards.py │ │ ├── test_data_sources.py │ │ ├── test_parameterized_query.py │ │ ├── test_permissions.py │ │ ├── test_queries.py │ │ ├── test_query_results.py │ │ └── test_users.py │ ├── query_runner/ │ │ ├── __init__.py │ │ ├── test_athena.py │ │ ├── test_azure_kusto.py │ │ ├── test_basequeryrunner.py │ │ ├── test_basesql_queryrunner.py │ │ ├── test_bigquery.py │ │ ├── test_cass.py │ │ ├── test_clickhouse.py │ │ ├── test_databricks.py │ │ ├── test_drill.py │ │ ├── test_duckdb.py │ │ ├── test_e6data.py │ │ ├── test_elasticsearch2.py │ │ ├── test_google_analytics4.py │ │ ├── test_google_search_console.py │ │ ├── test_google_spreadsheets.py │ │ ├── test_http.py │ │ ├── test_ignite.py │ │ ├── test_influx_db.py │ │ ├── test_influx_db_v2.py │ │ ├── test_jql.py │ │ ├── test_json_ds.py │ │ ├── test_mongodb.py │ │ ├── test_oracle.py │ │ ├── test_pg.py │ │ ├── test_prometheus.py │ │ ├── test_python.py │ │ ├── test_query_results.py │ │ ├── test_script.py │ │ ├── test_tinybird.py │ │ ├── test_trino.py │ │ ├── test_utils.py │ │ ├── test_yandex_disk.py │ │ └── test_yandex_metrica.py │ ├── serializers/ │ │ ├── __init__.py │ │ └── test_query_results.py │ ├── tasks/ │ │ ├── __init__.py │ │ ├── test_alerts.py │ │ ├── test_empty_schedule.py │ │ ├── test_failure_report.py │ │ ├── test_queries.py │ │ ├── test_refresh_queries.py │ │ ├── test_refresh_schemas.py │ │ ├── test_schedule.py │ │ └── test_worker.py │ ├── test_authentication.py │ ├── test_cli.py │ ├── test_configuration.py │ ├── test_handlers.py │ ├── test_migrations.py │ ├── test_models.py │ ├── test_monitor.py │ ├── test_permissions.py │ ├── test_utils.py │ └── utils/ │ ├── __init__.py │ └── test_json_dumps.py ├── viz-lib/ │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__/ │ │ ├── enzyme_setup.js │ │ └── mocks.js │ ├── package.json │ ├── prettier.config.js │ ├── src/ │ │ ├── components/ │ │ │ ├── ColorPicker/ │ │ │ │ ├── Input.tsx │ │ │ │ ├── Label.tsx │ │ │ │ ├── Swatch.tsx │ │ │ │ ├── index.less │ │ │ │ ├── index.tsx │ │ │ │ ├── input.less │ │ │ │ ├── label.less │ │ │ │ ├── swatch.less │ │ │ │ └── utils.ts │ │ │ ├── ErrorBoundary.tsx │ │ │ ├── HtmlContent.tsx │ │ │ ├── TextAlignmentSelect/ │ │ │ │ ├── index.less │ │ │ │ └── index.tsx │ │ │ ├── json-view-interactive/ │ │ │ │ ├── JsonViewInteractive.tsx │ │ │ │ └── json-view-interactive.less │ │ │ ├── sortable/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.less │ │ │ └── visualizations/ │ │ │ └── editor/ │ │ │ ├── ContextHelp.tsx │ │ │ ├── Section.less │ │ │ ├── Section.tsx │ │ │ ├── Switch.less │ │ │ ├── Switch.tsx │ │ │ ├── TextArea.less │ │ │ ├── TextArea.tsx │ │ │ ├── context-help.less │ │ │ ├── control-label.less │ │ │ ├── createTabbedEditor.tsx │ │ │ ├── index.ts │ │ │ └── withControlLabel.tsx │ │ ├── index.ts │ │ ├── lib/ │ │ │ ├── chooseTextColorForBackground.ts │ │ │ ├── hooks/ │ │ │ │ └── useMemoWithDeepCompare.ts │ │ │ ├── referenceCountingCache.ts │ │ │ ├── utils.ts │ │ │ └── value-format.tsx │ │ ├── services/ │ │ │ ├── resizeObserver.ts │ │ │ └── sanitize.ts │ │ └── visualizations/ │ │ ├── ColorPalette.ts │ │ ├── Editor.tsx │ │ ├── Renderer.tsx │ │ ├── box-plot/ │ │ │ ├── Editor.tsx │ │ │ ├── Renderer.tsx │ │ │ ├── d3box.ts │ │ │ ├── index.ts │ │ │ └── renderer.less │ │ ├── chart/ │ │ │ ├── Editor/ │ │ │ │ ├── AxisSettings.tsx │ │ │ │ ├── ChartTypeSelect.tsx │ │ │ │ ├── ColorsSettings.test.tsx │ │ │ │ ├── ColorsSettings.tsx │ │ │ │ ├── ColumnMappingSelect.tsx │ │ │ │ ├── CustomChartSettings.tsx │ │ │ │ ├── DataLabelsSettings.test.tsx │ │ │ │ ├── DataLabelsSettings.tsx │ │ │ │ ├── DefaultColorsSettings.tsx │ │ │ │ ├── GeneralSettings.test.tsx │ │ │ │ ├── GeneralSettings.tsx │ │ │ │ ├── HeatmapColorsSettings.tsx │ │ │ │ ├── PieColorsSettings.tsx │ │ │ │ ├── SeriesSettings.test.tsx │ │ │ │ ├── SeriesSettings.tsx │ │ │ │ ├── XAxisSettings.test.tsx │ │ │ │ ├── XAxisSettings.tsx │ │ │ │ ├── YAxisSettings.test.tsx │ │ │ │ ├── YAxisSettings.tsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ColorsSettings.test.tsx.snap │ │ │ │ │ ├── DataLabelsSettings.test.tsx.snap │ │ │ │ │ ├── GeneralSettings.test.tsx.snap │ │ │ │ │ ├── SeriesSettings.test.tsx.snap │ │ │ │ │ ├── XAxisSettings.test.tsx.snap │ │ │ │ │ └── YAxisSettings.test.tsx.snap │ │ │ │ ├── editor.less │ │ │ │ ├── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── Renderer/ │ │ │ │ ├── CustomPlotlyChart.tsx │ │ │ │ ├── PlotlyChart.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── initChart.ts │ │ │ │ └── renderer.less │ │ │ ├── fixtures/ │ │ │ │ └── getChartData/ │ │ │ │ ├── multiple-series-grouped.json │ │ │ │ ├── multiple-series-multiple-y.json │ │ │ │ ├── multiple-series-sorted.json │ │ │ │ └── single-series.json │ │ │ ├── getChartData.test.ts │ │ │ ├── getChartData.ts │ │ │ ├── getOptions.ts │ │ │ ├── index.ts │ │ │ └── plotly/ │ │ │ ├── customChartUtils.ts │ │ │ ├── fixtures/ │ │ │ │ ├── prepareData/ │ │ │ │ │ ├── bar/ │ │ │ │ │ │ ├── default.json │ │ │ │ │ │ ├── normalized.json │ │ │ │ │ │ └── stacked.json │ │ │ │ │ ├── box/ │ │ │ │ │ │ ├── default.json │ │ │ │ │ │ └── with-points.json │ │ │ │ │ ├── bubble/ │ │ │ │ │ │ └── default.json │ │ │ │ │ ├── heatmap/ │ │ │ │ │ │ ├── default.json │ │ │ │ │ │ ├── reversed.json │ │ │ │ │ │ ├── sorted-reversed.json │ │ │ │ │ │ ├── sorted.json │ │ │ │ │ │ └── with-labels.json │ │ │ │ │ ├── line-area/ │ │ │ │ │ │ ├── default.json │ │ │ │ │ │ ├── keep-missing-values.json │ │ │ │ │ │ ├── missing-values-0.json │ │ │ │ │ │ ├── normalized-stacked.json │ │ │ │ │ │ ├── normalized.json │ │ │ │ │ │ └── stacked.json │ │ │ │ │ ├── pie/ │ │ │ │ │ │ ├── custom-tooltip.json │ │ │ │ │ │ ├── default.json │ │ │ │ │ │ ├── without-labels.json │ │ │ │ │ │ └── without-x.json │ │ │ │ │ └── scatter/ │ │ │ │ │ ├── default.json │ │ │ │ │ └── without-labels.json │ │ │ │ └── prepareLayout/ │ │ │ │ ├── box-single-axis.json │ │ │ │ ├── box-with-second-axis.json │ │ │ │ ├── default-single-axis.json │ │ │ │ ├── default-with-second-axis.json │ │ │ │ ├── default-with-stacking.json │ │ │ │ ├── default-without-legend.json │ │ │ │ ├── pie-multiple-series.json │ │ │ │ ├── pie-without-annotations.json │ │ │ │ └── pie.json │ │ │ ├── index.ts │ │ │ ├── locales.ts │ │ │ ├── prepareData.test.ts │ │ │ ├── prepareData.ts │ │ │ ├── prepareDefaultData.ts │ │ │ ├── prepareHeatmapData.ts │ │ │ ├── prepareLayout.test.ts │ │ │ ├── prepareLayout.ts │ │ │ ├── preparePieData.ts │ │ │ ├── updateAxes.ts │ │ │ ├── updateChartSize.ts │ │ │ ├── updateData.ts │ │ │ └── utils.ts │ │ ├── choropleth/ │ │ │ ├── ColorPalette.ts │ │ │ ├── Editor/ │ │ │ │ ├── BoundsSettings.tsx │ │ │ │ ├── ColorsSettings.tsx │ │ │ │ ├── FormatSettings.tsx │ │ │ │ ├── GeneralSettings.tsx │ │ │ │ ├── index.ts │ │ │ │ └── utils.ts │ │ │ ├── Renderer/ │ │ │ │ ├── Legend.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── initChoropleth.tsx │ │ │ │ ├── renderer.less │ │ │ │ └── utils.ts │ │ │ ├── getOptions.ts │ │ │ ├── hooks/ │ │ │ │ └── useLoadGeoJson.ts │ │ │ ├── index.ts │ │ │ └── maps/ │ │ │ ├── convert-projection.ts │ │ │ ├── countries.geo.json │ │ │ ├── japan.prefectures.geo.json │ │ │ ├── usa-albers.geo.json │ │ │ └── usa.geo.json │ │ ├── cohort/ │ │ │ ├── Cornelius.tsx │ │ │ ├── Editor/ │ │ │ │ ├── AppearanceSettings.tsx │ │ │ │ ├── ColorsSettings.tsx │ │ │ │ ├── ColumnsSettings.tsx │ │ │ │ ├── OptionsSettings.tsx │ │ │ │ └── index.ts │ │ │ ├── Renderer.tsx │ │ │ ├── cornelius.less │ │ │ ├── getOptions.ts │ │ │ ├── index.ts │ │ │ ├── prepareData.ts │ │ │ └── renderer.less │ │ ├── counter/ │ │ │ ├── Editor/ │ │ │ │ ├── FormatSettings.tsx │ │ │ │ ├── GeneralSettings.tsx │ │ │ │ └── index.ts │ │ │ ├── Renderer.tsx │ │ │ ├── index.ts │ │ │ ├── render.less │ │ │ ├── utils.test.ts │ │ │ └── utils.ts │ │ ├── details/ │ │ │ ├── Editor/ │ │ │ │ ├── ColumnEditor.tsx │ │ │ │ ├── ColumnsSettings.test.tsx │ │ │ │ ├── ColumnsSettings.tsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── ColumnsSettings.test.tsx.snap │ │ │ │ ├── editor.less │ │ │ │ └── index.tsx │ │ │ ├── Renderer.test.tsx │ │ │ ├── Renderer.tsx │ │ │ ├── details.less │ │ │ ├── getOptions.test.ts │ │ │ ├── getOptions.ts │ │ │ └── index.ts │ │ ├── funnel/ │ │ │ ├── Editor/ │ │ │ │ ├── AppearanceSettings.tsx │ │ │ │ ├── GeneralSettings.tsx │ │ │ │ └── index.ts │ │ │ ├── Renderer/ │ │ │ │ ├── FunnelBar.tsx │ │ │ │ ├── funnel-bar.less │ │ │ │ ├── index.less │ │ │ │ ├── index.tsx │ │ │ │ └── prepareData.ts │ │ │ ├── getOptions.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── map/ │ │ │ ├── Editor/ │ │ │ │ ├── FormatSettings.tsx │ │ │ │ ├── GeneralSettings.tsx │ │ │ │ ├── GroupsSettings.tsx │ │ │ │ ├── StyleSettings.tsx │ │ │ │ └── index.ts │ │ │ ├── Renderer.tsx │ │ │ ├── getOptions.ts │ │ │ ├── index.ts │ │ │ ├── initMap.ts │ │ │ └── prepareData.ts │ │ ├── pivot/ │ │ │ ├── Editor.tsx │ │ │ ├── Renderer.tsx │ │ │ ├── index.ts │ │ │ └── renderer.less │ │ ├── prop-types.ts │ │ ├── registeredVisualizations.ts │ │ ├── sankey/ │ │ │ ├── Editor.tsx │ │ │ ├── Renderer.tsx │ │ │ ├── d3sankey.ts │ │ │ ├── index.ts │ │ │ ├── initSankey.ts │ │ │ └── renderer.less │ │ ├── shared/ │ │ │ ├── columnUtils.ts │ │ │ ├── columns/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── boolean.test.tsx.snap │ │ │ │ │ ├── datetime.test.tsx.snap │ │ │ │ │ ├── image.test.tsx.snap │ │ │ │ │ ├── link.test.tsx.snap │ │ │ │ │ ├── number.test.tsx.snap │ │ │ │ │ └── text.test.tsx.snap │ │ │ │ ├── boolean.test.tsx │ │ │ │ ├── boolean.tsx │ │ │ │ ├── datetime.test.tsx │ │ │ │ ├── datetime.tsx │ │ │ │ ├── image.test.tsx │ │ │ │ ├── image.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── json.tsx │ │ │ │ ├── link.test.tsx │ │ │ │ ├── link.tsx │ │ │ │ ├── number.test.tsx │ │ │ │ ├── number.tsx │ │ │ │ ├── text.test.tsx │ │ │ │ └── text.tsx │ │ │ └── components/ │ │ │ ├── ColumnEditor.test.tsx │ │ │ ├── ColumnEditor.tsx │ │ │ └── ColumnsSettings.tsx │ │ ├── sunburst/ │ │ │ ├── Editor.tsx │ │ │ ├── Renderer.tsx │ │ │ ├── index.ts │ │ │ ├── initSunburst.ts │ │ │ └── renderer.less │ │ ├── table/ │ │ │ ├── Editor/ │ │ │ │ ├── ColumnEditor.tsx │ │ │ │ ├── ColumnsSettings.test.tsx │ │ │ │ ├── ColumnsSettings.tsx │ │ │ │ ├── GridSettings.test.tsx │ │ │ │ ├── GridSettings.tsx │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── ColumnsSettings.test.tsx.snap │ │ │ │ │ └── GridSettings.test.tsx.snap │ │ │ │ ├── editor.less │ │ │ │ └── index.tsx │ │ │ ├── Renderer.tsx │ │ │ ├── getOptions.ts │ │ │ ├── index.ts │ │ │ ├── renderer.less │ │ │ └── utils.tsx │ │ ├── variables.less │ │ ├── visualizationsSettings.tsx │ │ └── word-cloud/ │ │ ├── Editor.tsx │ │ ├── Renderer.tsx │ │ ├── index.ts │ │ └── renderer.less │ ├── tsconfig.json │ └── webpack.config.js ├── webpack.config.js └── worker.conf