Chore: Improve some types (#64675)

* some type fixes

* few more

* more type fixes

* fix the majority of (window as any) calls

* don't make new variable for event

* few more

* MOAR
pull/64751/head
Ashley Harrison 2 years ago committed by GitHub
parent aade4b0bd2
commit 53186c14a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 255
      .betterer.results
  2. 2
      e2e/benchmarks/live/4-20hz-panels.spec.ts
  3. 4
      e2e/panels-suite/panelEdit_queries.spec.ts
  4. 2
      packages/grafana-data/src/field/fieldOverrides.test.ts
  5. 2
      packages/grafana-data/src/types/displayValue.ts
  6. 4
      packages/grafana-data/src/utils/Registry.ts
  7. 21
      packages/grafana-data/src/utils/csv.ts
  8. 2
      packages/grafana-data/src/utils/fieldParser.ts
  9. 20
      packages/grafana-data/src/utils/labels.ts
  10. 6
      packages/grafana-data/src/utils/logs.ts
  11. 8
      packages/grafana-data/src/utils/makeClassES5Compatible.ts
  12. 2
      packages/grafana-data/src/utils/tests/mockTransformationsRegistry.ts
  13. 2
      packages/grafana-data/src/valueFormats/arithmeticFormatters.ts
  14. 2
      packages/grafana-data/src/valueFormats/dateTimeFormatters.ts
  15. 4
      packages/grafana-data/src/valueFormats/valueFormats.ts
  16. 2
      packages/grafana-data/test/__mocks__/pluginMocks.ts
  17. 2
      packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx
  18. 2
      packages/grafana-ui/src/components/Graph/Graph.test.tsx
  19. 2
      packages/grafana-ui/src/components/Graph/GraphTooltip/MultiModeGraphTooltip.test.tsx
  20. 2
      packages/grafana-ui/src/components/Icon/iconBundle.ts
  21. 10
      packages/grafana-ui/src/components/Icon/iconBundle.ts.template
  22. 52
      packages/grafana-ui/src/components/Table/utils.ts
  23. 18
      public/app/core/components/OptionsUI/string.tsx
  24. 11
      public/app/core/components/OptionsUI/strings.tsx
  25. 6
      public/app/core/components/Select/ReadonlyFolderPicker/api.test.ts
  26. 7
      public/app/core/components/TagFilter/TagOption.tsx
  27. 2
      public/app/core/components/TimelineChart/TimelineChart.tsx
  28. 12
      public/app/core/components/TimelineChart/timeline.ts
  29. 10
      public/app/core/components/TimelineChart/utils.ts
  30. 2
      public/app/core/history/richHistoryLocalStorageUtils.ts
  31. 4
      public/app/core/navigation/patch/interceptLinkClicks.ts
  32. 8
      public/app/core/profiler.ts
  33. 2
      public/app/core/services/FetchQueue.ts
  34. 4
      public/app/core/services/PreferencesService.ts
  35. 2
      public/app/core/services/__mocks__/search_srv.ts
  36. 2
      public/app/core/services/echo/backends/analytics/ApplicationInsightsBackend.ts
  37. 2
      public/app/core/utils/richHistory.ts
  38. 6
      public/app/core/utils/tracing.ts
  39. 6
      public/app/features/dashboard/components/AddPanelWidget/AddPanelWidget.tsx
  40. 4
      public/app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor.tsx
  41. 4
      public/app/features/dashboard/components/PanelEditor/PanelEditor.tsx
  42. 2
      public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx
  43. 4
      public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx
  44. 4
      public/app/features/dashboard/components/PanelEditor/types.ts
  45. 2
      public/app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect.tsx
  46. 18
      public/app/features/dashboard/components/ShareModal/ShareLink.test.tsx
  47. 2
      public/app/features/dashboard/components/ShareModal/ShareModal.tsx
  48. 4
      public/app/features/dashboard/components/ShareModal/utils.ts
  49. 2
      public/app/features/dashboard/components/VersionHistory/utils.ts
  50. 2
      public/app/features/datasources/components/ButtonRow.tsx
  51. 2
      public/app/features/datasources/components/EditDataSource.tsx
  52. 2
      public/app/features/dimensions/color.ts
  53. 2
      public/app/features/dimensions/editors/ColorDimensionEditor.tsx
  54. 2
      public/app/features/dimensions/editors/IconSelector.tsx
  55. 2
      public/app/features/dimensions/editors/ResourcePicker.tsx
  56. 2
      public/app/features/dimensions/editors/ScalarDimensionEditor.tsx
  57. 4
      public/app/features/dimensions/editors/ScaleDimensionEditor.tsx
  58. 2
      public/app/features/dimensions/editors/TextDimensionEditor.tsx
  59. 2
      public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditor.tsx
  60. 4
      public/app/features/dimensions/text.ts
  61. 3
      public/app/features/explore/LogsContainer.tsx
  62. 4
      public/app/features/explore/QueryRows.test.tsx
  63. 2
      public/app/features/explore/RichHistory/RichHistory.tsx
  64. 2
      public/app/features/explore/RichHistory/RichHistoryQueriesTab.tsx
  65. 6
      public/app/features/explore/TraceView/components/ScrollManager.tsx
  66. 6
      public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/Scrubber.tsx
  67. 34
      public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/render-into-canvas.tsx
  68. 2
      public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBar.tsx
  69. 2
      public/app/features/explore/TraceView/components/TraceTimelineViewer/utils.tsx
  70. 2
      public/app/features/explore/TraceView/components/constants/index.tsx
  71. 20
      public/app/features/runtime/init.ts
  72. 10
      public/app/plugins/datasource/loki/querySplitting.ts
  73. 15
      public/app/plugins/panel/barchart/utils.ts

@ -5,14 +5,6 @@
//
exports[`better eslint`] = {
value: `{
"e2e/benchmarks/live/4-20hz-panels.spec.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"e2e/panels-suite/panelEdit_queries.spec.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"packages/grafana-data/src/dataframe/ArrayDataFrame.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@ -397,9 +389,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "28"],
[0, 0, 0, "Unexpected any. Specify a different type.", "29"]
],
"packages/grafana-data/src/types/displayValue.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-data/src/types/explore.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@ -597,26 +586,18 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "87"]
],
"packages/grafana-data/src/utils/Registry.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-data/src/utils/arrayUtils.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"packages/grafana-data/src/utils/csv.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Do not use any type assertions.", "4"],
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
[0, 0, 0, "Unexpected any. Specify a different type.", "7"],
[0, 0, 0, "Unexpected any. Specify a different type.", "8"],
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
[0, 0, 0, "Do not use any type assertions.", "10"],
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
[0, 0, 0, "Do not use any type assertions.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
],
"packages/grafana-data/src/utils/dataLinks.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
@ -629,16 +610,11 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "4"]
],
"packages/grafana-data/src/utils/fieldParser.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-data/src/utils/flotPairs.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-data/src/utils/labels.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"packages/grafana-data/src/utils/location.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@ -647,24 +623,12 @@ exports[`better eslint`] = {
],
"packages/grafana-data/src/utils/logs.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Do not use any type assertions.", "4"]
],
"packages/grafana-data/src/utils/makeClassES5Compatible.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"packages/grafana-data/src/utils/testdata/testTheme.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"packages/grafana-data/src/utils/tests/mockTransformationsRegistry.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-data/src/utils/url.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@ -690,16 +654,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "9"],
[0, 0, 0, "Unexpected any. Specify a different type.", "10"]
],
"packages/grafana-data/src/valueFormats/arithmeticFormatters.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-data/src/valueFormats/dateTimeFormatters.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-data/src/valueFormats/valueFormats.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"packages/grafana-data/src/vector/AppendedVectors.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
@ -725,8 +679,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-data/test/__mocks__/pluginMocks.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"packages/grafana-e2e/cypress/plugins/benchmark/formatting.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@ -1064,8 +1017,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"]
],
"packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"packages/grafana-ui/src/components/Forms/FieldArray.story.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@ -2215,13 +2167,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "85"],
[0, 0, 0, "Unexpected any. Specify a different type.", "86"]
],
"public/app/core/components/OptionsUI/string.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/core/components/OptionsUI/strings.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/core/components/PageNew/SectionNavItem.tsx:5381": [
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"]
],
@ -2238,11 +2183,6 @@ exports[`better eslint`] = {
"public/app/core/components/Select/FolderPicker.tsx:5381": [
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"]
],
"public/app/core/components/Select/ReadonlyFolderPicker/api.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"public/app/core/components/TagFilter/TagFilter.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@ -2254,23 +2194,10 @@ exports[`better eslint`] = {
],
"public/app/core/components/TagFilter/TagOption.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"public/app/core/components/TimelineChart/TimelineChart.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/components/TimelineChart/timeline.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Do not use any type assertions.", "3"],
[0, 0, 0, "Do not use any type assertions.", "4"]
],
"public/app/core/components/TimelineChart/utils.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
"public/app/core/components/TimelineChart/TimelineChart.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/core/components/connectWithCleanUp.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@ -2279,9 +2206,6 @@ exports[`better eslint`] = {
"public/app/core/components/modals/AngularModalProxy.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/core/history/richHistoryLocalStorageUtils.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/core/navigation/GrafanaRoute.test.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@ -2292,37 +2216,18 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"public/app/core/navigation/patch/interceptLinkClicks.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/core/navigation/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/profiler.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/reducers/root.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/services/FetchQueue.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/core/services/PreferencesService.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/services/ResponseQueue.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/services/__mocks__/search_srv.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/services/backend_srv.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@ -2351,9 +2256,7 @@ exports[`better eslint`] = {
],
"public/app/core/services/echo/backends/analytics/ApplicationInsightsBackend.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/core/services/echo/backends/analytics/RudderstackBackend.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@ -2465,9 +2368,6 @@ exports[`better eslint`] = {
"public/app/core/utils/richHistory.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/core/utils/richHistory.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/core/utils/ticks.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@ -2477,9 +2377,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "5"]
],
"public/app/core/utils/tracing.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"]
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/admin/OrgRolePicker.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@ -2844,16 +2742,10 @@ exports[`better eslint`] = {
],
"public/app/features/dashboard/components/AddPanelWidget/AddPanelWidget.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
[0, 0, 0, "Unexpected any. Specify a different type.", "5"],
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "7"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "8"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "9"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "10"]
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "4"]
],
"public/app/features/dashboard/components/AnnotationSettings/AnnotationSettingsEdit.tsx:5381": [
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"]
@ -2928,19 +2820,16 @@ exports[`better eslint`] = {
],
"public/app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"]
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"]
],
"public/app/features/dashboard/components/PanelEditor/OverrideCategoryTitle.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/PanelEditor/PanelEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "3"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "4"],
[0, 0, 0, "Do not use any type assertions.", "5"]
[0, 0, 0, "Do not use any type assertions.", "3"]
],
"public/app/features/dashboard/components/PanelEditor/VisualizationButton.tsx:5381": [
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"],
@ -2950,21 +2839,17 @@ exports[`better eslint`] = {
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"]
],
"public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
[0, 0, 0, "Unexpected any. Specify a different type.", "5"]
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
],
"public/app/features/dashboard/components/PanelEditor/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/PanelEditor/utils.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@ -2974,9 +2859,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "4"],
[0, 0, 0, "Unexpected any. Specify a different type.", "5"]
],
"public/app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/SaveDashboard/SaveDashboardButton.tsx:5381": [
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"]
@ -3009,21 +2891,9 @@ exports[`better eslint`] = {
"public/app/features/dashboard/components/ShareModal/ShareExport.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/ShareModal/ShareLink.test.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/ShareModal/ShareModal.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dashboard/components/ShareModal/utils.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"public/app/features/dashboard/components/TransformationsEditor/TransformationEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"],
@ -3054,8 +2924,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"public/app/features/dashboard/containers/DashboardPage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@ -3334,9 +3203,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"]
],
"public/app/features/datasources/components/ButtonRow.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"]
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"],
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "1"]
],
"public/app/features/datasources/components/DataSourceReadOnlyMessage.tsx:5381": [
[0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "0"]
@ -3371,55 +3239,26 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/features/dimensions/color.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dimensions/editors/ColorDimensionEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/dimensions/editors/FolderPickerTab.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/dimensions/editors/IconSelector.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/dimensions/editors/ResourceDimensionEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/dimensions/editors/ResourcePicker.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dimensions/editors/ScalarDimensionEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dimensions/editors/ScaleDimensionEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/dimensions/editors/TextDimensionEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"]
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditor.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/dimensions/scale.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/dimensions/text.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/dimensions/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@ -3440,17 +3279,12 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "1"]
],
"public/app/features/explore/LogsContainer.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/explore/LogsMetaRow.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/explore/QueryRows.test.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
],
"public/app/features/explore/RichHistory/RichHistory.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/explore/TraceView/TraceView.tsx:5381": [
@ -3461,34 +3295,12 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
[0, 0, 0, "Do not use any type assertions.", "5"]
],
"public/app/features/explore/TraceView/components/ScrollManager.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/Scrubber.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
"public/app/features/explore/TraceView/components/TracePageHeader/SpanGraph/render-into-canvas.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/ListView/index.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBar.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/utils.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/explore/TraceView/components/common/BreakableText.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/features/explore/TraceView/components/constants/index.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/explore/TraceView/components/demo/trace-generators.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@ -4028,11 +3840,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "10"],
[0, 0, 0, "Unexpected any. Specify a different type.", "11"]
],
"public/app/features/runtime/init.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"]
],
"public/app/features/sandbox/TestStuffPage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@ -5396,12 +5203,6 @@ exports[`better eslint`] = {
"public/app/plugins/datasource/loki/getDerivedFields.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
"public/app/plugins/datasource/loki/querySplitting.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"]
],
"public/app/plugins/datasource/loki/querybuilder/binaryScalarOperations.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],

@ -10,7 +10,7 @@ type WithGrafanaRuntime<T> = T & {
};
const hasGrafanaRuntime = <T>(obj: T): obj is WithGrafanaRuntime<T> => {
return typeof (obj as any)?.grafanaRuntime === 'object';
return 'grafanaRuntime' in obj;
};
e2e.benchmark({

@ -88,14 +88,14 @@ e2e.scenario({
},
});
const expectInspectorResultAndClose = (expectCallBack: (keys: any[]) => void) => {
const expectInspectorResultAndClose = (expectCallBack: (keys: JQuery<HTMLElement>) => void) => {
e2e.components.QueryTab.queryInspectorButton().should('be.visible').click();
e2e.components.PanelInspector.Query.refreshButton().should('be.visible').click();
e2e.components.PanelInspector.Query.jsonObjectKeys({ timeout: flakyTimeout })
.should('be.visible')
.within((keys: any) => expectCallBack(keys));
.within((keys) => expectCallBack(keys));
e2e.components.Drawer.General.close().should('be.visible').click();
};

@ -640,7 +640,7 @@ describe('getLinksSupplier', () => {
},
],
},
display: (v) => ({ numeric: v, text: String(v) }),
display: (v) => ({ numeric: Number(v), text: String(v) }),
},
],
});

@ -1,6 +1,6 @@
import { FormattedValue } from '../valueFormats';
export type DisplayProcessor = (value: any, decimals?: DecimalCount) => DisplayValue;
export type DisplayProcessor = (value: unknown, decimals?: DecimalCount) => DisplayValue;
export interface DisplayValue extends FormattedValue {
/**

@ -87,10 +87,10 @@ export class Registry<T extends RegistryItem> {
this.initialize();
}
const select = {
const select: RegistrySelectInfo = {
options: [],
current: [],
} as RegistrySelectInfo;
};
const currentOptions: Record<string, SelectableValue<string>> = {};
if (current) {

@ -34,7 +34,7 @@ export interface CSVParseCallbacks {
onHeader: (fields: Field[]) => void;
// Called after each row is read
onRow: (row: any[]) => void;
onRow: (row: string[]) => void;
}
export interface CSVOptions {
@ -73,9 +73,9 @@ export class CSVReader {
}
// PapaParse callback on each line
private chunk = (results: ParseResult<any>, parser: Parser): void => {
private chunk = (results: ParseResult<string[]>, parser: Parser): void => {
for (let i = 0; i < results.data.length; i++) {
const line: string[] = results.data[i];
const line = results.data[i];
if (line.length < 1) {
continue;
}
@ -191,15 +191,18 @@ export class CSVReader {
}
}
type FieldWriter = (value: any) => string;
type FieldWriter = (value: unknown) => string;
function writeValue(value: any, config: CSVConfig): string {
function writeValue(value: unknown, config: CSVConfig): string {
if (value === null || value === undefined) {
return '';
}
const str = value.toString();
if (str.includes('"')) {
// Escape the double quote characters
return config.quoteChar + str.replace(/"/gi, '""') + config.quoteChar;
}
if (str.includes('\n') || str.includes(config.delimiter)) {
if (str.includes('\n') || (config.delimiter && str.includes(config.delimiter))) {
return config.quoteChar + str + config.quoteChar;
}
return str;
@ -207,13 +210,13 @@ function writeValue(value: any, config: CSVConfig): string {
function makeFieldWriter(field: Field, config: CSVConfig): FieldWriter {
if (field.display) {
return (value: any) => {
return (value: unknown) => {
const displayValue = field.display!(value);
return writeValue(formattedValueToString(displayValue), config);
};
}
return (value: any) => writeValue(value, config);
return (value: unknown) => writeValue(value, config);
}
function getHeaderLine(key: string, fields: Field[], config: CSVConfig): string {
@ -229,7 +232,7 @@ function getHeaderLine(key: string, fields: Field[], config: CSVConfig): string
line = line + config.delimiter;
}
let v: any = fields[i].name;
let v = fields[i].name;
if (isType) {
v = fields[i].type;
} else if (isName) {

@ -1,7 +1,7 @@
import { guessFieldTypeFromValue } from '../dataframe/processDataFrame';
import { Field, FieldType } from '../types/dataFrame';
export function makeFieldParser(value: any, field: Field): (value: string) => any {
export function makeFieldParser(value: unknown, field: Field): (value: string) => any {
if (!field.type) {
if (field.name === 'time' || field.name === 'Time') {
field.type = FieldType.time;

@ -23,14 +23,11 @@ export function parseLabels(labels: string): Labels {
* Returns a map labels that are common to the given label sets.
*/
export function findCommonLabels(labelsSets: Labels[]): Labels {
return labelsSets.reduce((acc, labels) => {
if (!labels) {
throw new Error('Need parsed labels to find common labels.');
}
if (!acc) {
// Initial set
acc = { ...labels };
} else {
return labelsSets.reduce(
(acc, labels) => {
if (!labels) {
throw new Error('Need parsed labels to find common labels.');
}
// Remove incoming labels that are missing or not matching in value
Object.keys(labels).forEach((key) => {
if (acc[key] === undefined || acc[key] !== labels[key]) {
@ -43,9 +40,10 @@ export function findCommonLabels(labelsSets: Labels[]): Labels {
delete acc[key];
}
});
}
return acc;
}, undefined as unknown as Labels);
return acc;
},
{ ...labelsSets[0] }
);
}
/**

@ -30,7 +30,7 @@ export function getLogLevel(line: string): LogLevel {
if (result) {
if (currentIndex === undefined || result.index < currentIndex) {
level = (LogLevel as any)[key];
level = LogLevel[key as keyof typeof LogLevel];
currentIndex = result.index;
}
}
@ -40,7 +40,7 @@ export function getLogLevel(line: string): LogLevel {
/** @deprecated will be removed in the next major version */
export function getLogLevelFromKey(key: string | number): LogLevel {
const level = (LogLevel as any)[key.toString().toLowerCase()];
const level = LogLevel[key.toString().toLowerCase() as keyof typeof LogLevel];
if (level) {
return level;
}
@ -136,7 +136,7 @@ export function calculateLogsLabelStats(rows: LogRowModel[], label: string): Log
const rowCount = rowsWithLabel.length;
// Get label value counts for eligible rows
const countsByValue = countBy(rowsWithLabel, (row) => (row as LogRowModel).labels[label]);
const countsByValue = countBy(rowsWithLabel, (row) => row.labels[label]);
return getSortedCounts(countsByValue, rowCount);
}

@ -2,8 +2,10 @@
* @beta
* Proxies a ES6 class so that it can be used as a base class for an ES5 class
*/
export function makeClassES5Compatible<T>(ES6Class: T): T {
return new Proxy(ES6Class as any, {
export function makeClassES5Compatible<T extends abstract new (...args: ConstructorParameters<T>) => InstanceType<T>>(
ES6Class: T
): T {
return new Proxy(ES6Class, {
// ES5 code will call it like a function using super
apply(target, self, argumentsList) {
if (typeof Reflect === 'undefined' || !Reflect.construct) {
@ -12,5 +14,5 @@ export function makeClassES5Compatible<T>(ES6Class: T): T {
return Reflect.construct(target, argumentsList, self.constructor);
},
}) as unknown as T;
});
}

@ -1,7 +1,7 @@
import { standardTransformersRegistry } from '../../transformations';
import { DataTransformerInfo } from '../../types';
export const mockTransformationsRegistry = (transformers: Array<DataTransformerInfo<any>>) => {
export const mockTransformationsRegistry = (transformers: DataTransformerInfo[]) => {
standardTransformersRegistry.setInit(() => {
return transformers.map((t) => {
return {

@ -42,5 +42,5 @@ export function sci(value: number | null, decimals: DecimalCount): FormattedValu
if (value == null) {
return { text: '' };
}
return { text: value.toExponential(decimals as number) };
return { text: value.toExponential(decimals ?? undefined) };
}

@ -228,7 +228,7 @@ export function toDuration(size: number, decimals: DecimalCount, timeScale: Inte
let decimalsCount = 0;
if (decimals !== null && decimals !== undefined) {
decimalsCount = decimals as number;
decimalsCount = decimals;
}
for (let i = 0; i < UNITS.length && decimalsCount >= 0; i++) {

@ -127,7 +127,7 @@ export function isBooleanUnit(unit?: string) {
}
export function booleanValueFormatter(t: string, f: string): ValueFormatter {
return (value: any) => {
return (value) => {
return { text: value ? t : f };
};
}
@ -159,7 +159,7 @@ export function locale(value: number, decimals: DecimalCount): FormattedValue {
return { text: '' };
}
return {
text: value.toLocaleString(undefined, { maximumFractionDigits: decimals as number }),
text: value.toLocaleString(undefined, { maximumFractionDigits: decimals ?? undefined }),
};
}

@ -34,7 +34,7 @@ export const getMockPlugins = (amount: number): PluginMeta[] => {
});
}
return plugins as any;
return plugins;
};
export function getPanelPlugin(

@ -68,7 +68,7 @@ const ButtonSelectComponent = <T,>(props: Props<T>) => {
{options.map((item) => (
<MenuItem
key={`${item.value}`}
label={(item.label || item.value) as string}
label={item.label ?? String(item.value)}
onClick={() => onChangeInternal(item)}
active={item.value === value?.value}
ariaChecked={item.value === value?.value}

@ -9,7 +9,7 @@ import { VizTooltip } from '../VizTooltip';
import Graph from './Graph';
const display: DisplayProcessor = (v) => ({ numeric: v, text: String(v), color: 'red' });
const display: DisplayProcessor = (v) => ({ numeric: Number(v), text: String(v), color: 'red' });
const series: GraphSeriesXY[] = [
{

@ -11,7 +11,7 @@ import { GraphDimensions } from './types';
let dimensions: GraphDimensions;
describe('MultiModeGraphTooltip', () => {
const display: DisplayProcessor = (v) => ({ numeric: v, text: String(v), color: 'red' });
const display: DisplayProcessor = (v) => ({ numeric: Number(v), text: String(v), color: 'red' });
const theme = createTheme();
describe('when shown when hovering over a datapoint', () => {

@ -187,7 +187,7 @@ export function initIconCache() {
// This function needs to be called after index.js loads to give the
// application time to modify __webpack_public_path__ with a CDN path
const grafanaPublicPath = typeof window !== 'undefined' && (window as any).__grafana_public_path__;
const grafanaPublicPath = typeof window !== 'undefined' && window.__grafana_public_path__;
if (grafanaPublicPath) {
iconRoot = grafanaPublicPath + 'img/icons/';
}

@ -24,14 +24,14 @@ export function initIconCache() {
// This function needs to be called after index.js loads to give the
// application time to modify __webpack_public_path__ with a CDN path
const grafanaPublicPath = typeof window !== 'undefined' && (window as any).__grafana_public_path__;
const grafanaPublicPath = typeof window !== 'undefined' && window.__grafana_public_path__;
if (grafanaPublicPath) {
iconRoot = grafanaPublicPath + 'img/icons/';
}
// do not edit this list directly
// the list of icons live here: @grafana/ui/components/Icon/cached.json
// do not edit this list directly
// the list of icons live here: @grafana/ui/components/Icon/cached.json
//{{cacheItems}}
// do not edit this list directly
// the list of icons live here: @grafana/ui/components/Icon/cached.json
// do not edit this list directly
// the list of icons live here: @grafana/ui/components/Icon/cached.json
}

@ -166,7 +166,7 @@ export function getColumns(
}
/*
Build `Field` data for row numbers and prepend to the field array;
Build `Field` data for row numbers and prepend to the field array;
this way, on other column's sort, the row numbers will persist in their proper place.
*/
export function buildFieldsForOptionalRowNums(totalRows: number): Field {
@ -339,12 +339,12 @@ export function getFooterItems(
theme2: GrafanaTheme2
): FooterItem[] {
/*
Here, `filterFields` is passed as the `headerGroups[0].headers` array
that was destructured from the `useTable` hook. Unfortunately, since
the `headerGroups` object is data based ONLY on the rendered "non-hidden"
column headers, it will NOT include the Row Number column if it has been
Here, `filterFields` is passed as the `headerGroups[0].headers` array
that was destructured from the `useTable` hook. Unfortunately, since
the `headerGroups` object is data based ONLY on the rendered "non-hidden"
column headers, it will NOT include the Row Number column if it has been
toggled off. This will shift the rendering of the footer left 1 column,
creating an off-by-one issue. This is why we test for a `field.id` of "0".
creating an off-by-one issue. This is why we test for a `field.id` of "0".
If the condition is truthy, the togglable Row Number column is being rendered,
and we can proceed normally. If not, we must add the field data in its place
so that the footer data renders in the expected column.
@ -356,26 +356,26 @@ export function getFooterItems(
filterFields = [fieldToAdd, ...filterFields];
}
/*
The FooterItems[] are calculated using both the `headerGroups[0].headers`
/*
The FooterItems[] are calculated using both the `headerGroups[0].headers`
(filterFields) and `rows` (values) destructured from the useTable() hook.
This cacluation is based on the data from each index in `filterFields`
array as well as the corresponding index in the `values` array.
When the user hides a column through an override, the getColumns()
hook is invoked, removes said hidden column, sends the updated column
data to the useTable() hook, which then builds `headerGroups[0].headers`
without the hidden column. However, it doesn't remove the hidden column
from the `row` data, instead it substututes the hidden column row data
with an `undefined` value. Therefore, the `row` array length never changes,
despite the `headerGroups[0].headers` length changing at every column removal.
This makes all footer reduce calculations AFTER the first hidden column
in the `headerGroups[0].headers` break, since the indexing of both
This cacluation is based on the data from each index in `filterFields`
array as well as the corresponding index in the `values` array.
When the user hides a column through an override, the getColumns()
hook is invoked, removes said hidden column, sends the updated column
data to the useTable() hook, which then builds `headerGroups[0].headers`
without the hidden column. However, it doesn't remove the hidden column
from the `row` data, instead it substututes the hidden column row data
with an `undefined` value. Therefore, the `row` array length never changes,
despite the `headerGroups[0].headers` length changing at every column removal.
This makes all footer reduce calculations AFTER the first hidden column
in the `headerGroups[0].headers` break, since the indexing of both
arrays is no longer in parity.
So, here we simply recursively test for the "hidden" columns
from `headerGroups[0].headers`. Each column has an ID property that corresponds
to its own index, therefore if (`filterField.id` !== `String(index)`),
we know there is one or more hidden columns; at which point we update
So, here we simply recursively test for the "hidden" columns
from `headerGroups[0].headers`. Each column has an ID property that corresponds
to its own index, therefore if (`filterField.id` !== `String(index)`),
we know there is one or more hidden columns; at which point we update
the index with an ersatz placeholder with just an `id` property.
*/
addMissingColumnIndex(filterFields);
@ -499,15 +499,15 @@ export function migrateTableDisplayModeToCellOptions(displayMode: TableCellDispl
`values` property is omitted, as it will be added at a later time.
*/
export const defaultRowNumberColumnFieldData: Omit<Field, 'values'> = {
/*
/*
Single whitespace as value for `name` property so as to render an empty/invisible column header;
without the single whitespace, falsey headers (empty strings) are given a default name of "Value".
*/
name: ' ',
display: function (value: string) {
display: function (value) {
return {
numeric: Number(value),
text: value,
text: value != null ? String(value) : '',
};
},
type: FieldType.string,

@ -10,18 +10,20 @@ interface Props extends StandardEditorProps<string, StringFieldConfigSettings> {
export const StringValueEditor = ({ value, onChange, item, suffix }: Props) => {
const Component = item.settings?.useTextarea ? TextArea : Input;
const onValueChange = useCallback(
(e: React.SyntheticEvent) => {
(
e:
| React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>
| React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>
) => {
let nextValue = value ?? '';
if (e.hasOwnProperty('key')) {
if ('key' in e) {
// handling keyboard event
const evt = e as React.KeyboardEvent<HTMLInputElement>;
if (evt.key === 'Enter' && !item.settings?.useTextarea) {
nextValue = evt.currentTarget.value.trim();
if (e.key === 'Enter' && !item.settings?.useTextarea) {
nextValue = e.currentTarget.value.trim();
}
} else {
// handling form event
const evt = e as React.FormEvent<HTMLInputElement>;
nextValue = evt.currentTarget.value.trim();
// handling blur event
nextValue = e.currentTarget.value.trim();
}
if (nextValue === value) {
return; // no change

@ -22,20 +22,19 @@ export class StringArrayEditor extends React.PureComponent<Props, State> {
onChange(copy);
};
onValueChange = (e: React.SyntheticEvent, idx: number) => {
const evt = e as React.KeyboardEvent<HTMLInputElement>;
if (e.hasOwnProperty('key')) {
if (evt.key !== 'Enter') {
onValueChange = (e: React.KeyboardEvent<HTMLInputElement> | React.FocusEvent<HTMLInputElement>, idx: number) => {
if ('key' in e) {
if (e.key !== 'Enter') {
return;
}
}
const { value, onChange } = this.props;
// Form event, or Enter
const v = evt.currentTarget.value.trim();
const v = e.currentTarget.value.trim();
if (idx < 0) {
if (v) {
evt.currentTarget.value = ''; // reset last value
e.currentTarget.value = ''; // reset last value
onChange([...value, v]);
}
this.setState({ showAdd: false });

@ -31,7 +31,7 @@ describe('getFoldersAsOptions', () => {
describe('and extra folders are passed', () => {
it('then extra folders should all appear first in the result', async () => {
const args = { query: '', extraFolders: [ALL_FOLDER, GENERAL_FOLDER] };
const searchHits: any[] = [{ id: 1, title: 'Folder 1' }];
const searchHits = [{ id: 1, title: 'Folder 1' }] as DashboardSearchHit[];
getTestContext(searchHits);
const result = await getFoldersAsOptions(args);
@ -57,7 +57,7 @@ describe('getFoldersAsOptions', () => {
describe('and extra folders are passed and extra folders contain query', () => {
it('then correct extra folders should all appear first in the result', async () => {
const args = { query: 'er', extraFolders: [ALL_FOLDER, GENERAL_FOLDER] };
const searchHits: any[] = [{ id: 1, title: 'Folder 1' }];
const searchHits = [{ id: 1, title: 'Folder 1' }] as DashboardSearchHit[];
getTestContext(searchHits);
const result = await getFoldersAsOptions(args);
@ -71,7 +71,7 @@ describe('getFoldersAsOptions', () => {
describe('and extra folders are passed and extra folders do not contain query', () => {
it('then no extra folders should appear first in the result', async () => {
const args = { query: '1', extraFolders: [ALL_FOLDER, GENERAL_FOLDER] };
const searchHits: any[] = [{ id: 1, title: 'Folder 1' }];
const searchHits = [{ id: 1, title: 'Folder 1' }] as DashboardSearchHit[];
getTestContext(searchHits);
const result = await getFoldersAsOptions(args);

@ -7,12 +7,7 @@ import { useStyles2 } from '@grafana/ui';
import { TagBadge } from './TagBadge';
// https://github.com/JedWatson/react-select/issues/3038
interface ExtendedOptionProps extends OptionProps<any, any> {
data: any;
}
export const TagOption = ({ data, className, label, isFocused, innerProps }: ExtendedOptionProps) => {
export const TagOption = ({ data, className, label, isFocused, innerProps }: OptionProps<any, any>) => {
const styles = useStyles2(getStyles);
return (

@ -33,7 +33,7 @@ export class TimelineChart extends React.Component<TimelineProps> {
static contextType = PanelContextRoot;
panelContext: PanelContext = {} as PanelContext;
getValueColor = (frameIdx: number, fieldIdx: number, value: any) => {
getValueColor = (frameIdx: number, fieldIdx: number, value: unknown) => {
const field = this.props.frames[frameIdx].fields[fieldIdx];
if (field.display) {

@ -47,10 +47,10 @@ export interface TimelineCoreOptions {
showValue: VisibilityMode;
mergeValues?: boolean;
isDiscrete: (seriesIdx: number) => boolean;
getValueColor: (seriesIdx: number, value: any) => string;
getValueColor: (seriesIdx: number, value: unknown) => string;
label: (seriesIdx: number) => string;
getTimeRange: () => TimeRange;
formatValue?: (seriesIdx: number, value: any) => string;
formatValue?: (seriesIdx: number, value: unknown) => string;
getFieldConfig: (seriesIdx: number) => StateTimeLineFieldConfig | StatusHistoryFieldConfig;
onHover: (seriesIdx: number, valueIdx: number, rect: Rect) => void;
onLeave: () => void;
@ -137,7 +137,7 @@ export function getConfig(opts: TimelineCoreOptions) {
strokeWidth: number,
seriesIdx: number,
valueIdx: number,
value: any,
value: number | null,
discrete: boolean
) {
// do not render super small boxes
@ -497,6 +497,7 @@ export function getConfig(opts: TimelineCoreOptions) {
const yMids: number[] = Array(numSeries).fill(0);
const ySplits: number[] = Array(numSeries).fill(0);
const yRange: uPlot.Range.MinMax = [0, 1];
return {
cursor,
@ -542,7 +543,8 @@ export function getConfig(opts: TimelineCoreOptions) {
}
}
return [min, max] as uPlot.Range.MinMax;
const result: uPlot.Range.MinMax = [min, max];
return result;
},
ySplits: (u: uPlot) => {
@ -556,7 +558,7 @@ export function getConfig(opts: TimelineCoreOptions) {
},
yValues: (u: uPlot, splits: number[]) => splits.map((v, i) => label(i + 1)),
yRange: [0, 1] as uPlot.Range.MinMax,
yRange,
// pathbuilders
drawPaths,

@ -60,7 +60,7 @@ interface UPlotConfigOptions {
showValue: VisibilityMode;
alignValue?: TimelineValueAlignment;
mergeValues?: boolean;
getValueColor: (frameIdx: number, fieldIdx: number, value: any) => string;
getValueColor: (frameIdx: number, fieldIdx: number, value: unknown) => string;
}
/**
@ -113,7 +113,7 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<UPlotConfigOptions> = (
return !(mode && field.display && mode.startsWith('continuous-'));
};
const getValueColorFn = (seriesIdx: number, value: any) => {
const getValueColorFn = (seriesIdx: number, value: unknown) => {
const field = frame.fields[seriesIdx];
if (
@ -404,9 +404,9 @@ export function mergeThresholdValues(field: Field, theme: GrafanaTheme2): Field
},
type: FieldType.string,
values: new ArrayVector(vals),
display: (value: string) => ({
text: value,
color: textToColor.get(value),
display: (value) => ({
text: String(value),
color: textToColor.get(String(value)),
numeric: NaN,
}),
};

@ -57,7 +57,7 @@ function filterQueriesBySearchFilter(queries: RichHistoryQuery[], searchFilter:
const listOfMatchingQueries = query.queries.filter((query) =>
// Remove fields in which we don't want to be searching
Object.values(omit(query, ['datasource', 'key', 'refId', 'hide', 'queryType'])).some((value: any) =>
Object.values(omit(query, ['datasource', 'key', 'refId', 'hide', 'queryType'])).some((value) =>
value?.toString().includes(searchFilter)
)
);

@ -3,7 +3,7 @@ import { locationService, navigationLogger } from '@grafana/runtime';
import { config } from 'app/core/config';
export function interceptLinkClicks(e: MouseEvent) {
const anchor = getParentAnchor(e.target as HTMLElement);
const anchor = e.target instanceof HTMLElement ? getParentAnchor(e.target) : null;
// Ignore if opening new tab or already default prevented
if (e.ctrlKey || e.metaKey || e.defaultPrevented) {
@ -48,7 +48,7 @@ function getParentAnchor(element: HTMLElement | null): HTMLElement | null {
if (element.tagName.toUpperCase() === 'A') {
return element;
}
element = element.parentNode as HTMLElement;
element = element.parentElement;
}
return null;

@ -1,3 +1,9 @@
declare global {
interface Window {
panelsRendered?: number;
}
}
export class Profiler {
panelsRendered = 0;
enabled?: boolean = undefined;
@ -9,7 +15,7 @@ export class Profiler {
// this window variable is used by backend rendering tools to know
// all panels have completed rendering
(window as any).panelsRendered = this.panelsRendered;
window.panelsRendered = this.panelsRendered;
}
}

@ -35,7 +35,7 @@ export class FetchQueue {
const { id, state, options } = entry;
if (!this.state[id]) {
this.state[id] = { state: FetchStatus.Pending, options: {} as BackendSrvRequest };
this.state[id] = { state: FetchStatus.Pending, options: { url: '' } };
}
if (state === FetchStatus.Done) {

@ -8,14 +8,14 @@ export class PreferencesService {
/**
* Overrides all preferences
*/
update(preferences: UserPreferencesDTO): Promise<any> {
update(preferences: UserPreferencesDTO) {
return backendSrv.put(`/api/${this.resourceUri}/preferences`, preferences);
}
/**
* Updates only provided preferences
*/
patch(preferences: Partial<UserPreferencesDTO>): Promise<any> {
patch(preferences: Partial<UserPreferencesDTO>) {
return backendSrv.patch(`/api/${this.resourceUri}/preferences`, preferences);
}

@ -1,4 +1,4 @@
export const mockSearch = jest.fn<any, any>(() => {
export const mockSearch = jest.fn(() => {
return Promise.resolve([]);
});

@ -41,7 +41,7 @@ export class ApplicationInsightsBackend implements EchoBackend<PageviewEchoEvent
const url = 'https://js.monitor.azure.com/scripts/b/ai.2.min.js';
loadScript(url).then(() => {
const init = new (window as any).Microsoft.ApplicationInsights.ApplicationInsights(applicationInsightsOpts);
(window as any).applicationInsights = init.loadAppInsights();
window.applicationInsights = init.loadAppInsights();
});
}

@ -243,7 +243,7 @@ export function createQueryText(query: DataQuery, dsApi?: DataSourceApi) {
}
export function mapQueriesToHeadings(query: RichHistoryQuery[], sortOrder: SortOrder) {
let mappedQueriesToHeadings: any = {};
let mappedQueriesToHeadings: Record<string, RichHistoryQuery[]> = {};
query.forEach((q) => {
let heading = createQueryHeading(q, sortOrder);

@ -5,7 +5,7 @@ import { FieldType, MutableDataFrame, NodeGraphDataFrameFieldNames as Fields } f
export function getNonOverlappingDuration(ranges: Array<[number, number]>): number {
ranges.sort((a, b) => a[0] - b[0]);
const mergedRanges = ranges.reduce((acc, range) => {
const mergedRanges = ranges.reduce<Array<[number, number]>>((acc, range) => {
if (!acc.length) {
return [range];
}
@ -23,8 +23,8 @@ export function getNonOverlappingDuration(ranges: Array<[number, number]>): numb
}
// We know there is overlap and current range ends later than previous so we can just extend the range
return [...acc.slice(0, -1), [prevStart, end]] as Array<[number, number]>;
}, [] as Array<[number, number]>);
return [...acc.slice(0, -1), [prevStart, end]];
}, []);
return mergedRanges.reduce((acc, range) => {
return acc + (range[1] - range[0]);

@ -21,7 +21,7 @@ import {
import { LibraryElementDTO } from '../../../library-panels/types';
import { DashboardModel, PanelModel } from '../../state';
export type PanelPluginInfo = { id: any; defaults: { gridPos: { w: any; h: any }; title: any } };
export type PanelPluginInfo = { id: number; defaults: { gridPos: { w: number; h: number }; title: string } };
export interface OwnProps {
panel: PanelModel;
@ -88,7 +88,7 @@ export const AddPanelWidgetUnconnected = ({ panel, dashboard }: Props) => {
const onPasteCopiedPanel = (panelPluginInfo: PanelPluginInfo) => {
const { gridPos } = panel;
const newPanel: any = {
const newPanel = {
type: panelPluginInfo.id,
title: 'Panel Title',
gridPos: {
@ -124,7 +124,7 @@ export const AddPanelWidgetUnconnected = ({ panel, dashboard }: Props) => {
};
const onCreateNewRow = () => {
const newRow: any = {
const newRow = {
type: 'row',
title: 'Row title',
gridPos: { x: 0, y: 0 },

@ -13,7 +13,7 @@ export interface OptionsPaneItemProps {
value?: any;
description?: string;
popularRank?: number;
render: () => React.ReactNode;
render: () => React.ReactElement;
skipField?: boolean;
showIf?: () => boolean;
overrides?: OptionPaneItemOverrideInfo[];
@ -94,7 +94,7 @@ export class OptionsPaneItemDescriptor {
key={key}
aria-label={selectors.components.PanelEditor.OptionsPane.fieldLabel(key)}
>
{render() as React.ReactElement}
{render()}
</Field>
);
}

@ -167,13 +167,13 @@ export class PanelEditorUnconnected extends PureComponent<Props> {
});
};
onPanelOptionsChanged = (options: any) => {
onPanelOptionsChanged = (options: PanelModel['options']) => {
// we do not need to trigger force update here as the function call below
// fires PanelOptionsChangedEvent which we subscribe to above
this.props.panel.updateOptions(options);
};
onPanelConfigChanged = (configKey: keyof PanelModel, value: any) => {
onPanelConfigChanged = (configKey: keyof PanelModel, value: unknown) => {
this.props.panel.setProperty(configKey, value);
this.props.panel.render();
this.forceUpdate();

@ -155,7 +155,7 @@ export function getFieldOverrideCategories(
continue;
}
const onPropertyChange = (value: any) => {
const onPropertyChange = (value: DynamicConfigValue) => {
override.properties[propIdx].value = value;
onOverrideChange(idx, override);
};

@ -82,8 +82,8 @@ export function getVisualizationOptions(props: OptionPaneRenderProps): OptionsPa
};
const access: NestedValueAccess = {
getValue: (path: string) => lodashGet(currentOptions, path),
onChange: (path: string, value: any) => {
getValue: (path) => lodashGet(currentOptions, path),
onChange: (path, value) => {
const newOptions = setOptionImmutably(currentOptions, path, value);
onPanelOptionsChanged(newOptions);
},

@ -56,8 +56,8 @@ export interface OptionPaneRenderProps {
data?: PanelData;
dashboard: DashboardModel;
instanceState: any;
onPanelConfigChange: (configKey: keyof PanelModel, value: any) => void;
onPanelOptionsChanged: (options: any) => void;
onPanelConfigChange: (configKey: keyof PanelModel, value: unknown) => void;
onPanelOptionsChanged: (options: PanelModel['options']) => void;
onFieldConfigsChange: (config: FieldConfigSource) => void;
}

@ -18,7 +18,7 @@ export const RepeatRowSelect: FC<Props> = ({ repeat, onChange, id }) => {
});
const variableOptions = useMemo(() => {
const options = variables.map((item: any) => {
const options: Array<SelectableValue<string | null>> = variables.map((item) => {
return { label: item.name, value: item.name };
});

@ -43,16 +43,6 @@ function mockLocationHref(href: string) {
};
}
function setUTCTimeZone() {
(window as any).Intl.DateTimeFormat = () => {
return {
resolvedOptions: () => {
return { timeZone: 'UTC' };
},
};
};
}
const mockUid = 'abc123';
jest.mock('@grafana/runtime', () => {
const original = jest.requireActual('@grafana/runtime');
@ -80,7 +70,13 @@ describe('ShareModal', () => {
beforeEach(() => {
const defaultTimeRange = getDefaultTimeRange();
setUTCTimeZone();
jest.spyOn(window.Intl, 'DateTimeFormat').mockImplementation(() => {
return {
resolvedOptions: () => {
return { timeZone: 'UTC' };
},
} as Intl.DateTimeFormat;
});
mockLocationHref('http://server/#!/test');
config.rendererAvailable = true;
config.bootData.user.orgId = 1;

@ -95,7 +95,7 @@ export class ShareModal extends React.Component<Props, State> {
reportInteraction('grafana_dashboards_share_modal_viewed');
}
onSelectTab = (t: any) => {
onSelectTab: React.ComponentProps<typeof ModalTabsHeader>['onChangeTab'] = (t) => {
this.setState((prevState) => ({ ...prevState, activeTab: t.value }));
};

@ -121,11 +121,11 @@ export function getLocalTimeZone() {
const utcOffset = '&tz=UTC' + encodeURIComponent(dateTime().format('Z'));
// Older browser does not the internationalization API
if (!(window as any).Intl) {
if (!window.Intl) {
return utcOffset;
}
const dateFormat = (window as any).Intl.DateTimeFormat();
const dateFormat = window.Intl.DateTimeFormat();
if (!dateFormat.resolvedOptions) {
return utcOffset;
}

@ -54,7 +54,7 @@ export const jsonDiff = (lhs: any, rhs: any): Diffs => {
const sortByLineNumber = (diffs: Diff[]) => sortBy(diffs, 'startLineNumber');
const groupByPath = (diffs: Diff[]) =>
diffs.reduce<Record<string, any>>((acc, value) => {
diffs.reduce<Record<string, Diff[]>>((acc, value) => {
const groupKey: string = value.path[0];
if (!acc[groupKey]) {
acc[groupKey] = [];

@ -10,7 +10,7 @@ export interface Props {
canSave: boolean;
canDelete: boolean;
onDelete: () => void;
onSubmit: (event: any) => void;
onSubmit: (event: React.MouseEvent<HTMLButtonElement>) => void;
onTest: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
}

@ -117,7 +117,7 @@ export function EditDataSourceView({
const isAlertManagerDatasource = dsi?.type === 'alertmanager';
const alertingSupported = hasAlertingEnabled || isAlertManagerDatasource;
const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
const onSubmit = async (e: React.MouseEvent<HTMLButtonElement> | React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
await onUpdate({ ...dataSource });

@ -48,7 +48,7 @@ export function getColorDimensionForField(
}
const disp = getDisplayProcessor({ field, theme });
const getColor = (value: any): string => {
const getColor = (value: unknown): string => {
return disp(value).color ?? '#ccc';
};

@ -12,7 +12,7 @@ const fixedColorOption: SelectableValue<string> = {
value: '_____fixed_____',
};
export const ColorDimensionEditor: FC<StandardEditorProps<ColorDimensionConfig, any, any>> = (props) => {
export const ColorDimensionEditor: FC<StandardEditorProps<ColorDimensionConfig>> = (props) => {
const { value, context, onChange } = props;
const defaultColor = 'dark-green';

@ -12,7 +12,7 @@ interface Props {
const IconSelector = ({ value, onChange }: Props) => {
const [icons, setIcons] = useState<SelectableValue[]>(value ? [{ value, label: value }] : []);
const [icon, setIcon] = useState<string>();
const iconRoot = (window as any).__grafana_public_path__ + 'img/icons/unicons/';
const iconRoot = window.__grafana_public_path__ + 'img/icons/unicons/';
const onChangeIcon = (value: string) => {
onChange(value);
setIcon(value);

@ -40,7 +40,7 @@ export const ResourcePicker = (props: Props) => {
const styles = useStyles2(getStyles);
const theme = useTheme2();
const pickerTriggerRef = createRef<any>();
const pickerTriggerRef = createRef<HTMLDivElement>();
const popoverElement = (
<ResourcePickerPopover onChange={onChange} value={value} mediaType={mediaType} folderName={folderName} />
);

@ -18,7 +18,7 @@ const scalarOptions = [
{ label: 'Clamped', value: ScalarDimensionMode.Clamped, description: 'Use field values, clamped to max and min' },
];
type Props = StandardEditorProps<ScalarDimensionConfig, ScalarDimensionOptions, any>;
type Props = StandardEditorProps<ScalarDimensionConfig, ScalarDimensionOptions>;
export const ScalarDimensionEditor = ({ value, context, onChange, item }: Props) => {
const { settings } = item;

@ -14,9 +14,7 @@ const fixedValueOption: SelectableValue<string> = {
value: '_____fixed_____',
};
export const ScaleDimensionEditor: FC<StandardEditorProps<ScaleDimensionConfig, ScaleDimensionOptions, any>> = (
props
) => {
export const ScaleDimensionEditor: FC<StandardEditorProps<ScaleDimensionConfig, ScaleDimensionOptions>> = (props) => {
const { value, context, onChange, item } = props;
const { settings } = item;
const styles = useStyles2(getStyles);

@ -26,7 +26,7 @@ const dummyStringSettings: StandardEditorsRegistryItem<string, StringFieldConfig
settings: {},
} as any;
type Props = StandardEditorProps<TextDimensionConfig, TextDimensionOptions, any>;
type Props = StandardEditorProps<TextDimensionConfig, TextDimensionOptions>;
export const TextDimensionEditor = ({ value, context, onChange }: Props) => {
const labelWidth = 9;

@ -9,7 +9,7 @@ import { ResourcePicker } from '../ResourcePicker';
import { buildEditRowModels, editModelToSaveModel, ValueMappingsEditorModal } from './ValueMappingsEditorModal';
export interface Props extends StandardEditorProps<ValueMapping[], any, any> {
export interface Props extends StandardEditorProps<ValueMapping[]> {
showIcon?: boolean;
}

@ -28,7 +28,7 @@ export function getTextDimensionForField(
}
if (mode === TextDimensionMode.Template) {
const disp = (v: any) => {
const disp = (v: unknown) => {
return `TEMPLATE[${config.fixed} // ${v}]`;
};
if (!field) {
@ -56,7 +56,7 @@ export function getTextDimensionForField(
};
}
let disp = (v: any) => formattedValueToString(field.display!(v));
let disp = (v: unknown) => formattedValueToString(field.display!(v));
return {
field,
get: (i) => disp(field.values.get(i)),

@ -13,6 +13,7 @@ import {
SplitOpen,
DataFrame,
SupplementaryQueryType,
DataQueryResponse,
} from '@grafana/data';
import { Collapse } from '@grafana/ui';
import { StoreState } from 'app/types';
@ -49,7 +50,7 @@ class LogsContainer extends PureComponent<LogsContainerProps> {
updateTimeRange({ exploreId, absoluteRange });
};
getLogRowContext = async (row: LogRowModel, options?: any): Promise<any> => {
getLogRowContext = async (row: LogRowModel, options?: any): Promise<DataQueryResponse | []> => {
const { datasourceInstance, logsQueries } = this.props;
if (hasLogsContextSupport(datasourceInstance)) {

@ -2,7 +2,7 @@ import { fireEvent, render, screen } from '@testing-library/react';
import React from 'react';
import { Provider } from 'react-redux';
import { setDataSourceSrv } from '@grafana/runtime';
import { DataSourceSrv, setDataSourceSrv } from '@grafana/runtime';
import { DataQuery } from '@grafana/schema';
import { configureStore } from 'app/store/configureStore';
import { ExploreId, ExploreState } from 'app/types';
@ -46,7 +46,7 @@ function setup(queries: DataQuery[]) {
get(uid?: string) {
return Promise.resolve(uid ? datasources[uid] || defaultDs : defaultDs);
},
} as any);
} as DataSourceSrv);
const leftState = makeExplorePaneState();
const initialState: ExploreState = {

@ -90,7 +90,7 @@ class UnThemedRichHistory extends PureComponent<RichHistoryProps> {
toggleActiveDatasourceOnly = () =>
this.updateSettings({ activeDatasourceOnly: !this.props.richHistorySettings.activeDatasourceOnly });
componentDidUpdate(prevProps: Readonly<RichHistoryProps>, prevState: Readonly<{}>, snapshot?: any) {
componentDidUpdate(prevProps: Readonly<RichHistoryProps>) {
if (prevProps.richHistory !== this.props.richHistory) {
this.setState({
loading: false,

@ -239,7 +239,7 @@ export function RichHistoryQueriesTab(props: Props) {
{mappedQueriesToHeadings[heading].length} queries
</span>
</div>
{mappedQueriesToHeadings[heading].map((q: RichHistoryQuery) => {
{mappedQueriesToHeadings[heading].map((q) => {
return <RichHistoryCard query={q} key={q.id} exploreId={exploreId} />;
})}
</div>

@ -157,9 +157,7 @@ export default class ScrollManager {
const _collapsed = xrs.getCollapsedChildren();
const childrenAreHidden = _collapsed ? new Set(_collapsed) : null;
// use empty Map as fallback to make flow happy
const spansMap: Map<string, TraceSpan> = childrenAreHidden
? new Map(spans.map((s) => [s.spanID, s] as [string, TraceSpan]))
: new Map();
const spansMap: Map<string, TraceSpan> = childrenAreHidden ? new Map(spans.map((s) => [s.spanID, s])) : new Map();
const boundary = direction < 0 ? -1 : spans.length;
let nextSpanIndex: number | undefined;
for (let i = fullViewSpanIndex + direction; i !== boundary; i += direction) {
@ -268,7 +266,7 @@ export default class ScrollManager {
destroy() {
this._trace = undefined;
this._scroller = undefined as any;
this._scroller = undefined;
this._accessors = undefined;
}
}

@ -75,9 +75,9 @@ export const getStyles = () => {
export type ScrubberProps = {
isDragging: boolean;
position: number;
onMouseDown: (evt: React.MouseEvent<any>) => void;
onMouseEnter: (evt: React.MouseEvent<any>) => void;
onMouseLeave: (evt: React.MouseEvent<any>) => void;
onMouseDown: (evt: React.MouseEvent<SVGGElement>) => void;
onMouseEnter: (evt: React.MouseEvent<SVGGElement>) => void;
onMouseLeave: (evt: React.MouseEvent<SVGGElement>) => void;
};
export default function Scrubber({ isDragging, onMouseDown, onMouseEnter, onMouseLeave, position }: ScrubberProps) {

@ -39,22 +39,24 @@ export default function renderIntoCanvas(
const itemHeight = Math.min(MAX_ITEM_HEIGHT, Math.max(MIN_ITEM_HEIGHT, cHeight / items.length));
const itemYChange = cHeight / items.length;
const ctx = canvas.getContext('2d', { alpha: false }) as CanvasRenderingContext2D;
ctx.fillStyle = bgColor;
ctx.fillRect(0, 0, cWidth, cHeight);
for (let i = 0; i < items.length; i++) {
const { valueWidth, valueOffset, serviceName } = items[i];
const x = (valueOffset / totalValueWidth) * cWidth;
let width = (valueWidth / totalValueWidth) * cWidth;
if (width < MIN_ITEM_WIDTH) {
width = MIN_ITEM_WIDTH;
const ctx = canvas.getContext('2d', { alpha: false });
if (ctx) {
ctx.fillStyle = bgColor;
ctx.fillRect(0, 0, cWidth, cHeight);
for (let i = 0; i < items.length; i++) {
const { valueWidth, valueOffset, serviceName } = items[i];
const x = (valueOffset / totalValueWidth) * cWidth;
let width = (valueWidth / totalValueWidth) * cWidth;
if (width < MIN_ITEM_WIDTH) {
width = MIN_ITEM_WIDTH;
}
let fillStyle = fillCache.get(serviceName);
if (!fillStyle) {
fillStyle = `rgba(${getFillColor(serviceName).concat(ITEM_ALPHA).join()})`;
fillCache.set(serviceName, fillStyle);
}
ctx.fillStyle = fillStyle;
ctx.fillRect(x, i * itemYChange, width, itemHeight);
}
let fillStyle = fillCache.get(serviceName);
if (!fillStyle) {
fillStyle = `rgba(${getFillColor(serviceName).concat(ITEM_ALPHA).join()})`;
fillCache.set(serviceName, fillStyle);
}
ctx.fillStyle = fillStyle;
ctx.fillRect(x, i * itemYChange, width, itemHeight);
}
}

@ -94,7 +94,7 @@ const getStyles = (theme: GrafanaTheme2) => {
export type Props = {
color: string;
onClick?: (evt: React.MouseEvent<any>) => void;
onClick?: (evt: React.MouseEvent<HTMLDivElement>) => void;
viewEnd: number;
viewStart: number;
getViewedBounds: ViewedBoundsFunctionType;

@ -57,7 +57,7 @@ export function createViewedBoundsFunc(viewRange: { min: number; max: number; vi
* items.
* @returns {boolean} True if a match was found.
*/
export function spanHasTag(key: string, value: any, span: TraceSpan) {
export function spanHasTag(key: string, value: unknown, span: TraceSpan) {
if (!Array.isArray(span.tags) || !span.tags.length) {
return false;
}

@ -12,5 +12,5 @@
// See the License for the specific language governing permissions and
// limitations under the License.
export const FALLBACK_DAG_MAX_NUM_SERVICES = 100 as 100;
export const FALLBACK_DAG_MAX_NUM_SERVICES = 100;
export const FALLBACK_TRACE_NAME = '<trace-without-root-span>';

@ -1,7 +1,19 @@
import { PanelData } from '@grafana/data';
import { PanelData, RawTimeRange } from '@grafana/data';
import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';
import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';
import { DashboardModel } from '../dashboard/state';
declare global {
interface Window {
grafanaRuntime?: {
getDashboardSaveModel: () => DashboardModel | undefined;
getDashboardTimeRange: () => { from: number; to: number; raw: RawTimeRange };
getPanelData: () => Record<number, PanelData | undefined> | undefined;
};
}
}
/**
* This will setup features that are accessible through the root window location
*
@ -10,7 +22,7 @@ import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';
* @internal and subject to change
*/
export function initWindowRuntime() {
(window as any).grafanaRuntime = {
window.grafanaRuntime = {
/** Get info for the current dashboard. This will include the migrated dashboard JSON */
getDashboardSaveModel: () => {
const d = getDashboardSrv().getCurrent();
@ -36,10 +48,10 @@ export function initWindowRuntime() {
if (!d) {
return undefined;
}
return d.panels.reduce((acc, panel) => {
return d.panels.reduce<Record<number, PanelData | undefined>>((acc, panel) => {
acc[panel.id] = panel.getQueryRunner().getLastResult();
return acc;
}, {} as Record<number, PanelData | undefined>);
}, {});
},
};
}

@ -10,12 +10,18 @@ import { getRangeChunks as getMetricRangeChunks } from './metricTimeSplit';
import { combineResponses, isLogsQuery } from './queryUtils';
import { LokiQuery, LokiQueryType } from './types';
declare global {
interface Window {
lokiChunkDuration: number;
}
}
/**
* Purposely exposing it to support doing tests without needing to update the repo.
* TODO: remove.
* Hardcoded to 1 day.
*/
(window as any).lokiChunkDuration = 24 * 60 * 60 * 1000;
window.lokiChunkDuration = 24 * 60 * 60 * 1000;
export function partitionTimeRange(
isLogsQuery: boolean,
@ -35,7 +41,7 @@ export function partitionTimeRange(
const safeStep = Math.ceil((end - start) / 11000);
const step = Math.max(intervalMs * resolution, safeStep);
const duration: number = (window as any).lokiChunkDuration;
const duration = window.lokiChunkDuration;
const ranges = isLogsQuery
? getLogsRangeChunks(start, end, duration)

@ -316,13 +316,13 @@ function getRotationPadding(
): Padding {
const values = frame.fields[0].values;
const fontSize = UPLOT_AXIS_FONT_SIZE;
const displayProcessor = frame.fields[0].display ?? ((v) => v);
const displayProcessor = frame.fields[0].display;
const getProcessedValue = (i: number) => {
return displayProcessor ? displayProcessor(values.get(i)) : values.get(i);
};
let maxLength = 0;
for (let i = 0; i < values.length; i++) {
let size = measureText(
shortenValue(formattedValueToString(displayProcessor(values.get(i))), valueMaxLength),
fontSize
);
let size = measureText(shortenValue(formattedValueToString(getProcessedValue(i)), valueMaxLength), fontSize);
maxLength = size.width > maxLength ? size.width : maxLength;
}
@ -331,7 +331,7 @@ function getRotationPadding(
rotateLabel > 0
? Math.cos((rotateLabel * Math.PI) / 180) *
measureText(
shortenValue(formattedValueToString(displayProcessor(values.get(values.length - 1))), valueMaxLength),
shortenValue(formattedValueToString(getProcessedValue(values.length - 1)), valueMaxLength),
fontSize
).width
: 0;
@ -340,8 +340,7 @@ function getRotationPadding(
const paddingLeft =
rotateLabel < 0
? Math.cos((rotateLabel * -1 * Math.PI) / 180) *
measureText(shortenValue(formattedValueToString(displayProcessor(values.get(0))), valueMaxLength), fontSize)
.width
measureText(shortenValue(formattedValueToString(getProcessedValue(0)), valueMaxLength), fontSize).width
: 0;
// Add padding to the bottom to avoid clipping the rotated labels.

Loading…
Cancel
Save