Compare commits

..
Author SHA1 Message Date
oscarkilhed ccc52094a9 fix lint 2026-01-14 08:07:41 +01:00
oscarkilhed 47bb27a977 Dashboards: Fix react-grid-layout placeholder stuck when dragging panel across rows
Toggle isDraggable off/on when removing a panel from SceneGridLayout to force
react-grid-layout to exit drag mode and clear its internal state. This prevents
the placeholder from remaining stuck when dragging panels from a custom grid
inside a row to another layout.
2026-01-13 16:14:00 +01:00
oscarkilhed d599a2b125 Dashboards: Fix drag-to-tabs edge cases and improve drop behavior
- Use capture phase for pointerup listeners to handle tab header stopPropagation
- Drop items into current tab when released on tab header after cross-tab drag
- Handle RowsLayoutManager in TabItem.draggedGridItemInside (add to first row)
- Clear tab activation timer on row drag pointerup to prevent late tab switches
- Add tests for cross-tab drag scenarios
2026-01-13 13:03:33 +01:00
oscarkilhed 9992da3cc8 Refactor dashboard drop target attributes to use constants for improved maintainability
- Introduced constants for data attributes used to identify auto grid items and dashboard layout elements as drop targets.
- Updated references throughout the AutoGridLayout, AutoGridItemRenderer, DashboardLayoutOrchestrator, and other related components to utilize the new constants.
- This change enhances code readability and reduces the risk of errors related to hardcoded strings.
2026-01-13 09:07:55 +01:00
oscarkilhed 5256a5e83e remove dead code 2026-01-09 08:49:59 +01:00
oscarkilhed 337560a993 Merge branch 'main' into oscark/dragging-to-tabs-attempt-2 2026-01-08 14:44:05 +01:00
oscarkilhed ad10039d41 Add tests for layout orchestrator logic and clean up unecessary fallback 2026-01-08 14:43:18 +01:00
oscarkilhed 81880ffb2a i18n 2026-01-08 09:38:38 +01:00
oscarkilhed 792a26800b Remove panel selection during drag that opens edit pane
The code was selecting the panel after the drag distance threshold was reached,
which caused the edit pane to open during dragging. This was unintended behavior.
2026-01-08 09:31:11 +01:00
oscarkilhed 7ea4dd3744 Fix flickering when dragging AutoGrid items between grids
- Add isDroppedElsewhere() method to orchestrator for cross-layout detection
- Delay clearing draggingKey until item is moved to prevent source grid flicker
- Keep dropPosition/isDropTarget until draggedGridItemInside clears them
- Add endExternalDrag() to properly clean up CSS vars and draggingKey together
- Track container position to compensate for layout shifts during drag
2026-01-08 09:22:09 +01:00
oscarkilhed b444e42f05 Add visual placeholder for AutoGrid cross-grid drops
- Extend DashboardDropTarget interface with setDropPosition and position parameter
- Make AutoGridLayoutManager implement DashboardDropTarget with placeholder support
- Add placeholder rendering in AutoGridLayoutRenderer at dropPosition
- Track hover position in orchestrator with left/right half detection for precise placement
- Prevent flickering by tracking last hovered item key
- Add draggedGridItemOutside to AutoGridLayoutManager to remove items from source
- Clear row parent reference before adding to new layout in acceptDroppedRow
2026-01-07 10:25:33 +01:00
oscarkilhed 381a67243d Fix drag-to-tabs edge cases and add RowsLayoutManager drop target
- Fix closure bug in _stopDraggingSync where drop targets were nulled before setTimeout callback
- Add RowsLayoutManager as a drop target when empty (allows dropping grid items)
- Fix dropped row not being added when converting grid layout to RowsLayoutManager
- Remove visual drop target outline from RowsLayoutManager
- Properly reset isDropTarget state after drag operations complete
2026-01-05 09:22:08 +01:00
oscarkilhed 2873009b47 Attempt to drag to other tabs by creating a draggable preview 2026-01-02 13:53:37 +01:00
1114 changed files with 14345 additions and 45522 deletions
-4
View File
@@ -440,7 +440,6 @@ i18next.config.ts @grafana/grafana-frontend-platform
/e2e-playwright/dashboards/TestDashboard.json @grafana/dashboards-squad @grafana/grafana-search-navigate-organise
/e2e-playwright/dashboards/TestV2Dashboard.json @grafana/dashboards-squad
/e2e-playwright/dashboards/V2DashWithRepeats.json @grafana/dashboards-squad
/e2e-playwright/dashboards/V2DashWithRowRepeats.json @grafana/dashboards-squad
/e2e-playwright/dashboards/V2DashWithTabRepeats.json @grafana/dashboards-squad
/e2e-playwright/dashboards-suite/adhoc-filter-from-panel.spec.ts @grafana/datapro
/e2e-playwright/dashboards-suite/dashboard-browse-nested.spec.ts @grafana/grafana-search-navigate-organise
@@ -543,7 +542,6 @@ i18next.config.ts @grafana/grafana-frontend-platform
/packages/grafana-data/tsconfig.json @grafana/grafana-frontend-platform
/packages/grafana-data/test/ @grafana/grafana-frontend-platform
/packages/grafana-data/typings/ @grafana/grafana-frontend-platform
/packages/grafana-data/scripts/ @grafana/grafana-frontend-platform
/packages/grafana-data/src/**/*logs* @grafana/observability-logs
/packages/grafana-data/src/context/plugins/ @grafana/plugins-platform-frontend
@@ -659,7 +657,6 @@ i18next.config.ts @grafana/grafana-frontend-platform
/packages/grafana-runtime/src/services/LocationService.tsx @grafana/grafana-search-navigate-organise
/packages/grafana-runtime/src/services/LocationSrv.ts @grafana/grafana-search-navigate-organise
/packages/grafana-runtime/src/services/live.ts @grafana/dashboards-squad
/packages/grafana-runtime/src/services/pluginMeta @grafana/plugins-platform-frontend
/packages/grafana-runtime/src/utils/chromeHeaderHeight.ts @grafana/grafana-search-navigate-organise
/packages/grafana-runtime/src/utils/DataSourceWithBackend* @grafana/grafana-datasources-core-services
/packages/grafana-runtime/src/utils/licensing.ts @grafana/grafana-operator-experience-squad
@@ -1278,7 +1275,6 @@ embed.go @grafana/grafana-as-code
/.github/workflows/i18n-crowdin-download.yml @grafana/grafana-frontend-platform
/.github/workflows/i18n-crowdin-create-tasks.yml @grafana/grafana-frontend-platform
/.github/workflows/i18n-verify.yml @grafana/grafana-frontend-platform
/.github/workflows/deploy-storybook.yml @grafana/grafana-frontend-platform
/.github/workflows/deploy-storybook-preview.yml @grafana/grafana-frontend-platform
/.github/workflows/scripts/crowdin/create-tasks.ts @grafana/grafana-frontend-platform
/.github/workflows/scripts/publish-frontend-metrics.mts @grafana/grafana-frontend-platform
@@ -14,9 +14,6 @@ outputs:
frontend:
description: Whether the frontend or self has changed in any way
value: ${{ steps.changed-files.outputs.frontend_any_changed || 'true' }}
frontend-packages:
description: Whether any frontend packages have changed
value: ${{ steps.changed-files.outputs.frontend_packages_any_changed || 'true' }}
e2e:
description: Whether the e2e tests or self have changed in any way
value: ${{ steps.changed-files.outputs.e2e_any_changed == 'true' ||
@@ -100,12 +97,6 @@ runs:
- '.yarn/**'
- 'apps/dashboard/pkg/migration/**'
- '${{ inputs.self }}'
frontend_packages:
- '.github/actions/checkout/**'
- '.github/actions/change-detection/**'
- 'packages/**'
- './scripts/validate-npm-packages.sh'
- '${{ inputs.self }}'
e2e:
- 'e2e/**'
- 'e2e-playwright/**'
@@ -162,8 +153,6 @@ runs:
echo " --> ${{ steps.changed-files.outputs.backend_all_changed_files }}"
echo "Frontend: ${{ steps.changed-files.outputs.frontend_any_changed || 'true' }}"
echo " --> ${{ steps.changed-files.outputs.frontend_all_changed_files }}"
echo "Frontend packages: ${{ steps.changed-files.outputs.frontend_packages_any_changed || 'true' }}"
echo " --> ${{ steps.changed-files.outputs.frontend_packages_all_changed_files }}"
echo "E2E: ${{ steps.changed-files.outputs.e2e_any_changed || 'true' }}"
echo " --> ${{ steps.changed-files.outputs.e2e_all_changed_files }}"
echo " --> ${{ steps.changed-files.outputs.backend_all_changed_files }}"
+2 -2
View File
@@ -4,8 +4,8 @@ description: Sets up a node.js environment with presets for the Grafana reposito
runs:
using: "composite"
steps:
- uses: actions/setup-node@v6
- uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
cache-dependency-path: 'yarn.lock'
-79
View File
@@ -1,79 +0,0 @@
name: Deploy Storybook
on:
workflow_dispatch:
# push:
# branches:
# - main
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions: {}
jobs:
detect-changes:
# Only run in grafana/grafana
if: github.repository == 'grafana/grafana'
name: Detect whether code changed
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
changed-frontend-packages: ${{ steps.detect-changes.outputs.frontend-packages }}
steps:
- uses: actions/checkout@v5
with:
persist-credentials: true # required to get more history in the changed-files action
fetch-depth: 2
- name: Detect changes
id: detect-changes
uses: ./.github/actions/change-detection
with:
self: .github/workflows/deploy-storybook.yml
deploy-storybook:
name: Deploy Storybook
runs-on: ubuntu-latest
needs: detect-changes
# Only run in grafana/grafana
if: github.repository == 'grafana/grafana' && needs.detect-changes.outputs.changed-frontend-packages == 'true'
permissions:
contents: read
id-token: write
env:
BUCKET_NAME: grafana-storybook
steps:
- name: Checkout code
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node.js
uses: ./.github/actions/setup-node
- name: Install dependencies
run: yarn install --immutable
- name: Build storybook
run: yarn storybook:build
# Create the GCS folder name
# Right now, this just returns "canary"
# But we'll expand this to work for "latest" as well in the future
- name: Create deploy name
id: create-deploy-name
run: |
echo "deploy-name=canary" >> "$GITHUB_OUTPUT"
- name: Upload Storybook
uses: grafana/shared-workflows/actions/push-to-gcs@main
with:
environment: prod
bucket: ${{ env.BUCKET_NAME }}
bucket_path: ${{ steps.create-deploy-name.outputs.deploy-name }}
path: packages/grafana-ui/dist/storybook
service_account: github-gf-storybook-deploy@grafanalabs-workload-identity.iam.gserviceaccount.com
parent: false
+30 -36
View File
@@ -17,7 +17,6 @@ jobs:
outputs:
changed: ${{ steps.detect-changes.outputs.frontend }}
prettier: ${{ steps.detect-changes.outputs.frontend == 'true' || steps.detect-changes.outputs.docs == 'true' }}
changed-frontend-packages: ${{ steps.detect-changes.outputs.frontend-packages }}
steps:
- uses: actions/checkout@v5
with:
@@ -43,8 +42,11 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node
uses: ./.github/actions/setup-node
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- run: yarn install --immutable --check-cache
- run: yarn run prettier:check
- run: yarn run lint
@@ -61,8 +63,11 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node
uses: ./.github/actions/setup-node
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- name: Setup Enterprise
uses: ./.github/actions/setup-enterprise
with:
@@ -84,8 +89,11 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node
uses: ./.github/actions/setup-node
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- run: yarn install --immutable --check-cache
- run: yarn run typecheck
lint-frontend-typecheck-enterprise:
@@ -101,8 +109,11 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node
uses: ./.github/actions/setup-node
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- name: Setup Enterprise
uses: ./.github/actions/setup-enterprise
with:
@@ -122,8 +133,11 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node
uses: ./.github/actions/setup-node
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- run: yarn install --immutable --check-cache
- name: Generate API clients
run: |
@@ -150,8 +164,11 @@ jobs:
- uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node
uses: ./.github/actions/setup-node
- uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- name: Setup Enterprise
uses: ./.github/actions/setup-enterprise
with:
@@ -170,26 +187,3 @@ jobs:
echo "${uncommited_error_message}"
exit 1
fi
lint-frontend-packed-packages:
needs: detect-changes
permissions:
contents: read
id-token: write
if: github.event_name == 'pull_request' && needs.detect-changes.outputs.changed-frontend-packages == 'true'
name: Verify packed frontend packages
runs-on: ubuntu-latest
steps:
- name: Checkout build commit
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Setup Node
uses: ./.github/actions/setup-node
- name: Install dependencies
run: yarn install --immutable
- name: Build and pack packages
run: |
yarn run packages:build
yarn run packages:pack
- name: Validate packages
run: ./scripts/validate-npm-packages.sh
-2
View File
@@ -121,8 +121,6 @@ linters:
- '**/pkg/tsdb/zipkin/**/*'
- '**/pkg/tsdb/jaeger/*'
- '**/pkg/tsdb/jaeger/**/*'
- '**/pkg/tsdb/elasticsearch/*'
- '**/pkg/tsdb/elasticsearch/**/*'
deny:
- pkg: github.com/grafana/grafana/pkg/api
desc: Core plugins are not allowed to depend on Grafana core packages
@@ -1,8 +1,8 @@
diff --git a/dist/builder-manager/index.js b/dist/builder-manager/index.js
index ac8ac6a5f6a3b7852c4064e93dc9acd3201289e6..34a0a5a5c38dd7fe525c9ebd382a10a451d4d4f3 100644
index 3d7f9b213dae1801bda62b31db31b9113e382ccd..212501c63d20146c29db63fb0f6300c6779eecb5 100644
--- a/dist/builder-manager/index.js
+++ b/dist/builder-manager/index.js
@@ -1974,7 +1974,7 @@ var pa = /^\/($|\?)/, G, C, xt = /* @__PURE__ */ o(async (e) => {
@@ -1970,7 +1970,7 @@ var pa = /^\/($|\?)/, G, C, xt = /* @__PURE__ */ o(async (e) => {
bundle: !0,
minify: !0,
sourcemap: !1,
-1
View File
@@ -91,7 +91,6 @@ COPY pkg/storage/unified/resource pkg/storage/unified/resource
COPY pkg/storage/unified/resourcepb pkg/storage/unified/resourcepb
COPY pkg/storage/unified/apistore pkg/storage/unified/apistore
COPY pkg/semconv pkg/semconv
COPY pkg/plugins pkg/plugins
COPY pkg/aggregator pkg/aggregator
COPY apps/playlist apps/playlist
COPY apps/quotas apps/quotas
+1 -6
View File
@@ -135,7 +135,7 @@ i18n-extract-enterprise:
@echo "Skipping i18n extract for Enterprise: not enabled"
else
i18n-extract-enterprise:
@echo "Extracting i18n strings for Enterprise"
@echo "Extracting i18n strings for Enterprise"
cd public/locales/enterprise && yarn run i18next-cli extract --sync-primary
endif
@@ -227,10 +227,6 @@ fix-cue:
gen-jsonnet:
go generate ./devenv/jsonnet
.PHONY: gen-themes
gen-themes:
go generate ./pkg/services/preference
.PHONY: update-workspace
update-workspace: gen-go
@echo "updating workspace"
@@ -248,7 +244,6 @@ build-go-fast: ## Build all Go binaries without updating workspace.
.PHONY: build-backend
build-backend: ## Build Grafana backend.
@echo "build backend"
$(MAKE) gen-themes
$(GO) run build.go $(GO_BUILD_FLAGS) build-backend
.PHONY: build-air
@@ -28,7 +28,7 @@ type check struct {
PluginStore pluginstore.Store
PluginContextProvider PluginContextProvider
PluginClient plugins.Client
PluginRepo checks.PluginInfoGetter
PluginRepo repo.Service
GrafanaVersion string
pluginCanBeInstalledCache map[string]bool
pluginExistsCacheMu sync.RWMutex
@@ -39,7 +39,7 @@ func New(
pluginStore pluginstore.Store,
pluginContextProvider PluginContextProvider,
pluginClient plugins.Client,
pluginRepo checks.PluginInfoGetter,
pluginRepo repo.Service,
grafanaVersion string,
) checks.Check {
return &check{
@@ -15,7 +15,7 @@ import (
type missingPluginStep struct {
PluginStore pluginstore.Store
PluginRepo checks.PluginInfoGetter
PluginRepo repo.Service
GrafanaVersion string
}
-8
View File
@@ -5,7 +5,6 @@ import (
"github.com/grafana/grafana-app-sdk/logging"
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/pkg/plugins/repo"
)
// Check returns metadata about the check being executed and the list of Steps
@@ -38,10 +37,3 @@ type Step interface {
// Run executes the step for an item and returns a report
Run(ctx context.Context, log logging.Logger, obj *advisorv0alpha1.CheckSpec, item any) ([]advisorv0alpha1.CheckReportFailure, error)
}
// PluginInfoGetter is a minimal interface for retrieving plugin information from a repository.
// It contains only the GetPluginsInfo method used by plugincheck and datasourcecheck.
type PluginInfoGetter interface {
// GetPluginsInfo will return a list of plugins from grafana.com/api/plugins.
GetPluginsInfo(ctx context.Context, options repo.GetPluginsInfoOptions, compatOpts repo.CompatOpts) ([]repo.PluginInfo, error)
}
@@ -17,7 +17,7 @@ const (
func New(
pluginStore pluginstore.Store,
pluginRepo checks.PluginInfoGetter,
pluginRepo repo.Service,
updateChecker pluginchecker.PluginUpdateChecker,
pluginErrorResolver plugins.ErrorResolver,
grafanaVersion string,
@@ -33,7 +33,7 @@ func New(
type check struct {
PluginStore pluginstore.Store
PluginRepo checks.PluginInfoGetter
PluginRepo repo.Service
updateChecker pluginchecker.PluginUpdateChecker
pluginErrorResolver plugins.ErrorResolver
GrafanaVersion string
+1 -1
View File
@@ -4,7 +4,7 @@ go 1.25.5
require (
github.com/go-kit/log v0.2.1
github.com/grafana/alerting v0.0.0-20260112172717-98a49ed9557f
github.com/grafana/alerting v0.0.0-20251231150637-b7821017d69f
github.com/grafana/dskit v0.0.0-20250908063411-6b6da59b5cc4
github.com/grafana/grafana-app-sdk v0.48.7
github.com/grafana/grafana-app-sdk/logging v0.48.7
+2 -2
View File
@@ -243,8 +243,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/grafana/alerting v0.0.0-20260112172717-98a49ed9557f h1:3bXOyht68qkfvD6Y8z8XoenFbytSSOIkr/s+AqRzj0o=
github.com/grafana/alerting v0.0.0-20260112172717-98a49ed9557f/go.mod h1:Ji0SfJChcwjgq8ljy6Y5CcYfHfAYKXjKYeysOoDS/6s=
github.com/grafana/alerting v0.0.0-20251231150637-b7821017d69f h1:Br4SaUL3dnVopKKNhDavCLgehw60jdtl/sIxdfzmVts=
github.com/grafana/alerting v0.0.0-20251231150637-b7821017d69f/go.mod h1:l7v67cgP7x72ajB9UPZlumdrHqNztpKoqQ52cU8T3LU=
github.com/grafana/dskit v0.0.0-20250908063411-6b6da59b5cc4 h1:jSojuc7njleS3UOz223WDlXOinmuLAIPI0z2vtq8EgI=
github.com/grafana/dskit v0.0.0-20250908063411-6b6da59b5cc4/go.mod h1:VahT+GtfQIM+o8ht2StR6J9g+Ef+C2Vokh5uuSmOD/4=
github.com/grafana/grafana-app-sdk v0.48.7 h1:9mF7nqkqP0QUYYDlznoOt+GIyjzj45wGfUHB32u2ZMo=
@@ -254,18 +254,8 @@ FieldConfig: {
// custom is specified by the FieldConfig field
// in panel plugin schemas.
custom?: {...}
// Calculate min max per field
fieldMinMax?: bool
// How null values should be handled when calculating field stats
// "null" - Include null values, "connected" - Ignore nulls, "null as zero" - Treat nulls as zero
nullValueMode?: NullValueMode
}
// How null values should be handled
NullValueMode: "null" | "connected" | "null as zero"
DynamicConfigValue: {
id: string | *""
value?: _
@@ -250,18 +250,8 @@ FieldConfig: {
// custom is specified by the FieldConfig field
// in panel plugin schemas.
custom?: {...}
// Calculate min max per field
fieldMinMax?: bool
// How null values should be handled when calculating field stats
// "null" - Include null values, "connected" - Ignore nulls, "null as zero" - Treat nulls as zero
nullValueMode?: NullValueMode
}
// How null values should be handled
NullValueMode: "null" | "connected" | "null as zero"
DynamicConfigValue: {
id: string | *""
value?: _
@@ -258,18 +258,8 @@ FieldConfig: {
// custom is specified by the FieldConfig field
// in panel plugin schemas.
custom?: {...}
// Calculate min max per field
fieldMinMax?: bool
// How null values should be handled when calculating field stats
// "null" - Include null values, "connected" - Ignore nulls, "null as zero" - Treat nulls as zero
nullValueMode?: NullValueMode
}
// How null values should be handled
NullValueMode: "null" | "connected" | "null as zero"
DynamicConfigValue: {
id: string | *""
value?: _
@@ -419,11 +419,6 @@ type DashboardFieldConfig struct {
// custom is specified by the FieldConfig field
// in panel plugin schemas.
Custom map[string]interface{} `json:"custom,omitempty"`
// Calculate min max per field
FieldMinMax *bool `json:"fieldMinMax,omitempty"`
// How null values should be handled when calculating field stats
// "null" - Include null values, "connected" - Ignore nulls, "null as zero" - Treat nulls as zero
NullValueMode *DashboardNullValueMode `json:"nullValueMode,omitempty"`
}
// NewDashboardFieldConfig creates a new DashboardFieldConfig object.
@@ -750,16 +745,6 @@ func NewDashboardActionVariable() *DashboardActionVariable {
// +k8s:openapi-gen=true
const DashboardActionVariableType = "string"
// How null values should be handled
// +k8s:openapi-gen=true
type DashboardNullValueMode string
const (
DashboardNullValueModeNull DashboardNullValueMode = "null"
DashboardNullValueModeConnected DashboardNullValueMode = "connected"
DashboardNullValueModeNullAsZero DashboardNullValueMode = "null as zero"
)
// +k8s:openapi-gen=true
type DashboardDynamicConfigValue struct {
Id string `json:"id"`
@@ -2277,20 +2277,6 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref common.Referenc
},
},
},
"fieldMinMax": {
SchemaProps: spec.SchemaProps{
Description: "Calculate min max per field",
Type: []string{"boolean"},
Format: "",
},
},
"nullValueMode": {
SchemaProps: spec.SchemaProps{
Description: "How null values should be handled when calculating field stats \"null\" - Include null values, \"connected\" - Ignore nulls, \"null as zero\" - Treat nulls as zero",
Type: []string{"string"},
Format: "",
},
},
},
},
},
@@ -254,18 +254,8 @@ FieldConfig: {
// custom is specified by the FieldConfig field
// in panel plugin schemas.
custom?: {...}
// Calculate min max per field
fieldMinMax?: bool
// How null values should be handled when calculating field stats
// "null" - Include null values, "connected" - Ignore nulls, "null as zero" - Treat nulls as zero
nullValueMode?: NullValueMode
}
// How null values should be handled
NullValueMode: "null" | "connected" | "null as zero"
DynamicConfigValue: {
id: string | *""
value?: _
@@ -423,11 +423,6 @@ type DashboardFieldConfig struct {
// custom is specified by the FieldConfig field
// in panel plugin schemas.
Custom map[string]interface{} `json:"custom,omitempty"`
// Calculate min max per field
FieldMinMax *bool `json:"fieldMinMax,omitempty"`
// How null values should be handled when calculating field stats
// "null" - Include null values, "connected" - Ignore nulls, "null as zero" - Treat nulls as zero
NullValueMode *DashboardNullValueMode `json:"nullValueMode,omitempty"`
}
// NewDashboardFieldConfig creates a new DashboardFieldConfig object.
@@ -754,16 +749,6 @@ func NewDashboardActionVariable() *DashboardActionVariable {
// +k8s:openapi-gen=true
const DashboardActionVariableType = "string"
// How null values should be handled
// +k8s:openapi-gen=true
type DashboardNullValueMode string
const (
DashboardNullValueModeNull DashboardNullValueMode = "null"
DashboardNullValueModeConnected DashboardNullValueMode = "connected"
DashboardNullValueModeNullAsZero DashboardNullValueMode = "null as zero"
)
// +k8s:openapi-gen=true
type DashboardDynamicConfigValue struct {
Id string `json:"id"`
@@ -2284,20 +2284,6 @@ func schema_pkg_apis_dashboard_v2beta1_DashboardFieldConfig(ref common.Reference
},
},
},
"fieldMinMax": {
SchemaProps: spec.SchemaProps{
Description: "Calculate min max per field",
Type: []string{"boolean"},
Format: "",
},
},
"nullValueMode": {
SchemaProps: spec.SchemaProps{
Description: "How null values should be handled when calculating field stats \"null\" - Include null values, \"connected\" - Ignore nulls, \"null as zero\" - Treat nulls as zero",
Type: []string{"string"},
Format: "",
},
},
},
},
},
File diff suppressed because one or more lines are too long
@@ -1,427 +0,0 @@
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations \u0026 Alerts",
"type": "dashboard"
},
{
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations \u0026 Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"type": "dashboard"
},
{
"datasource": {
"type": "grafana-testdata-datasource"
},
"enable": true,
"filter": {
"exclude": false,
"ids": [
1
]
},
"iconColor": "red",
"name": "Red, only panel 1",
"target": {
"lines": 4,
"refId": "Anno",
"scenarioId": "annotations"
}
},
{
"datasource": {
"type": "grafana-testdata-datasource"
},
"enable": true,
"filter": {
"exclude": true,
"ids": [
1
]
},
"iconColor": "yellow",
"name": "Yellow - all except 1",
"target": {
"lines": 5,
"refId": "Anno",
"scenarioId": "annotations"
}
},
{
"datasource": {
"type": "grafana-testdata-datasource"
},
"enable": true,
"filter": {
"exclude": false,
"ids": [
3,
4
]
},
"iconColor": "dark-purple",
"name": "Purple only panel 3+4",
"target": {
"lines": 6,
"refId": "Anno",
"scenarioId": "annotations"
}
}
]
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": 119,
"links": [],
"liveNow": false,
"panels": [
{
"datasource": {
"type": "grafana-testdata-datasource"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"title": "Panel one",
"type": "timeseries"
},
{
"datasource": {
"type": "grafana-testdata-datasource"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"id": 2,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"title": "Panel two",
"type": "timeseries"
},
{
"datasource": {
"type": "grafana-testdata-datasource"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 8
},
"id": 3,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"title": "Panel three",
"type": "timeseries"
},
{
"datasource": {
"type": "grafana-testdata-datasource"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisCenteredZero": false,
"axisColorMode": "text",
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green"
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 8
},
"id": 4,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom",
"showLegend": true
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"title": "Panel four",
"type": "timeseries"
}
],
"refresh": "",
"schemaVersion": 42,
"tags": [
"gdev",
"annotations"
],
"templating": {
"list": []
},
"time": {
"from": "now-30m",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Annotation filtering",
"uid": "ed155665",
"weekStart": ""
}
@@ -219,7 +219,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -311,7 +312,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -490,7 +492,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -581,7 +584,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -672,7 +676,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -786,7 +791,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -900,7 +906,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -1015,7 +1022,8 @@
"value": 80
}
]
}
},
"unitScale": true
},
"overrides": []
},
@@ -65,14 +65,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -133,14 +136,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -201,14 +207,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -262,6 +271,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [],
"max": 100,
"min": 0,
@@ -269,14 +279,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -329,6 +342,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [],
"max": 100,
"min": 0,
@@ -336,14 +350,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -397,6 +414,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [],
"max": 100,
"min": 0,
@@ -404,14 +422,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -464,6 +485,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [],
"max": 100,
"min": 0,
@@ -471,14 +493,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -643,6 +668,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [
{
"options": {
@@ -659,14 +685,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -721,6 +750,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [
{
"options": {
@@ -738,14 +768,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -800,6 +833,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [
{
"options": {
@@ -818,14 +852,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -880,6 +917,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": "",
"mappings": [
{
"options": {
@@ -908,14 +946,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]
@@ -997,7 +1038,7 @@
"mode": "thresholds"
},
"custom": {},
"decimals": 2,
"decimals": "2",
"mappings": [],
"max": 100,
"min": 0,
@@ -1005,14 +1046,17 @@
"mode": "absolute",
"steps": [
{
"color": "#7EB26D"
"color": "#7EB26D",
"index": 0
},
{
"color": "#ef843c",
"index": 1,
"value": 75
},
{
"color": "#e24d42",
"index": 2,
"value": 90
}
]

Some files were not shown because too many files have changed in this diff Show More