mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Merge branch 'main' into drclau/unistor/replace-authenticators-3
This commit is contained in:
commit
a6c977ba4d
@ -2750,9 +2750,6 @@ exports[`better eslint`] = {
|
|||||||
"public/app/features/dashboard-scene/saving/shared.tsx:5381": [
|
"public/app/features/dashboard-scene/saving/shared.tsx:5381": [
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
|
||||||
],
|
],
|
||||||
"public/app/features/dashboard-scene/scene/DashboardControls.tsx:5381": [
|
|
||||||
[0, 0, 0, "Do not use any type assertions.", "0"]
|
|
||||||
],
|
|
||||||
"public/app/features/dashboard-scene/scene/NavToolbarActions.tsx:5381": [
|
"public/app/features/dashboard-scene/scene/NavToolbarActions.tsx:5381": [
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
|
||||||
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
|
||||||
|
File diff suppressed because one or more lines are too long
@ -26,7 +26,7 @@ plugins:
|
|||||||
- path: .yarn/plugins/@yarnpkg/plugin-outdated.cjs
|
- path: .yarn/plugins/@yarnpkg/plugin-outdated.cjs
|
||||||
spec: 'https://mskelton.dev/yarn-outdated/v2'
|
spec: 'https://mskelton.dev/yarn-outdated/v2'
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-4.4.1.cjs
|
yarnPath: .yarn/releases/yarn-4.5.0.cjs
|
||||||
# Uncomment the following lines if you want to use Verdaccio local npm registry. Read more at packages/README.md
|
# Uncomment the following lines if you want to use Verdaccio local npm registry. Read more at packages/README.md
|
||||||
#npmScopes:
|
#npmScopes:
|
||||||
# grafana:
|
# grafana:
|
||||||
|
@ -912,10 +912,10 @@ Content-Type: application/json
|
|||||||
"datasource":{
|
"datasource":{
|
||||||
"uid":"PD8C576611E62080A"
|
"uid":"PD8C576611E62080A"
|
||||||
},
|
},
|
||||||
"format": "table"
|
"format": "table",
|
||||||
"maxDataPoints":1848,
|
"maxDataPoints":1848,
|
||||||
"intervalMs":200,
|
"intervalMs":200,
|
||||||
"stringInput":"1,20,90,30,5,0",
|
"stringInput":"1,20,90,30,5,0"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"from":"now-5m",
|
"from":"now-5m",
|
||||||
|
@ -12,7 +12,7 @@ describe('Dashboards', () => {
|
|||||||
e2e.components.Panels.Panel.title('Panel #1').should('be.visible');
|
e2e.components.Panels.Panel.title('Panel #1').should('be.visible');
|
||||||
|
|
||||||
// scroll to the bottom
|
// scroll to the bottom
|
||||||
cy.get('#page-scrollbar').scrollTo('bottom', {
|
cy.scrollTo('bottom', {
|
||||||
timeout: 5 * 1000,
|
timeout: 5 * 1000,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ describe('Dashboards', () => {
|
|||||||
e2e.components.Panels.Panel.title('Panel #1').should('be.visible');
|
e2e.components.Panels.Panel.title('Panel #1').should('be.visible');
|
||||||
|
|
||||||
// scroll to the bottom
|
// scroll to the bottom
|
||||||
cy.get('#page-scrollbar').scrollTo('bottom', {
|
cy.scrollTo('bottom', {
|
||||||
timeout: 5 * 1000,
|
timeout: 5 * 1000,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ describe('Auto-migrate graph panel', () => {
|
|||||||
e2e.pages.Dashboard.Annotations.marker().should('exist');
|
e2e.pages.Dashboard.Annotations.marker().should('exist');
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.get('#pageContent .scrollbar-view').first().scrollTo('bottom');
|
cy.scrollTo('bottom');
|
||||||
|
|
||||||
e2e.components.Panels.Panel.title('05:00')
|
e2e.components.Panels.Panel.title('05:00')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
|
@ -64,7 +64,7 @@ describe('Auto-migrate graph panel', () => {
|
|||||||
e2e.pages.Dashboard.Annotations.marker().should('exist');
|
e2e.pages.Dashboard.Annotations.marker().should('exist');
|
||||||
});
|
});
|
||||||
|
|
||||||
cy.get('#pageContent .scrollbar-view').first().scrollTo('bottom');
|
cy.scrollTo('bottom');
|
||||||
|
|
||||||
e2e.components.Panels.Panel.title('05:00')
|
e2e.components.Panels.Panel.title('05:00')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
|
2
go.mod
2
go.mod
@ -74,7 +74,7 @@ require (
|
|||||||
github.com/gorilla/mux v1.8.1 // @grafana/grafana-backend-group
|
github.com/gorilla/mux v1.8.1 // @grafana/grafana-backend-group
|
||||||
github.com/gorilla/websocket v1.5.0 // @grafana/grafana-app-platform-squad
|
github.com/gorilla/websocket v1.5.0 // @grafana/grafana-app-platform-squad
|
||||||
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10 // @grafana/alerting-backend
|
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10 // @grafana/alerting-backend
|
||||||
github.com/grafana/authlib v0.0.0-20240827201526-24af227df935 // @grafana/identity-access-team
|
github.com/grafana/authlib v0.0.0-20240919120951-58259833c564 // @grafana/identity-access-team
|
||||||
github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd // @grafana/identity-access-team
|
github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd // @grafana/identity-access-team
|
||||||
github.com/grafana/codejen v0.0.3 // @grafana/dataviz-squad
|
github.com/grafana/codejen v0.0.3 // @grafana/dataviz-squad
|
||||||
github.com/grafana/cuetsy v0.1.11 // @grafana/grafana-as-code
|
github.com/grafana/cuetsy v0.1.11 // @grafana/grafana-as-code
|
||||||
|
4
go.sum
4
go.sum
@ -2258,8 +2258,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm
|
|||||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10 h1:oDbLKM34O+JUF9EQFS+9aYhdYoeNfUpXqNjFCLIxwF4=
|
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10 h1:oDbLKM34O+JUF9EQFS+9aYhdYoeNfUpXqNjFCLIxwF4=
|
||||||
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10/go.mod h1:GMLi6d09Xqo96fCVUjNk//rcjP5NKEdjOzfWIffD5r4=
|
github.com/grafana/alerting v0.0.0-20240917171353-6c25eb6eff10/go.mod h1:GMLi6d09Xqo96fCVUjNk//rcjP5NKEdjOzfWIffD5r4=
|
||||||
github.com/grafana/authlib v0.0.0-20240827201526-24af227df935 h1:nT4UY61s2flsiLkU2jDqtqFhOLwqh355+8ZhnavKoMQ=
|
github.com/grafana/authlib v0.0.0-20240919120951-58259833c564 h1:zYF/RBulpvMqPYR3gbzJZ8t/j/Eymn5FNidSYkueNCA=
|
||||||
github.com/grafana/authlib v0.0.0-20240827201526-24af227df935/go.mod h1:ER7bMzNNWTN/5Zl3pwqfgS6XEhcanjrvL7lOp8Ow6oc=
|
github.com/grafana/authlib v0.0.0-20240919120951-58259833c564/go.mod h1:PFzXbCrn0GIpN4KwT6NP1l5Z1CPLfmKHnYx8rZzQcyY=
|
||||||
github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd h1:sIlR7n38/MnZvX2qxDEszywXdI5soCwQ78aTDSARvus=
|
github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd h1:sIlR7n38/MnZvX2qxDEszywXdI5soCwQ78aTDSARvus=
|
||||||
github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A=
|
github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A=
|
||||||
github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw=
|
github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw=
|
||||||
|
@ -119,10 +119,10 @@
|
|||||||
"@types/jquery": "3.5.30",
|
"@types/jquery": "3.5.30",
|
||||||
"@types/js-yaml": "^4.0.5",
|
"@types/js-yaml": "^4.0.5",
|
||||||
"@types/jsurl": "^1.2.28",
|
"@types/jsurl": "^1.2.28",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/logfmt": "^1.2.3",
|
"@types/logfmt": "^1.2.3",
|
||||||
"@types/lucene": "^2",
|
"@types/lucene": "^2",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/node-forge": "^1",
|
"@types/node-forge": "^1",
|
||||||
"@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.2.4",
|
"@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.2.4",
|
||||||
"@types/pluralize": "^0.0.33",
|
"@types/pluralize": "^0.0.33",
|
||||||
@ -249,7 +249,7 @@
|
|||||||
"@emotion/css": "11.11.2",
|
"@emotion/css": "11.11.2",
|
||||||
"@emotion/react": "11.11.4",
|
"@emotion/react": "11.11.4",
|
||||||
"@fingerprintjs/fingerprintjs": "^3.4.2",
|
"@fingerprintjs/fingerprintjs": "^3.4.2",
|
||||||
"@floating-ui/react": "0.26.23",
|
"@floating-ui/react": "0.26.24",
|
||||||
"@formatjs/intl-durationformat": "^0.2.4",
|
"@formatjs/intl-durationformat": "^0.2.4",
|
||||||
"@glideapps/glide-data-grid": "^6.0.0",
|
"@glideapps/glide-data-grid": "^6.0.0",
|
||||||
"@grafana/aws-sdk": "0.4.2",
|
"@grafana/aws-sdk": "0.4.2",
|
||||||
@ -440,7 +440,7 @@
|
|||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 20"
|
"node": ">= 20"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1",
|
"packageManager": "yarn@4.5.0",
|
||||||
"dependenciesMeta": {
|
"dependenciesMeta": {
|
||||||
"prettier@3.3.3": {
|
"prettier@3.3.3": {
|
||||||
"unplugged": true
|
"unplugged": true
|
||||||
|
@ -65,8 +65,8 @@
|
|||||||
"@rollup/plugin-node-resolve": "15.2.4",
|
"@rollup/plugin-node-resolve": "15.2.4",
|
||||||
"@types/dompurify": "^3.0.0",
|
"@types/dompurify": "^3.0.0",
|
||||||
"@types/history": "4.7.11",
|
"@types/history": "4.7.11",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/papaparse": "5.3.14",
|
"@types/papaparse": "5.3.14",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
|
@ -309,6 +309,63 @@ describe('applyFieldOverrides', () => {
|
|||||||
expect(config.decimals).toEqual(1);
|
expect(config.decimals).toEqual(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('displayName should be able to reference itself', () => {
|
||||||
|
const data = applyFieldOverrides({
|
||||||
|
data: [f0], // the frame
|
||||||
|
fieldConfig: {
|
||||||
|
defaults: {
|
||||||
|
displayName: '${__field.displayName} and more!',
|
||||||
|
},
|
||||||
|
overrides: [],
|
||||||
|
},
|
||||||
|
replaceVariables: (v, scopedVars) => {
|
||||||
|
const dataContext = scopedVars?.__dataContext?.value;
|
||||||
|
if (dataContext) {
|
||||||
|
// Trying to fake what would happen with the real interpolation function
|
||||||
|
return getFieldDisplayName(dataContext.field, dataContext.frame) + ' and more!';
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
},
|
||||||
|
theme: createTheme(),
|
||||||
|
fieldConfigRegistry: customFieldRegistry,
|
||||||
|
})[0];
|
||||||
|
|
||||||
|
const valueColumn = data.fields[1];
|
||||||
|
const displayName = getFieldDisplayName(valueColumn, data);
|
||||||
|
|
||||||
|
expect(displayName).toEqual('value and more!');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('displayName should be able to reference itself in an override', () => {
|
||||||
|
const data = applyFieldOverrides({
|
||||||
|
data: [f0], // the frame
|
||||||
|
fieldConfig: {
|
||||||
|
defaults: {},
|
||||||
|
overrides: [
|
||||||
|
{
|
||||||
|
matcher: { id: FieldMatcherID.byName, options: 'value' },
|
||||||
|
properties: [{ id: 'displayName', value: '${__field.displayName} and more!' }],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
replaceVariables: (v, scopedVars) => {
|
||||||
|
const dataContext = scopedVars?.__dataContext?.value;
|
||||||
|
if (dataContext) {
|
||||||
|
// Trying to fake what would happen with the real interpolation function
|
||||||
|
return getFieldDisplayName(dataContext.field, dataContext.frame) + ' and more!';
|
||||||
|
}
|
||||||
|
return v;
|
||||||
|
},
|
||||||
|
theme: createTheme(),
|
||||||
|
fieldConfigRegistry: customFieldRegistry,
|
||||||
|
})[0];
|
||||||
|
|
||||||
|
const valueColumn = data.fields[1];
|
||||||
|
const displayName = getFieldDisplayName(valueColumn, data);
|
||||||
|
|
||||||
|
expect(displayName).toEqual('value and more!');
|
||||||
|
});
|
||||||
|
|
||||||
it('will apply set min/max when asked', () => {
|
it('will apply set min/max when asked', () => {
|
||||||
const data = applyFieldOverrides({
|
const data = applyFieldOverrides({
|
||||||
data: [f0], // the frame
|
data: [f0], // the frame
|
||||||
|
@ -162,6 +162,8 @@ export function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFra
|
|||||||
const { range, newGlobalRange } = calculateRange(config, field, globalRange, options.data!);
|
const { range, newGlobalRange } = calculateRange(config, field, globalRange, options.data!);
|
||||||
globalRange = newGlobalRange;
|
globalRange = newGlobalRange;
|
||||||
|
|
||||||
|
// Clear any cached displayName as it can change during field overrides process
|
||||||
|
field.state!.displayName = null;
|
||||||
field.state!.seriesIndex = seriesIndex;
|
field.state!.seriesIndex = seriesIndex;
|
||||||
field.state!.range = range;
|
field.state!.range = range;
|
||||||
field.type = type;
|
field.type = type;
|
||||||
|
@ -199,7 +199,6 @@ export interface FeatureToggles {
|
|||||||
alertingApiServer?: boolean;
|
alertingApiServer?: boolean;
|
||||||
dashboardRestoreUI?: boolean;
|
dashboardRestoreUI?: boolean;
|
||||||
cloudWatchRoundUpEndTime?: boolean;
|
cloudWatchRoundUpEndTime?: boolean;
|
||||||
bodyScrolling?: boolean;
|
|
||||||
cloudwatchMetricInsightsCrossAccount?: boolean;
|
cloudwatchMetricInsightsCrossAccount?: boolean;
|
||||||
prometheusAzureOverrideAudience?: boolean;
|
prometheusAzureOverrideAudience?: boolean;
|
||||||
alertingFilterV2?: boolean;
|
alertingFilterV2?: boolean;
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rollup/plugin-node-resolve": "15.2.4",
|
"@rollup/plugin-node-resolve": "15.2.4",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"esbuild": "0.24.0",
|
"esbuild": "0.24.0",
|
||||||
"rimraf": "6.0.1",
|
"rimraf": "6.0.1",
|
||||||
"rollup": "2.79.1",
|
"rollup": "2.79.1",
|
||||||
|
@ -67,8 +67,8 @@
|
|||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/d3": "^7",
|
"@types/d3": "^7",
|
||||||
"@types/jest": "^29.5.4",
|
"@types/jest": "^29.5.4",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-virtualized-auto-sizer": "1.0.4",
|
"@types/react-virtualized-auto-sizer": "1.0.4",
|
||||||
"@types/tinycolor2": "1.4.6",
|
"@types/tinycolor2": "1.4.6",
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
"@svgr/plugin-prettier": "^8.1.0",
|
"@svgr/plugin-prettier": "^8.1.0",
|
||||||
"@svgr/plugin-svgo": "^8.1.0",
|
"@svgr/plugin-svgo": "^8.1.0",
|
||||||
"@types/babel__core": "^7",
|
"@types/babel__core": "^7",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
"esbuild": "0.24.0",
|
"esbuild": "0.24.0",
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "^29.5.4",
|
"@types/jest": "^29.5.4",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/systemjs": "6.15.1",
|
"@types/systemjs": "6.15.1",
|
||||||
"@types/testing-library__jest-dom": "5.14.9",
|
"@types/testing-library__jest-dom": "5.14.9",
|
||||||
|
@ -20,5 +20,5 @@
|
|||||||
"typescript": "5.5.4",
|
"typescript": "5.5.4",
|
||||||
"webpack": "5.94.0"
|
"webpack": "5.94.0"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/css": "11.11.2",
|
"@emotion/css": "11.11.2",
|
||||||
"@floating-ui/react": "0.26.23",
|
"@floating-ui/react": "0.26.24",
|
||||||
"@grafana/data": "11.3.0-pre",
|
"@grafana/data": "11.3.0-pre",
|
||||||
"@grafana/experimental": "1.8.0",
|
"@grafana/experimental": "1.8.0",
|
||||||
"@grafana/faro-web-sdk": "1.10.0",
|
"@grafana/faro-web-sdk": "1.10.0",
|
||||||
@ -91,8 +91,8 @@
|
|||||||
"@types/eslint": "8.56.10",
|
"@types/eslint": "8.56.10",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/jquery": "3.5.30",
|
"@types/jquery": "3.5.30",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/pluralize": "^0.0.33",
|
"@types/pluralize": "^0.0.33",
|
||||||
"@types/prismjs": "1.26.4",
|
"@types/prismjs": "1.26.4",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
"@types/angular": "1.8.9",
|
"@types/angular": "1.8.9",
|
||||||
"@types/history": "4.7.11",
|
"@types/history": "4.7.11",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
"@types/systemjs": "6.15.1",
|
"@types/systemjs": "6.15.1",
|
||||||
|
@ -41,8 +41,8 @@
|
|||||||
"@testing-library/react-hooks": "^8.0.1",
|
"@testing-library/react-hooks": "^8.0.1",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "^29.5.4",
|
"@types/jest": "^29.5.4",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
"@types/react-virtualized-auto-sizer": "1.0.4",
|
"@types/react-virtualized-auto-sizer": "1.0.4",
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/css": "11.11.2",
|
"@emotion/css": "11.11.2",
|
||||||
"@emotion/react": "11.11.4",
|
"@emotion/react": "11.11.4",
|
||||||
"@floating-ui/react": "0.26.23",
|
"@floating-ui/react": "0.26.24",
|
||||||
"@grafana/data": "11.3.0-pre",
|
"@grafana/data": "11.3.0-pre",
|
||||||
"@grafana/e2e-selectors": "11.3.0-pre",
|
"@grafana/e2e-selectors": "11.3.0-pre",
|
||||||
"@grafana/faro-web-sdk": "^1.3.6",
|
"@grafana/faro-web-sdk": "^1.3.6",
|
||||||
@ -64,7 +64,7 @@
|
|||||||
"@react-aria/utils": "3.25.2",
|
"@react-aria/utils": "3.25.2",
|
||||||
"@tanstack/react-virtual": "^3.5.1",
|
"@tanstack/react-virtual": "^3.5.1",
|
||||||
"@types/jquery": "3.5.30",
|
"@types/jquery": "3.5.30",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/react-table": "7.7.20",
|
"@types/react-table": "7.7.20",
|
||||||
"ansicolor": "1.1.100",
|
"ansicolor": "1.1.100",
|
||||||
"calculate-size": "1.1.1",
|
"calculate-size": "1.1.1",
|
||||||
@ -145,7 +145,7 @@
|
|||||||
"@types/is-hotkey": "0.1.10",
|
"@types/is-hotkey": "0.1.10",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/mock-raf": "1.0.6",
|
"@types/mock-raf": "1.0.6",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/prismjs": "1.26.4",
|
"@types/prismjs": "1.26.4",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-color": "3.0.12",
|
"@types/react-color": "3.0.12",
|
||||||
|
@ -15,7 +15,6 @@ export interface WithContextMenuProps {
|
|||||||
export const WithContextMenu = ({ children, renderMenuItems, focusOnOpen = true }: WithContextMenuProps) => {
|
export const WithContextMenu = ({ children, renderMenuItems, focusOnOpen = true }: WithContextMenuProps) => {
|
||||||
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
||||||
const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });
|
const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });
|
||||||
const isBodyScrolling = window.grafanaBootData?.settings.featureToggles.bodyScrolling;
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{children({
|
{children({
|
||||||
@ -23,7 +22,7 @@ export const WithContextMenu = ({ children, renderMenuItems, focusOnOpen = true
|
|||||||
setIsMenuOpen(true);
|
setIsMenuOpen(true);
|
||||||
setMenuPosition({
|
setMenuPosition({
|
||||||
x: e.pageX,
|
x: e.pageX,
|
||||||
y: isBodyScrolling ? e.pageY - window.scrollY : e.pageY,
|
y: e.pageY - window.scrollY,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
})}
|
})}
|
||||||
|
@ -8,7 +8,7 @@ import { GrafanaTheme2, dateTimeParse, DateTime, TimeZone } from '@grafana/data'
|
|||||||
import { useStyles2 } from '../../../themes';
|
import { useStyles2 } from '../../../themes';
|
||||||
import { t } from '../../../utils/i18n';
|
import { t } from '../../../utils/i18n';
|
||||||
import { Icon } from '../../Icon/Icon';
|
import { Icon } from '../../Icon/Icon';
|
||||||
import { WeekStart } from '../WeekStartPicker';
|
import { getWeekStart, WeekStart } from '../WeekStartPicker';
|
||||||
import { adjustDateForReactCalendar } from '../utils/adjustDateForReactCalendar';
|
import { adjustDateForReactCalendar } from '../utils/adjustDateForReactCalendar';
|
||||||
|
|
||||||
import { TimePickerCalendarProps } from './TimePickerCalendar';
|
import { TimePickerCalendarProps } from './TimePickerCalendar';
|
||||||
@ -19,10 +19,11 @@ const weekStartMap: Record<WeekStart, CalendarType> = {
|
|||||||
monday: 'iso8601',
|
monday: 'iso8601',
|
||||||
};
|
};
|
||||||
|
|
||||||
export function Body({ onChange, from, to, timeZone, weekStart = 'monday' }: TimePickerCalendarProps) {
|
export function Body({ onChange, from, to, timeZone, weekStart }: TimePickerCalendarProps) {
|
||||||
const value = inputToValue(from, to, new Date(), timeZone);
|
const value = inputToValue(from, to, new Date(), timeZone);
|
||||||
const onCalendarChange = useOnCalendarChange(onChange, timeZone);
|
const onCalendarChange = useOnCalendarChange(onChange, timeZone);
|
||||||
const styles = useStyles2(getBodyStyles);
|
const styles = useStyles2(getBodyStyles);
|
||||||
|
const weekStartValue = getWeekStart(weekStart);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Calendar
|
<Calendar
|
||||||
@ -38,7 +39,7 @@ export function Body({ onChange, from, to, timeZone, weekStart = 'monday' }: Tim
|
|||||||
prevAriaLabel={t('time-picker.calendar.previous-month', 'Previous month')}
|
prevAriaLabel={t('time-picker.calendar.previous-month', 'Previous month')}
|
||||||
onChange={onCalendarChange}
|
onChange={onCalendarChange}
|
||||||
locale="en"
|
locale="en"
|
||||||
calendarType={weekStartMap[weekStart]}
|
calendarType={weekStartMap[weekStartValue]}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { useCallback, useMemo } from 'react';
|
import { useCallback, useMemo } from 'react';
|
||||||
|
|
||||||
|
import { BootData } from '@grafana/data';
|
||||||
import { selectors } from '@grafana/e2e-selectors';
|
import { selectors } from '@grafana/e2e-selectors';
|
||||||
|
|
||||||
import { Combobox, ComboboxOption } from '../Combobox/Combobox';
|
import { Combobox, ComboboxOption } from '../Combobox/Combobox';
|
||||||
@ -26,13 +27,28 @@ const isWeekStart = (value: string): value is WeekStart => {
|
|||||||
return ['saturday', 'sunday', 'monday'].includes(value);
|
return ['saturday', 'sunday', 'monday'].includes(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getWeekStart = (value: string): WeekStart => {
|
declare global {
|
||||||
if (isWeekStart(value)) {
|
interface Window {
|
||||||
return value;
|
grafanaBootData?: BootData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the system or user defined week start (as defined in bootData)
|
||||||
|
* Or you can pass in an override weekStart string and have it be validated and returned as WeekStart type if valid
|
||||||
|
*/
|
||||||
|
export function getWeekStart(override?: string): WeekStart {
|
||||||
|
if (override && isWeekStart(override)) {
|
||||||
|
return override;
|
||||||
|
}
|
||||||
|
|
||||||
|
const preference = window?.grafanaBootData?.user?.weekStart;
|
||||||
|
if (preference && isWeekStart(preference)) {
|
||||||
|
return preference;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'monday';
|
return 'monday';
|
||||||
};
|
}
|
||||||
|
|
||||||
export const WeekStartPicker = (props: Props) => {
|
export const WeekStartPicker = (props: Props) => {
|
||||||
const { onChange, width, autoFocus = false, onBlur, value, disabled = false, inputId } = props;
|
const { onChange, width, autoFocus = false, onBlur, value, disabled = false, inputId } = props;
|
||||||
|
@ -55,21 +55,13 @@ export function PortalContainer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getStyles = (theme: GrafanaTheme2) => {
|
const getStyles = (theme: GrafanaTheme2) => {
|
||||||
const isBodyScrolling = window.grafanaBootData?.settings.featureToggles.bodyScrolling;
|
|
||||||
return {
|
return {
|
||||||
grafanaPortalContainer: css(
|
grafanaPortalContainer: css({
|
||||||
isBodyScrolling
|
position: 'fixed',
|
||||||
? {
|
top: 0,
|
||||||
position: 'fixed',
|
width: '100%',
|
||||||
top: 0,
|
zIndex: theme.zIndex.portal,
|
||||||
width: '100%',
|
}),
|
||||||
zIndex: theme.zIndex.portal,
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
position: 'absolute',
|
|
||||||
width: '100%',
|
|
||||||
}
|
|
||||||
),
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5,9 +5,6 @@ import { GrafanaTheme2, ThemeTypographyVariant } from '@grafana/data';
|
|||||||
import { getFocusStyles } from '../mixins';
|
import { getFocusStyles } from '../mixins';
|
||||||
|
|
||||||
export function getElementStyles(theme: GrafanaTheme2) {
|
export function getElementStyles(theme: GrafanaTheme2) {
|
||||||
// TODO can we get the feature toggle in a better way?
|
|
||||||
const isBodyScrolling = window.grafanaBootData?.settings.featureToggles.bodyScrolling;
|
|
||||||
|
|
||||||
return css({
|
return css({
|
||||||
'*, *::before, *::after': {
|
'*, *::before, *::after': {
|
||||||
boxSizing: 'inherit',
|
boxSizing: 'inherit',
|
||||||
@ -40,26 +37,24 @@ export function getElementStyles(theme: GrafanaTheme2) {
|
|||||||
body: {
|
body: {
|
||||||
height: '100%',
|
height: '100%',
|
||||||
width: '100%',
|
width: '100%',
|
||||||
position: isBodyScrolling ? 'unset' : 'absolute',
|
position: 'unset',
|
||||||
color: theme.colors.text.primary,
|
color: theme.colors.text.primary,
|
||||||
backgroundColor: theme.colors.background.canvas,
|
backgroundColor: theme.colors.background.canvas,
|
||||||
|
// react select tries prevent scrolling by setting overflow/padding-right on the body
|
||||||
|
// Need type assertion here due to the use of !important
|
||||||
|
// see https://github.com/frenic/csstype/issues/114#issuecomment-697201978
|
||||||
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
||||||
|
overflowY: 'auto !important' as 'auto',
|
||||||
|
paddingRight: '0 !important',
|
||||||
|
'@media print': {
|
||||||
|
overflow: 'visible',
|
||||||
|
},
|
||||||
|
'@page': {
|
||||||
|
margin: 0,
|
||||||
|
size: 'auto',
|
||||||
|
padding: 0,
|
||||||
|
},
|
||||||
...theme.typography.body,
|
...theme.typography.body,
|
||||||
...(isBodyScrolling && {
|
|
||||||
// react select tries prevent scrolling by setting overflow/padding-right on the body
|
|
||||||
// Need type assertion here due to the use of !important
|
|
||||||
// see https://github.com/frenic/csstype/issues/114#issuecomment-697201978
|
|
||||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
||||||
overflowY: 'auto !important' as 'auto',
|
|
||||||
paddingRight: '0 !important',
|
|
||||||
'@media print': {
|
|
||||||
overflow: 'visible',
|
|
||||||
},
|
|
||||||
'@page': {
|
|
||||||
margin: 0,
|
|
||||||
size: 'auto',
|
|
||||||
padding: 0,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
|
|
||||||
'h1, .h1': getVariantStyles(theme.typography.h1),
|
'h1, .h1': getVariantStyles(theme.typography.h1),
|
||||||
|
@ -5,42 +5,21 @@ import { GrafanaTheme2 } from '@grafana/data';
|
|||||||
export function getPageStyles(theme: GrafanaTheme2) {
|
export function getPageStyles(theme: GrafanaTheme2) {
|
||||||
const maxWidthBreakpoint =
|
const maxWidthBreakpoint =
|
||||||
theme.breakpoints.values.xxl + theme.spacing.gridSize * 2 + theme.components.sidemenu.width;
|
theme.breakpoints.values.xxl + theme.spacing.gridSize * 2 + theme.components.sidemenu.width;
|
||||||
const isBodyScrolling = window.grafanaBootData?.settings.featureToggles.bodyScrolling;
|
|
||||||
|
|
||||||
return css({
|
return css({
|
||||||
'.grafana-app': isBodyScrolling
|
'.grafana-app': {
|
||||||
? {
|
display: 'flex',
|
||||||
display: 'flex',
|
flexDirection: 'column',
|
||||||
flexDirection: 'column',
|
height: '100vh',
|
||||||
height: '100vh',
|
},
|
||||||
}
|
|
||||||
: {
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'stretch',
|
|
||||||
position: 'absolute',
|
|
||||||
width: '100%',
|
|
||||||
height: '100%',
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
'.main-view': isBodyScrolling
|
'.main-view': {
|
||||||
? {
|
display: 'flex',
|
||||||
display: 'flex',
|
flexDirection: 'column',
|
||||||
flexDirection: 'column',
|
flexGrow: 1,
|
||||||
flexGrow: 1,
|
position: 'relative',
|
||||||
position: 'relative',
|
minWidth: 0,
|
||||||
minWidth: 0,
|
},
|
||||||
}
|
|
||||||
: {
|
|
||||||
position: 'relative',
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: 'column',
|
|
||||||
flexGrow: 1,
|
|
||||||
height: '100%',
|
|
||||||
flex: '1 1 0',
|
|
||||||
minWidth: 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
'.page-scrollbar-content': {
|
'.page-scrollbar-content': {
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
|
@ -3,7 +3,7 @@ module github.com/grafana/grafana/pkg/apimachinery
|
|||||||
go 1.23.1
|
go 1.23.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/grafana/authlib v0.0.0-20240906122029-0100695765b9 // @grafana/identity-access-team
|
github.com/grafana/authlib v0.0.0-20240919120951-58259833c564 // @grafana/identity-access-team
|
||||||
github.com/grafana/authlib/claims v0.0.0-20240903121118-16441568af1e // @grafana/identity-access-team
|
github.com/grafana/authlib/claims v0.0.0-20240903121118-16441568af1e // @grafana/identity-access-team
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.9.0
|
||||||
k8s.io/apimachinery v0.31.0
|
k8s.io/apimachinery v0.31.0
|
||||||
|
@ -28,8 +28,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
|
|||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/grafana/authlib v0.0.0-20240906122029-0100695765b9 h1:e+kFqd2sECBhbxOV1NoVxsudLygNQuu9bO+7FjNTkXo=
|
github.com/grafana/authlib v0.0.0-20240919120951-58259833c564 h1:zYF/RBulpvMqPYR3gbzJZ8t/j/Eymn5FNidSYkueNCA=
|
||||||
github.com/grafana/authlib v0.0.0-20240906122029-0100695765b9/go.mod h1:PFzXbCrn0GIpN4KwT6NP1l5Z1CPLfmKHnYx8rZzQcyY=
|
github.com/grafana/authlib v0.0.0-20240919120951-58259833c564/go.mod h1:PFzXbCrn0GIpN4KwT6NP1l5Z1CPLfmKHnYx8rZzQcyY=
|
||||||
github.com/grafana/authlib/claims v0.0.0-20240903121118-16441568af1e h1:ng5SopWamGS0MHaCj2e5huWYxAfMeCrj1l/dbJnfiow=
|
github.com/grafana/authlib/claims v0.0.0-20240903121118-16441568af1e h1:ng5SopWamGS0MHaCj2e5huWYxAfMeCrj1l/dbJnfiow=
|
||||||
github.com/grafana/authlib/claims v0.0.0-20240903121118-16441568af1e/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A=
|
github.com/grafana/authlib/claims v0.0.0-20240903121118-16441568af1e/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A=
|
||||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||||
|
@ -166,7 +166,7 @@ func AddKnownTypes(scheme *runtime.Scheme, version string) {
|
|||||||
&ServiceAccountTokenList{},
|
&ServiceAccountTokenList{},
|
||||||
&Team{},
|
&Team{},
|
||||||
&TeamList{},
|
&TeamList{},
|
||||||
&IdentityDisplayResults{},
|
&DisplayList{},
|
||||||
&SSOSetting{},
|
&SSOSetting{},
|
||||||
&SSOSettingList{},
|
&SSOSettingList{},
|
||||||
&TeamBinding{},
|
&TeamBinding{},
|
||||||
|
@ -7,23 +7,24 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
|
||||||
type IdentityDisplayResults struct {
|
type DisplayList struct {
|
||||||
metav1.TypeMeta `json:",inline"`
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ListMeta `json:"metadata,omitempty"`
|
||||||
|
|
||||||
// Request keys used to lookup the display value
|
// Request keys used to lookup the display value
|
||||||
// +listType=set
|
// +listType=set
|
||||||
Keys []string `json:"keys"`
|
Keys []string `json:"keys"`
|
||||||
|
|
||||||
// Matching items (the caller may need to remap from keys to results)
|
|
||||||
// +listType=atomic
|
|
||||||
Display []IdentityDisplay `json:"display"`
|
|
||||||
|
|
||||||
// Input keys that were not useable
|
// Input keys that were not useable
|
||||||
// +listType=set
|
// +listType=set
|
||||||
InvalidKeys []string `json:"invalidKeys,omitempty"`
|
InvalidKeys []string `json:"invalidKeys,omitempty"`
|
||||||
|
|
||||||
|
// Matching items (the caller may need to remap from keys to results)
|
||||||
|
// +listType=atomic
|
||||||
|
Items []Display `json:"display"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type IdentityDisplay struct {
|
type Display struct {
|
||||||
Identity IdentityRef `json:"identity"`
|
Identity IdentityRef `json:"identity"`
|
||||||
|
|
||||||
// Display name for identity.
|
// Display name for identity.
|
@ -68,7 +68,7 @@ type TeamMemberList struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type TeamMember struct {
|
type TeamMember struct {
|
||||||
IdentityDisplay `json:",inline"`
|
Display `json:",inline"`
|
||||||
|
|
||||||
// External is set if member ship was synced from external IDP.
|
// External is set if member ship was synced from external IDP.
|
||||||
External bool `json:"external,omitempty"`
|
External bool `json:"external,omitempty"`
|
||||||
|
@ -12,56 +12,57 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *IdentityDisplay) DeepCopyInto(out *IdentityDisplay) {
|
func (in *Display) DeepCopyInto(out *Display) {
|
||||||
*out = *in
|
*out = *in
|
||||||
out.Identity = in.Identity
|
out.Identity = in.Identity
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityDisplay.
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Display.
|
||||||
func (in *IdentityDisplay) DeepCopy() *IdentityDisplay {
|
func (in *Display) DeepCopy() *Display {
|
||||||
if in == nil {
|
if in == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
out := new(IdentityDisplay)
|
out := new(Display)
|
||||||
in.DeepCopyInto(out)
|
in.DeepCopyInto(out)
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *IdentityDisplayResults) DeepCopyInto(out *IdentityDisplayResults) {
|
func (in *DisplayList) DeepCopyInto(out *DisplayList) {
|
||||||
*out = *in
|
*out = *in
|
||||||
out.TypeMeta = in.TypeMeta
|
out.TypeMeta = in.TypeMeta
|
||||||
|
in.ListMeta.DeepCopyInto(&out.ListMeta)
|
||||||
if in.Keys != nil {
|
if in.Keys != nil {
|
||||||
in, out := &in.Keys, &out.Keys
|
in, out := &in.Keys, &out.Keys
|
||||||
*out = make([]string, len(*in))
|
*out = make([]string, len(*in))
|
||||||
copy(*out, *in)
|
copy(*out, *in)
|
||||||
}
|
}
|
||||||
if in.Display != nil {
|
|
||||||
in, out := &in.Display, &out.Display
|
|
||||||
*out = make([]IdentityDisplay, len(*in))
|
|
||||||
copy(*out, *in)
|
|
||||||
}
|
|
||||||
if in.InvalidKeys != nil {
|
if in.InvalidKeys != nil {
|
||||||
in, out := &in.InvalidKeys, &out.InvalidKeys
|
in, out := &in.InvalidKeys, &out.InvalidKeys
|
||||||
*out = make([]string, len(*in))
|
*out = make([]string, len(*in))
|
||||||
copy(*out, *in)
|
copy(*out, *in)
|
||||||
}
|
}
|
||||||
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]Display, len(*in))
|
||||||
|
copy(*out, *in)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityDisplayResults.
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DisplayList.
|
||||||
func (in *IdentityDisplayResults) DeepCopy() *IdentityDisplayResults {
|
func (in *DisplayList) DeepCopy() *DisplayList {
|
||||||
if in == nil {
|
if in == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
out := new(IdentityDisplayResults)
|
out := new(DisplayList)
|
||||||
in.DeepCopyInto(out)
|
in.DeepCopyInto(out)
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
func (in *IdentityDisplayResults) DeepCopyObject() runtime.Object {
|
func (in *DisplayList) DeepCopyObject() runtime.Object {
|
||||||
if c := in.DeepCopy(); c != nil {
|
if c := in.DeepCopy(); c != nil {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
@ -440,7 +441,7 @@ func (in *TeamList) DeepCopyObject() runtime.Object {
|
|||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *TeamMember) DeepCopyInto(out *TeamMember) {
|
func (in *TeamMember) DeepCopyInto(out *TeamMember) {
|
||||||
*out = *in
|
*out = *in
|
||||||
out.IdentityDisplay = in.IdentityDisplay
|
out.Display = in.Display
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@ import (
|
|||||||
|
|
||||||
func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
|
func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
|
||||||
return map[string]common.OpenAPIDefinition{
|
return map[string]common.OpenAPIDefinition{
|
||||||
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplay": schema_pkg_apis_iam_v0alpha1_IdentityDisplay(ref),
|
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.Display": schema_pkg_apis_iam_v0alpha1_Display(ref),
|
||||||
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplayResults": schema_pkg_apis_iam_v0alpha1_IdentityDisplayResults(ref),
|
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.DisplayList": schema_pkg_apis_iam_v0alpha1_DisplayList(ref),
|
||||||
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityRef": schema_pkg_apis_iam_v0alpha1_IdentityRef(ref),
|
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityRef": schema_pkg_apis_iam_v0alpha1_IdentityRef(ref),
|
||||||
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSetting": schema_pkg_apis_iam_v0alpha1_SSOSetting(ref),
|
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSetting": schema_pkg_apis_iam_v0alpha1_SSOSetting(ref),
|
||||||
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSettingList": schema_pkg_apis_iam_v0alpha1_SSOSettingList(ref),
|
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.SSOSettingList": schema_pkg_apis_iam_v0alpha1_SSOSettingList(ref),
|
||||||
@ -43,7 +43,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func schema_pkg_apis_iam_v0alpha1_IdentityDisplay(ref common.ReferenceCallback) common.OpenAPIDefinition {
|
func schema_pkg_apis_iam_v0alpha1_Display(ref common.ReferenceCallback) common.OpenAPIDefinition {
|
||||||
return common.OpenAPIDefinition{
|
return common.OpenAPIDefinition{
|
||||||
Schema: spec.Schema{
|
Schema: spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
@ -86,7 +86,7 @@ func schema_pkg_apis_iam_v0alpha1_IdentityDisplay(ref common.ReferenceCallback)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func schema_pkg_apis_iam_v0alpha1_IdentityDisplayResults(ref common.ReferenceCallback) common.OpenAPIDefinition {
|
func schema_pkg_apis_iam_v0alpha1_DisplayList(ref common.ReferenceCallback) common.OpenAPIDefinition {
|
||||||
return common.OpenAPIDefinition{
|
return common.OpenAPIDefinition{
|
||||||
Schema: spec.Schema{
|
Schema: spec.Schema{
|
||||||
SchemaProps: spec.SchemaProps{
|
SchemaProps: spec.SchemaProps{
|
||||||
@ -106,6 +106,12 @@ func schema_pkg_apis_iam_v0alpha1_IdentityDisplayResults(ref common.ReferenceCal
|
|||||||
Format: "",
|
Format: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"metadata": {
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Default: map[string]interface{}{},
|
||||||
|
Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
|
||||||
|
},
|
||||||
|
},
|
||||||
"keys": {
|
"keys": {
|
||||||
VendorExtensible: spec.VendorExtensible{
|
VendorExtensible: spec.VendorExtensible{
|
||||||
Extensions: spec.Extensions{
|
Extensions: spec.Extensions{
|
||||||
@ -126,25 +132,6 @@ func schema_pkg_apis_iam_v0alpha1_IdentityDisplayResults(ref common.ReferenceCal
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"display": {
|
|
||||||
VendorExtensible: spec.VendorExtensible{
|
|
||||||
Extensions: spec.Extensions{
|
|
||||||
"x-kubernetes-list-type": "atomic",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SchemaProps: spec.SchemaProps{
|
|
||||||
Description: "Matching items (the caller may need to remap from keys to results)",
|
|
||||||
Type: []string{"array"},
|
|
||||||
Items: &spec.SchemaOrArray{
|
|
||||||
Schema: &spec.Schema{
|
|
||||||
SchemaProps: spec.SchemaProps{
|
|
||||||
Default: map[string]interface{}{},
|
|
||||||
Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplay"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"invalidKeys": {
|
"invalidKeys": {
|
||||||
VendorExtensible: spec.VendorExtensible{
|
VendorExtensible: spec.VendorExtensible{
|
||||||
Extensions: spec.Extensions{
|
Extensions: spec.Extensions{
|
||||||
@ -165,12 +152,31 @@ func schema_pkg_apis_iam_v0alpha1_IdentityDisplayResults(ref common.ReferenceCal
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"display": {
|
||||||
|
VendorExtensible: spec.VendorExtensible{
|
||||||
|
Extensions: spec.Extensions{
|
||||||
|
"x-kubernetes-list-type": "atomic",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Description: "Matching items (the caller may need to remap from keys to results)",
|
||||||
|
Type: []string{"array"},
|
||||||
|
Items: &spec.SchemaOrArray{
|
||||||
|
Schema: &spec.Schema{
|
||||||
|
SchemaProps: spec.SchemaProps{
|
||||||
|
Default: map[string]interface{}{},
|
||||||
|
Ref: ref("github.com/grafana/grafana/pkg/apis/iam/v0alpha1.Display"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Required: []string{"keys", "display"},
|
Required: []string{"keys", "display"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Dependencies: []string{
|
Dependencies: []string{
|
||||||
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.IdentityDisplay"},
|
"github.com/grafana/grafana/pkg/apis/iam/v0alpha1.Display", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
|
API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,DisplayList,Items
|
||||||
API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,TeamBindingSpec,Subjects
|
API rule violation: list_type_missing,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,TeamBindingSpec,Subjects
|
||||||
API rule violation: names_match,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,IdentityDisplay,InternalID
|
API rule violation: names_match,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,Display,InternalID
|
||||||
|
API rule violation: names_match,github.com/grafana/grafana/pkg/apis/iam/v0alpha1,DisplayList,Items
|
||||||
|
@ -3,7 +3,6 @@ package grpcplugin
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"sync"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
@ -15,7 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errClientNotStarted = errors.New("plugin client has not been started")
|
errClientNotAvailable = errors.New("plugin client not available")
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ ProtoClient = (*protoClient)(nil)
|
var _ ProtoClient = (*protoClient)(nil)
|
||||||
@ -31,20 +30,12 @@ type ProtoClient interface {
|
|||||||
PID(context.Context) (string, error)
|
PID(context.Context) (string, error)
|
||||||
PluginID() string
|
PluginID() string
|
||||||
PluginVersion() string
|
PluginVersion() string
|
||||||
PluginJSON() plugins.JSONData
|
|
||||||
Backend() backendplugin.Plugin
|
Backend() backendplugin.Plugin
|
||||||
Logger() log.Logger
|
|
||||||
Start(context.Context) error
|
|
||||||
Stop(context.Context) error
|
|
||||||
Running(context.Context) bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type protoClient struct {
|
type protoClient struct {
|
||||||
plugin *grpcPlugin
|
plugin *grpcPlugin
|
||||||
pluginVersion string
|
pluginJSON plugins.JSONData
|
||||||
pluginJSON plugins.JSONData
|
|
||||||
|
|
||||||
mu sync.RWMutex
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProtoClientOpts struct {
|
type ProtoClientOpts struct {
|
||||||
@ -68,12 +59,12 @@ func NewProtoClient(opts ProtoClientOpts) (ProtoClient, error) {
|
|||||||
func() []string { return opts.Env },
|
func() []string { return opts.Env },
|
||||||
)
|
)
|
||||||
|
|
||||||
return &protoClient{plugin: p, pluginVersion: opts.PluginJSON.Info.Version, pluginJSON: opts.PluginJSON}, nil
|
return &protoClient{plugin: p, pluginJSON: opts.PluginJSON}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *protoClient) PID(ctx context.Context) (string, error) {
|
func (r *protoClient) PID(ctx context.Context) (string, error) {
|
||||||
if _, exists := r.client(ctx); !exists {
|
if _, exists := r.client(ctx); !exists {
|
||||||
return "", errClientNotStarted
|
return "", errClientNotAvailable
|
||||||
}
|
}
|
||||||
return r.plugin.client.ID(), nil
|
return r.plugin.client.ID(), nil
|
||||||
}
|
}
|
||||||
@ -83,11 +74,7 @@ func (r *protoClient) PluginID() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *protoClient) PluginVersion() string {
|
func (r *protoClient) PluginVersion() string {
|
||||||
return r.pluginVersion
|
return r.pluginJSON.Info.Version
|
||||||
}
|
|
||||||
|
|
||||||
func (r *protoClient) PluginJSON() plugins.JSONData {
|
|
||||||
return r.pluginJSON
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *protoClient) Backend() backendplugin.Plugin {
|
func (r *protoClient) Backend() backendplugin.Plugin {
|
||||||
@ -98,43 +85,14 @@ func (r *protoClient) Logger() log.Logger {
|
|||||||
return r.plugin.logger
|
return r.plugin.logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *protoClient) Start(ctx context.Context) error {
|
|
||||||
r.mu.Lock()
|
|
||||||
defer r.mu.Unlock()
|
|
||||||
return r.plugin.Start(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *protoClient) Stop(ctx context.Context) error {
|
|
||||||
r.mu.Lock()
|
|
||||||
defer r.mu.Unlock()
|
|
||||||
return r.plugin.Stop(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *protoClient) Running(_ context.Context) bool {
|
|
||||||
r.mu.RLock()
|
|
||||||
defer r.mu.RUnlock()
|
|
||||||
return !r.plugin.Exited()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *protoClient) client(ctx context.Context) (*ClientV2, bool) {
|
func (r *protoClient) client(ctx context.Context) (*ClientV2, bool) {
|
||||||
if !r.Running(ctx) {
|
return r.plugin.getPluginClient(ctx)
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
r.mu.RLock()
|
|
||||||
if r.plugin.pluginClient == nil {
|
|
||||||
r.mu.RUnlock()
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
pc := r.plugin.pluginClient
|
|
||||||
r.mu.RUnlock()
|
|
||||||
return pc, true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *protoClient) QueryData(ctx context.Context, in *pluginv2.QueryDataRequest, opts ...grpc.CallOption) (*pluginv2.QueryDataResponse, error) {
|
func (r *protoClient) QueryData(ctx context.Context, in *pluginv2.QueryDataRequest, opts ...grpc.CallOption) (*pluginv2.QueryDataResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.DataClient.QueryData(ctx, in, opts...)
|
return c.DataClient.QueryData(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -142,7 +100,7 @@ func (r *protoClient) QueryData(ctx context.Context, in *pluginv2.QueryDataReque
|
|||||||
func (r *protoClient) CallResource(ctx context.Context, in *pluginv2.CallResourceRequest, opts ...grpc.CallOption) (pluginv2.Resource_CallResourceClient, error) {
|
func (r *protoClient) CallResource(ctx context.Context, in *pluginv2.CallResourceRequest, opts ...grpc.CallOption) (pluginv2.Resource_CallResourceClient, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.ResourceClient.CallResource(ctx, in, opts...)
|
return c.ResourceClient.CallResource(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -150,7 +108,7 @@ func (r *protoClient) CallResource(ctx context.Context, in *pluginv2.CallResourc
|
|||||||
func (r *protoClient) CheckHealth(ctx context.Context, in *pluginv2.CheckHealthRequest, opts ...grpc.CallOption) (*pluginv2.CheckHealthResponse, error) {
|
func (r *protoClient) CheckHealth(ctx context.Context, in *pluginv2.CheckHealthRequest, opts ...grpc.CallOption) (*pluginv2.CheckHealthResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.DiagnosticsClient.CheckHealth(ctx, in, opts...)
|
return c.DiagnosticsClient.CheckHealth(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -158,7 +116,7 @@ func (r *protoClient) CheckHealth(ctx context.Context, in *pluginv2.CheckHealthR
|
|||||||
func (r *protoClient) CollectMetrics(ctx context.Context, in *pluginv2.CollectMetricsRequest, opts ...grpc.CallOption) (*pluginv2.CollectMetricsResponse, error) {
|
func (r *protoClient) CollectMetrics(ctx context.Context, in *pluginv2.CollectMetricsRequest, opts ...grpc.CallOption) (*pluginv2.CollectMetricsResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.DiagnosticsClient.CollectMetrics(ctx, in, opts...)
|
return c.DiagnosticsClient.CollectMetrics(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -166,7 +124,7 @@ func (r *protoClient) CollectMetrics(ctx context.Context, in *pluginv2.CollectMe
|
|||||||
func (r *protoClient) SubscribeStream(ctx context.Context, in *pluginv2.SubscribeStreamRequest, opts ...grpc.CallOption) (*pluginv2.SubscribeStreamResponse, error) {
|
func (r *protoClient) SubscribeStream(ctx context.Context, in *pluginv2.SubscribeStreamRequest, opts ...grpc.CallOption) (*pluginv2.SubscribeStreamResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.StreamClient.SubscribeStream(ctx, in, opts...)
|
return c.StreamClient.SubscribeStream(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -174,7 +132,7 @@ func (r *protoClient) SubscribeStream(ctx context.Context, in *pluginv2.Subscrib
|
|||||||
func (r *protoClient) RunStream(ctx context.Context, in *pluginv2.RunStreamRequest, opts ...grpc.CallOption) (pluginv2.Stream_RunStreamClient, error) {
|
func (r *protoClient) RunStream(ctx context.Context, in *pluginv2.RunStreamRequest, opts ...grpc.CallOption) (pluginv2.Stream_RunStreamClient, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.StreamClient.RunStream(ctx, in, opts...)
|
return c.StreamClient.RunStream(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -182,7 +140,7 @@ func (r *protoClient) RunStream(ctx context.Context, in *pluginv2.RunStreamReque
|
|||||||
func (r *protoClient) PublishStream(ctx context.Context, in *pluginv2.PublishStreamRequest, opts ...grpc.CallOption) (*pluginv2.PublishStreamResponse, error) {
|
func (r *protoClient) PublishStream(ctx context.Context, in *pluginv2.PublishStreamRequest, opts ...grpc.CallOption) (*pluginv2.PublishStreamResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.StreamClient.PublishStream(ctx, in, opts...)
|
return c.StreamClient.PublishStream(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -190,7 +148,7 @@ func (r *protoClient) PublishStream(ctx context.Context, in *pluginv2.PublishStr
|
|||||||
func (r *protoClient) ValidateAdmission(ctx context.Context, in *pluginv2.AdmissionRequest, opts ...grpc.CallOption) (*pluginv2.ValidationResponse, error) {
|
func (r *protoClient) ValidateAdmission(ctx context.Context, in *pluginv2.AdmissionRequest, opts ...grpc.CallOption) (*pluginv2.ValidationResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.AdmissionClient.ValidateAdmission(ctx, in, opts...)
|
return c.AdmissionClient.ValidateAdmission(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -198,7 +156,7 @@ func (r *protoClient) ValidateAdmission(ctx context.Context, in *pluginv2.Admiss
|
|||||||
func (r *protoClient) MutateAdmission(ctx context.Context, in *pluginv2.AdmissionRequest, opts ...grpc.CallOption) (*pluginv2.MutationResponse, error) {
|
func (r *protoClient) MutateAdmission(ctx context.Context, in *pluginv2.AdmissionRequest, opts ...grpc.CallOption) (*pluginv2.MutationResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.AdmissionClient.MutateAdmission(ctx, in, opts...)
|
return c.AdmissionClient.MutateAdmission(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
@ -206,7 +164,7 @@ func (r *protoClient) MutateAdmission(ctx context.Context, in *pluginv2.Admissio
|
|||||||
func (r *protoClient) ConvertObjects(ctx context.Context, in *pluginv2.ConversionRequest, opts ...grpc.CallOption) (*pluginv2.ConversionResponse, error) {
|
func (r *protoClient) ConvertObjects(ctx context.Context, in *pluginv2.ConversionRequest, opts ...grpc.CallOption) (*pluginv2.ConversionResponse, error) {
|
||||||
c, exists := r.client(ctx)
|
c, exists := r.client(ctx)
|
||||||
if !exists {
|
if !exists {
|
||||||
return nil, errClientNotStarted
|
return nil, errClientNotAvailable
|
||||||
}
|
}
|
||||||
return c.ConversionClient.ConvertObjects(ctx, in, opts...)
|
return c.ConversionClient.ConvertObjects(ctx, in, opts...)
|
||||||
}
|
}
|
||||||
|
@ -14,16 +14,6 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/plugins/log"
|
"github.com/grafana/grafana/pkg/plugins/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
type pluginClient interface {
|
|
||||||
backend.CollectMetricsHandler
|
|
||||||
backend.CheckHealthHandler
|
|
||||||
backend.QueryDataHandler
|
|
||||||
backend.CallResourceHandler
|
|
||||||
backend.AdmissionHandler
|
|
||||||
backend.ConversionHandler
|
|
||||||
backend.StreamHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
type grpcPlugin struct {
|
type grpcPlugin struct {
|
||||||
descriptor PluginDescriptor
|
descriptor PluginDescriptor
|
||||||
clientFactory func() *plugin.Client
|
clientFactory func() *plugin.Client
|
||||||
@ -32,8 +22,19 @@ type grpcPlugin struct {
|
|||||||
logger log.Logger
|
logger log.Logger
|
||||||
mutex sync.RWMutex
|
mutex sync.RWMutex
|
||||||
decommissioned bool
|
decommissioned bool
|
||||||
|
state pluginState
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type pluginState int
|
||||||
|
|
||||||
|
const (
|
||||||
|
pluginStateNotStarted pluginState = iota
|
||||||
|
pluginStateStartInit
|
||||||
|
pluginStateStartSuccess
|
||||||
|
pluginStateStartFail
|
||||||
|
pluginStateStopped
|
||||||
|
)
|
||||||
|
|
||||||
// newPlugin allocates and returns a new gRPC (external) backendplugin.Plugin.
|
// newPlugin allocates and returns a new gRPC (external) backendplugin.Plugin.
|
||||||
func newPlugin(descriptor PluginDescriptor) backendplugin.PluginFactoryFunc {
|
func newPlugin(descriptor PluginDescriptor) backendplugin.PluginFactoryFunc {
|
||||||
return func(pluginID string, logger log.Logger, env func() []string) (backendplugin.Plugin, error) {
|
return func(pluginID string, logger log.Logger, env func() []string) (backendplugin.Plugin, error) {
|
||||||
@ -48,6 +49,7 @@ func newGrpcPlugin(descriptor PluginDescriptor, logger log.Logger, env func() []
|
|||||||
clientFactory: func() *plugin.Client {
|
clientFactory: func() *plugin.Client {
|
||||||
return plugin.NewClient(newClientConfig(descriptor.executablePath, descriptor.executableArgs, env(), descriptor.skipHostEnvVars, logger, descriptor.versionedPlugins))
|
return plugin.NewClient(newClientConfig(descriptor.executablePath, descriptor.executableArgs, env(), descriptor.skipHostEnvVars, logger, descriptor.versionedPlugins))
|
||||||
},
|
},
|
||||||
|
state: pluginStateNotStarted,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,21 +65,27 @@ func (p *grpcPlugin) Start(_ context.Context) error {
|
|||||||
p.mutex.Lock()
|
p.mutex.Lock()
|
||||||
defer p.mutex.Unlock()
|
defer p.mutex.Unlock()
|
||||||
|
|
||||||
|
p.state = pluginStateStartInit
|
||||||
|
|
||||||
p.client = p.clientFactory()
|
p.client = p.clientFactory()
|
||||||
rpcClient, err := p.client.Client()
|
rpcClient, err := p.client.Client()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.state = pluginStateStartFail
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.client.NegotiatedVersion() < 2 {
|
if p.client.NegotiatedVersion() < 2 {
|
||||||
|
p.state = pluginStateStartFail
|
||||||
return errors.New("plugin protocol version not supported")
|
return errors.New("plugin protocol version not supported")
|
||||||
}
|
}
|
||||||
p.pluginClient, err = newClientV2(p.descriptor, p.logger, rpcClient)
|
p.pluginClient, err = newClientV2(p.descriptor, p.logger, rpcClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.state = pluginStateStartFail
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.pluginClient == nil {
|
if p.pluginClient == nil {
|
||||||
|
p.state = pluginStateStartFail
|
||||||
return errors.New("no compatible plugin implementation found")
|
return errors.New("no compatible plugin implementation found")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,6 +97,7 @@ func (p *grpcPlugin) Start(_ context.Context) error {
|
|||||||
p.logger.Warn("Plugin process is running with elevated privileges. This is not recommended")
|
p.logger.Warn("Plugin process is running with elevated privileges. This is not recommended")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.state = pluginStateStartSuccess
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,6 +108,7 @@ func (p *grpcPlugin) Stop(_ context.Context) error {
|
|||||||
if p.client != nil {
|
if p.client != nil {
|
||||||
p.client.Kill()
|
p.client.Kill()
|
||||||
}
|
}
|
||||||
|
p.state = pluginStateStopped
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,94 +144,110 @@ func (p *grpcPlugin) Target() backendplugin.Target {
|
|||||||
return backendplugin.TargetLocal
|
return backendplugin.TargetLocal
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) getPluginClient() (pluginClient, bool) {
|
func (p *grpcPlugin) getPluginClient(ctx context.Context) (*ClientV2, bool) {
|
||||||
p.mutex.RLock()
|
p.mutex.RLock()
|
||||||
if p.client == nil || p.client.Exited() || p.pluginClient == nil {
|
defer p.mutex.RUnlock()
|
||||||
p.mutex.RUnlock()
|
if p.client != nil && !p.client.Exited() && p.pluginClient != nil {
|
||||||
return nil, false
|
return p.pluginClient, true
|
||||||
}
|
}
|
||||||
pluginClient := p.pluginClient
|
|
||||||
p.mutex.RUnlock()
|
logger := p.Logger().FromContext(ctx)
|
||||||
return pluginClient, true
|
if p.state == pluginStateNotStarted {
|
||||||
|
logger.Debug("Plugin client has not been started yet")
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.state == pluginStateStartInit {
|
||||||
|
logger.Debug("Plugin client is starting")
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.state == pluginStateStartFail {
|
||||||
|
logger.Debug("Plugin client failed to start")
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.state == pluginStateStopped {
|
||||||
|
logger.Debug("Plugin client has stopped")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) CollectMetrics(ctx context.Context, req *backend.CollectMetricsRequest) (*backend.CollectMetricsResult, error) {
|
func (p *grpcPlugin) CollectMetrics(ctx context.Context, req *backend.CollectMetricsRequest) (*backend.CollectMetricsResult, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.CollectMetrics(ctx, req)
|
return pc.CollectMetrics(ctx, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
func (p *grpcPlugin) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.CheckHealth(ctx, req)
|
return pc.CheckHealth(ctx, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
func (p *grpcPlugin) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
|
|
||||||
return pluginClient.QueryData(ctx, req)
|
return pc.QueryData(ctx, req)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
|
func (p *grpcPlugin) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return plugins.ErrPluginUnavailable
|
return plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.CallResource(ctx, req, sender)
|
return pc.CallResource(ctx, req, sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) SubscribeStream(ctx context.Context, request *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
|
func (p *grpcPlugin) SubscribeStream(ctx context.Context, request *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.SubscribeStream(ctx, request)
|
return pc.SubscribeStream(ctx, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) PublishStream(ctx context.Context, request *backend.PublishStreamRequest) (*backend.PublishStreamResponse, error) {
|
func (p *grpcPlugin) PublishStream(ctx context.Context, request *backend.PublishStreamRequest) (*backend.PublishStreamResponse, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.PublishStream(ctx, request)
|
return pc.PublishStream(ctx, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) RunStream(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error {
|
func (p *grpcPlugin) RunStream(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return plugins.ErrPluginUnavailable
|
return plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.RunStream(ctx, req, sender)
|
return pc.RunStream(ctx, req, sender)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) ValidateAdmission(ctx context.Context, request *backend.AdmissionRequest) (*backend.ValidationResponse, error) {
|
func (p *grpcPlugin) ValidateAdmission(ctx context.Context, request *backend.AdmissionRequest) (*backend.ValidationResponse, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.ValidateAdmission(ctx, request)
|
return pc.ValidateAdmission(ctx, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) MutateAdmission(ctx context.Context, request *backend.AdmissionRequest) (*backend.MutationResponse, error) {
|
func (p *grpcPlugin) MutateAdmission(ctx context.Context, request *backend.AdmissionRequest) (*backend.MutationResponse, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.MutateAdmission(ctx, request)
|
return pc.MutateAdmission(ctx, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *grpcPlugin) ConvertObjects(ctx context.Context, request *backend.ConversionRequest) (*backend.ConversionResponse, error) {
|
func (p *grpcPlugin) ConvertObjects(ctx context.Context, request *backend.ConversionRequest) (*backend.ConversionResponse, error) {
|
||||||
pluginClient, ok := p.getPluginClient()
|
pc, ok := p.getPluginClient(ctx)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, plugins.ErrPluginUnavailable
|
return nil, plugins.ErrPluginUnavailable
|
||||||
}
|
}
|
||||||
return pluginClient.ConvertObjects(ctx, request)
|
return pc.ConvertObjects(ctx, request)
|
||||||
}
|
}
|
||||||
|
@ -79,6 +79,10 @@ func RegisterAPIService(
|
|||||||
continue // skip this one
|
continue // skip this one
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !ds.JSONData.Backend {
|
||||||
|
continue // skip frontend only plugins
|
||||||
|
}
|
||||||
|
|
||||||
builder, err = NewDataSourceAPIBuilder(ds.JSONData,
|
builder, err = NewDataSourceAPIBuilder(ds.JSONData,
|
||||||
pluginClient,
|
pluginClient,
|
||||||
datasources.GetDatasourceProvider(ds.JSONData),
|
datasources.GetDatasourceProvider(ds.JSONData),
|
||||||
|
@ -7,29 +7,40 @@ import (
|
|||||||
"github.com/grafana/authlib/claims"
|
"github.com/grafana/authlib/claims"
|
||||||
"k8s.io/apiserver/pkg/authorization/authorizer"
|
"k8s.io/apiserver/pkg/authorization/authorizer"
|
||||||
|
|
||||||
|
iamv0 "github.com/grafana/grafana/pkg/apis/iam/v0alpha1"
|
||||||
"github.com/grafana/grafana/pkg/registry/apis/iam/legacy"
|
"github.com/grafana/grafana/pkg/registry/apis/iam/legacy"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
gfauthorizer "github.com/grafana/grafana/pkg/services/apiserver/auth/authorizer"
|
gfauthorizer "github.com/grafana/grafana/pkg/services/apiserver/auth/authorizer"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newLegacyAuthorizer(ac accesscontrol.AccessControl, store legacy.LegacyIdentityStore) (authorizer.Authorizer, claims.AccessClient) {
|
func newLegacyAuthorizer(ac accesscontrol.AccessControl, store legacy.LegacyIdentityStore) (authorizer.Authorizer, claims.AccessClient) {
|
||||||
client := accesscontrol.NewLegacyAccessClient(ac, accesscontrol.ResourceAuthorizerOptions{
|
client := accesscontrol.NewLegacyAccessClient(
|
||||||
Resource: "users",
|
ac,
|
||||||
Attr: "id",
|
accesscontrol.ResourceAuthorizerOptions{
|
||||||
Mapping: map[string]string{
|
Resource: iamv0.UserResourceInfo.GetName(),
|
||||||
"get": accesscontrol.ActionOrgUsersRead,
|
Attr: "id",
|
||||||
"list": accesscontrol.ActionOrgUsersRead,
|
Mapping: map[string]string{
|
||||||
|
"get": accesscontrol.ActionOrgUsersRead,
|
||||||
|
"list": accesscontrol.ActionOrgUsersRead,
|
||||||
|
},
|
||||||
|
Resolver: accesscontrol.ResourceResolverFunc(func(ctx context.Context, ns claims.NamespaceInfo, name string) ([]string, error) {
|
||||||
|
res, err := store.GetUserInternalID(ctx, ns, legacy.GetUserInternalIDQuery{
|
||||||
|
UID: name,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return []string{fmt.Sprintf("users:id:%d", res.ID)}, nil
|
||||||
|
}),
|
||||||
},
|
},
|
||||||
Resolver: accesscontrol.ResourceResolverFunc(func(ctx context.Context, ns claims.NamespaceInfo, name string) ([]string, error) {
|
accesscontrol.ResourceAuthorizerOptions{
|
||||||
res, err := store.GetUserInternalID(ctx, ns, legacy.GetUserInternalIDQuery{
|
Resource: "display",
|
||||||
UID: name,
|
Unchecked: map[string]bool{
|
||||||
})
|
"get": true,
|
||||||
if err != nil {
|
"list": true,
|
||||||
return nil, err
|
},
|
||||||
}
|
},
|
||||||
return []string{fmt.Sprintf("users:id:%d", res.ID)}, nil
|
)
|
||||||
}),
|
|
||||||
})
|
|
||||||
|
|
||||||
return gfauthorizer.NewResourceAuthorizer(client), client
|
return gfauthorizer.NewResourceAuthorizer(client), client
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/registry/apis/iam/user"
|
"github.com/grafana/grafana/pkg/registry/apis/iam/user"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/apiserver/builder"
|
"github.com/grafana/grafana/pkg/services/apiserver/builder"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
||||||
"github.com/grafana/grafana/pkg/services/ssosettings"
|
"github.com/grafana/grafana/pkg/services/ssosettings"
|
||||||
"github.com/grafana/grafana/pkg/storage/legacysql"
|
"github.com/grafana/grafana/pkg/storage/legacysql"
|
||||||
)
|
)
|
||||||
@ -42,17 +41,11 @@ type IdentityAccessManagementAPIBuilder struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RegisterAPIService(
|
func RegisterAPIService(
|
||||||
features featuremgmt.FeatureToggles,
|
|
||||||
apiregistration builder.APIRegistrar,
|
apiregistration builder.APIRegistrar,
|
||||||
ssoService ssosettings.Service,
|
ssoService ssosettings.Service,
|
||||||
sql db.DB,
|
sql db.DB,
|
||||||
ac accesscontrol.AccessControl,
|
ac accesscontrol.AccessControl,
|
||||||
) (*IdentityAccessManagementAPIBuilder, error) {
|
) (*IdentityAccessManagementAPIBuilder, error) {
|
||||||
if !features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs) {
|
|
||||||
// skip registration unless opting into experimental apis
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
store := legacy.NewLegacySQLStores(legacysql.NewDatabaseProvider(sql))
|
store := legacy.NewLegacySQLStores(legacysql.NewDatabaseProvider(sql))
|
||||||
authorizer, client := newLegacyAuthorizer(ac, store)
|
authorizer, client := newLegacyAuthorizer(ac, store)
|
||||||
|
|
||||||
@ -114,9 +107,9 @@ func (b *IdentityAccessManagementAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *ge
|
|||||||
storage[userResource.StoragePath()] = user.NewLegacyStore(b.store, b.accessClient)
|
storage[userResource.StoragePath()] = user.NewLegacyStore(b.store, b.accessClient)
|
||||||
storage[userResource.StoragePath("teams")] = user.NewLegacyTeamMemberREST(b.store)
|
storage[userResource.StoragePath("teams")] = user.NewLegacyTeamMemberREST(b.store)
|
||||||
|
|
||||||
serviceaccountResource := iamv0.ServiceAccountResourceInfo
|
serviceAccountResource := iamv0.ServiceAccountResourceInfo
|
||||||
storage[serviceaccountResource.StoragePath()] = serviceaccount.NewLegacyStore(b.store)
|
storage[serviceAccountResource.StoragePath()] = serviceaccount.NewLegacyStore(b.store)
|
||||||
storage[serviceaccountResource.StoragePath("tokens")] = serviceaccount.NewLegacyTokenREST(b.store)
|
storage[serviceAccountResource.StoragePath("tokens")] = serviceaccount.NewLegacyTokenREST(b.store)
|
||||||
|
|
||||||
if b.sso != nil {
|
if b.sso != nil {
|
||||||
ssoResource := iamv0.SSOSettingResourceInfo
|
ssoResource := iamv0.SSOSettingResourceInfo
|
||||||
|
@ -97,7 +97,7 @@ var cfg = &setting.Cfg{}
|
|||||||
|
|
||||||
func mapToTeamMember(m legacy.TeamMember) iamv0.TeamMember {
|
func mapToTeamMember(m legacy.TeamMember) iamv0.TeamMember {
|
||||||
return iamv0.TeamMember{
|
return iamv0.TeamMember{
|
||||||
IdentityDisplay: iamv0.IdentityDisplay{
|
Display: iamv0.Display{
|
||||||
Identity: iamv0.IdentityRef{
|
Identity: iamv0.IdentityRef{
|
||||||
Type: claims.TypeUser,
|
Type: claims.TypeUser,
|
||||||
Name: m.UserUID,
|
Name: m.UserUID,
|
||||||
|
@ -35,7 +35,7 @@ func NewLegacyDisplayREST(store legacy.LegacyIdentityStore) *LegacyDisplayREST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LegacyDisplayREST) New() runtime.Object {
|
func (r *LegacyDisplayREST) New() runtime.Object {
|
||||||
return &iamv0.IdentityDisplayResults{}
|
return &iamv0.DisplayList{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LegacyDisplayREST) Destroy() {}
|
func (r *LegacyDisplayREST) Destroy() {}
|
||||||
@ -45,8 +45,7 @@ func (r *LegacyDisplayREST) NamespaceScoped() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LegacyDisplayREST) GetSingularName() string {
|
func (r *LegacyDisplayREST) GetSingularName() string {
|
||||||
// not actually used anywhere, but required by SingularNameProvider
|
return "display"
|
||||||
return "identitydisplay"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LegacyDisplayREST) ProducesMIMETypes(verb string) []string {
|
func (r *LegacyDisplayREST) ProducesMIMETypes(verb string) []string {
|
||||||
@ -54,11 +53,11 @@ func (r *LegacyDisplayREST) ProducesMIMETypes(verb string) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *LegacyDisplayREST) ProducesObject(verb string) any {
|
func (r *LegacyDisplayREST) ProducesObject(verb string) any {
|
||||||
return &iamv0.IdentityDisplayResults{}
|
return &iamv0.DisplayList{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LegacyDisplayREST) ConnectMethods() []string {
|
func (r *LegacyDisplayREST) ConnectMethods() []string {
|
||||||
return []string{"GET"}
|
return []string{http.MethodGet}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LegacyDisplayREST) NewConnectOptions() (runtime.Object, bool, string) {
|
func (r *LegacyDisplayREST) NewConnectOptions() (runtime.Object, bool, string) {
|
||||||
@ -91,13 +90,13 @@ func (r *LegacyDisplayREST) Connect(ctx context.Context, name string, _ runtime.
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rsp := &iamv0.IdentityDisplayResults{
|
rsp := &iamv0.DisplayList{
|
||||||
Keys: keys.keys,
|
Keys: keys.keys,
|
||||||
InvalidKeys: keys.invalid,
|
InvalidKeys: keys.invalid,
|
||||||
Display: make([]iamv0.IdentityDisplay, 0, len(users.Users)+len(keys.disp)+1),
|
Items: make([]iamv0.Display, 0, len(users.Users)+len(keys.disp)+1),
|
||||||
}
|
}
|
||||||
for _, user := range users.Users {
|
for _, user := range users.Users {
|
||||||
disp := iamv0.IdentityDisplay{
|
disp := iamv0.Display{
|
||||||
Identity: iamv0.IdentityRef{
|
Identity: iamv0.IdentityRef{
|
||||||
Type: claims.TypeUser,
|
Type: claims.TypeUser,
|
||||||
Name: user.UID,
|
Name: user.UID,
|
||||||
@ -109,12 +108,12 @@ func (r *LegacyDisplayREST) Connect(ctx context.Context, name string, _ runtime.
|
|||||||
disp.Identity.Type = claims.TypeServiceAccount
|
disp.Identity.Type = claims.TypeServiceAccount
|
||||||
}
|
}
|
||||||
disp.AvatarURL = dtos.GetGravatarUrlWithDefault(fakeCfgForGravatar, user.Email, disp.DisplayName)
|
disp.AvatarURL = dtos.GetGravatarUrlWithDefault(fakeCfgForGravatar, user.Email, disp.DisplayName)
|
||||||
rsp.Display = append(rsp.Display, disp)
|
rsp.Items = append(rsp.Items, disp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append the constants here
|
// Append the constants here
|
||||||
if len(keys.disp) > 0 {
|
if len(keys.disp) > 0 {
|
||||||
rsp.Display = append(rsp.Display, keys.disp...)
|
rsp.Items = append(rsp.Items, keys.disp...)
|
||||||
}
|
}
|
||||||
responder.Object(200, rsp)
|
responder.Object(200, rsp)
|
||||||
}), nil
|
}), nil
|
||||||
@ -127,7 +126,7 @@ type dispKeys struct {
|
|||||||
invalid []string
|
invalid []string
|
||||||
|
|
||||||
// For terminal keys, this is a constant
|
// For terminal keys, this is a constant
|
||||||
disp []iamv0.IdentityDisplay
|
disp []iamv0.Display
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseKeys(req []string) dispKeys {
|
func parseKeys(req []string) dispKeys {
|
||||||
@ -148,7 +147,7 @@ func parseKeys(req []string) dispKeys {
|
|||||||
|
|
||||||
switch t {
|
switch t {
|
||||||
case claims.TypeAnonymous:
|
case claims.TypeAnonymous:
|
||||||
keys.disp = append(keys.disp, iamv0.IdentityDisplay{
|
keys.disp = append(keys.disp, iamv0.Display{
|
||||||
Identity: iamv0.IdentityRef{
|
Identity: iamv0.IdentityRef{
|
||||||
Type: t,
|
Type: t,
|
||||||
},
|
},
|
||||||
@ -157,7 +156,7 @@ func parseKeys(req []string) dispKeys {
|
|||||||
})
|
})
|
||||||
continue
|
continue
|
||||||
case claims.TypeAPIKey:
|
case claims.TypeAPIKey:
|
||||||
keys.disp = append(keys.disp, iamv0.IdentityDisplay{
|
keys.disp = append(keys.disp, iamv0.Display{
|
||||||
Identity: iamv0.IdentityRef{
|
Identity: iamv0.IdentityRef{
|
||||||
Type: t,
|
Type: t,
|
||||||
Name: key,
|
Name: key,
|
||||||
@ -167,7 +166,7 @@ func parseKeys(req []string) dispKeys {
|
|||||||
})
|
})
|
||||||
continue
|
continue
|
||||||
case claims.TypeProvisioning:
|
case claims.TypeProvisioning:
|
||||||
keys.disp = append(keys.disp, iamv0.IdentityDisplay{
|
keys.disp = append(keys.disp, iamv0.Display{
|
||||||
Identity: iamv0.IdentityRef{
|
Identity: iamv0.IdentityRef{
|
||||||
Type: t,
|
Type: t,
|
||||||
},
|
},
|
||||||
@ -184,7 +183,7 @@ func parseKeys(req []string) dispKeys {
|
|||||||
id, err := strconv.ParseInt(key, 10, 64)
|
id, err := strconv.ParseInt(key, 10, 64)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if id == 0 {
|
if id == 0 {
|
||||||
keys.disp = append(keys.disp, iamv0.IdentityDisplay{
|
keys.disp = append(keys.disp, iamv0.Display{
|
||||||
Identity: iamv0.IdentityRef{
|
Identity: iamv0.IdentityRef{
|
||||||
Type: claims.TypeUser,
|
Type: claims.TypeUser,
|
||||||
Name: key,
|
Name: key,
|
||||||
|
@ -27,6 +27,9 @@ func (r ResourceResolverFunc) Resolve(ctx context.Context, ns claims.NamespaceIn
|
|||||||
type ResourceAuthorizerOptions struct {
|
type ResourceAuthorizerOptions struct {
|
||||||
// Resource is the resource name in plural.
|
// Resource is the resource name in plural.
|
||||||
Resource string
|
Resource string
|
||||||
|
// Unchecked is used to skip authorization checks for specified verbs.
|
||||||
|
// This takes precedence over configured Mapping
|
||||||
|
Unchecked map[string]bool
|
||||||
// Attr is attribute used for resource scope. It's usually 'id' or 'uid'
|
// Attr is attribute used for resource scope. It's usually 'id' or 'uid'
|
||||||
// depending on what is stored for the resource.
|
// depending on what is stored for the resource.
|
||||||
Attr string
|
Attr string
|
||||||
@ -45,6 +48,9 @@ func NewLegacyAccessClient(ac AccessControl, opts ...ResourceAuthorizerOptions)
|
|||||||
stored := map[string]ResourceAuthorizerOptions{}
|
stored := map[string]ResourceAuthorizerOptions{}
|
||||||
|
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
|
if o.Unchecked == nil {
|
||||||
|
o.Unchecked = map[string]bool{}
|
||||||
|
}
|
||||||
if o.Mapping == nil {
|
if o.Mapping == nil {
|
||||||
o.Mapping = map[string]string{}
|
o.Mapping = map[string]string{}
|
||||||
}
|
}
|
||||||
@ -75,6 +81,11 @@ func (c *LegacyAccessClient) HasAccess(ctx context.Context, id claims.AuthInfo,
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip := opts.Unchecked[req.Verb]
|
||||||
|
if skip {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
action, ok := opts.Mapping[req.Verb]
|
action, ok := opts.Mapping[req.Verb]
|
||||||
if !ok {
|
if !ok {
|
||||||
return false, fmt.Errorf("missing action for %s %s", req.Verb, req.Resource)
|
return false, fmt.Errorf("missing action for %s %s", req.Verb, req.Resource)
|
||||||
|
@ -103,6 +103,41 @@ func TestResourceAuthorizer_HasAccess(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, true, ok)
|
assert.Equal(t, true, ok)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("should skip authorization for configured verb", func(t *testing.T) {
|
||||||
|
a := accesscontrol.NewLegacyAccessClient(ac, accesscontrol.ResourceAuthorizerOptions{
|
||||||
|
Resource: "dashboards",
|
||||||
|
Attr: "uid",
|
||||||
|
Unchecked: map[string]bool{
|
||||||
|
"get": true,
|
||||||
|
},
|
||||||
|
Mapping: map[string]string{
|
||||||
|
"create": "dashboards:create",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
ident := newIdent(accesscontrol.Permission{})
|
||||||
|
|
||||||
|
ok, err := a.HasAccess(context.Background(), ident, claims.AccessRequest{
|
||||||
|
Verb: "get",
|
||||||
|
Namespace: "default",
|
||||||
|
Resource: "dashboards",
|
||||||
|
Name: "1",
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, true, ok)
|
||||||
|
|
||||||
|
ok, err = a.HasAccess(context.Background(), ident, claims.AccessRequest{
|
||||||
|
Verb: "create",
|
||||||
|
Namespace: "default",
|
||||||
|
Resource: "dashboards",
|
||||||
|
Name: "1",
|
||||||
|
})
|
||||||
|
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, false, ok)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func newIdent(permissions ...accesscontrol.Permission) *identity.StaticRequester {
|
func newIdent(permissions ...accesscontrol.Permission) *identity.StaticRequester {
|
||||||
|
@ -2,10 +2,9 @@ package correlations
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ConfigurationPageAccess is used to protect the "Configure > correlations" tab access
|
// ConfigurationPageAccess is used to protect the "Configure > correlations" tab access
|
||||||
ConfigurationPageAccess = accesscontrol.EvalPermission(datasources.ActionRead)
|
ConfigurationPageAccess = accesscontrol.EvalPermission(accesscontrol.ActionDatasourcesExplore)
|
||||||
)
|
)
|
||||||
|
@ -1371,17 +1371,6 @@ var (
|
|||||||
Owner: awsDatasourcesSquad,
|
Owner: awsDatasourcesSquad,
|
||||||
Expression: "true",
|
Expression: "true",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "bodyScrolling",
|
|
||||||
Description: "Adjusts Page to make body the scrollable element",
|
|
||||||
Stage: FeatureStagePublicPreview,
|
|
||||||
Owner: grafanaFrontendPlatformSquad,
|
|
||||||
Expression: "false", // enabled by default
|
|
||||||
FrontendOnly: true,
|
|
||||||
AllowSelfServe: true,
|
|
||||||
HideFromDocs: true,
|
|
||||||
HideFromAdminPage: false,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
Name: "cloudwatchMetricInsightsCrossAccount",
|
Name: "cloudwatchMetricInsightsCrossAccount",
|
||||||
Description: "Enables cross account observability for Cloudwatch Metric Insights query builder",
|
Description: "Enables cross account observability for Cloudwatch Metric Insights query builder",
|
||||||
|
@ -180,7 +180,6 @@ passScopeToDashboardApi,experimental,@grafana/dashboards-squad,false,false,false
|
|||||||
alertingApiServer,experimental,@grafana/alerting-squad,false,true,false
|
alertingApiServer,experimental,@grafana/alerting-squad,false,true,false
|
||||||
dashboardRestoreUI,experimental,@grafana/grafana-frontend-platform,false,false,false
|
dashboardRestoreUI,experimental,@grafana/grafana-frontend-platform,false,false,false
|
||||||
cloudWatchRoundUpEndTime,GA,@grafana/aws-datasources,false,false,false
|
cloudWatchRoundUpEndTime,GA,@grafana/aws-datasources,false,false,false
|
||||||
bodyScrolling,preview,@grafana/grafana-frontend-platform,false,false,true
|
|
||||||
cloudwatchMetricInsightsCrossAccount,preview,@grafana/aws-datasources,false,false,true
|
cloudwatchMetricInsightsCrossAccount,preview,@grafana/aws-datasources,false,false,true
|
||||||
prometheusAzureOverrideAudience,deprecated,@grafana/partner-datasources,false,false,false
|
prometheusAzureOverrideAudience,deprecated,@grafana/partner-datasources,false,false,false
|
||||||
alertingFilterV2,experimental,@grafana/alerting-squad,false,false,false
|
alertingFilterV2,experimental,@grafana/alerting-squad,false,false,false
|
||||||
|
|
@ -731,10 +731,6 @@ const (
|
|||||||
// Round up end time for metric queries to the next minute to avoid missing data
|
// Round up end time for metric queries to the next minute to avoid missing data
|
||||||
FlagCloudWatchRoundUpEndTime = "cloudWatchRoundUpEndTime"
|
FlagCloudWatchRoundUpEndTime = "cloudWatchRoundUpEndTime"
|
||||||
|
|
||||||
// FlagBodyScrolling
|
|
||||||
// Adjusts Page to make body the scrollable element
|
|
||||||
FlagBodyScrolling = "bodyScrolling"
|
|
||||||
|
|
||||||
// FlagCloudwatchMetricInsightsCrossAccount
|
// FlagCloudwatchMetricInsightsCrossAccount
|
||||||
// Enables cross account observability for Cloudwatch Metric Insights query builder
|
// Enables cross account observability for Cloudwatch Metric Insights query builder
|
||||||
FlagCloudwatchMetricInsightsCrossAccount = "cloudwatchMetricInsightsCrossAccount"
|
FlagCloudwatchMetricInsightsCrossAccount = "cloudwatchMetricInsightsCrossAccount"
|
||||||
|
@ -595,6 +595,7 @@
|
|||||||
"name": "bodyScrolling",
|
"name": "bodyScrolling",
|
||||||
"resourceVersion": "1721723807004",
|
"resourceVersion": "1721723807004",
|
||||||
"creationTimestamp": "2024-07-01T10:28:39Z",
|
"creationTimestamp": "2024-07-01T10:28:39Z",
|
||||||
|
"deletionTimestamp": "2024-09-24T09:17:00Z",
|
||||||
"annotations": {
|
"annotations": {
|
||||||
"grafana.app/updatedTimestamp": "2024-07-23 08:36:47.004393 +0000 UTC"
|
"grafana.app/updatedTimestamp": "2024-07-23 08:36:47.004393 +0000 UTC"
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||||||
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
"github.com/grafana/grafana/pkg/util"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var logger = log.New("ngalert.eval")
|
var logger = log.New("ngalert.eval")
|
||||||
@ -705,13 +704,6 @@ func evaluateExecutionResult(execResults ExecutionResults, ts time.Time) Results
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// The query service returns instant vectors from prometheus as scalars. We need to handle them accordingly.
|
|
||||||
if val, ok := scalarInstantVector(f); ok {
|
|
||||||
r := buildResult(f, val, ts)
|
|
||||||
evalResults = append(evalResults, r)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(f.TypeIndices(data.FieldTypeTime, data.FieldTypeNullableTime)) > 0 {
|
if len(f.TypeIndices(data.FieldTypeTime, data.FieldTypeNullableTime)) > 0 {
|
||||||
appendErrRes(&invalidEvalResultFormatError{refID: f.RefID, reason: "looks like time series data, only reduced data can be alerted on."})
|
appendErrRes(&invalidEvalResultFormatError{refID: f.RefID, reason: "looks like time series data, only reduced data can be alerted on."})
|
||||||
continue
|
continue
|
||||||
@ -789,23 +781,6 @@ func buildResult(f *data.Frame, val *float64, ts time.Time) Result {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func scalarInstantVector(f *data.Frame) (*float64, bool) {
|
|
||||||
if len(f.Fields) != 2 {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
if f.Fields[0].Len() > 1 || (f.Fields[0].Type() != data.FieldTypeNullableTime && f.Fields[0].Type() != data.FieldTypeTime) {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
switch f.Fields[1].Type() {
|
|
||||||
case data.FieldTypeFloat64:
|
|
||||||
return util.Pointer(f.Fields[1].At(0).(float64)), true
|
|
||||||
case data.FieldTypeNullableFloat64:
|
|
||||||
return f.Fields[1].At(0).(*float64), true
|
|
||||||
default:
|
|
||||||
return nil, true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsDataFrame forms the EvalResults in Frame suitable for displaying in the table panel of the front end.
|
// AsDataFrame forms the EvalResults in Frame suitable for displaying in the table panel of the front end.
|
||||||
// It displays one row per alert instance, with a column for each label and one for the alerting state.
|
// It displays one row per alert instance, with a column for each label and one for the alerting state.
|
||||||
func (evalResults Results) AsDataFrame() data.Frame {
|
func (evalResults Results) AsDataFrame() data.Frame {
|
||||||
|
@ -2,7 +2,6 @@ package eval
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@ -63,52 +62,6 @@ func TestEvaluateExecutionResult(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
desc: "query service dataframe works as instant vector",
|
|
||||||
execResults: ExecutionResults{
|
|
||||||
Condition: func() []*data.Frame {
|
|
||||||
f := data.NewFrame("",
|
|
||||||
data.NewField("", nil, []*time.Time{util.Pointer(time.Now())}),
|
|
||||||
data.NewField("", nil, []*float64{util.Pointer(0.0)}),
|
|
||||||
)
|
|
||||||
f.Meta = &data.FrameMeta{
|
|
||||||
Custom: map[string]any{
|
|
||||||
"resultType": "scalar",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return []*data.Frame{f}
|
|
||||||
}(),
|
|
||||||
},
|
|
||||||
expectResultLength: 1,
|
|
||||||
expectResults: Results{
|
|
||||||
{
|
|
||||||
State: Normal,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
desc: "query service dataframe works as instant vector when alerting",
|
|
||||||
execResults: ExecutionResults{
|
|
||||||
Condition: func() []*data.Frame {
|
|
||||||
f := data.NewFrame("",
|
|
||||||
data.NewField("", nil, []*time.Time{util.Pointer(time.Now())}),
|
|
||||||
data.NewField("", nil, []*float64{util.Pointer(1.0)}),
|
|
||||||
)
|
|
||||||
f.Meta = &data.FrameMeta{
|
|
||||||
Custom: map[string]any{
|
|
||||||
"resultType": "scalar",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return []*data.Frame{f}
|
|
||||||
}(),
|
|
||||||
},
|
|
||||||
expectResultLength: 1,
|
|
||||||
expectResults: Results{
|
|
||||||
{
|
|
||||||
State: Alerting,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
desc: "nil value single instance is single a NoData state result",
|
desc: "nil value single instance is single a NoData state result",
|
||||||
execResults: ExecutionResults{
|
execResults: ExecutionResults{
|
||||||
@ -1343,76 +1296,6 @@ func TestCreate(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestQueryServiceResponse(t *testing.T) {
|
|
||||||
data := `
|
|
||||||
{
|
|
||||||
"results": {
|
|
||||||
"A": {
|
|
||||||
"status": 200,
|
|
||||||
"frames": [
|
|
||||||
{
|
|
||||||
"schema": {
|
|
||||||
"refId": "A",
|
|
||||||
"meta": {
|
|
||||||
"type": "numeric-multi",
|
|
||||||
"typeVersion": [
|
|
||||||
0,
|
|
||||||
1
|
|
||||||
],
|
|
||||||
"custom": {
|
|
||||||
"resultType": "scalar"
|
|
||||||
},
|
|
||||||
"executedQueryString": "Expr: 1\nStep: 15s"
|
|
||||||
},
|
|
||||||
"fields": [
|
|
||||||
{
|
|
||||||
"name": "Time",
|
|
||||||
"type": "time",
|
|
||||||
"typeInfo": {
|
|
||||||
"frame": "time.Time"
|
|
||||||
},
|
|
||||||
"config": {
|
|
||||||
"interval": 15000
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Value",
|
|
||||||
"type": "number",
|
|
||||||
"typeInfo": {
|
|
||||||
"frame": "float64"
|
|
||||||
},
|
|
||||||
"labels": {},
|
|
||||||
"config": {
|
|
||||||
"displayNameFromDS": "1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"data": {
|
|
||||||
"values": [
|
|
||||||
[
|
|
||||||
1719855251019
|
|
||||||
],
|
|
||||||
[
|
|
||||||
1
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
var s backend.QueryDataResponse
|
|
||||||
err := json.Unmarshal([]byte(data), &s)
|
|
||||||
require.NoError(t, err)
|
|
||||||
res := EvaluateAlert(&s, models.Condition{Condition: "A"}, time.Time{})
|
|
||||||
|
|
||||||
require.Equal(t, 1, len(res))
|
|
||||||
require.Equal(t, Alerting, res[0].State)
|
|
||||||
}
|
|
||||||
|
|
||||||
type fakeExpressionService struct {
|
type fakeExpressionService struct {
|
||||||
hook func(ctx context.Context, now time.Time, pipeline expr.DataPipeline) (*backend.QueryDataResponse, error)
|
hook func(ctx context.Context, now time.Time, pipeline expr.DataPipeline) (*backend.QueryDataResponse, error)
|
||||||
buildHook func(req *expr.Request) (expr.DataPipeline, error)
|
buildHook func(req *expr.Request) (expr.DataPipeline, error)
|
||||||
|
@ -2,7 +2,6 @@ package identity
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
@ -30,22 +29,6 @@ func TestMain(m *testing.M) {
|
|||||||
testsuite.Run(m)
|
testsuite.Run(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIntegrationRequiresDevMode(t *testing.T) {
|
|
||||||
if testing.Short() {
|
|
||||||
t.Skip("skipping integration test")
|
|
||||||
}
|
|
||||||
helper := apis.NewK8sTestHelper(t, testinfra.GrafanaOpts{
|
|
||||||
AppModeProduction: true, // should fail
|
|
||||||
DisableAnonymous: true,
|
|
||||||
EnableFeatureToggles: []string{
|
|
||||||
featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // Required to start the example service
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
_, err := helper.NewDiscoveryClient().ServerResourcesForGroupVersion("iam.grafana.app/v0alpha1")
|
|
||||||
require.Error(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestIntegrationIdentity(t *testing.T) {
|
func TestIntegrationIdentity(t *testing.T) {
|
||||||
if testing.Short() {
|
if testing.Short() {
|
||||||
t.Skip("skipping integration test")
|
t.Skip("skipping integration test")
|
||||||
@ -102,7 +85,6 @@ func TestIntegrationIdentity(t *testing.T) {
|
|||||||
|
|
||||||
// Get just the specs (avoids values that change with each deployment)
|
// Get just the specs (avoids values that change with each deployment)
|
||||||
found = teamClient.SpecJSON(rsp)
|
found = teamClient.SpecJSON(rsp)
|
||||||
// fmt.Printf("%s", found) // NOTE the first value does not have an email or login
|
|
||||||
require.JSONEq(t, `[
|
require.JSONEq(t, `[
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
@ -130,7 +112,6 @@ func TestIntegrationIdentity(t *testing.T) {
|
|||||||
|
|
||||||
// Get just the specs (avoids values that change with each deployment)
|
// Get just the specs (avoids values that change with each deployment)
|
||||||
found = teamClient.SpecJSON(rsp)
|
found = teamClient.SpecJSON(rsp)
|
||||||
fmt.Printf("%s", found) // NOTE the first value does not have an email or login
|
|
||||||
require.JSONEq(t, `[
|
require.JSONEq(t, `[
|
||||||
{
|
{
|
||||||
"email": "admin-3",
|
"email": "admin-3",
|
||||||
|
@ -3,7 +3,7 @@ import classNames from 'classnames';
|
|||||||
import { PropsWithChildren, useEffect } from 'react';
|
import { PropsWithChildren, useEffect } from 'react';
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
import { config, locationSearchToObject, locationService } from '@grafana/runtime';
|
import { locationSearchToObject, locationService } from '@grafana/runtime';
|
||||||
import { useStyles2, LinkButton, useTheme2 } from '@grafana/ui';
|
import { useStyles2, LinkButton, useTheme2 } from '@grafana/ui';
|
||||||
import { useGrafana } from 'app/core/context/GrafanaContext';
|
import { useGrafana } from 'app/core/context/GrafanaContext';
|
||||||
import { useMediaQueryChange } from 'app/core/hooks/useMediaQueryChange';
|
import { useMediaQueryChange } from 'app/core/hooks/useMediaQueryChange';
|
||||||
@ -121,10 +121,8 @@ export function AppChrome({ children }: Props) {
|
|||||||
)}
|
)}
|
||||||
<main
|
<main
|
||||||
className={cx(styles.pageContainer, {
|
className={cx(styles.pageContainer, {
|
||||||
[styles.pageContainerMenuDocked]:
|
[styles.pageContainerMenuDocked]: menuDockedAndOpen || isScopesDashboardsOpen,
|
||||||
config.featureToggles.bodyScrolling && (menuDockedAndOpen || isScopesDashboardsOpen),
|
[styles.pageContainerMenuDockedScopes]: menuDockedAndOpen && isScopesDashboardsOpen,
|
||||||
[styles.pageContainerMenuDockedScopes]:
|
|
||||||
config.featureToggles.bodyScrolling && menuDockedAndOpen && isScopesDashboardsOpen,
|
|
||||||
})}
|
})}
|
||||||
id="pageContent"
|
id="pageContent"
|
||||||
>
|
>
|
||||||
@ -148,7 +146,7 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
|
|||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
paddingTop: TOP_BAR_LEVEL_HEIGHT * 2,
|
paddingTop: TOP_BAR_LEVEL_HEIGHT * 2,
|
||||||
flexGrow: 1,
|
flexGrow: 1,
|
||||||
height: config.featureToggles.bodyScrolling ? 'auto' : '100%',
|
height: 'auto',
|
||||||
}),
|
}),
|
||||||
contentNoSearchBar: css({
|
contentNoSearchBar: css({
|
||||||
paddingTop: TOP_BAR_LEVEL_HEIGHT,
|
paddingTop: TOP_BAR_LEVEL_HEIGHT,
|
||||||
@ -167,27 +165,17 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
|
|||||||
display: 'block',
|
display: 'block',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
config.featureToggles.bodyScrolling
|
{
|
||||||
? {
|
position: 'fixed',
|
||||||
position: 'fixed',
|
height: `calc(100% - ${searchBarHidden ? TOP_BAR_LEVEL_HEIGHT : TOP_BAR_LEVEL_HEIGHT * 2}px)`,
|
||||||
height: `calc(100% - ${searchBarHidden ? TOP_BAR_LEVEL_HEIGHT : TOP_BAR_LEVEL_HEIGHT * 2}px)`,
|
zIndex: 2,
|
||||||
zIndex: 2,
|
}
|
||||||
}
|
|
||||||
: {
|
|
||||||
zIndex: theme.zIndex.navbarFixed,
|
|
||||||
}
|
|
||||||
),
|
|
||||||
scopesDashboardsContainer: css(
|
|
||||||
config.featureToggles.bodyScrolling
|
|
||||||
? {
|
|
||||||
position: 'fixed',
|
|
||||||
height: `calc(100% - ${searchBarHidden ? TOP_BAR_LEVEL_HEIGHT : TOP_BAR_LEVEL_HEIGHT * 2}px)`,
|
|
||||||
zIndex: 1,
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
zIndex: theme.zIndex.navbarFixed,
|
|
||||||
}
|
|
||||||
),
|
),
|
||||||
|
scopesDashboardsContainer: css({
|
||||||
|
position: 'fixed',
|
||||||
|
height: `calc(100% - ${searchBarHidden ? TOP_BAR_LEVEL_HEIGHT : TOP_BAR_LEVEL_HEIGHT * 2}px)`,
|
||||||
|
zIndex: 1,
|
||||||
|
}),
|
||||||
scopesDashboardsContainerDocked: css({
|
scopesDashboardsContainerDocked: css({
|
||||||
left: MENU_WIDTH,
|
left: MENU_WIDTH,
|
||||||
}),
|
}),
|
||||||
@ -200,49 +188,24 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
|
|||||||
background: theme.colors.background.primary,
|
background: theme.colors.background.primary,
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
}),
|
}),
|
||||||
panes: css(
|
panes: css({
|
||||||
{
|
display: 'flex',
|
||||||
display: 'flex',
|
flexDirection: 'column',
|
||||||
flexDirection: 'column',
|
flexGrow: 1,
|
||||||
flexGrow: 1,
|
label: 'page-panes',
|
||||||
label: 'page-panes',
|
}),
|
||||||
},
|
|
||||||
!config.featureToggles.bodyScrolling && {
|
|
||||||
height: '100%',
|
|
||||||
minHeight: 0,
|
|
||||||
width: '100%',
|
|
||||||
[theme.breakpoints.up('md')]: {
|
|
||||||
flexDirection: 'row',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
),
|
|
||||||
pageContainerMenuDocked: css({
|
pageContainerMenuDocked: css({
|
||||||
paddingLeft: MENU_WIDTH,
|
paddingLeft: MENU_WIDTH,
|
||||||
}),
|
}),
|
||||||
pageContainerMenuDockedScopes: css({
|
pageContainerMenuDockedScopes: css({
|
||||||
paddingLeft: `calc(${MENU_WIDTH} * 2)`,
|
paddingLeft: `calc(${MENU_WIDTH} * 2)`,
|
||||||
}),
|
}),
|
||||||
pageContainer: css(
|
pageContainer: css({
|
||||||
{
|
label: 'page-container',
|
||||||
label: 'page-container',
|
display: 'flex',
|
||||||
display: 'flex',
|
flexDirection: 'column',
|
||||||
flexDirection: 'column',
|
flexGrow: 1,
|
||||||
flexGrow: 1,
|
}),
|
||||||
},
|
|
||||||
!config.featureToggles.bodyScrolling && {
|
|
||||||
minHeight: 0,
|
|
||||||
minWidth: 0,
|
|
||||||
overflow: 'auto',
|
|
||||||
'@media print': {
|
|
||||||
overflow: 'visible',
|
|
||||||
},
|
|
||||||
'@page': {
|
|
||||||
margin: 0,
|
|
||||||
size: 'auto',
|
|
||||||
padding: 0,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
),
|
|
||||||
skipLink: css({
|
skipLink: css({
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
top: -1000,
|
top: -1000,
|
||||||
|
@ -3,7 +3,6 @@ import { useEffect, useState } from 'react';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
import { config } from '@grafana/runtime';
|
|
||||||
import { useStyles2 } from '@grafana/ui';
|
import { useStyles2 } from '@grafana/ui';
|
||||||
|
|
||||||
import { Branding } from '../Branding/Branding';
|
import { Branding } from '../Branding/Branding';
|
||||||
@ -37,9 +36,7 @@ export const LoginLayout = ({ children, branding, isChangingPassword }: React.Pr
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Branding.LoginBackground
|
<Branding.LoginBackground
|
||||||
className={cx(loginStyles.container, startAnim && loginStyles.loginAnim, branding?.loginBackground, {
|
className={cx(loginStyles.container, startAnim && loginStyles.loginAnim, branding?.loginBackground)}
|
||||||
[loginStyles.containerBodyScrolling]: config.featureToggles.bodyScrolling,
|
|
||||||
})}
|
|
||||||
>
|
>
|
||||||
<div className={loginStyles.loginMain}>
|
<div className={loginStyles.loginMain}>
|
||||||
<div className={cx(loginStyles.loginContent, loginBoxBackground, 'login-content-box')}>
|
<div className={cx(loginStyles.loginContent, loginBoxBackground, 'login-content-box')}>
|
||||||
@ -89,6 +86,7 @@ export const getLoginStyles = (theme: GrafanaTheme2) => {
|
|||||||
minHeight: '100%',
|
minHeight: '100%',
|
||||||
backgroundPosition: 'center',
|
backgroundPosition: 'center',
|
||||||
backgroundRepeat: 'no-repeat',
|
backgroundRepeat: 'no-repeat',
|
||||||
|
flex: 1,
|
||||||
minWidth: '100%',
|
minWidth: '100%',
|
||||||
marginLeft: 0,
|
marginLeft: 0,
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
@ -96,9 +94,6 @@ export const getLoginStyles = (theme: GrafanaTheme2) => {
|
|||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
justifyContent: 'center',
|
justifyContent: 'center',
|
||||||
}),
|
}),
|
||||||
containerBodyScrolling: css({
|
|
||||||
flex: 1,
|
|
||||||
}),
|
|
||||||
loginAnim: css({
|
loginAnim: css({
|
||||||
['&:before']: {
|
['&:before']: {
|
||||||
opacity: 1,
|
opacity: 1,
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
import { css, cx } from '@emotion/css';
|
|
||||||
import { useEffect, useRef } from 'react';
|
import { useEffect, useRef } from 'react';
|
||||||
|
|
||||||
import { config } from '@grafana/runtime';
|
|
||||||
import { useStyles2 } from '@grafana/ui';
|
|
||||||
|
|
||||||
export interface Props {
|
export interface Props {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
onSetScrollRef?: (ref: ScrollRefElement) => void;
|
onSetScrollRef?: (ref: ScrollRefElement) => void;
|
||||||
@ -16,30 +11,16 @@ export interface ScrollRefElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Shim to provide API-compatibility for Page's scroll-related props
|
// Shim to provide API-compatibility for Page's scroll-related props
|
||||||
// when bodyScrolling is enabled, this is a no-op
|
|
||||||
// TODO remove this shim completely when bodyScrolling is enabled
|
|
||||||
export default function NativeScrollbar({ children, onSetScrollRef, divId }: Props) {
|
export default function NativeScrollbar({ children, onSetScrollRef, divId }: Props) {
|
||||||
const styles = useStyles2(getStyles);
|
|
||||||
const ref = useRef<HTMLDivElement>(null);
|
const ref = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (config.featureToggles.bodyScrolling && onSetScrollRef) {
|
if (onSetScrollRef) {
|
||||||
onSetScrollRef(new DivScrollElement(document.documentElement));
|
onSetScrollRef(new DivScrollElement(document.documentElement));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!config.featureToggles.bodyScrolling && ref.current && onSetScrollRef) {
|
|
||||||
onSetScrollRef(new DivScrollElement(ref.current));
|
|
||||||
}
|
|
||||||
}, [ref, onSetScrollRef]);
|
}, [ref, onSetScrollRef]);
|
||||||
|
|
||||||
return config.featureToggles.bodyScrolling ? (
|
return children;
|
||||||
children
|
|
||||||
) : (
|
|
||||||
// Set the .scrollbar-view class to help e2e tests find this, like in CustomScrollbar
|
|
||||||
<div ref={ref} className={cx(styles.nativeScrollbars, 'scrollbar-view')} id={divId}>
|
|
||||||
{children}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DivScrollElement {
|
class DivScrollElement {
|
||||||
@ -61,17 +42,3 @@ class DivScrollElement {
|
|||||||
this.element.scrollTo(x, y);
|
this.element.scrollTo(x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getStyles() {
|
|
||||||
return {
|
|
||||||
nativeScrollbars: css({
|
|
||||||
label: 'native-scroll-container',
|
|
||||||
minHeight: `calc(100% + 0px)`, // I don't know, just copied from custom scrollbars
|
|
||||||
maxHeight: `calc(100% + 0px)`, // I don't know, just copied from custom scrollbars
|
|
||||||
display: 'flex',
|
|
||||||
flexDirection: 'column',
|
|
||||||
flexGrow: 1,
|
|
||||||
overflow: 'auto',
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
@ -2,7 +2,6 @@ import { css, cx } from '@emotion/css';
|
|||||||
import { useLayoutEffect } from 'react';
|
import { useLayoutEffect } from 'react';
|
||||||
|
|
||||||
import { GrafanaTheme2, PageLayoutType } from '@grafana/data';
|
import { GrafanaTheme2, PageLayoutType } from '@grafana/data';
|
||||||
import { config } from '@grafana/runtime';
|
|
||||||
import { useStyles2 } from '@grafana/ui';
|
import { useStyles2 } from '@grafana/ui';
|
||||||
import { useGrafana } from 'app/core/context/GrafanaContext';
|
import { useGrafana } from 'app/core/context/GrafanaContext';
|
||||||
|
|
||||||
@ -94,24 +93,13 @@ Page.Contents = PageContents;
|
|||||||
|
|
||||||
const getStyles = (theme: GrafanaTheme2) => {
|
const getStyles = (theme: GrafanaTheme2) => {
|
||||||
return {
|
return {
|
||||||
wrapper: css(
|
wrapper: css({
|
||||||
config.featureToggles.bodyScrolling
|
label: 'page-wrapper',
|
||||||
? {
|
display: 'flex',
|
||||||
label: 'page-wrapper',
|
flex: '1 1 0',
|
||||||
display: 'flex',
|
flexDirection: 'column',
|
||||||
flex: '1 1 0',
|
position: 'relative',
|
||||||
flexDirection: 'column',
|
}),
|
||||||
position: 'relative',
|
|
||||||
}
|
|
||||||
: {
|
|
||||||
label: 'page-wrapper',
|
|
||||||
height: '100%',
|
|
||||||
display: 'flex',
|
|
||||||
flex: '1 1 0',
|
|
||||||
flexDirection: 'column',
|
|
||||||
minHeight: 0,
|
|
||||||
}
|
|
||||||
),
|
|
||||||
pageContent: css({
|
pageContent: css({
|
||||||
label: 'page-content',
|
label: 'page-content',
|
||||||
flexGrow: 1,
|
flexGrow: 1,
|
||||||
|
@ -23,11 +23,7 @@ export interface PageProps extends HTMLAttributes<HTMLDivElement> {
|
|||||||
subTitle?: React.ReactNode;
|
subTitle?: React.ReactNode;
|
||||||
/** Control the page layout. */
|
/** Control the page layout. */
|
||||||
layout?: PageLayoutType;
|
layout?: PageLayoutType;
|
||||||
/**
|
/** Can be used to get the scroll container element to access scroll position */
|
||||||
* TODO: Not sure we should deprecated it given the sidecar project?
|
|
||||||
* @deprecated this will be removed when bodyScrolling is enabled by default
|
|
||||||
* Can be used to get the scroll container element to access scroll position
|
|
||||||
* */
|
|
||||||
onSetScrollRef?: (ref: ScrollRefElement) => void;
|
onSetScrollRef?: (ref: ScrollRefElement) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { createContext, useCallback, useContext } from 'react';
|
import { createContext, useCallback, useContext } from 'react';
|
||||||
|
|
||||||
import { GrafanaConfig } from '@grafana/data';
|
import { GrafanaConfig } from '@grafana/data';
|
||||||
import { LocationService, locationService, BackendSrv, config } from '@grafana/runtime';
|
import { LocationService, locationService, BackendSrv } from '@grafana/runtime';
|
||||||
|
|
||||||
import { AppChromeService } from '../components/AppChrome/AppChromeService';
|
import { AppChromeService } from '../components/AppChrome/AppChromeService';
|
||||||
import { NewFrontendAssetsChecker } from '../services/NewFrontendAssetsChecker';
|
import { NewFrontendAssetsChecker } from '../services/NewFrontendAssetsChecker';
|
||||||
@ -48,7 +48,7 @@ export function useChromeHeaderHeight() {
|
|||||||
const { chrome } = useGrafana();
|
const { chrome } = useGrafana();
|
||||||
const { kioskMode, searchBarHidden, chromeless } = chrome.useState();
|
const { kioskMode, searchBarHidden, chromeless } = chrome.useState();
|
||||||
|
|
||||||
if (kioskMode || chromeless || !config.featureToggles.bodyScrolling) {
|
if (kioskMode || chromeless) {
|
||||||
return 0;
|
return 0;
|
||||||
} else if (searchBarHidden) {
|
} else if (searchBarHidden) {
|
||||||
return SINGLE_HEADER_BAR_HEIGHT;
|
return SINGLE_HEADER_BAR_HEIGHT;
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { css, cx } from '@emotion/css';
|
import { css } from '@emotion/css';
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
import { config } from '@grafana/runtime';
|
|
||||||
import { useStyles2 } from '@grafana/ui';
|
import { useStyles2 } from '@grafana/ui';
|
||||||
|
|
||||||
import { BouncingLoader } from '../components/BouncingLoader/BouncingLoader';
|
import { BouncingLoader } from '../components/BouncingLoader/BouncingLoader';
|
||||||
@ -10,12 +9,7 @@ export function GrafanaRouteLoading() {
|
|||||||
const styles = useStyles2(getStyles);
|
const styles = useStyles2(getStyles);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div className={styles.loadingPage}>
|
||||||
className={cx({
|
|
||||||
[styles.loadingPage]: !config.featureToggles.bodyScrolling,
|
|
||||||
[styles.loadingPageBodyScrolling]: config.featureToggles.bodyScrolling,
|
|
||||||
})}
|
|
||||||
>
|
|
||||||
<BouncingLoader />
|
<BouncingLoader />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -23,14 +17,6 @@ export function GrafanaRouteLoading() {
|
|||||||
|
|
||||||
const getStyles = (theme: GrafanaTheme2) => ({
|
const getStyles = (theme: GrafanaTheme2) => ({
|
||||||
loadingPage: css({
|
loadingPage: css({
|
||||||
backgroundColor: theme.colors.background.primary,
|
|
||||||
height: '100%',
|
|
||||||
flexDrection: 'column',
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'center',
|
|
||||||
alignItems: 'center',
|
|
||||||
}),
|
|
||||||
loadingPageBodyScrolling: css({
|
|
||||||
backgroundColor: theme.colors.background.primary,
|
backgroundColor: theme.colors.background.primary,
|
||||||
flex: 1,
|
flex: 1,
|
||||||
flexDrection: 'column',
|
flexDrection: 'column',
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
|
import { Location } from 'history';
|
||||||
|
|
||||||
import { locationService, setBackendSrv, BackendSrv } from '@grafana/runtime';
|
import { locationService, setBackendSrv, BackendSrv } from '@grafana/runtime';
|
||||||
|
import { playlistSrv } from 'app/features/playlist/PlaylistSrv';
|
||||||
|
|
||||||
import { NewFrontendAssetsChecker } from './NewFrontendAssetsChecker';
|
import { NewFrontendAssetsChecker } from './NewFrontendAssetsChecker';
|
||||||
|
|
||||||
@ -46,4 +49,28 @@ describe('NewFrontendAssetsChecker', () => {
|
|||||||
|
|
||||||
expect(backendApiGet).toHaveBeenCalledTimes(2);
|
expect(backendApiGet).toHaveBeenCalledTimes(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should skip reloading if we are playing a playlist', () => {
|
||||||
|
const checker = new NewFrontendAssetsCheckerExposedLocationUpdate();
|
||||||
|
const reloadMock = jest.fn();
|
||||||
|
checker.reloadIfUpdateDetected = reloadMock;
|
||||||
|
playlistSrv.state.isPlaying = true;
|
||||||
|
checker.doLocationUpdated({ hash: 'foo', pathname: '/d/dashboarduid', state: {}, search: '' });
|
||||||
|
expect(reloadMock).not.toHaveBeenCalled();
|
||||||
|
playlistSrv.state.isPlaying = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should reload if we are accessing a dashboard', () => {
|
||||||
|
const checker = new NewFrontendAssetsCheckerExposedLocationUpdate();
|
||||||
|
const reloadMock = jest.fn();
|
||||||
|
checker.reloadIfUpdateDetected = reloadMock;
|
||||||
|
checker.doLocationUpdated({ hash: 'foo', pathname: '/d/dashboarduid', state: {}, search: '' });
|
||||||
|
expect(reloadMock).toHaveBeenCalled();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
class NewFrontendAssetsCheckerExposedLocationUpdate extends NewFrontendAssetsChecker {
|
||||||
|
public doLocationUpdated(location: Location) {
|
||||||
|
this.locationUpdated(location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ import { Location } from 'history';
|
|||||||
import { isEqual } from 'lodash';
|
import { isEqual } from 'lodash';
|
||||||
|
|
||||||
import { getBackendSrv, getGrafanaLiveSrv, locationService, reportInteraction } from '@grafana/runtime';
|
import { getBackendSrv, getGrafanaLiveSrv, locationService, reportInteraction } from '@grafana/runtime';
|
||||||
|
import { playlistSrv } from 'app/features/playlist/PlaylistSrv';
|
||||||
|
|
||||||
export class NewFrontendAssetsChecker {
|
export class NewFrontendAssetsChecker {
|
||||||
private hasUpdates = false;
|
private hasUpdates = false;
|
||||||
@ -35,7 +36,7 @@ export class NewFrontendAssetsChecker {
|
|||||||
/**
|
/**
|
||||||
* Tries to detect some navigation events where it's safe to trigger a reload
|
* Tries to detect some navigation events where it's safe to trigger a reload
|
||||||
*/
|
*/
|
||||||
private locationUpdated(location: Location) {
|
protected locationUpdated(location: Location) {
|
||||||
if (this.prevLocationPath === location.pathname) {
|
if (this.prevLocationPath === location.pathname) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -46,8 +47,8 @@ export class NewFrontendAssetsChecker {
|
|||||||
if (newLocationSegments[1] === '/' && this.prevLocationPath !== '/') {
|
if (newLocationSegments[1] === '/' && this.prevLocationPath !== '/') {
|
||||||
this.reloadIfUpdateDetected();
|
this.reloadIfUpdateDetected();
|
||||||
}
|
}
|
||||||
// Moving to dashboard (or changing dashboards)
|
// Moving to dashboard (or changing dashboards, except when we're playing a playlist)
|
||||||
else if (newLocationSegments[1] === 'd') {
|
else if (newLocationSegments[1] === 'd' && !playlistSrv.state.isPlaying) {
|
||||||
this.reloadIfUpdateDetected();
|
this.reloadIfUpdateDetected();
|
||||||
}
|
}
|
||||||
// Track potential page change
|
// Track potential page change
|
||||||
|
@ -2,7 +2,7 @@ import { css } from '@emotion/css';
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
import { config, useChromeHeaderHeight } from '@grafana/runtime';
|
import { useChromeHeaderHeight } from '@grafana/runtime';
|
||||||
import { Icon, Input, useStyles2 } from '@grafana/ui';
|
import { Icon, Input, useStyles2 } from '@grafana/ui';
|
||||||
import { t } from 'app/core/internationalization';
|
import { t } from 'app/core/internationalization';
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ export interface Props {
|
|||||||
|
|
||||||
export const Search = ({ onChange, value }: Props) => {
|
export const Search = ({ onChange, value }: Props) => {
|
||||||
const chromeHeaderHeight = useChromeHeaderHeight();
|
const chromeHeaderHeight = useChromeHeaderHeight();
|
||||||
const styles = useStyles2(getStyles, config.featureToggles.bodyScrolling ? (chromeHeaderHeight ?? 0) : 0);
|
const styles = useStyles2(getStyles, chromeHeaderHeight ?? 0);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.searchContainer}>
|
<div className={styles.searchContainer}>
|
||||||
|
@ -2,7 +2,6 @@ import { css, cx } from '@emotion/css';
|
|||||||
|
|
||||||
import { GrafanaTheme2 } from '@grafana/data';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
import { selectors } from '@grafana/e2e-selectors';
|
import { selectors } from '@grafana/e2e-selectors';
|
||||||
import { config } from '@grafana/runtime';
|
|
||||||
import { SceneComponentProps } from '@grafana/scenes';
|
import { SceneComponentProps } from '@grafana/scenes';
|
||||||
import { Button, ToolbarButton, useStyles2 } from '@grafana/ui';
|
import { Button, ToolbarButton, useStyles2 } from '@grafana/ui';
|
||||||
|
|
||||||
@ -35,9 +34,7 @@ export function PanelEditorRenderer({ model }: SceneComponentProps<PanelEditor>)
|
|||||||
<NavToolbarActions dashboard={dashboard} />
|
<NavToolbarActions dashboard={dashboard} />
|
||||||
<div
|
<div
|
||||||
{...containerProps}
|
{...containerProps}
|
||||||
className={cx(containerProps.className, {
|
className={cx(containerProps.className, styles.content)}
|
||||||
[styles.content]: config.featureToggles.bodyScrolling,
|
|
||||||
})}
|
|
||||||
data-testid={selectors.components.PanelEditor.General.content}
|
data-testid={selectors.components.PanelEditor.General.content}
|
||||||
>
|
>
|
||||||
<div {...primaryProps} className={cx(primaryProps.className, styles.body)}>
|
<div {...primaryProps} className={cx(primaryProps.className, styles.body)}>
|
||||||
|
@ -47,7 +47,7 @@ export const PanelOptions = React.memo<Props>(({ vizManager, searchQuery, listMo
|
|||||||
instanceState: _pluginInstanceState,
|
instanceState: _pluginInstanceState,
|
||||||
});
|
});
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [panel, options, fieldConfig, _pluginInstanceState]);
|
}, [data, panel, options, fieldConfig, _pluginInstanceState]);
|
||||||
|
|
||||||
const libraryPanelOptions = useMemo(() => {
|
const libraryPanelOptions = useMemo(() => {
|
||||||
if (panel instanceof VizPanel && isLibraryPanel(panel)) {
|
if (panel instanceof VizPanel && isLibraryPanel(panel)) {
|
||||||
|
@ -66,23 +66,15 @@ describe('DashboardControls', () => {
|
|||||||
expect(scene._urlSync.getKeys()).toEqual(['_dash.hideTimePicker', '_dash.hideVariables', '_dash.hideLinks']);
|
expect(scene._urlSync.getKeys()).toEqual(['_dash.hideTimePicker', '_dash.hideVariables', '_dash.hideLinks']);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return url state', () => {
|
it('should not return url state for hide flags', () => {
|
||||||
const scene = buildTestScene();
|
const scene = buildTestScene();
|
||||||
expect(scene.getUrlState()).toEqual({
|
expect(scene.getUrlState()).toEqual({});
|
||||||
'_dash.hideTimePicker': undefined,
|
|
||||||
'_dash.hideVariables': undefined,
|
|
||||||
'_dash.hideLinks': undefined,
|
|
||||||
});
|
|
||||||
scene.setState({
|
scene.setState({
|
||||||
hideTimeControls: true,
|
hideTimeControls: true,
|
||||||
hideVariableControls: true,
|
hideVariableControls: true,
|
||||||
hideLinksControls: true,
|
hideLinksControls: true,
|
||||||
});
|
});
|
||||||
expect(scene.getUrlState()).toEqual({
|
expect(scene.getUrlState()).toEqual({});
|
||||||
'_dash.hideTimePicker': 'true',
|
|
||||||
'_dash.hideVariables': 'true',
|
|
||||||
'_dash.hideLinks': 'true',
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should update from url', () => {
|
it('should update from url', () => {
|
||||||
@ -114,19 +106,16 @@ describe('DashboardControls', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should not call setState if no changes', () => {
|
it('should not call setState if no changes', () => {
|
||||||
const scene = buildTestScene();
|
const scene = buildTestScene({ hideTimeControls: true, hideVariableControls: true, hideLinksControls: true });
|
||||||
const setState = jest.spyOn(scene, 'setState');
|
const setState = jest.spyOn(scene, 'setState');
|
||||||
|
|
||||||
scene.updateFromUrl({
|
scene.updateFromUrl({
|
||||||
'_dash.hideTimePicker': 'true',
|
'_dash.hideTimePicker': 'true',
|
||||||
'_dash.hideVariables': 'true',
|
'_dash.hideVariables': 'true',
|
||||||
'_dash.hideLinks': 'true',
|
'_dash.hideLinks': 'true',
|
||||||
});
|
});
|
||||||
scene.updateFromUrl({
|
|
||||||
'_dash.hideTimePicker': 'true',
|
expect(setState).toHaveBeenCalledTimes(0);
|
||||||
'_dash.hideVariables': 'true',
|
|
||||||
'_dash.hideLinks': 'true',
|
|
||||||
});
|
|
||||||
expect(setState).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -43,28 +43,31 @@ export class DashboardControls extends SceneObjectBase<DashboardControlsState> {
|
|||||||
keys: ['_dash.hideTimePicker', '_dash.hideVariables', '_dash.hideLinks'],
|
keys: ['_dash.hideTimePicker', '_dash.hideVariables', '_dash.hideLinks'],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We want the hideXX url keys to only sync one way (url => state) on init
|
||||||
|
* We don't want these flags to be added to URL.
|
||||||
|
*/
|
||||||
getUrlState() {
|
getUrlState() {
|
||||||
return {
|
return {};
|
||||||
'_dash.hideTimePicker': this.state.hideTimeControls ? 'true' : undefined,
|
|
||||||
'_dash.hideVariables': this.state.hideVariableControls ? 'true' : undefined,
|
|
||||||
'_dash.hideLinks': this.state.hideLinksControls ? 'true' : undefined,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateFromUrl(values: SceneObjectUrlValues) {
|
updateFromUrl(values: SceneObjectUrlValues) {
|
||||||
const update: Partial<DashboardControlsState> = {};
|
const { hideTimeControls, hideVariableControls, hideLinksControls } = this.state;
|
||||||
|
const isEnabledViaUrl = (key: string) => values[key] === 'true' || values[key] === '';
|
||||||
|
|
||||||
update.hideTimeControls =
|
// Only allow hiding, never "unhiding" from url
|
||||||
values['_dash.hideTimePicker'] === 'true' || values['_dash.hideTimePicker'] === '' || this.state.hideTimeControls;
|
// Becasue this should really only change on first init it's fine to do multiple setState here
|
||||||
update.hideVariableControls =
|
|
||||||
values['_dash.hideVariables'] === 'true' ||
|
|
||||||
values['_dash.hideVariables'] === '' ||
|
|
||||||
this.state.hideVariableControls;
|
|
||||||
update.hideLinksControls =
|
|
||||||
values['_dash.hideLinks'] === 'true' || values['_dash.hideLinks'] === '' || this.state.hideLinksControls;
|
|
||||||
|
|
||||||
if (Object.entries(update).some(([k, v]) => v !== this.state[k as keyof DashboardControlsState])) {
|
if (!hideTimeControls && isEnabledViaUrl('_dash.hideTimePicker')) {
|
||||||
this.setState(update);
|
this.setState({ hideTimeControls: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hideVariableControls && isEnabledViaUrl('_dash.hideVariables')) {
|
||||||
|
this.setState({ hideVariableControls: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hideLinksControls && isEnabledViaUrl('_dash.hideLinks')) {
|
||||||
|
this.setState({ hideLinksControls: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@ import { Component } from 'react';
|
|||||||
import { Unsubscribable } from 'rxjs';
|
import { Unsubscribable } from 'rxjs';
|
||||||
|
|
||||||
import { dateMath, TimeRange, TimeZone } from '@grafana/data';
|
import { dateMath, TimeRange, TimeZone } from '@grafana/data';
|
||||||
import { config, TimeRangeUpdatedEvent } from '@grafana/runtime';
|
import { TimeRangeUpdatedEvent } from '@grafana/runtime';
|
||||||
import { defaultIntervals, getWeekStart, RefreshPicker } from '@grafana/ui';
|
import { defaultIntervals, RefreshPicker } from '@grafana/ui';
|
||||||
import { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';
|
import { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';
|
||||||
import { appEvents } from 'app/core/core';
|
import { appEvents } from 'app/core/core';
|
||||||
import { t } from 'app/core/internationalization';
|
import { t } from 'app/core/internationalization';
|
||||||
@ -100,7 +100,7 @@ export class DashNavTimeControls extends Component<Props> {
|
|||||||
const timeZone = dashboard.getTimezone();
|
const timeZone = dashboard.getTimezone();
|
||||||
const fiscalYearStartMonth = dashboard.fiscalYearStartMonth;
|
const fiscalYearStartMonth = dashboard.fiscalYearStartMonth;
|
||||||
const hideIntervalPicker = dashboard.panelInEdit?.isEditing;
|
const hideIntervalPicker = dashboard.panelInEdit?.isEditing;
|
||||||
const weekStart = dashboard.weekStart || getWeekStart(config.bootData.user.weekStart);
|
const weekStart = dashboard.weekStart;
|
||||||
|
|
||||||
let text: string | undefined = undefined;
|
let text: string | undefined = undefined;
|
||||||
if (dashboard.refresh === AutoRefreshInterval) {
|
if (dashboard.refresh === AutoRefreshInterval) {
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
import { Component } from 'react';
|
import { Component } from 'react';
|
||||||
|
|
||||||
import { TimeRange, RawTimeRange, dateTimeForTimeZone, dateMath } from '@grafana/data';
|
import { TimeRange, RawTimeRange, dateTimeForTimeZone, dateMath } from '@grafana/data';
|
||||||
import { config, reportInteraction } from '@grafana/runtime';
|
import { reportInteraction } from '@grafana/runtime';
|
||||||
import { TimeZone } from '@grafana/schema';
|
import { TimeZone } from '@grafana/schema';
|
||||||
import { getWeekStart } from '@grafana/ui';
|
|
||||||
import { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';
|
import { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';
|
||||||
import { getShiftedTimeRange, getZoomedTimeRange } from 'app/core/utils/timePicker';
|
import { getShiftedTimeRange, getZoomedTimeRange } from 'app/core/utils/timePicker';
|
||||||
|
|
||||||
@ -86,7 +85,7 @@ export class ExploreTimeControls extends Component<Props> {
|
|||||||
onZoom: this.onZoom,
|
onZoom: this.onZoom,
|
||||||
hideText,
|
hideText,
|
||||||
};
|
};
|
||||||
const weekStart = getWeekStart(config.bootData.user.weekStart);
|
|
||||||
return (
|
return (
|
||||||
<TimePickerWithHistory
|
<TimePickerWithHistory
|
||||||
isOnCanvas
|
isOnCanvas
|
||||||
@ -97,7 +96,6 @@ export class ExploreTimeControls extends Component<Props> {
|
|||||||
onChange={this.onChangeTimePicker}
|
onChange={this.onChangeTimePicker}
|
||||||
onChangeTimeZone={onChangeTimeZone}
|
onChangeTimeZone={onChangeTimeZone}
|
||||||
onChangeFiscalYearStartMonth={onChangeFiscalYearStartMonth}
|
onChangeFiscalYearStartMonth={onChangeFiscalYearStartMonth}
|
||||||
weekStart={weekStart}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ export function getQueryMatches(query: string, spans: TraceSpan[] | TNil) {
|
|||||||
const isTextInKeyValues = (kvs: TraceKeyValuePair[]) =>
|
const isTextInKeyValues = (kvs: TraceKeyValuePair[]) =>
|
||||||
kvs
|
kvs
|
||||||
? kvs.some((kv) => {
|
? kvs.some((kv) => {
|
||||||
return isTextInQuery(queryParts, kv.key) || isTextInQuery(queryParts, kv.value.toString());
|
return isTextInQuery(queryParts, kv.key) || isTextInQuery(queryParts, getStringValue(kv.value));
|
||||||
})
|
})
|
||||||
: false;
|
: false;
|
||||||
|
|
||||||
@ -190,11 +190,15 @@ const checkKeyForMatch = (tagKey: string, key: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const checkKeyAndValueForMatch = (tag: Tag, kv: TraceKeyValuePair) => {
|
const checkKeyAndValueForMatch = (tag: Tag, kv: TraceKeyValuePair) => {
|
||||||
return tag.key === kv.key.toString() && tag.value === kv.value.toString();
|
return tag.key === kv.key && tag.value === getStringValue(kv.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const checkKeyAndValueForRegex = (tag: Tag, kv: TraceKeyValuePair) => {
|
const checkKeyAndValueForRegex = (tag: Tag, kv: TraceKeyValuePair) => {
|
||||||
return kv.key.toString().includes(tag.key || '') && kv.value.toString().includes(tag.value || '');
|
return kv.key.includes(tag.key || '') && getStringValue(kv.value).includes(tag.value || '');
|
||||||
|
};
|
||||||
|
|
||||||
|
const getStringValue = (value: string | number | boolean | undefined) => {
|
||||||
|
return value ? value.toString() : '';
|
||||||
};
|
};
|
||||||
|
|
||||||
const getServiceNameMatches = (spans: TraceSpan[], searchProps: SearchProps) => {
|
const getServiceNameMatches = (spans: TraceSpan[], searchProps: SearchProps) => {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { css, cx } from '@emotion/css';
|
import { css } from '@emotion/css';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
|
|
||||||
import { AppPlugin, GrafanaTheme2, PluginContextProvider, UrlQueryMap } from '@grafana/data';
|
import { AppPlugin, GrafanaTheme2, PluginContextProvider, UrlQueryMap } from '@grafana/data';
|
||||||
@ -45,7 +45,7 @@ export function PluginDetailsBody({ plugin, queryParams, pageId }: Props): JSX.E
|
|||||||
if (pageId === PluginTabIds.OVERVIEW) {
|
if (pageId === PluginTabIds.OVERVIEW) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={cx(styles.readme, styles.container)}
|
className={styles.readme}
|
||||||
dangerouslySetInnerHTML={{
|
dangerouslySetInnerHTML={{
|
||||||
__html: plugin.details?.readme ?? 'No plugin help or readme markdown file was found',
|
__html: plugin.details?.readme ?? 'No plugin help or readme markdown file was found',
|
||||||
}}
|
}}
|
||||||
@ -55,7 +55,7 @@ export function PluginDetailsBody({ plugin, queryParams, pageId }: Props): JSX.E
|
|||||||
|
|
||||||
if (pageId === PluginTabIds.VERSIONS) {
|
if (pageId === PluginTabIds.VERSIONS) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div>
|
||||||
<VersionList versions={plugin.details?.versions} installedVersion={plugin.installedVersion} />
|
<VersionList versions={plugin.details?.versions} installedVersion={plugin.installedVersion} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -67,7 +67,7 @@ export function PluginDetailsBody({ plugin, queryParams, pageId }: Props): JSX.E
|
|||||||
|
|
||||||
if (pageId === PluginTabIds.CONFIG && pluginConfig?.angularConfigCtrl) {
|
if (pageId === PluginTabIds.CONFIG && pluginConfig?.angularConfigCtrl) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div>
|
||||||
<AppConfigCtrlWrapper app={pluginConfig as AppPlugin} />
|
<AppConfigCtrlWrapper app={pluginConfig as AppPlugin} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -102,7 +102,7 @@ export function PluginDetailsBody({ plugin, queryParams, pageId }: Props): JSX.E
|
|||||||
for (const configPage of pluginConfig.configPages) {
|
for (const configPage of pluginConfig.configPages) {
|
||||||
if (pageId === configPage.id) {
|
if (pageId === configPage.id) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div>
|
||||||
<PluginContextProvider meta={pluginConfig.meta}>
|
<PluginContextProvider meta={pluginConfig.meta}>
|
||||||
<configPage.body plugin={pluginConfig} query={queryParams} />
|
<configPage.body plugin={pluginConfig} query={queryParams} />
|
||||||
</PluginContextProvider>
|
</PluginContextProvider>
|
||||||
@ -114,7 +114,7 @@ export function PluginDetailsBody({ plugin, queryParams, pageId }: Props): JSX.E
|
|||||||
|
|
||||||
if (pageId === PluginTabIds.USAGE && pluginConfig) {
|
if (pageId === PluginTabIds.USAGE && pluginConfig) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div>
|
||||||
<PluginUsage plugin={pluginConfig?.meta} />
|
<PluginUsage plugin={pluginConfig?.meta} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -122,25 +122,20 @@ export function PluginDetailsBody({ plugin, queryParams, pageId }: Props): JSX.E
|
|||||||
|
|
||||||
if (pageId === PluginTabIds.DASHBOARDS && pluginConfig) {
|
if (pageId === PluginTabIds.DASHBOARDS && pluginConfig) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div>
|
||||||
<PluginDashboards plugin={pluginConfig?.meta} />
|
<PluginDashboards plugin={pluginConfig?.meta} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div>
|
||||||
<p>Page not found.</p>
|
<p>Page not found.</p>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getStyles = (theme: GrafanaTheme2) => ({
|
export const getStyles = (theme: GrafanaTheme2) => ({
|
||||||
container: config.featureToggles.bodyScrolling
|
|
||||||
? css({})
|
|
||||||
: css({
|
|
||||||
height: '100%',
|
|
||||||
}),
|
|
||||||
readme: css({
|
readme: css({
|
||||||
'& img': {
|
'& img': {
|
||||||
maxWidth: '100%',
|
maxWidth: '100%',
|
||||||
|
@ -113,15 +113,9 @@ export const getStyles = (theme: GrafanaTheme2) => {
|
|||||||
gap: theme.spacing(1),
|
gap: theme.spacing(1),
|
||||||
}),
|
}),
|
||||||
// Needed due to block formatting context
|
// Needed due to block formatting context
|
||||||
tabContent: config.featureToggles.bodyScrolling
|
tabContent: css({
|
||||||
? css({
|
paddingLeft: '5px',
|
||||||
paddingLeft: '5px',
|
}),
|
||||||
})
|
|
||||||
: css({
|
|
||||||
overflow: 'auto',
|
|
||||||
height: '100%',
|
|
||||||
paddingLeft: '5px',
|
|
||||||
}),
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/prismjs": "1.26.4",
|
"@types/prismjs": "1.26.4",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
@ -50,5 +50,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -33,8 +33,8 @@
|
|||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/debounce-promise": "3.1.9",
|
"@types/debounce-promise": "3.1.9",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/prismjs": "1.26.4",
|
"@types/prismjs": "1.26.4",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
@ -54,5 +54,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/testing-library__jest-dom": "5.14.9",
|
"@types/testing-library__jest-dom": "5.14.9",
|
||||||
"ts-node": "10.9.2",
|
"ts-node": "10.9.2",
|
||||||
@ -37,5 +37,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/prismjs": "1.26.4",
|
"@types/prismjs": "1.26.4",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
@ -47,5 +47,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/d3-random": "^3.0.2",
|
"@types/d3-random": "^3.0.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
"@types/testing-library__jest-dom": "5.14.9",
|
"@types/testing-library__jest-dom": "5.14.9",
|
||||||
@ -47,5 +47,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -29,9 +29,9 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/logfmt": "^1.2.3",
|
"@types/logfmt": "^1.2.3",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
"@types/react-window": "1.8.8",
|
"@types/react-window": "1.8.8",
|
||||||
@ -48,5 +48,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ export function createTraceFrame(data: TraceResponse): DataFrame {
|
|||||||
{ name: 'startTime', type: FieldType.number },
|
{ name: 'startTime', type: FieldType.number },
|
||||||
{ name: 'duration', type: FieldType.number },
|
{ name: 'duration', type: FieldType.number },
|
||||||
{ name: 'logs', type: FieldType.other },
|
{ name: 'logs', type: FieldType.other },
|
||||||
|
{ name: 'references', type: FieldType.other, values: [] },
|
||||||
{ name: 'tags', type: FieldType.other },
|
{ name: 'tags', type: FieldType.other },
|
||||||
{ name: 'warnings', type: FieldType.other },
|
{ name: 'warnings', type: FieldType.other },
|
||||||
{ name: 'stackTraces', type: FieldType.other },
|
{ name: 'stackTraces', type: FieldType.other },
|
||||||
@ -44,10 +45,12 @@ export function createTraceFrame(data: TraceResponse): DataFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function toSpanRow(span: Span, processes: Record<string, TraceProcess>): TraceSpanRow {
|
function toSpanRow(span: Span, processes: Record<string, TraceProcess>): TraceSpanRow {
|
||||||
|
const parentSpanID = span.references?.find((r) => r.refType === 'CHILD_OF')?.spanID;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
spanID: span.spanID,
|
spanID: span.spanID,
|
||||||
traceID: span.traceID,
|
traceID: span.traceID,
|
||||||
parentSpanID: span.references?.find((r) => r.refType === 'CHILD_OF')?.spanID,
|
parentSpanID: parentSpanID,
|
||||||
operationName: span.operationName,
|
operationName: span.operationName,
|
||||||
// from micro to millis
|
// from micro to millis
|
||||||
startTime: span.startTime / 1000,
|
startTime: span.startTime / 1000,
|
||||||
@ -59,6 +62,7 @@ function toSpanRow(span: Span, processes: Record<string, TraceProcess>): TraceSp
|
|||||||
tags: span.tags,
|
tags: span.tags,
|
||||||
warnings: span.warnings ?? undefined,
|
warnings: span.warnings ?? undefined,
|
||||||
stackTraces: span.stackTraces,
|
stackTraces: span.stackTraces,
|
||||||
|
references: span.references?.filter((r) => r.spanID !== parentSpanID) ?? [], // parentSpanID is pushed to references in the transformTraceDataFrame method
|
||||||
serviceName: processes[span.processID].serviceName,
|
serviceName: processes[span.processID].serviceName,
|
||||||
serviceTags: processes[span.processID].tags,
|
serviceTags: processes[span.processID].tags,
|
||||||
};
|
};
|
||||||
|
@ -76,6 +76,7 @@ export const testResponseDataFrameFields = toVectors([
|
|||||||
{ name: 'startTime', values: [1605873894680.409, 1605873894680.587] },
|
{ name: 'startTime', values: [1605873894680.409, 1605873894680.587] },
|
||||||
{ name: 'duration', values: [1049.141, 1.847] },
|
{ name: 'duration', values: [1049.141, 1.847] },
|
||||||
{ name: 'logs', values: [[], []] },
|
{ name: 'logs', values: [[], []] },
|
||||||
|
{ name: 'references', values: [[], []] },
|
||||||
{
|
{
|
||||||
name: 'tags',
|
name: 'tags',
|
||||||
values: [
|
values: [
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/testing-library__jest-dom": "5.14.9",
|
"@types/testing-library__jest-dom": "5.14.9",
|
||||||
"ts-node": "10.9.2",
|
"ts-node": "10.9.2",
|
||||||
@ -37,5 +37,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,8 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/testing-library__jest-dom": "5.14.9",
|
"@types/testing-library__jest-dom": "5.14.9",
|
||||||
"ts-node": "10.9.2",
|
"ts-node": "10.9.2",
|
||||||
@ -37,5 +37,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,8 @@
|
|||||||
"@testing-library/dom": "10.0.0",
|
"@testing-library/dom": "10.0.0",
|
||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
"ts-node": "10.9.2",
|
"ts-node": "10.9.2",
|
||||||
@ -38,5 +38,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -45,8 +45,8 @@
|
|||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@testing-library/user-event": "14.5.2",
|
"@testing-library/user-event": "14.5.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/prismjs": "1.26.4",
|
"@types/prismjs": "1.26.4",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
@ -66,5 +66,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
"@testing-library/jest-dom": "6.4.2",
|
"@testing-library/jest-dom": "6.4.2",
|
||||||
"@testing-library/react": "15.0.2",
|
"@testing-library/react": "15.0.2",
|
||||||
"@types/jest": "29.5.13",
|
"@types/jest": "29.5.13",
|
||||||
"@types/lodash": "4.17.7",
|
"@types/lodash": "4.17.9",
|
||||||
"@types/node": "20.16.5",
|
"@types/node": "20.16.6",
|
||||||
"@types/react": "18.3.3",
|
"@types/react": "18.3.3",
|
||||||
"@types/react-dom": "18.2.25",
|
"@types/react-dom": "18.2.25",
|
||||||
"ts-node": "10.9.2",
|
"ts-node": "10.9.2",
|
||||||
@ -40,5 +40,5 @@
|
|||||||
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
"build:commit": "webpack -c ./webpack.config.ts --env production --env commit=$(git rev-parse --short HEAD)",
|
||||||
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
"dev": "webpack -w -c ./webpack.config.ts --env development"
|
||||||
},
|
},
|
||||||
"packageManager": "yarn@4.4.1"
|
"packageManager": "yarn@4.5.0"
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,7 @@
|
|||||||
"last-delivery-attempt": "",
|
"last-delivery-attempt": "",
|
||||||
"last-delivery-failed": "",
|
"last-delivery-failed": "",
|
||||||
"no-delivery-attempts": "",
|
"no-delivery-attempts": "",
|
||||||
|
"no-integrations": "",
|
||||||
"only-firing": "",
|
"only-firing": "",
|
||||||
"telegram": {
|
"telegram": {
|
||||||
"parse-mode-warning-body": "",
|
"parse-mode-warning-body": "",
|
||||||
@ -124,6 +125,11 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
},
|
},
|
||||||
"list-view": {
|
"list-view": {
|
||||||
|
"empty": {
|
||||||
|
"new-alert-rule": "",
|
||||||
|
"new-recording-rule": "",
|
||||||
|
"provisioning": ""
|
||||||
|
},
|
||||||
"section": {
|
"section": {
|
||||||
"dataSourceManaged": {
|
"dataSourceManaged": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -929,6 +935,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"explore-metrics": {
|
"explore-metrics": {
|
||||||
|
"breakdown": {
|
||||||
|
"clearFilter": "",
|
||||||
|
"labelSelect": "",
|
||||||
|
"noMatchingValue": ""
|
||||||
|
},
|
||||||
"viewBy": ""
|
"viewBy": ""
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
@ -1173,8 +1184,7 @@
|
|||||||
},
|
},
|
||||||
"search-base-dns": {
|
"search-base-dns": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"label": "",
|
"label": ""
|
||||||
"placeholder": ""
|
|
||||||
},
|
},
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -1610,6 +1620,9 @@
|
|||||||
"grafana-quaderno": {
|
"grafana-quaderno": {
|
||||||
"title": "Grafana Quaderno"
|
"title": "Grafana Quaderno"
|
||||||
},
|
},
|
||||||
|
"groupsync": {
|
||||||
|
"subtitle": ""
|
||||||
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"title": "Hilfe"
|
"title": "Hilfe"
|
||||||
},
|
},
|
||||||
@ -2588,11 +2601,20 @@
|
|||||||
"trails": {
|
"trails": {
|
||||||
"metric-overview": {
|
"metric-overview": {
|
||||||
"description-label": "",
|
"description-label": "",
|
||||||
"labels-label": "",
|
"labels": "",
|
||||||
|
"metric-attributes": "",
|
||||||
"no-description": "",
|
"no-description": "",
|
||||||
"type-label": "",
|
"type-label": "",
|
||||||
"unit-label": "",
|
"unit-label": "",
|
||||||
"unknown-type": ""
|
"unknown-type": ""
|
||||||
|
},
|
||||||
|
"metric-select": {
|
||||||
|
"filter-by": "",
|
||||||
|
"otel-switch": ""
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"always-keep-selected-metric-graph-in-view": "",
|
||||||
|
"show-previews-of-metric-graphs": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transformations": {
|
"transformations": {
|
||||||
|
@ -112,6 +112,7 @@
|
|||||||
"last-delivery-attempt": "",
|
"last-delivery-attempt": "",
|
||||||
"last-delivery-failed": "",
|
"last-delivery-failed": "",
|
||||||
"no-delivery-attempts": "",
|
"no-delivery-attempts": "",
|
||||||
|
"no-integrations": "",
|
||||||
"only-firing": "",
|
"only-firing": "",
|
||||||
"telegram": {
|
"telegram": {
|
||||||
"parse-mode-warning-body": "",
|
"parse-mode-warning-body": "",
|
||||||
@ -124,6 +125,11 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
},
|
},
|
||||||
"list-view": {
|
"list-view": {
|
||||||
|
"empty": {
|
||||||
|
"new-alert-rule": "",
|
||||||
|
"new-recording-rule": "",
|
||||||
|
"provisioning": ""
|
||||||
|
},
|
||||||
"section": {
|
"section": {
|
||||||
"dataSourceManaged": {
|
"dataSourceManaged": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -929,6 +935,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"explore-metrics": {
|
"explore-metrics": {
|
||||||
|
"breakdown": {
|
||||||
|
"clearFilter": "",
|
||||||
|
"labelSelect": "",
|
||||||
|
"noMatchingValue": ""
|
||||||
|
},
|
||||||
"viewBy": ""
|
"viewBy": ""
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
@ -1173,8 +1184,7 @@
|
|||||||
},
|
},
|
||||||
"search-base-dns": {
|
"search-base-dns": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"label": "",
|
"label": ""
|
||||||
"placeholder": ""
|
|
||||||
},
|
},
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -1610,6 +1620,9 @@
|
|||||||
"grafana-quaderno": {
|
"grafana-quaderno": {
|
||||||
"title": "Grafana Quaderno"
|
"title": "Grafana Quaderno"
|
||||||
},
|
},
|
||||||
|
"groupsync": {
|
||||||
|
"subtitle": ""
|
||||||
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"title": "Ayuda"
|
"title": "Ayuda"
|
||||||
},
|
},
|
||||||
@ -2588,11 +2601,20 @@
|
|||||||
"trails": {
|
"trails": {
|
||||||
"metric-overview": {
|
"metric-overview": {
|
||||||
"description-label": "",
|
"description-label": "",
|
||||||
"labels-label": "",
|
"labels": "",
|
||||||
|
"metric-attributes": "",
|
||||||
"no-description": "",
|
"no-description": "",
|
||||||
"type-label": "",
|
"type-label": "",
|
||||||
"unit-label": "",
|
"unit-label": "",
|
||||||
"unknown-type": ""
|
"unknown-type": ""
|
||||||
|
},
|
||||||
|
"metric-select": {
|
||||||
|
"filter-by": "",
|
||||||
|
"otel-switch": ""
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"always-keep-selected-metric-graph-in-view": "",
|
||||||
|
"show-previews-of-metric-graphs": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transformations": {
|
"transformations": {
|
||||||
|
@ -112,6 +112,7 @@
|
|||||||
"last-delivery-attempt": "",
|
"last-delivery-attempt": "",
|
||||||
"last-delivery-failed": "",
|
"last-delivery-failed": "",
|
||||||
"no-delivery-attempts": "",
|
"no-delivery-attempts": "",
|
||||||
|
"no-integrations": "",
|
||||||
"only-firing": "",
|
"only-firing": "",
|
||||||
"telegram": {
|
"telegram": {
|
||||||
"parse-mode-warning-body": "",
|
"parse-mode-warning-body": "",
|
||||||
@ -124,6 +125,11 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
},
|
},
|
||||||
"list-view": {
|
"list-view": {
|
||||||
|
"empty": {
|
||||||
|
"new-alert-rule": "",
|
||||||
|
"new-recording-rule": "",
|
||||||
|
"provisioning": ""
|
||||||
|
},
|
||||||
"section": {
|
"section": {
|
||||||
"dataSourceManaged": {
|
"dataSourceManaged": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -929,6 +935,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"explore-metrics": {
|
"explore-metrics": {
|
||||||
|
"breakdown": {
|
||||||
|
"clearFilter": "",
|
||||||
|
"labelSelect": "",
|
||||||
|
"noMatchingValue": ""
|
||||||
|
},
|
||||||
"viewBy": ""
|
"viewBy": ""
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
@ -1173,8 +1184,7 @@
|
|||||||
},
|
},
|
||||||
"search-base-dns": {
|
"search-base-dns": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"label": "",
|
"label": ""
|
||||||
"placeholder": ""
|
|
||||||
},
|
},
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -1610,6 +1620,9 @@
|
|||||||
"grafana-quaderno": {
|
"grafana-quaderno": {
|
||||||
"title": "Grafana Quaderno"
|
"title": "Grafana Quaderno"
|
||||||
},
|
},
|
||||||
|
"groupsync": {
|
||||||
|
"subtitle": ""
|
||||||
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"title": "Aide"
|
"title": "Aide"
|
||||||
},
|
},
|
||||||
@ -2588,11 +2601,20 @@
|
|||||||
"trails": {
|
"trails": {
|
||||||
"metric-overview": {
|
"metric-overview": {
|
||||||
"description-label": "",
|
"description-label": "",
|
||||||
"labels-label": "",
|
"labels": "",
|
||||||
|
"metric-attributes": "",
|
||||||
"no-description": "",
|
"no-description": "",
|
||||||
"type-label": "",
|
"type-label": "",
|
||||||
"unit-label": "",
|
"unit-label": "",
|
||||||
"unknown-type": ""
|
"unknown-type": ""
|
||||||
|
},
|
||||||
|
"metric-select": {
|
||||||
|
"filter-by": "",
|
||||||
|
"otel-switch": ""
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"always-keep-selected-metric-graph-in-view": "",
|
||||||
|
"show-previews-of-metric-graphs": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transformations": {
|
"transformations": {
|
||||||
|
@ -112,6 +112,7 @@
|
|||||||
"last-delivery-attempt": "",
|
"last-delivery-attempt": "",
|
||||||
"last-delivery-failed": "",
|
"last-delivery-failed": "",
|
||||||
"no-delivery-attempts": "",
|
"no-delivery-attempts": "",
|
||||||
|
"no-integrations": "",
|
||||||
"only-firing": "",
|
"only-firing": "",
|
||||||
"telegram": {
|
"telegram": {
|
||||||
"parse-mode-warning-body": "",
|
"parse-mode-warning-body": "",
|
||||||
@ -124,6 +125,11 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
},
|
},
|
||||||
"list-view": {
|
"list-view": {
|
||||||
|
"empty": {
|
||||||
|
"new-alert-rule": "",
|
||||||
|
"new-recording-rule": "",
|
||||||
|
"provisioning": ""
|
||||||
|
},
|
||||||
"section": {
|
"section": {
|
||||||
"dataSourceManaged": {
|
"dataSourceManaged": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -929,6 +935,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"explore-metrics": {
|
"explore-metrics": {
|
||||||
|
"breakdown": {
|
||||||
|
"clearFilter": "",
|
||||||
|
"labelSelect": "",
|
||||||
|
"noMatchingValue": ""
|
||||||
|
},
|
||||||
"viewBy": ""
|
"viewBy": ""
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
@ -1173,8 +1184,7 @@
|
|||||||
},
|
},
|
||||||
"search-base-dns": {
|
"search-base-dns": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"label": "",
|
"label": ""
|
||||||
"placeholder": ""
|
|
||||||
},
|
},
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -1610,6 +1620,9 @@
|
|||||||
"grafana-quaderno": {
|
"grafana-quaderno": {
|
||||||
"title": "Grafana Quaderno"
|
"title": "Grafana Quaderno"
|
||||||
},
|
},
|
||||||
|
"groupsync": {
|
||||||
|
"subtitle": ""
|
||||||
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"title": "Ajuda"
|
"title": "Ajuda"
|
||||||
},
|
},
|
||||||
@ -2588,11 +2601,20 @@
|
|||||||
"trails": {
|
"trails": {
|
||||||
"metric-overview": {
|
"metric-overview": {
|
||||||
"description-label": "",
|
"description-label": "",
|
||||||
"labels-label": "",
|
"labels": "",
|
||||||
|
"metric-attributes": "",
|
||||||
"no-description": "",
|
"no-description": "",
|
||||||
"type-label": "",
|
"type-label": "",
|
||||||
"unit-label": "",
|
"unit-label": "",
|
||||||
"unknown-type": ""
|
"unknown-type": ""
|
||||||
|
},
|
||||||
|
"metric-select": {
|
||||||
|
"filter-by": "",
|
||||||
|
"otel-switch": ""
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"always-keep-selected-metric-graph-in-view": "",
|
||||||
|
"show-previews-of-metric-graphs": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transformations": {
|
"transformations": {
|
||||||
|
@ -112,6 +112,7 @@
|
|||||||
"last-delivery-attempt": "",
|
"last-delivery-attempt": "",
|
||||||
"last-delivery-failed": "",
|
"last-delivery-failed": "",
|
||||||
"no-delivery-attempts": "",
|
"no-delivery-attempts": "",
|
||||||
|
"no-integrations": "",
|
||||||
"only-firing": "",
|
"only-firing": "",
|
||||||
"telegram": {
|
"telegram": {
|
||||||
"parse-mode-warning-body": "",
|
"parse-mode-warning-body": "",
|
||||||
@ -123,6 +124,11 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
},
|
},
|
||||||
"list-view": {
|
"list-view": {
|
||||||
|
"empty": {
|
||||||
|
"new-alert-rule": "",
|
||||||
|
"new-recording-rule": "",
|
||||||
|
"provisioning": ""
|
||||||
|
},
|
||||||
"section": {
|
"section": {
|
||||||
"dataSourceManaged": {
|
"dataSourceManaged": {
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -921,6 +927,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"explore-metrics": {
|
"explore-metrics": {
|
||||||
|
"breakdown": {
|
||||||
|
"clearFilter": "",
|
||||||
|
"labelSelect": "",
|
||||||
|
"noMatchingValue": ""
|
||||||
|
},
|
||||||
"viewBy": ""
|
"viewBy": ""
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
@ -1165,8 +1176,7 @@
|
|||||||
},
|
},
|
||||||
"search-base-dns": {
|
"search-base-dns": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"label": "",
|
"label": ""
|
||||||
"placeholder": ""
|
|
||||||
},
|
},
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
"title": ""
|
"title": ""
|
||||||
@ -1601,6 +1611,9 @@
|
|||||||
"grafana-quaderno": {
|
"grafana-quaderno": {
|
||||||
"title": "Grafana Quaderno"
|
"title": "Grafana Quaderno"
|
||||||
},
|
},
|
||||||
|
"groupsync": {
|
||||||
|
"subtitle": ""
|
||||||
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"title": "帮助"
|
"title": "帮助"
|
||||||
},
|
},
|
||||||
@ -2576,11 +2589,20 @@
|
|||||||
"trails": {
|
"trails": {
|
||||||
"metric-overview": {
|
"metric-overview": {
|
||||||
"description-label": "",
|
"description-label": "",
|
||||||
"labels-label": "",
|
"labels": "",
|
||||||
|
"metric-attributes": "",
|
||||||
"no-description": "",
|
"no-description": "",
|
||||||
"type-label": "",
|
"type-label": "",
|
||||||
"unit-label": "",
|
"unit-label": "",
|
||||||
"unknown-type": ""
|
"unknown-type": ""
|
||||||
|
},
|
||||||
|
"metric-select": {
|
||||||
|
"filter-by": "",
|
||||||
|
"otel-switch": ""
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"always-keep-selected-metric-graph-in-view": "",
|
||||||
|
"show-previews-of-metric-graphs": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transformations": {
|
"transformations": {
|
||||||
|
384
yarn.lock
384
yarn.lock
@ -2963,15 +2963,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@floating-ui/react-dom@npm:^2.1.0, @floating-ui/react-dom@npm:^2.1.1":
|
"@floating-ui/react-dom@npm:^2.1.0, @floating-ui/react-dom@npm:^2.1.2":
|
||||||
version: 2.1.1
|
version: 2.1.2
|
||||||
resolution: "@floating-ui/react-dom@npm:2.1.1"
|
resolution: "@floating-ui/react-dom@npm:2.1.2"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@floating-ui/dom": "npm:^1.0.0"
|
"@floating-ui/dom": "npm:^1.0.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ">=16.8.0"
|
react: ">=16.8.0"
|
||||||
react-dom: ">=16.8.0"
|
react-dom: ">=16.8.0"
|
||||||
checksum: 10/cafabfb5dd0b25547863520b3bcf6faee7f087d0c3187a8779910a6838d496bf494f237bf1fe883bbfae1a7fcc399611ae52377b696065d8118bd7c1b9c0d253
|
checksum: 10/2a67dc8499674e42ff32c7246bded185bb0fdd492150067caf9568569557ac4756a67787421d8604b0f241e5337de10762aee270d9aeef106d078a0ff13596c4
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@ -2989,24 +2989,24 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@floating-ui/react@npm:0.26.23":
|
"@floating-ui/react@npm:0.26.24":
|
||||||
version: 0.26.23
|
version: 0.26.24
|
||||||
resolution: "@floating-ui/react@npm:0.26.23"
|
resolution: "@floating-ui/react@npm:0.26.24"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@floating-ui/react-dom": "npm:^2.1.1"
|
"@floating-ui/react-dom": "npm:^2.1.2"
|
||||||
"@floating-ui/utils": "npm:^0.2.7"
|
"@floating-ui/utils": "npm:^0.2.8"
|
||||||
tabbable: "npm:^6.0.0"
|
tabbable: "npm:^6.0.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ">=16.8.0"
|
react: ">=16.8.0"
|
||||||
react-dom: ">=16.8.0"
|
react-dom: ">=16.8.0"
|
||||||
checksum: 10/a2ffeb0bae72cac9e6583d9651e75e94c261a9e78ca4a5e862b7d33f2c19ae014cbe272627a0a0a5a2b526280efab17ec687d32ba02f6ce4e924bec562ae06ab
|
checksum: 10/903ffbee2c6726d117086e2a83f43d6ad339970758ce7979fd16cc7cf8dc0f5b869bd72c2c8ee1bcd6c63b190bb0960effd4d403e63685fb5aeed6b185041b08
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@floating-ui/utils@npm:^0.2.0, @floating-ui/utils@npm:^0.2.7":
|
"@floating-ui/utils@npm:^0.2.0, @floating-ui/utils@npm:^0.2.8":
|
||||||
version: 0.2.7
|
version: 0.2.8
|
||||||
resolution: "@floating-ui/utils@npm:0.2.7"
|
resolution: "@floating-ui/utils@npm:0.2.8"
|
||||||
checksum: 10/56b1bb3f73f6ec9aabf9b1fd3dc584e0f2384d319c1a6119050eab102ae6ca8b9b0eed711c2f235ffe035188cbe9727bf36e8dcb54c8bd32176737e4be47efa8
|
checksum: 10/3e3ea3b2de06badc4baebdf358b3dbd77ccd9474a257a6ef237277895943db2acbae756477ec64de65a2a1436d94aea3107129a1feeef6370675bf2b161c1abc
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@ -3130,8 +3130,8 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/prismjs": "npm:1.26.4"
|
"@types/prismjs": "npm:1.26.4"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
@ -3172,8 +3172,8 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/testing-library__jest-dom": "npm:5.14.9"
|
"@types/testing-library__jest-dom": "npm:5.14.9"
|
||||||
lodash: "npm:4.17.21"
|
lodash: "npm:4.17.21"
|
||||||
@ -3203,8 +3203,8 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/prismjs": "npm:1.26.4"
|
"@types/prismjs": "npm:1.26.4"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
@ -3246,8 +3246,8 @@ __metadata:
|
|||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/d3-random": "npm:^3.0.2"
|
"@types/d3-random": "npm:^3.0.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
"@types/testing-library__jest-dom": "npm:5.14.9"
|
"@types/testing-library__jest-dom": "npm:5.14.9"
|
||||||
@ -3287,9 +3287,9 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/logfmt": "npm:^1.2.3"
|
"@types/logfmt": "npm:^1.2.3"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
"@types/react-window": "npm:1.8.8"
|
"@types/react-window": "npm:1.8.8"
|
||||||
@ -3327,8 +3327,8 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/testing-library__jest-dom": "npm:5.14.9"
|
"@types/testing-library__jest-dom": "npm:5.14.9"
|
||||||
lodash: "npm:4.17.21"
|
lodash: "npm:4.17.21"
|
||||||
@ -3358,8 +3358,8 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/testing-library__jest-dom": "npm:5.14.9"
|
"@types/testing-library__jest-dom": "npm:5.14.9"
|
||||||
lodash: "npm:4.17.21"
|
lodash: "npm:4.17.21"
|
||||||
@ -3387,8 +3387,8 @@ __metadata:
|
|||||||
"@testing-library/dom": "npm:10.0.0"
|
"@testing-library/dom": "npm:10.0.0"
|
||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
lodash: "npm:4.17.21"
|
lodash: "npm:4.17.21"
|
||||||
@ -3424,8 +3424,8 @@ __metadata:
|
|||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/debounce-promise": "npm:3.1.9"
|
"@types/debounce-promise": "npm:3.1.9"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/prismjs": "npm:1.26.4"
|
"@types/prismjs": "npm:1.26.4"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
@ -3480,8 +3480,8 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/prismjs": "npm:1.26.4"
|
"@types/prismjs": "npm:1.26.4"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
@ -3529,8 +3529,8 @@ __metadata:
|
|||||||
"@testing-library/jest-dom": "npm:6.4.2"
|
"@testing-library/jest-dom": "npm:6.4.2"
|
||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
lodash: "npm:4.17.21"
|
lodash: "npm:4.17.21"
|
||||||
@ -3587,8 +3587,8 @@ __metadata:
|
|||||||
"@types/d3-interpolate": "npm:^3.0.0"
|
"@types/d3-interpolate": "npm:^3.0.0"
|
||||||
"@types/dompurify": "npm:^3.0.0"
|
"@types/dompurify": "npm:^3.0.0"
|
||||||
"@types/history": "npm:4.7.11"
|
"@types/history": "npm:4.7.11"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/papaparse": "npm:5.3.14"
|
"@types/papaparse": "npm:5.3.14"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
@ -3635,7 +3635,7 @@ __metadata:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@grafana/tsconfig": "npm:^2.0.0"
|
"@grafana/tsconfig": "npm:^2.0.0"
|
||||||
"@rollup/plugin-node-resolve": "npm:15.2.4"
|
"@rollup/plugin-node-resolve": "npm:15.2.4"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
esbuild: "npm:0.24.0"
|
esbuild: "npm:0.24.0"
|
||||||
rimraf: "npm:6.0.1"
|
rimraf: "npm:6.0.1"
|
||||||
rollup: "npm:2.79.1"
|
rollup: "npm:2.79.1"
|
||||||
@ -3753,7 +3753,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@grafana/faro-web-sdk@npm:1.10.0, @grafana/faro-web-sdk@npm:^1.3.6, @grafana/faro-web-sdk@npm:^1.9.1":
|
"@grafana/faro-web-sdk@npm:1.10.0, @grafana/faro-web-sdk@npm:^1.10.0, @grafana/faro-web-sdk@npm:^1.3.6":
|
||||||
version: 1.10.0
|
version: 1.10.0
|
||||||
resolution: "@grafana/faro-web-sdk@npm:1.10.0"
|
resolution: "@grafana/faro-web-sdk@npm:1.10.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -3765,22 +3765,22 @@ __metadata:
|
|||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@grafana/faro-web-tracing@npm:^1.8.2":
|
"@grafana/faro-web-tracing@npm:^1.8.2":
|
||||||
version: 1.9.1
|
version: 1.10.0
|
||||||
resolution: "@grafana/faro-web-tracing@npm:1.9.1"
|
resolution: "@grafana/faro-web-tracing@npm:1.10.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@grafana/faro-web-sdk": "npm:^1.9.1"
|
"@grafana/faro-web-sdk": "npm:^1.10.0"
|
||||||
"@opentelemetry/api": "npm:^1.9.0"
|
"@opentelemetry/api": "npm:^1.9.0"
|
||||||
"@opentelemetry/context-zone": "npm:1.21.0"
|
"@opentelemetry/context-zone": "npm:1.26.0"
|
||||||
"@opentelemetry/core": "npm:^1.25.0"
|
"@opentelemetry/core": "npm:^1.26.0"
|
||||||
"@opentelemetry/exporter-trace-otlp-http": "npm:^0.52.0"
|
"@opentelemetry/exporter-trace-otlp-http": "npm:^0.53.0"
|
||||||
"@opentelemetry/instrumentation": "npm:^0.52.0"
|
"@opentelemetry/instrumentation": "npm:^0.53.0"
|
||||||
"@opentelemetry/instrumentation-fetch": "npm:^0.52.0"
|
"@opentelemetry/instrumentation-fetch": "npm:^0.53.0"
|
||||||
"@opentelemetry/instrumentation-xml-http-request": "npm:^0.52.0"
|
"@opentelemetry/instrumentation-xml-http-request": "npm:^0.53.0"
|
||||||
"@opentelemetry/otlp-transformer": "npm:^0.52.0"
|
"@opentelemetry/otlp-transformer": "npm:^0.53.0"
|
||||||
"@opentelemetry/resources": "npm:^1.25.0"
|
"@opentelemetry/resources": "npm:^1.26.0"
|
||||||
"@opentelemetry/sdk-trace-web": "npm:^1.25.0"
|
"@opentelemetry/sdk-trace-web": "npm:^1.26.0"
|
||||||
"@opentelemetry/semantic-conventions": "npm:^1.25.0"
|
"@opentelemetry/semantic-conventions": "npm:^1.27.0"
|
||||||
checksum: 10/cd62af5b0cb177b33b80eb99c2c1c995485497bd383124dd4dcd45c2de8cfd2e081cff42b95fe326872cfaa433d460273de5b4a1dfe6f1147620591b337b46e9
|
checksum: 10/ba986abf1e91b0b829f101e0f7abbd7cb14ff76c7968c30051d1005c2ab1f13e41118441e1d8fe76c3a71890e47ff24e9af185464d1e86ef6616af5c3fa7f4d1
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@ -3803,8 +3803,8 @@ __metadata:
|
|||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/d3": "npm:^7"
|
"@types/d3": "npm:^7"
|
||||||
"@types/jest": "npm:^29.5.4"
|
"@types/jest": "npm:^29.5.4"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-virtualized-auto-sizer": "npm:1.0.4"
|
"@types/react-virtualized-auto-sizer": "npm:1.0.4"
|
||||||
"@types/tinycolor2": "npm:1.4.6"
|
"@types/tinycolor2": "npm:1.4.6"
|
||||||
@ -3888,7 +3888,7 @@ __metadata:
|
|||||||
"@testing-library/react": "npm:15.0.2"
|
"@testing-library/react": "npm:15.0.2"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:^29.5.4"
|
"@types/jest": "npm:^29.5.4"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/systemjs": "npm:6.15.1"
|
"@types/systemjs": "npm:6.15.1"
|
||||||
"@types/testing-library__jest-dom": "npm:5.14.9"
|
"@types/testing-library__jest-dom": "npm:5.14.9"
|
||||||
@ -3946,7 +3946,7 @@ __metadata:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@emotion/css": "npm:11.11.2"
|
"@emotion/css": "npm:11.11.2"
|
||||||
"@emotion/eslint-plugin": "npm:11.11.0"
|
"@emotion/eslint-plugin": "npm:11.11.0"
|
||||||
"@floating-ui/react": "npm:0.26.23"
|
"@floating-ui/react": "npm:0.26.24"
|
||||||
"@grafana/data": "npm:11.3.0-pre"
|
"@grafana/data": "npm:11.3.0-pre"
|
||||||
"@grafana/e2e-selectors": "npm:11.3.0-pre"
|
"@grafana/e2e-selectors": "npm:11.3.0-pre"
|
||||||
"@grafana/experimental": "npm:1.8.0"
|
"@grafana/experimental": "npm:1.8.0"
|
||||||
@ -3975,8 +3975,8 @@ __metadata:
|
|||||||
"@types/eslint": "npm:8.56.10"
|
"@types/eslint": "npm:8.56.10"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/jquery": "npm:3.5.30"
|
"@types/jquery": "npm:3.5.30"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/pluralize": "npm:^0.0.33"
|
"@types/pluralize": "npm:^0.0.33"
|
||||||
"@types/prismjs": "npm:1.26.4"
|
"@types/prismjs": "npm:1.26.4"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
@ -4069,7 +4069,7 @@ __metadata:
|
|||||||
"@types/angular": "npm:1.8.9"
|
"@types/angular": "npm:1.8.9"
|
||||||
"@types/history": "npm:4.7.11"
|
"@types/history": "npm:4.7.11"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
"@types/systemjs": "npm:6.15.1"
|
"@types/systemjs": "npm:6.15.1"
|
||||||
@ -4108,7 +4108,7 @@ __metadata:
|
|||||||
"@svgr/plugin-prettier": "npm:^8.1.0"
|
"@svgr/plugin-prettier": "npm:^8.1.0"
|
||||||
"@svgr/plugin-svgo": "npm:^8.1.0"
|
"@svgr/plugin-svgo": "npm:^8.1.0"
|
||||||
"@types/babel__core": "npm:^7"
|
"@types/babel__core": "npm:^7"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
esbuild: "npm:0.24.0"
|
esbuild: "npm:0.24.0"
|
||||||
@ -4187,8 +4187,8 @@ __metadata:
|
|||||||
"@testing-library/react-hooks": "npm:^8.0.1"
|
"@testing-library/react-hooks": "npm:^8.0.1"
|
||||||
"@testing-library/user-event": "npm:14.5.2"
|
"@testing-library/user-event": "npm:14.5.2"
|
||||||
"@types/jest": "npm:^29.5.4"
|
"@types/jest": "npm:^29.5.4"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-dom": "npm:18.2.25"
|
"@types/react-dom": "npm:18.2.25"
|
||||||
"@types/react-virtualized-auto-sizer": "npm:1.0.4"
|
"@types/react-virtualized-auto-sizer": "npm:1.0.4"
|
||||||
@ -4237,7 +4237,7 @@ __metadata:
|
|||||||
"@emotion/css": "npm:11.11.2"
|
"@emotion/css": "npm:11.11.2"
|
||||||
"@emotion/react": "npm:11.11.4"
|
"@emotion/react": "npm:11.11.4"
|
||||||
"@faker-js/faker": "npm:^8.4.1"
|
"@faker-js/faker": "npm:^8.4.1"
|
||||||
"@floating-ui/react": "npm:0.26.23"
|
"@floating-ui/react": "npm:0.26.24"
|
||||||
"@grafana/data": "npm:11.3.0-pre"
|
"@grafana/data": "npm:11.3.0-pre"
|
||||||
"@grafana/e2e-selectors": "npm:11.3.0-pre"
|
"@grafana/e2e-selectors": "npm:11.3.0-pre"
|
||||||
"@grafana/faro-web-sdk": "npm:^1.3.6"
|
"@grafana/faro-web-sdk": "npm:^1.3.6"
|
||||||
@ -4280,9 +4280,9 @@ __metadata:
|
|||||||
"@types/is-hotkey": "npm:0.1.10"
|
"@types/is-hotkey": "npm:0.1.10"
|
||||||
"@types/jest": "npm:29.5.13"
|
"@types/jest": "npm:29.5.13"
|
||||||
"@types/jquery": "npm:3.5.30"
|
"@types/jquery": "npm:3.5.30"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/mock-raf": "npm:1.0.6"
|
"@types/mock-raf": "npm:1.0.6"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/prismjs": "npm:1.26.4"
|
"@types/prismjs": "npm:1.26.4"
|
||||||
"@types/react": "npm:18.3.3"
|
"@types/react": "npm:18.3.3"
|
||||||
"@types/react-color": "npm:3.0.12"
|
"@types/react-color": "npm:3.0.12"
|
||||||
@ -5842,15 +5842,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/api-logs@npm:0.52.1":
|
|
||||||
version: 0.52.1
|
|
||||||
resolution: "@opentelemetry/api-logs@npm:0.52.1"
|
|
||||||
dependencies:
|
|
||||||
"@opentelemetry/api": "npm:^1.0.0"
|
|
||||||
checksum: 10/7515667a41a38014ffda70674c0b77c9c68417cde9f8ce8840e675308b4431f99d879e8d347f1b08486561617f914c07ee704ad6ed8a6522dabc3a81ac39dc88
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/api-logs@npm:0.53.0":
|
"@opentelemetry/api-logs@npm:0.53.0":
|
||||||
version: 0.53.0
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/api-logs@npm:0.53.0"
|
resolution: "@opentelemetry/api-logs@npm:0.53.0"
|
||||||
@ -5876,23 +5867,23 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/context-zone-peer-dep@npm:1.21.0":
|
"@opentelemetry/context-zone-peer-dep@npm:1.26.0":
|
||||||
version: 1.21.0
|
version: 1.26.0
|
||||||
resolution: "@opentelemetry/context-zone-peer-dep@npm:1.21.0"
|
resolution: "@opentelemetry/context-zone-peer-dep@npm:1.26.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
"@opentelemetry/api": ">=1.0.0 <1.8.0"
|
"@opentelemetry/api": ">=1.0.0 <1.10.0"
|
||||||
zone.js: ^0.10.2 || ^0.11.0 || ^0.13.0
|
zone.js: ^0.10.2 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0
|
||||||
checksum: 10/e89bfb8b5dd35ef86fd67f6bab9abd0d5c17027611b3d75f01419d9267a7ee8a1976af9198feabf8ea5f199badee7c0c5b34b2b3f3820fd5409aedc28c1abfc0
|
checksum: 10/aed06016c380001418656810f80d24b68d05ce8d8138ed278fd27ed7990961b02dc4f3e1e75511662eb97afcfb4b7f96be2dfd28894eba3edff375be8908749a
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/context-zone@npm:1.21.0":
|
"@opentelemetry/context-zone@npm:1.26.0":
|
||||||
version: 1.21.0
|
version: 1.26.0
|
||||||
resolution: "@opentelemetry/context-zone@npm:1.21.0"
|
resolution: "@opentelemetry/context-zone@npm:1.26.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/context-zone-peer-dep": "npm:1.21.0"
|
"@opentelemetry/context-zone-peer-dep": "npm:1.26.0"
|
||||||
zone.js: "npm:^0.11.0"
|
zone.js: "npm:^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0"
|
||||||
checksum: 10/7b925ad7a4d9087b1d5ea39042cb8a9e30c7b21c675e9e470531e80579c891e80faec822bd70384a44f49a73284145150c0f01a205ff7958ce1eb2ae8fc93881
|
checksum: 10/16ddaa1129e818a6950db15f5f2c254e7d3216f2e7deb93ecb5b11496d4a68ea043cc469ac0f426840b797a21ad9162daabe74b5311ac3d0661fc6b64c51fff6
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@ -5908,18 +5899,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/core@npm:1.25.1":
|
"@opentelemetry/core@npm:1.26.0, @opentelemetry/core@npm:^1.26.0":
|
||||||
version: 1.25.1
|
|
||||||
resolution: "@opentelemetry/core@npm:1.25.1"
|
|
||||||
dependencies:
|
|
||||||
"@opentelemetry/semantic-conventions": "npm:1.25.1"
|
|
||||||
peerDependencies:
|
|
||||||
"@opentelemetry/api": ">=1.0.0 <1.10.0"
|
|
||||||
checksum: 10/3f669798760e70587cb1f329def5c02b586d3ceeb3200728387e6fb6dcd5ac9a04e4eafe3dc98a6c0cf5204e4ca238d4f0809a37425a1f1e7e9aea673ea28f59
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/core@npm:1.26.0, @opentelemetry/core@npm:^1.25.0":
|
|
||||||
version: 1.26.0
|
version: 1.26.0
|
||||||
resolution: "@opentelemetry/core@npm:1.26.0"
|
resolution: "@opentelemetry/core@npm:1.26.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -5945,95 +5925,78 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/exporter-trace-otlp-http@npm:^0.52.0":
|
"@opentelemetry/exporter-trace-otlp-http@npm:^0.53.0":
|
||||||
version: 0.52.1
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.52.1"
|
resolution: "@opentelemetry/exporter-trace-otlp-http@npm:0.53.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
"@opentelemetry/core": "npm:1.26.0"
|
||||||
"@opentelemetry/otlp-exporter-base": "npm:0.52.1"
|
"@opentelemetry/otlp-exporter-base": "npm:0.53.0"
|
||||||
"@opentelemetry/otlp-transformer": "npm:0.52.1"
|
"@opentelemetry/otlp-transformer": "npm:0.53.0"
|
||||||
"@opentelemetry/resources": "npm:1.25.1"
|
"@opentelemetry/resources": "npm:1.26.0"
|
||||||
"@opentelemetry/sdk-trace-base": "npm:1.25.1"
|
"@opentelemetry/sdk-trace-base": "npm:1.26.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
"@opentelemetry/api": ^1.0.0
|
"@opentelemetry/api": ^1.0.0
|
||||||
checksum: 10/12580244204ac156c0a5d059e275a8d9f1fd5b705d425b6e1c6b3045740d157f5d55190e88c430a528cdc5fa92ad8f3ae4fb157e253f9026462728b189d6b6c3
|
checksum: 10/28c75e25564833bc448b5733415730483c9f28714577acb679087d5ccfc46d74b3f24996c41f2c93bf6a6406edb1cad7e8cf2a76b61096e3f417f90044e1d795
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/instrumentation-fetch@npm:^0.52.0":
|
"@opentelemetry/instrumentation-fetch@npm:^0.53.0":
|
||||||
version: 0.52.1
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/instrumentation-fetch@npm:0.52.1"
|
resolution: "@opentelemetry/instrumentation-fetch@npm:0.53.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
"@opentelemetry/core": "npm:1.26.0"
|
||||||
"@opentelemetry/instrumentation": "npm:0.52.1"
|
"@opentelemetry/instrumentation": "npm:0.53.0"
|
||||||
"@opentelemetry/sdk-trace-web": "npm:1.25.1"
|
"@opentelemetry/sdk-trace-web": "npm:1.26.0"
|
||||||
"@opentelemetry/semantic-conventions": "npm:1.25.1"
|
"@opentelemetry/semantic-conventions": "npm:1.27.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
"@opentelemetry/api": ^1.0.0
|
"@opentelemetry/api": ^1.0.0
|
||||||
checksum: 10/0d21aa1c3170d77fe6e09f540304ba22d728a9ce0160e81934ab26c47545289aaca81c2f2dd435d5564c11d9a835e86641ff4bcdf6fd6185b6bd5a3edc0e04fa
|
checksum: 10/422e9c749523a2be4cd6b82304f20b3208ced12a14990b1cfee273c7485252c94618336c94342a0b0ad72863ec5519d3b1c31f0d09395c29926ecbc0986c9b15
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/instrumentation-xml-http-request@npm:^0.52.0":
|
"@opentelemetry/instrumentation-xml-http-request@npm:^0.53.0":
|
||||||
version: 0.52.1
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/instrumentation-xml-http-request@npm:0.52.1"
|
resolution: "@opentelemetry/instrumentation-xml-http-request@npm:0.53.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
"@opentelemetry/core": "npm:1.26.0"
|
||||||
"@opentelemetry/instrumentation": "npm:0.52.1"
|
"@opentelemetry/instrumentation": "npm:0.53.0"
|
||||||
"@opentelemetry/sdk-trace-web": "npm:1.25.1"
|
"@opentelemetry/sdk-trace-web": "npm:1.26.0"
|
||||||
"@opentelemetry/semantic-conventions": "npm:1.25.1"
|
"@opentelemetry/semantic-conventions": "npm:1.27.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
"@opentelemetry/api": ^1.0.0
|
"@opentelemetry/api": ^1.0.0
|
||||||
checksum: 10/02833d5d940a455979df7e02f425e4eae12f8f45e00ab59c85830be58e4e0a28294391f2cb1bc0b0fe29dc68df2f0945794e6d20b4ecf6409f6a24569b6080d7
|
checksum: 10/82c7e3d9f54fafccfabfe02033b11ca39b052134ec6e8902ac3c54993745fc02503f60e7d223b74319e855091c5f961e78483857a690633958fb61852c041749
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/instrumentation@npm:0.52.1, @opentelemetry/instrumentation@npm:^0.52.0":
|
"@opentelemetry/instrumentation@npm:0.53.0, @opentelemetry/instrumentation@npm:^0.53.0":
|
||||||
version: 0.52.1
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/instrumentation@npm:0.52.1"
|
resolution: "@opentelemetry/instrumentation@npm:0.53.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/api-logs": "npm:0.52.1"
|
"@opentelemetry/api-logs": "npm:0.53.0"
|
||||||
"@types/shimmer": "npm:^1.0.2"
|
"@types/shimmer": "npm:^1.2.0"
|
||||||
import-in-the-middle: "npm:^1.8.1"
|
import-in-the-middle: "npm:^1.8.1"
|
||||||
require-in-the-middle: "npm:^7.1.1"
|
require-in-the-middle: "npm:^7.1.1"
|
||||||
semver: "npm:^7.5.2"
|
semver: "npm:^7.5.2"
|
||||||
shimmer: "npm:^1.2.1"
|
shimmer: "npm:^1.2.1"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
"@opentelemetry/api": ^1.3.0
|
"@opentelemetry/api": ^1.3.0
|
||||||
checksum: 10/87761bd593f2b905d88d0531a3a2a7f4b0186334ae413b4c172a86bd4de0fd6d2f906a1bfd9dd7bd172a228a44fa7a680f5802a1570dfe2fadad0768e80bd7a8
|
checksum: 10/4b994c8568a503a15655cba249b1dbdef3f67dfda37938abba6267ba75b6d72a9aa276be4b0c8874e86f98ab89d92877e1874e0565a7e67f062c43dfcbbb16a5
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/otlp-exporter-base@npm:0.52.1":
|
"@opentelemetry/otlp-exporter-base@npm:0.53.0":
|
||||||
version: 0.52.1
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/otlp-exporter-base@npm:0.52.1"
|
resolution: "@opentelemetry/otlp-exporter-base@npm:0.53.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
"@opentelemetry/core": "npm:1.26.0"
|
||||||
"@opentelemetry/otlp-transformer": "npm:0.52.1"
|
"@opentelemetry/otlp-transformer": "npm:0.53.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
"@opentelemetry/api": ^1.0.0
|
"@opentelemetry/api": ^1.0.0
|
||||||
checksum: 10/0fbe164e04b05a7ba230f5532ecfbf1bb2156e2a7330090e1880c5b1db05f89ed4e7a89a67b8297415389975045377efbfb82410685b666581eaa6782c353450
|
checksum: 10/ca59d73ae8f83946062b060a9a382fc7db6154c892ed56b6ab7f545530ba4850b4d0a748daaa30d1177ef6a8c2a0fddd34a199080f4474ec445944cece86f1ef
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/otlp-transformer@npm:0.52.1, @opentelemetry/otlp-transformer@npm:^0.52.0":
|
"@opentelemetry/otlp-transformer@npm:0.53.0, @opentelemetry/otlp-transformer@npm:^0.53.0":
|
||||||
version: 0.52.1
|
|
||||||
resolution: "@opentelemetry/otlp-transformer@npm:0.52.1"
|
|
||||||
dependencies:
|
|
||||||
"@opentelemetry/api-logs": "npm:0.52.1"
|
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
|
||||||
"@opentelemetry/resources": "npm:1.25.1"
|
|
||||||
"@opentelemetry/sdk-logs": "npm:0.52.1"
|
|
||||||
"@opentelemetry/sdk-metrics": "npm:1.25.1"
|
|
||||||
"@opentelemetry/sdk-trace-base": "npm:1.25.1"
|
|
||||||
protobufjs: "npm:^7.3.0"
|
|
||||||
peerDependencies:
|
|
||||||
"@opentelemetry/api": ">=1.3.0 <1.10.0"
|
|
||||||
checksum: 10/954bef8f732bb0f4791755de73627cd6d83bde2e42337d5961d6694d90e404f20a48e941f17229ce87ef39b3bb9ddc11cc1293ac77a3e0bb2b2cca4ea660a778
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/otlp-transformer@npm:^0.53.0":
|
|
||||||
version: 0.53.0
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/otlp-transformer@npm:0.53.0"
|
resolution: "@opentelemetry/otlp-transformer@npm:0.53.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -6062,19 +6025,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/resources@npm:1.25.1":
|
"@opentelemetry/resources@npm:1.26.0, @opentelemetry/resources@npm:^1.26.0":
|
||||||
version: 1.25.1
|
|
||||||
resolution: "@opentelemetry/resources@npm:1.25.1"
|
|
||||||
dependencies:
|
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
|
||||||
"@opentelemetry/semantic-conventions": "npm:1.25.1"
|
|
||||||
peerDependencies:
|
|
||||||
"@opentelemetry/api": ">=1.0.0 <1.10.0"
|
|
||||||
checksum: 10/971f9616deeff76e584ba7d2957db402332701d9e1f679532e105ff2b929cd93e8ee40ccac029585e70ab917ff47696a0f37a4ddfcb9f96b4ae0eeca860deaf5
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/resources@npm:1.26.0, @opentelemetry/resources@npm:^1.25.0":
|
|
||||||
version: 1.26.0
|
version: 1.26.0
|
||||||
resolution: "@opentelemetry/resources@npm:1.26.0"
|
resolution: "@opentelemetry/resources@npm:1.26.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -6086,19 +6037,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/sdk-logs@npm:0.52.1":
|
|
||||||
version: 0.52.1
|
|
||||||
resolution: "@opentelemetry/sdk-logs@npm:0.52.1"
|
|
||||||
dependencies:
|
|
||||||
"@opentelemetry/api-logs": "npm:0.52.1"
|
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
|
||||||
"@opentelemetry/resources": "npm:1.25.1"
|
|
||||||
peerDependencies:
|
|
||||||
"@opentelemetry/api": ">=1.4.0 <1.10.0"
|
|
||||||
checksum: 10/17057d6105fb2bfba7cc7860a0d01c22e2a488d90d6d065ba6938a4c5315b025fb2ed98b7d82e2e828af8ec0c046934646c651f5bf0d587d64dc23643507c4fd
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/sdk-logs@npm:0.53.0":
|
"@opentelemetry/sdk-logs@npm:0.53.0":
|
||||||
version: 0.53.0
|
version: 0.53.0
|
||||||
resolution: "@opentelemetry/sdk-logs@npm:0.53.0"
|
resolution: "@opentelemetry/sdk-logs@npm:0.53.0"
|
||||||
@ -6126,19 +6064,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/sdk-metrics@npm:1.25.1":
|
|
||||||
version: 1.25.1
|
|
||||||
resolution: "@opentelemetry/sdk-metrics@npm:1.25.1"
|
|
||||||
dependencies:
|
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
|
||||||
"@opentelemetry/resources": "npm:1.25.1"
|
|
||||||
lodash.merge: "npm:^4.6.2"
|
|
||||||
peerDependencies:
|
|
||||||
"@opentelemetry/api": ">=1.3.0 <1.10.0"
|
|
||||||
checksum: 10/751015cef39cb13502fd03d32d46280697b24b6ceee27bf3b1336bef16259baf3fb629734cec6bf4998a14d785da467ae93cafc7b519c83cec52312269a773b3
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/sdk-metrics@npm:1.26.0":
|
"@opentelemetry/sdk-metrics@npm:1.26.0":
|
||||||
version: 1.26.0
|
version: 1.26.0
|
||||||
resolution: "@opentelemetry/sdk-metrics@npm:1.26.0"
|
resolution: "@opentelemetry/sdk-metrics@npm:1.26.0"
|
||||||
@ -6165,19 +6090,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/sdk-trace-base@npm:1.25.1":
|
|
||||||
version: 1.25.1
|
|
||||||
resolution: "@opentelemetry/sdk-trace-base@npm:1.25.1"
|
|
||||||
dependencies:
|
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
|
||||||
"@opentelemetry/resources": "npm:1.25.1"
|
|
||||||
"@opentelemetry/semantic-conventions": "npm:1.25.1"
|
|
||||||
peerDependencies:
|
|
||||||
"@opentelemetry/api": ">=1.0.0 <1.10.0"
|
|
||||||
checksum: 10/65d289a144bba052d1b4a0f8f528d2598cfb6bfbf60d9372543a317665e9e1dc63069a66601537fe1e6e94563f53d1be9cc3474dfc3361a8d33f31e1ea2d6262
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/sdk-trace-base@npm:1.26.0":
|
"@opentelemetry/sdk-trace-base@npm:1.26.0":
|
||||||
version: 1.26.0
|
version: 1.26.0
|
||||||
resolution: "@opentelemetry/sdk-trace-base@npm:1.26.0"
|
resolution: "@opentelemetry/sdk-trace-base@npm:1.26.0"
|
||||||
@ -6191,16 +6103,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/sdk-trace-web@npm:1.25.1, @opentelemetry/sdk-trace-web@npm:^1.25.0":
|
"@opentelemetry/sdk-trace-web@npm:1.26.0, @opentelemetry/sdk-trace-web@npm:^1.26.0":
|
||||||
version: 1.25.1
|
version: 1.26.0
|
||||||
resolution: "@opentelemetry/sdk-trace-web@npm:1.25.1"
|
resolution: "@opentelemetry/sdk-trace-web@npm:1.26.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@opentelemetry/core": "npm:1.25.1"
|
"@opentelemetry/core": "npm:1.26.0"
|
||||||
"@opentelemetry/sdk-trace-base": "npm:1.25.1"
|
"@opentelemetry/sdk-trace-base": "npm:1.26.0"
|
||||||
"@opentelemetry/semantic-conventions": "npm:1.25.1"
|
"@opentelemetry/semantic-conventions": "npm:1.27.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
"@opentelemetry/api": ">=1.0.0 <1.10.0"
|
"@opentelemetry/api": ">=1.0.0 <1.10.0"
|
||||||
checksum: 10/0c12cac81b612b361704d20264c663fafb1ccfb43f3ab08c1c8ddccbdc009c02de4dd8f89129799344a6095767a3949e86bf38e4c4222992a432c2c352f77ba0
|
checksum: 10/2882863d02510151460850575269129c603f2b3e44f5b2c34bede4128d7f724b7bb8bb8253469848110725e2b2af9340d13a81d565ea9e0c80cf57804b02d65f
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@ -6211,14 +6123,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@opentelemetry/semantic-conventions@npm:1.25.1":
|
"@opentelemetry/semantic-conventions@npm:1.27.0, @opentelemetry/semantic-conventions@npm:^1.27.0":
|
||||||
version: 1.25.1
|
|
||||||
resolution: "@opentelemetry/semantic-conventions@npm:1.25.1"
|
|
||||||
checksum: 10/d84745a9e21a451560a293b4e6f996ee7c67bb983a7ec05408c23d207c6fc8b73a0af9c1ebea26e3acb4f0e3405ea7eb0d6bdf9adad9f954d60829bbb48ea307
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@opentelemetry/semantic-conventions@npm:1.27.0, @opentelemetry/semantic-conventions@npm:^1.25.0":
|
|
||||||
version: 1.27.0
|
version: 1.27.0
|
||||||
resolution: "@opentelemetry/semantic-conventions@npm:1.27.0"
|
resolution: "@opentelemetry/semantic-conventions@npm:1.27.0"
|
||||||
checksum: 10/98166522f299e2fe3d43376adbdeb92679b75ebb172e2a3c4c71f2942bd91585e9537618efbbae6dc08177699e5719368edf66d7e69e8636f360b85217bbdbe1
|
checksum: 10/98166522f299e2fe3d43376adbdeb92679b75ebb172e2a3c4c71f2942bd91585e9537618efbbae6dc08177699e5719368edf66d7e69e8636f360b85217bbdbe1
|
||||||
@ -10168,7 +10073,14 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/lodash@npm:*, @types/lodash@npm:4.17.7, @types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.172":
|
"@types/lodash@npm:*, @types/lodash@npm:4.17.9, @types/lodash@npm:^4.14.167, @types/lodash@npm:^4.14.172":
|
||||||
|
version: 4.17.9
|
||||||
|
resolution: "@types/lodash@npm:4.17.9"
|
||||||
|
checksum: 10/49e35caaf668686be0bad9e9bef88456903a21999d3fd8bf91c302e0d5328398fb59fee793d0afbaf6edeca1b46c3e8109899d85ff3a433075178f1ab693e597
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/lodash@npm:4.17.7":
|
||||||
version: 4.17.7
|
version: 4.17.7
|
||||||
resolution: "@types/lodash@npm:4.17.7"
|
resolution: "@types/lodash@npm:4.17.7"
|
||||||
checksum: 10/b8177f19cf962414a66989837481b13f546afc2e98e8d465bec59e6ac03a59c584eb7053ce511cde3a09c5f3096d22a5ae22cfb56b23f3b0da75b0743b6b1a44
|
checksum: 10/b8177f19cf962414a66989837481b13f546afc2e98e8d465bec59e6ac03a59c584eb7053ce511cde3a09c5f3096d22a5ae22cfb56b23f3b0da75b0743b6b1a44
|
||||||
@ -10277,12 +10189,12 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/node@npm:*, @types/node@npm:20.16.5, @types/node@npm:>=13.7.0, @types/node@npm:^20.11.16":
|
"@types/node@npm:*, @types/node@npm:20.16.6, @types/node@npm:>=13.7.0, @types/node@npm:^20.11.16":
|
||||||
version: 20.16.5
|
version: 20.16.6
|
||||||
resolution: "@types/node@npm:20.16.5"
|
resolution: "@types/node@npm:20.16.6"
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: "npm:~6.19.2"
|
undici-types: "npm:~6.19.2"
|
||||||
checksum: 10/39a8457149dc17cdea57afc90d4da53182fdb8b958d5bb065a15d123d81d4efa6b51a0de92428d05ead2e63ce07195586f71083401b99cdbcd04662344fbf7a1
|
checksum: 10/f8a07b113901fa2b5bfbea8dedd15321126238023586f047576805cb1a53abd7f717f9e490d8e71d4c7b627885659f862584fa844fa71aab9c86295d1f006771
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@ -10620,7 +10532,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@types/shimmer@npm:^1.0.2":
|
"@types/shimmer@npm:^1.2.0":
|
||||||
version: 1.2.0
|
version: 1.2.0
|
||||||
resolution: "@types/shimmer@npm:1.2.0"
|
resolution: "@types/shimmer@npm:1.2.0"
|
||||||
checksum: 10/f081a31d826ce7bfe8cc7ba8129d2b1dffae44fd580eba4fcf741237646c4c2494ae6de2cada4b7713d138f35f4bc512dbf01311d813dee82020f97d7d8c491c
|
checksum: 10/f081a31d826ce7bfe8cc7ba8129d2b1dffae44fd580eba4fcf741237646c4c2494ae6de2cada4b7713d138f35f4bc512dbf01311d813dee82020f97d7d8c491c
|
||||||
@ -18890,7 +18802,7 @@ __metadata:
|
|||||||
"@emotion/eslint-plugin": "npm:11.11.0"
|
"@emotion/eslint-plugin": "npm:11.11.0"
|
||||||
"@emotion/react": "npm:11.11.4"
|
"@emotion/react": "npm:11.11.4"
|
||||||
"@fingerprintjs/fingerprintjs": "npm:^3.4.2"
|
"@fingerprintjs/fingerprintjs": "npm:^3.4.2"
|
||||||
"@floating-ui/react": "npm:0.26.23"
|
"@floating-ui/react": "npm:0.26.24"
|
||||||
"@formatjs/intl-durationformat": "npm:^0.2.4"
|
"@formatjs/intl-durationformat": "npm:^0.2.4"
|
||||||
"@glideapps/glide-data-grid": "npm:^6.0.0"
|
"@glideapps/glide-data-grid": "npm:^6.0.0"
|
||||||
"@grafana/aws-sdk": "npm:0.4.2"
|
"@grafana/aws-sdk": "npm:0.4.2"
|
||||||
@ -18977,10 +18889,10 @@ __metadata:
|
|||||||
"@types/jquery": "npm:3.5.30"
|
"@types/jquery": "npm:3.5.30"
|
||||||
"@types/js-yaml": "npm:^4.0.5"
|
"@types/js-yaml": "npm:^4.0.5"
|
||||||
"@types/jsurl": "npm:^1.2.28"
|
"@types/jsurl": "npm:^1.2.28"
|
||||||
"@types/lodash": "npm:4.17.7"
|
"@types/lodash": "npm:4.17.9"
|
||||||
"@types/logfmt": "npm:^1.2.3"
|
"@types/logfmt": "npm:^1.2.3"
|
||||||
"@types/lucene": "npm:^2"
|
"@types/lucene": "npm:^2"
|
||||||
"@types/node": "npm:20.16.5"
|
"@types/node": "npm:20.16.6"
|
||||||
"@types/node-forge": "npm:^1"
|
"@types/node-forge": "npm:^1"
|
||||||
"@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.2.4"
|
"@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.2.4"
|
||||||
"@types/pluralize": "npm:^0.0.33"
|
"@types/pluralize": "npm:^0.0.33"
|
||||||
@ -33596,12 +33508,10 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"zone.js@npm:^0.11.0":
|
"zone.js@npm:^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0":
|
||||||
version: 0.11.8
|
version: 0.14.10
|
||||||
resolution: "zone.js@npm:0.11.8"
|
resolution: "zone.js@npm:0.14.10"
|
||||||
dependencies:
|
checksum: 10/a7bed2f9a7ce67ba4e70b03b7e59dc955e4d2d738570950c4a0e16fafb5c23c47d0c6ece84f6e871a0f77d81c26a051da566d09738ebfdab297f54b862ae0b5d
|
||||||
tslib: "npm:^2.3.0"
|
|
||||||
checksum: 10/643c71eb9dc9a09510ab0d5c27ee4402f21d09b1aad1d5e1e0b7e1b98e621686e3d82a59d2646a91d655e5d2d4471e43068494dfef4aac16170b67ef46212446
|
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user