@grafana/scenes 5.24.0--canary.960.11775742614.0 β 5.24.0--canary.956.11776448023.0
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +41 -0
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +0 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelectors.js +3 -3
- package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariable.js +1 -0
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/esm/variables/variants/MultiValueVariable.js +3 -1
- package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,44 @@
|
|
1
|
+
# v5.23.4 (Fri Nov 08 2024)
|
2
|
+
|
3
|
+
#### π Bug Fix
|
4
|
+
|
5
|
+
- New filters UI: adds some basic unit tests [#958](https://github.com/grafana/scenes/pull/958) ([@ashharrison90](https://github.com/ashharrison90) [@Sergej-Vlasov](https://github.com/Sergej-Vlasov))
|
6
|
+
|
7
|
+
#### Authors: 2
|
8
|
+
|
9
|
+
- [@Sergej-Vlasov](https://github.com/Sergej-Vlasov)
|
10
|
+
- Ashley Harrison ([@ashharrison90](https://github.com/ashharrison90))
|
11
|
+
|
12
|
+
---
|
13
|
+
|
14
|
+
# v5.23.3 (Fri Nov 08 2024)
|
15
|
+
|
16
|
+
#### π Bug Fix
|
17
|
+
|
18
|
+
- VariableLabel: change variable label check to OR instead of ?? [#963](https://github.com/grafana/scenes/pull/963) ([@Sergej-Vlasov](https://github.com/Sergej-Vlasov))
|
19
|
+
- GroupByVariable: Support custom filter keys [#865](https://github.com/grafana/scenes/pull/865) ([@andreaalopez](https://github.com/andreaalopez))
|
20
|
+
|
21
|
+
#### Authors: 2
|
22
|
+
|
23
|
+
- [@Sergej-Vlasov](https://github.com/Sergej-Vlasov)
|
24
|
+
- Andrea Lopez ([@andreaalopez](https://github.com/andreaalopez))
|
25
|
+
|
26
|
+
---
|
27
|
+
|
28
|
+
# v5.23.2 (Fri Nov 08 2024)
|
29
|
+
|
30
|
+
#### π Bug Fix
|
31
|
+
|
32
|
+
- Variables: Saved default all value with non multi select fix [#959](https://github.com/grafana/scenes/pull/959) ([@torkelo](https://github.com/torkelo))
|
33
|
+
- ScenesReact: Cache SceneQueryRunners and other scene object by a key / hashing string [#788](https://github.com/grafana/scenes/pull/788) ([@torkelo](https://github.com/torkelo) [@mdvictor](https://github.com/mdvictor))
|
34
|
+
|
35
|
+
#### Authors: 2
|
36
|
+
|
37
|
+
- Torkel Γdegaard ([@torkelo](https://github.com/torkelo))
|
38
|
+
- Victor Marin ([@mdvictor](https://github.com/mdvictor))
|
39
|
+
|
40
|
+
---
|
41
|
+
|
1
42
|
# v5.23.1 (Wed Nov 06 2024)
|
2
43
|
|
3
44
|
#### π Bug Fix
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { MonoTypeOperatorFunction, Observable, Unsubscribable } from 'rxjs';\n\nimport {\n BusEvent,\n BusEventHandler,\n BusEventType,\n DataFrame,\n DataQueryRequest,\n DataSourceGetTagKeysOptions,\n DataSourceGetTagValuesOptions,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { DataQuery, DataTopic, TimeZone } from '@grafana/schema';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\nimport { SceneObjectRef } from './SceneObjectRef';\n\nexport interface SceneObjectState {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneDataProvider;\n $variables?: SceneVariables;\n /**\n * @experimental\n * Can be used to add extra behaviors to a scene object.\n * These are activated when the their parent scene object is activated.\n */\n $behaviors?: Array<SceneObject | SceneStatelessBehavior>;\n}\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n}\n\nexport type SceneComponent<TModel> = (props: SceneComponentProps<TModel>) => React.ReactElement | null;\n\nexport interface SceneDataState extends SceneObjectState {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler;\n\n /** Subscribe to state changes */\n subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /**\n * Called when the Component is mounted. This will also activate any $data, $variables or $timeRange scene object on this level.\n * Don't override this in your custom SceneObjects, instead use addActivationHandler from the constructor.\n **/\n activate(): CancelActivationHandler;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n\n /** Returns a SceneObjectRef that will resolve to this object */\n getRef(): SceneObjectRef<this>;\n\n /**\n * Allows external code to register code that is executed on activate and deactivate. This allow you\n * to wire up scene objects that need to respond to state changes in other objects from the outside.\n **/\n addActivationHandler(handler: SceneActivationHandler): void;\n\n /**\n * Loop through state and call callback for each direct child scene object.\n * Checks 1 level deep properties and arrays. So a scene object hidden in a nested plain object will not be detected.\n */\n forEachChild(callback: (child: SceneObject) => void): void;\n}\n\nexport type SceneActivationHandler = () => SceneDeactivationHandler | void;\nexport type SceneDeactivationHandler = () => void;\n\n/**\n * Function returned by activate() that when called will deactivate the object if it's the last activator\n **/\nexport type CancelActivationHandler = () => void;\n\nexport interface SceneLayoutState extends SceneObjectState {\n children: SceneObject[];\n}\n\nexport interface SceneLayout<T extends SceneLayoutState = SceneLayoutState> extends SceneObject<T> {\n isDraggable(): boolean;\n getDragClass?(): string;\n getDragClassCancel?(): string;\n}\n\nexport interface SceneTimeRangeState extends SceneObjectState {\n from: string;\n to: string;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n timeZone?: TimeZone;\n /** weekStart will change the global date locale so having multiple different weekStart values is not supported */\n weekStart?: string;\n /**\n * @internal\n * To enable feature parity with the old time range picker, not sure if it will be kept.\n * Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.\n * */\n UNSAFE_nowDelay?: string;\n\n refreshOnActivate?: {\n /**\n * When set, the time range will invalidate relative ranges after the specified interval has elapsed\n */\n afterMs?: number;\n /**\n * When set, the time range will invalidate relative ranges after the specified percentage of the current interval has elapsed.\n * If both invalidate values are set, the smaller value will be used for the given interval.\n */\n percent?: number;\n };\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeZoneChange(timeZone: TimeZone): void;\n onTimeRangeChange(timeRange: TimeRange): void;\n onRefresh(): void;\n getTimeZone(): TimeZone;\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return obj.useState !== undefined;\n}\n\nexport interface SceneObjectWithUrlSync extends SceneObject {\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n shouldCreateHistoryStep?(values: SceneObjectUrlValues): boolean;\n}\n\nexport interface SceneObjectUrlSyncHandler {\n getKeys(): string[];\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n shouldCreateHistoryStep?(values: SceneObjectUrlValues): boolean;\n}\n\nexport interface DataRequestEnricher {\n // Return partial data query request that will be merged with the original request provided by SceneQueryRunner\n enrichDataRequest(source: SceneObject): Partial<DataQueryRequest> | null;\n}\n\nexport interface FiltersRequestEnricher {\n // Return partial getTagKeys or getTagValues query request that will be merged with the original request provided by ad hoc or group by variable\n enrichFiltersRequest(\n source: SceneObject\n ): Partial<DataSourceGetTagKeysOptions | DataSourceGetTagValuesOptions> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport function isFiltersRequestEnricher(obj: any): obj is FiltersRequestEnricher {\n return 'enrichFiltersRequest' in obj;\n}\n\nexport type SceneObjectUrlValue = string | string[] | undefined | null;\nexport type SceneObjectUrlValues = Record<string, SceneObjectUrlValue>;\n\nexport type CustomTransformOperator = (context: DataTransformContext) => MonoTypeOperatorFunction<DataFrame[]>;\nexport type CustomTransformerDefinition =\n | { operator: CustomTransformOperator; topic: DataTopic }\n | CustomTransformOperator;\nexport type SceneStateChangedHandler<TState> = (newState: TState, prevState: TState) => void;\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport interface SceneDataProviderResult {\n data: PanelData;\n origin: SceneDataProvider;\n}\n\nexport interface SceneDataProvider<T extends SceneObjectState = SceneDataState> extends SceneObject<T> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataProviderResult>;\n}\n\nexport interface SceneDataLayerProviderState extends SceneDataState {\n name: string;\n description?: string;\n isEnabled?: boolean;\n isHidden?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneDataProvider<SceneDataLayerProviderState> {\n isDataLayer: true;\n}\n\nexport function isDataLayer(obj: SceneObject): obj is SceneDataLayerProvider {\n return 'isDataLayer' in obj;\n}\n\nexport interface DataLayerFilter {\n panelId: number;\n}\n\nexport interface SceneStatelessBehavior<T extends SceneObject = any> {\n (sceneObject: T): CancelActivationHandler | void;\n}\n\nexport type ControlsLayout = 'horizontal' | 'vertical';\n\nexport interface UseStateHookOptions {\n /**\n * For some edge cases other scene objects want to subscribe to scene object state for objects\n * that are not active, or whose main React Component can be un-mounted. Set this to true\n * to keep the scene object active even if the React component is unmounted.\n *\n * Normally you would not need this but this can be useful in some edge cases.\n *\n * @experimental\n */\n shouldActivateOrKeepAlive?: boolean;\n}\n\nexport interface SceneDataQuery extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\nexport interface SceneUrlSyncOptions {\n /**\n * This will update the url to contain all scene url state\n * when the scene is initialized. Important for browser history \"back\" actions.\n */\n updateUrlOnInit?: boolean;\n /**\n * This is only supported by some objects if they implement\n * shouldCreateHistoryStep where they can control what changes\n * url changes should add a new browser history entry.\n */\n createBrowserHistorySteps?: boolean;\n}\n"],"names":[],"mappings":"AA8KO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,KAAA,CAAA,CAAA;AAC1B,CAAA;AA2BO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA,CAAA;AAChC,CAAA;AAEO,SAAS,yBAAyB,GAAyC,EAAA;AAChF,EAAA,OAAO,sBAA0B,IAAA,GAAA,CAAA;AACnC,CAAA;AAsCO,SAAS,YAAY,GAAiD,EAAA;AAC3E,EAAA,OAAO,aAAiB,IAAA,GAAA,CAAA;AAC1B;;;;"}
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { MonoTypeOperatorFunction, Observable, Unsubscribable } from 'rxjs';\n\nimport {\n BusEvent,\n BusEventHandler,\n BusEventType,\n DataFrame,\n DataQueryRequest,\n DataSourceGetTagKeysOptions,\n DataSourceGetTagValuesOptions,\n DataTransformContext,\n PanelData,\n TimeRange,\n} from '@grafana/data';\nimport { DataQuery, DataTopic, TimeZone } from '@grafana/schema';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\nimport { SceneObjectRef } from './SceneObjectRef';\n\nexport interface SceneObjectState {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneDataProvider;\n $variables?: SceneVariables;\n /**\n * @experimental\n * Can be used to add extra behaviors to a scene object.\n * These are activated when the their parent scene object is activated.\n */\n $behaviors?: Array<SceneObject | SceneStatelessBehavior>;\n}\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n}\n\nexport type SceneComponent<TModel> = (props: SceneComponentProps<TModel>) => React.ReactElement | null;\n\nexport interface SceneDataState extends SceneObjectState {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler;\n\n /** Subscribe to state changes */\n subscribeToState(handler: SceneStateChangedHandler<TState>): Unsubscribable;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /**\n * Called when the Component is mounted. This will also activate any $data, $variables or $timeRange scene object on this level.\n * Don't override this in your custom SceneObjects, instead use addActivationHandler from the constructor.\n **/\n activate(): CancelActivationHandler;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n\n /** Returns a SceneObjectRef that will resolve to this object */\n getRef(): SceneObjectRef<this>;\n\n /**\n * Allows external code to register code that is executed on activate and deactivate. This allow you\n * to wire up scene objects that need to respond to state changes in other objects from the outside.\n **/\n addActivationHandler(handler: SceneActivationHandler): void;\n\n /**\n * Loop through state and call callback for each direct child scene object.\n * Checks 1 level deep properties and arrays. So a scene object hidden in a nested plain object will not be detected.\n */\n forEachChild(callback: (child: SceneObject) => void): void;\n\n /**\n * Useful for edge cases when you want to move a scene object to another parent.\n */\n clearParent(): void;\n}\n\nexport type SceneActivationHandler = () => SceneDeactivationHandler | void;\nexport type SceneDeactivationHandler = () => void;\n\n/**\n * Function returned by activate() that when called will deactivate the object if it's the last activator\n **/\nexport type CancelActivationHandler = () => void;\n\nexport interface SceneLayoutState extends SceneObjectState {\n children: SceneObject[];\n}\n\nexport interface SceneLayout<T extends SceneLayoutState = SceneLayoutState> extends SceneObject<T> {\n isDraggable(): boolean;\n getDragClass?(): string;\n getDragClassCancel?(): string;\n}\n\nexport interface SceneTimeRangeState extends SceneObjectState {\n from: string;\n to: string;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n timeZone?: TimeZone;\n /** weekStart will change the global date locale so having multiple different weekStart values is not supported */\n weekStart?: string;\n /**\n * @internal\n * To enable feature parity with the old time range picker, not sure if it will be kept.\n * Override the now time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values.\n * */\n UNSAFE_nowDelay?: string;\n\n refreshOnActivate?: {\n /**\n * When set, the time range will invalidate relative ranges after the specified interval has elapsed\n */\n afterMs?: number;\n /**\n * When set, the time range will invalidate relative ranges after the specified percentage of the current interval has elapsed.\n * If both invalidate values are set, the smaller value will be used for the given interval.\n */\n percent?: number;\n };\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeZoneChange(timeZone: TimeZone): void;\n onTimeRangeChange(timeRange: TimeRange): void;\n onRefresh(): void;\n getTimeZone(): TimeZone;\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return obj.useState !== undefined;\n}\n\nexport interface SceneObjectWithUrlSync extends SceneObject {\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n shouldCreateHistoryStep?(values: SceneObjectUrlValues): boolean;\n}\n\nexport interface SceneObjectUrlSyncHandler {\n getKeys(): string[];\n getUrlState(): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n shouldCreateHistoryStep?(values: SceneObjectUrlValues): boolean;\n}\n\nexport interface DataRequestEnricher {\n // Return partial data query request that will be merged with the original request provided by SceneQueryRunner\n enrichDataRequest(source: SceneObject): Partial<DataQueryRequest> | null;\n}\n\nexport interface FiltersRequestEnricher {\n // Return partial getTagKeys or getTagValues query request that will be merged with the original request provided by ad hoc or group by variable\n enrichFiltersRequest(\n source: SceneObject\n ): Partial<DataSourceGetTagKeysOptions | DataSourceGetTagValuesOptions> | null;\n}\n\nexport function isDataRequestEnricher(obj: any): obj is DataRequestEnricher {\n return 'enrichDataRequest' in obj;\n}\n\nexport function isFiltersRequestEnricher(obj: any): obj is FiltersRequestEnricher {\n return 'enrichFiltersRequest' in obj;\n}\n\nexport type SceneObjectUrlValue = string | string[] | undefined | null;\nexport type SceneObjectUrlValues = Record<string, SceneObjectUrlValue>;\n\nexport type CustomTransformOperator = (context: DataTransformContext) => MonoTypeOperatorFunction<DataFrame[]>;\nexport type CustomTransformerDefinition =\n | { operator: CustomTransformOperator; topic: DataTopic }\n | CustomTransformOperator;\nexport type SceneStateChangedHandler<TState> = (newState: TState, prevState: TState) => void;\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport interface SceneDataProviderResult {\n data: PanelData;\n origin: SceneDataProvider;\n}\n\nexport interface SceneDataProvider<T extends SceneObjectState = SceneDataState> extends SceneObject<T> {\n setContainerWidth?: (width: number) => void;\n isDataReadyToDisplay?: () => boolean;\n cancelQuery?: () => void;\n getResultsStream(): Observable<SceneDataProviderResult>;\n}\n\nexport interface SceneDataLayerProviderState extends SceneDataState {\n name: string;\n description?: string;\n isEnabled?: boolean;\n isHidden?: boolean;\n}\n\nexport interface SceneDataLayerProvider extends SceneDataProvider<SceneDataLayerProviderState> {\n isDataLayer: true;\n}\n\nexport function isDataLayer(obj: SceneObject): obj is SceneDataLayerProvider {\n return 'isDataLayer' in obj;\n}\n\nexport interface DataLayerFilter {\n panelId: number;\n}\n\nexport interface SceneStatelessBehavior<T extends SceneObject = any> {\n (sceneObject: T): CancelActivationHandler | void;\n}\n\nexport type ControlsLayout = 'horizontal' | 'vertical';\n\nexport interface UseStateHookOptions {\n /**\n * For some edge cases other scene objects want to subscribe to scene object state for objects\n * that are not active, or whose main React Component can be un-mounted. Set this to true\n * to keep the scene object active even if the React component is unmounted.\n *\n * Normally you would not need this but this can be useful in some edge cases.\n *\n * @experimental\n */\n shouldActivateOrKeepAlive?: boolean;\n}\n\nexport interface SceneDataQuery extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\nexport interface SceneUrlSyncOptions {\n /**\n * This will update the url to contain all scene url state\n * when the scene is initialized. Important for browser history \"back\" actions.\n */\n updateUrlOnInit?: boolean;\n /**\n * This is only supported by some objects if they implement\n * shouldCreateHistoryStep where they can control what changes\n * url changes should add a new browser history entry.\n */\n createBrowserHistorySteps?: boolean;\n}\n"],"names":[],"mappings":"AAmLO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,KAAA,CAAA,CAAA;AAC1B,CAAA;AA2BO,SAAS,sBAAsB,GAAsC,EAAA;AAC1E,EAAA,OAAO,mBAAuB,IAAA,GAAA,CAAA;AAChC,CAAA;AAEO,SAAS,yBAAyB,GAAyC,EAAA;AAChF,EAAA,OAAO,sBAA0B,IAAA,GAAA,CAAA;AACnC,CAAA;AAsCO,SAAS,YAAY,GAAiD,EAAA;AAC3E,EAAA,OAAO,aAAiB,IAAA,GAAA,CAAA;AAC1B;;;;"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AdHocFiltersCombobox.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FloatingFocusManager, FloatingPortal, UseFloatingOptions } from '@floating-ui/react';\nimport { Spinner, Text, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isMultiValueOperator } from '../AdHocFiltersVariable';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n DropdownItem,\n LoadingOptionsPlaceholder,\n MultiValueApplyButton,\n NoOptionsPlaceholder,\n OptionsErrorPlaceholder,\n} from './DropdownItem';\nimport {\n ERROR_STATE_DROPDOWN_WIDTH,\n flattenOptionGroups,\n fuzzySearchOptions,\n generateFilterUpdatePayload,\n generatePlaceholder,\n populateInputValueOnInputTypeSwitch,\n setupDropdownAccessibility,\n switchInputType,\n switchToNextInputType,\n VIRTUAL_LIST_ITEM_HEIGHT,\n VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION,\n VIRTUAL_LIST_OVERSCAN,\n} from './utils';\nimport { handleOptionGroups } from '../../utils';\nimport { useFloatingInteractions, MAX_MENU_HEIGHT } from './useFloatingInteractions';\nimport { MultiValuePill } from './MultiValuePill';\n\ninterface AdHocComboboxProps {\n filter?: AdHocFilterWithLabels;\n isAlwaysWip?: boolean;\n model: AdHocFiltersVariable;\n handleChangeViewMode?: (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => void;\n focusOnWipInputRef?: () => void;\n populateInputOnEdit?: boolean;\n}\n\nexport type AdHocInputType = 'key' | 'operator' | 'value';\n\nexport const AdHocCombobox = forwardRef(function AdHocCombobox(\n { filter, model, isAlwaysWip, handleChangeViewMode, focusOnWipInputRef, populateInputOnEdit }: AdHocComboboxProps,\n parentRef\n) {\n const [open, setOpen] = useState(false);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>([]);\n const [optionsLoading, setOptionsLoading] = useState<boolean>(false);\n const [optionsError, setOptionsError] = useState<boolean>(false);\n const [inputValue, setInputValue] = useState('');\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [filterInputType, setInputType] = useState<AdHocInputType>(!isAlwaysWip ? 'value' : 'key');\n const styles = useStyles2(getStyles);\n // control multi values with local state in order to commit all values at once and avoid _wip reset mid creation\n const [filterMultiValues, setFilterMultiValues] = useState<Array<SelectableValue<string>>>([]);\n const [_, setForceRefresh] = useState({});\n const allowCustomValue = model.state.allowCustomValue ?? true;\n\n const multiValuePillWrapperRef = useRef<HTMLDivElement>(null);\n\n const hasMultiValueOperator = isMultiValueOperator(filter?.operator || '');\n const isMultiValueEdit = hasMultiValueOperator && filterInputType === 'value';\n\n // used to identify operator element and prevent dismiss because it registers as outside click\n const operatorIdentifier = useId();\n\n const listRef = useRef<Array<HTMLElement | null>>([]);\n const disabledIndicesRef = useRef<number[]>([]);\n\n const optionsSearcher = useMemo(() => fuzzySearchOptions(options), [options]);\n\n const isLastFilter = useMemo(() => {\n if (isAlwaysWip) {\n return false;\n }\n\n if (model.state.filters.at(-1) === filter) {\n return true;\n }\n return false;\n }, [filter, isAlwaysWip, model.state.filters]);\n\n // reset wip filter. Used when navigating away with incomplete wip filer or when selecting wip filter value\n const handleResetWip = useCallback(() => {\n if (isAlwaysWip) {\n model._addWip();\n setInputType('key');\n setInputValue('');\n }\n }, [model, isAlwaysWip]);\n\n const handleMultiValueFilterCommit = useCallback(\n (\n model: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels,\n filterMultiValues: Array<SelectableValue<string>>,\n preventFocus?: boolean\n ) => {\n if (filterMultiValues.length) {\n const valueLabels: string[] = [];\n const values: string[] = [];\n filterMultiValues.forEach((item) => {\n valueLabels.push(item.label ?? item.value!);\n values.push(item.value!);\n });\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n model._updateFilter(filter!, { valueLabels, values, value: values[0] });\n setFilterMultiValues([]);\n }\n if (!preventFocus) {\n setTimeout(() => refs.domReference.current?.focus());\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const handleLocalMultiValueChange = useCallback((selectedItem: SelectableValue<string>) => {\n setFilterMultiValues((items) => {\n if (items.some((item) => item.value === selectedItem.value)) {\n return items.filter((item) => item.value !== selectedItem.value);\n }\n return [...items, selectedItem];\n });\n }, []);\n\n const onOpenChange = useCallback<NonNullable<UseFloatingOptions['onOpenChange']>>(\n (nextOpen, _, reason) => {\n setOpen(nextOpen);\n // change from filter edit mode to filter view mode when clicked\n // outside input or dropdown\n\n if (reason && ['outside-press', 'escape-key'].includes(reason)) {\n if (isMultiValueEdit) {\n // commit multi value filter values on escape and click-away\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }\n handleResetWip();\n handleChangeViewMode?.();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n isMultiValueEdit,\n model,\n ]\n );\n\n // generate ids from multi values in order to prevent outside click based on those ids\n const outsidePressIdsToIgnore = useMemo(() => {\n return [\n operatorIdentifier,\n ...filterMultiValues.reduce<string[]>(\n (acc, item, i) => [...acc, `${item.value}-${i}`, `${item.value}-${i}-close-icon`],\n []\n ),\n ];\n }, [operatorIdentifier, filterMultiValues]);\n\n const { refs, floatingStyles, context, getReferenceProps, getFloatingProps, getItemProps } = useFloatingInteractions({\n open,\n onOpenChange,\n activeIndex,\n setActiveIndex,\n outsidePressIdsToIgnore,\n listRef,\n disabledIndicesRef,\n });\n\n // pass ability to focus on input element back to parent\n // parentRef is coming from AdHocFiltersComboboxRenderer\n useImperativeHandle(parentRef, () => () => refs.domReference.current?.focus(), [refs.domReference]);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>) {\n const value = event.target.value;\n setInputValue(value);\n setActiveIndex(0);\n }\n\n const handleRemoveMultiValue = useCallback(\n (item: SelectableValue<string>) => {\n setFilterMultiValues((selected) => selected.filter((option) => option.value !== item.value));\n setTimeout(() => refs.domReference.current?.focus());\n },\n [refs.domReference]\n );\n\n // operation order on fetched options:\n // fuzzy search -> extract into groups -> flatten group labels and options\n const filteredDropDownItems = flattenOptionGroups(handleOptionGroups(optionsSearcher(inputValue, filterInputType)));\n\n // adding custom option this way so that virtualiser is aware of it and can scroll to\n if (allowCustomValue && filterInputType !== 'operator' && inputValue) {\n filteredDropDownItems.push({\n value: inputValue.trim(),\n label: inputValue.trim(),\n isCustom: true,\n });\n }\n\n // calculate width and populate listRef and disabledIndicesRef for arrow key navigation\n const maxOptionWidth = setupDropdownAccessibility(filteredDropDownItems, listRef, disabledIndicesRef);\n\n const handleFetchOptions = useCallback(\n async (inputType: AdHocInputType) => {\n setOptionsError(false);\n setOptionsLoading(true);\n setOptions([]);\n let options: Array<SelectableValue<string>> = [];\n try {\n if (inputType === 'key') {\n options = await model._getKeys(null);\n } else if (inputType === 'operator') {\n options = model._getOperators();\n } else if (inputType === 'value') {\n options = await model._getValuesFor(filter!);\n }\n\n setOptions(options);\n if (options[0]?.group) {\n setActiveIndex(1);\n } else {\n setActiveIndex(0);\n }\n } catch (e) {\n setOptionsError(true);\n }\n setOptionsLoading(false);\n },\n [filter, model]\n );\n\n const rowVirtualizer = useVirtualizer({\n count: filteredDropDownItems.length,\n getScrollElement: () => refs.floating.current,\n estimateSize: (index) =>\n filteredDropDownItems[index].description ? VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION : VIRTUAL_LIST_ITEM_HEIGHT,\n overscan: VIRTUAL_LIST_OVERSCAN,\n });\n\n //\n // Keyboard interactions\n //\n\n const handleBackspaceInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit: boolean) => {\n if (event.key === 'Backspace' && !inputValue) {\n if (filterInputType === 'value') {\n if (multiValueEdit) {\n if (filterMultiValues.length) {\n setFilterMultiValues((items) => {\n const updated = [...items];\n updated.splice(-1, 1);\n\n return updated;\n });\n return;\n }\n }\n setInputType('operator');\n return;\n }\n\n // focus back on alway wip input when you delete filter with backspace\n focusOnWipInputRef?.();\n\n model._handleComboboxBackspace(filter!);\n\n if (isAlwaysWip) {\n handleResetWip();\n }\n }\n },\n [\n inputValue,\n filterInputType,\n model,\n filter,\n isAlwaysWip,\n filterMultiValues.length,\n handleResetWip,\n focusOnWipInputRef,\n ]\n );\n\n const handleTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n // change filter to view mode when navigating away with Tab key\n // this is needed because useDismiss only reacts to mousedown\n if (event.key === 'Tab' && !event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n refs.domReference.current?.focus();\n }\n\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n model,\n refs.domReference,\n ]\n );\n\n const handleShiftTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Tab' && event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on shift tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues, true);\n }\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [filter, filterMultiValues, handleChangeViewMode, handleMultiValueFilterCommit, handleResetWip, model]\n );\n\n const handleEnterInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Enter' && activeIndex != null) {\n // safeguard for non existing items\n // note: custom item is added to filteredDropDownItems if allowed\n if (!filteredDropDownItems[activeIndex]) {\n return;\n }\n const selectedItem = filteredDropDownItems[activeIndex];\n\n if (multiValueEdit) {\n handleLocalMultiValueChange(selectedItem);\n setInputValue('');\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item: selectedItem,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // preventing focus on filter pill only when last filter for better backspace experience\n isLastFilter ? false : undefined\n );\n setActiveIndex(null);\n if (isLastFilter) {\n focusOnWipInputRef?.();\n }\n }\n }\n },\n [\n activeIndex,\n filteredDropDownItems,\n handleLocalMultiValueChange,\n model,\n filter,\n filterInputType,\n populateInputOnEdit,\n handleChangeViewMode,\n refs.domReference,\n isLastFilter,\n focusOnWipInputRef,\n ]\n );\n\n const handleEditMultiValuePill = useCallback(\n (value: SelectableValue<string>) => {\n const valueLabel = value.label || value.value!;\n setFilterMultiValues((prev) => prev.filter((item) => item.value !== value.value));\n setInputValue(valueLabel);\n refs.domReference.current?.focus();\n },\n [refs.domReference]\n );\n\n //\n // Effects\n //\n\n useEffect(() => {\n // fetch options when dropdown is opened.\n if (open) {\n handleFetchOptions(filterInputType);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, filterInputType]);\n\n // when not in wip mode this is the point of switching from view to edit mode\n // and in this case we default to 'value' input type and focus input\n useEffect(() => {\n if (!isAlwaysWip) {\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n if (hasMultiValueOperator && filter?.values?.length) {\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n const multiValueOptions = (filter.values as string[]).reduce<Array<SelectableValue<string>>>(\n (acc, value, i) => [\n ...acc,\n {\n label: filter.valueLabels?.[i] || value,\n value: value,\n },\n ],\n []\n );\n // populate filter multi values to local state on pill edit enter\n setFilterMultiValues(multiValueOptions);\n }\n\n // populate input when selecting pill for edit\n // this avoids populating input during delete with backspace\n if (!hasMultiValueOperator && populateInputOnEdit) {\n setInputValue(filter?.value || '');\n }\n\n refs.domReference.current?.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // this is required only with multi value select in order to update position\n // of the multi value apply button\n useEffect(() => {\n if (isMultiValueEdit && filterMultiValues) {\n setTimeout(() => setForceRefresh({}));\n }\n }, [filterMultiValues, isMultiValueEdit]);\n\n useLayoutEffect(() => {\n // this is needed to scroll virtual list to the position of currently selected\n // dropdown item when navigating with arrow up/down keys to end/start of list\n if (\n activeIndex !== null &&\n rowVirtualizer.range &&\n (activeIndex > rowVirtualizer.range?.endIndex || activeIndex < rowVirtualizer.range?.startIndex)\n ) {\n rowVirtualizer.scrollToIndex(activeIndex);\n }\n }, [activeIndex, rowVirtualizer]);\n\n const keyLabel = filter?.keyLabel ?? filter?.key;\n\n return (\n <div className={styles.comboboxWrapper}>\n {filter ? (\n <div className={styles.pillWrapper}>\n {/* Filter key pill render */}\n {filter?.key ? <div className={cx(styles.basePill, styles.keyPill)}>{keyLabel}</div> : null}\n {/* Filter operator pill render */}\n {filter?.key && filter?.operator && filterInputType !== 'operator' ? (\n <div\n id={operatorIdentifier}\n className={cx(styles.basePill, styles.operatorPill, operatorIdentifier)}\n role=\"button\"\n aria-label=\"Edit filter operator\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }}\n onKeyDown={(event) => {\n handleShiftTabInput(event, hasMultiValueOperator);\n if (event.key === 'Enter') {\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }\n }}\n >\n {filter.operator}\n </div>\n ) : null}\n\n <div ref={multiValuePillWrapperRef}></div>\n {isMultiValueEdit\n ? filterMultiValues.map((item, i) => (\n <MultiValuePill\n key={`${item.value}-${i}`}\n item={item}\n index={i}\n handleRemoveMultiValue={handleRemoveMultiValue}\n handleEditMultiValuePill={handleEditMultiValuePill}\n />\n ))\n : null}\n </div>\n ) : null}\n\n <input\n {...getReferenceProps({\n ref: refs.setReference,\n onChange,\n value: inputValue,\n // dynamic placeholder to display operator and/or value in filter edit mode\n placeholder: generatePlaceholder(filter!, filterInputType, isMultiValueEdit, isAlwaysWip),\n 'aria-autocomplete': 'list',\n onKeyDown(event) {\n if (!open) {\n setOpen(true);\n return;\n }\n\n if (filterInputType === 'operator') {\n handleShiftTabInput(event);\n }\n handleBackspaceInput(event, isMultiValueEdit);\n handleTabInput(event, isMultiValueEdit);\n handleEnterInput(event, isMultiValueEdit);\n },\n })}\n className={cx(styles.inputStyle, { [styles.loadingInputPadding]: !optionsLoading })}\n onClick={(event) => {\n event.stopPropagation();\n setOpen(true);\n }}\n onFocus={() => {\n setActiveIndex(0);\n setOpen(true);\n }}\n />\n {optionsLoading ? <Spinner className={styles.loadingIndicator} inline={true} /> : null}\n <FloatingPortal>\n {open && (\n <FloatingFocusManager context={context} initialFocus={-1} visuallyHiddenDismiss modal={false}>\n <>\n <div\n style={{\n ...floatingStyles,\n width: `${optionsError ? ERROR_STATE_DROPDOWN_WIDTH : maxOptionWidth}px`,\n transform: isMultiValueEdit\n ? `translate(${multiValuePillWrapperRef.current?.getBoundingClientRect().left || 0}px, ${\n (refs.domReference.current?.getBoundingClientRect().bottom || 0) + 10\n }px )`\n : floatingStyles.transform,\n }}\n ref={refs.setFloating}\n className={styles.dropdownWrapper}\n tabIndex={-1}\n >\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize() || VIRTUAL_LIST_ITEM_HEIGHT}px`, // fallback to 38px for loading/error/no options placeholders\n }}\n {...getFloatingProps()}\n tabIndex={-1}\n >\n {optionsLoading ? (\n <LoadingOptionsPlaceholder />\n ) : optionsError ? (\n <OptionsErrorPlaceholder handleFetchOptions={() => handleFetchOptions(filterInputType)} />\n ) : !filteredDropDownItems.length &&\n (!allowCustomValue || filterInputType === 'operator' || !inputValue) ? (\n <NoOptionsPlaceholder />\n ) : (\n rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const item = filteredDropDownItems[virtualItem.index];\n const index = virtualItem.index;\n\n // render group label\n if (item.options) {\n return (\n <div\n key={`${item.label}+${index}`}\n className={cx(styles.optionGroupLabel, styles.groupTopBorder)}\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n {item.label!}\n </Text>\n </div>\n );\n }\n\n const nextItem: SelectableValue<string> | undefined =\n filteredDropDownItems[virtualItem.index + 1];\n const shouldAddBottomBorder = nextItem && !nextItem.group && !nextItem.options && item.group;\n\n return (\n // key is included in getItemProps()\n // eslint-disable-next-line react/jsx-key\n <DropdownItem\n {...getItemProps({\n key: `${item.value!}-${index}`,\n ref(node) {\n listRef.current[index] = node;\n },\n onClick(event) {\n if (filterInputType !== 'value') {\n event.stopPropagation();\n }\n if (isMultiValueEdit) {\n event.preventDefault();\n event.stopPropagation();\n handleLocalMultiValueChange(item);\n setInputValue('');\n refs.domReference.current?.focus();\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // explicitly preventing focus on filter pill due to a11y error\n false\n );\n }\n },\n })}\n active={activeIndex === index}\n addGroupBottomBorder={shouldAddBottomBorder}\n // virtual item positioning and accessibility\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n aria-setsize={filteredDropDownItems.length}\n aria-posinset={virtualItem.index + 1}\n isMultiValueEdit={isMultiValueEdit}\n checked={filterMultiValues.some((val) => val.value === item.value)}\n >\n <span>\n {item.isCustom ? 'Use custom value: ' : ''} {item.label ?? item.value}\n </span>\n {item.description ? <div className={styles.descriptionText}>{item.description}</div> : null}\n </DropdownItem>\n );\n })\n )}\n </div>\n </div>\n {isMultiValueEdit && !optionsLoading && !optionsError && filteredDropDownItems.length ? (\n <MultiValueApplyButton\n onApply={() => {\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }}\n floatingElement={refs.floating.current}\n maxOptionWidth={maxOptionWidth}\n menuHeight={Math.min(rowVirtualizer.getTotalSize(), MAX_MENU_HEIGHT)}\n />\n ) : null}\n </>\n </FloatingFocusManager>\n )}\n </FloatingPortal>\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n }),\n pillWrapper: css({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }),\n basePill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.disabledBackground,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 1, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n cursor: 'pointer',\n }),\n keyPill: css({\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'default',\n }),\n operatorPill: css({\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n dropdownWrapper: css({\n backgroundColor: theme.colors.background.primary,\n color: theme.colors.text.primary,\n boxShadow: theme.shadows.z2,\n overflowY: 'auto',\n zIndex: theme.zIndex.dropdown,\n }),\n inputStyle: css({\n paddingBlock: 0,\n '&:focus': {\n outline: 'none',\n },\n }),\n loadingIndicator: css({\n color: theme.colors.text.secondary,\n marginLeft: theme.spacing(0.5),\n }),\n loadingInputPadding: css({\n paddingRight: theme.spacing(2.5),\n }),\n optionGroupLabel: css({\n padding: theme.spacing(1),\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n }),\n groupTopBorder: css({\n '&:not(:first-child)': {\n borderTop: `1px solid ${theme.colors.border.weak}`,\n },\n }),\n descriptionText: css({\n ...theme.typography.bodySmall,\n color: theme.colors.text.secondary,\n paddingTop: theme.spacing(0.5),\n }),\n});\n"],"names":["AdHocCombobox","model","filter","filterMultiValues","_a","_","options","_b"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"AdHocFiltersCombobox.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { FloatingFocusManager, FloatingPortal, UseFloatingOptions } from '@floating-ui/react';\nimport { Spinner, Text, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { AdHocFilterWithLabels, AdHocFiltersVariable, isMultiValueOperator } from '../AdHocFiltersVariable';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n DropdownItem,\n LoadingOptionsPlaceholder,\n MultiValueApplyButton,\n NoOptionsPlaceholder,\n OptionsErrorPlaceholder,\n} from './DropdownItem';\nimport {\n ERROR_STATE_DROPDOWN_WIDTH,\n flattenOptionGroups,\n fuzzySearchOptions,\n generateFilterUpdatePayload,\n generatePlaceholder,\n populateInputValueOnInputTypeSwitch,\n setupDropdownAccessibility,\n switchInputType,\n switchToNextInputType,\n VIRTUAL_LIST_ITEM_HEIGHT,\n VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION,\n VIRTUAL_LIST_OVERSCAN,\n} from './utils';\nimport { handleOptionGroups } from '../../utils';\nimport { useFloatingInteractions, MAX_MENU_HEIGHT } from './useFloatingInteractions';\nimport { MultiValuePill } from './MultiValuePill';\n\ninterface AdHocComboboxProps {\n filter?: AdHocFilterWithLabels;\n isAlwaysWip?: boolean;\n model: AdHocFiltersVariable;\n handleChangeViewMode?: (event?: React.MouseEvent, shouldFocusOnPillWrapperOverride?: boolean) => void;\n focusOnWipInputRef?: () => void;\n populateInputOnEdit?: boolean;\n}\n\nexport type AdHocInputType = 'key' | 'operator' | 'value';\n\nexport const AdHocCombobox = forwardRef(function AdHocCombobox(\n { filter, model, isAlwaysWip, handleChangeViewMode, focusOnWipInputRef, populateInputOnEdit }: AdHocComboboxProps,\n parentRef\n) {\n const [open, setOpen] = useState(false);\n const [options, setOptions] = useState<Array<SelectableValue<string>>>([]);\n const [optionsLoading, setOptionsLoading] = useState<boolean>(false);\n const [optionsError, setOptionsError] = useState<boolean>(false);\n const [inputValue, setInputValue] = useState('');\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [filterInputType, setInputType] = useState<AdHocInputType>(!isAlwaysWip ? 'value' : 'key');\n const styles = useStyles2(getStyles);\n // control multi values with local state in order to commit all values at once and avoid _wip reset mid creation\n const [filterMultiValues, setFilterMultiValues] = useState<Array<SelectableValue<string>>>([]);\n const [_, setForceRefresh] = useState({});\n const allowCustomValue = model.state.allowCustomValue ?? true;\n\n const multiValuePillWrapperRef = useRef<HTMLDivElement>(null);\n\n const hasMultiValueOperator = isMultiValueOperator(filter?.operator || '');\n const isMultiValueEdit = hasMultiValueOperator && filterInputType === 'value';\n\n // used to identify operator element and prevent dismiss because it registers as outside click\n const operatorIdentifier = useId();\n\n const listRef = useRef<Array<HTMLElement | null>>([]);\n const disabledIndicesRef = useRef<number[]>([]);\n\n const optionsSearcher = useMemo(() => fuzzySearchOptions(options), [options]);\n\n const isLastFilter = useMemo(() => {\n if (isAlwaysWip) {\n return false;\n }\n\n if (model.state.filters.at(-1) === filter) {\n return true;\n }\n return false;\n }, [filter, isAlwaysWip, model.state.filters]);\n\n // reset wip filter. Used when navigating away with incomplete wip filer or when selecting wip filter value\n const handleResetWip = useCallback(() => {\n if (isAlwaysWip) {\n model._addWip();\n setInputType('key');\n setInputValue('');\n }\n }, [model, isAlwaysWip]);\n\n const handleMultiValueFilterCommit = useCallback(\n (\n model: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels,\n filterMultiValues: Array<SelectableValue<string>>,\n preventFocus?: boolean\n ) => {\n if (filterMultiValues.length) {\n const valueLabels: string[] = [];\n const values: string[] = [];\n filterMultiValues.forEach((item) => {\n valueLabels.push(item.label ?? item.value!);\n values.push(item.value!);\n });\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n model._updateFilter(filter!, { valueLabels, values, value: values[0] });\n setFilterMultiValues([]);\n }\n if (!preventFocus) {\n setTimeout(() => refs.domReference.current?.focus());\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const handleLocalMultiValueChange = useCallback((selectedItem: SelectableValue<string>) => {\n setFilterMultiValues((items) => {\n if (items.some((item) => item.value === selectedItem.value)) {\n return items.filter((item) => item.value !== selectedItem.value);\n }\n return [...items, selectedItem];\n });\n }, []);\n\n const onOpenChange = useCallback<NonNullable<UseFloatingOptions['onOpenChange']>>(\n (nextOpen, _, reason) => {\n setOpen(nextOpen);\n // change from filter edit mode to filter view mode when clicked\n // outside input or dropdown\n\n if (reason && ['outside-press', 'escape-key'].includes(reason)) {\n if (isMultiValueEdit) {\n // commit multi value filter values on escape and click-away\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }\n handleResetWip();\n handleChangeViewMode?.();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n isMultiValueEdit,\n model,\n ]\n );\n\n // generate ids from multi values in order to prevent outside click based on those ids\n const outsidePressIdsToIgnore = useMemo(() => {\n return [\n operatorIdentifier,\n ...filterMultiValues.reduce<string[]>(\n (acc, item, i) => [...acc, `${item.value}-${i}`, `${item.value}-${i}-close-icon`],\n []\n ),\n ];\n }, [operatorIdentifier, filterMultiValues]);\n\n const { refs, floatingStyles, context, getReferenceProps, getFloatingProps, getItemProps } = useFloatingInteractions({\n open,\n onOpenChange,\n activeIndex,\n setActiveIndex,\n outsidePressIdsToIgnore,\n listRef,\n disabledIndicesRef,\n });\n\n // pass ability to focus on input element back to parent\n // parentRef is coming from AdHocFiltersComboboxRenderer\n useImperativeHandle(parentRef, () => () => refs.domReference.current?.focus(), [refs.domReference]);\n\n function onChange(event: React.ChangeEvent<HTMLInputElement>) {\n const value = event.target.value;\n setInputValue(value);\n setActiveIndex(0);\n }\n\n const handleRemoveMultiValue = useCallback(\n (item: SelectableValue<string>) => {\n setFilterMultiValues((selected) => selected.filter((option) => option.value !== item.value));\n setTimeout(() => refs.domReference.current?.focus());\n },\n [refs.domReference]\n );\n\n // operation order on fetched options:\n // fuzzy search -> extract into groups -> flatten group labels and options\n const filteredDropDownItems = flattenOptionGroups(handleOptionGroups(optionsSearcher(inputValue, filterInputType)));\n\n // adding custom option this way so that virtualiser is aware of it and can scroll to\n if (allowCustomValue && filterInputType !== 'operator' && inputValue) {\n filteredDropDownItems.push({\n value: inputValue.trim(),\n label: inputValue.trim(),\n isCustom: true,\n });\n }\n\n // calculate width and populate listRef and disabledIndicesRef for arrow key navigation\n const maxOptionWidth = setupDropdownAccessibility(filteredDropDownItems, listRef, disabledIndicesRef);\n\n const handleFetchOptions = useCallback(\n async (inputType: AdHocInputType) => {\n setOptionsError(false);\n setOptionsLoading(true);\n setOptions([]);\n let options: Array<SelectableValue<string>> = [];\n try {\n if (inputType === 'key') {\n options = await model._getKeys(null);\n } else if (inputType === 'operator') {\n options = model._getOperators();\n } else if (inputType === 'value') {\n options = await model._getValuesFor(filter!);\n }\n\n setOptions(options);\n if (options[0]?.group) {\n setActiveIndex(1);\n } else {\n setActiveIndex(0);\n }\n } catch (e) {\n setOptionsError(true);\n }\n setOptionsLoading(false);\n },\n [filter, model]\n );\n\n const rowVirtualizer = useVirtualizer({\n count: filteredDropDownItems.length,\n getScrollElement: () => refs.floating.current,\n estimateSize: (index) =>\n filteredDropDownItems[index].description ? VIRTUAL_LIST_ITEM_HEIGHT_WITH_DESCRIPTION : VIRTUAL_LIST_ITEM_HEIGHT,\n overscan: VIRTUAL_LIST_OVERSCAN,\n });\n\n //\n // Keyboard interactions\n //\n\n const handleBackspaceInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit: boolean) => {\n if (event.key === 'Backspace' && !inputValue) {\n if (filterInputType === 'value') {\n if (multiValueEdit) {\n if (filterMultiValues.length) {\n setFilterMultiValues((items) => {\n const updated = [...items];\n updated.splice(-1, 1);\n\n return updated;\n });\n return;\n }\n }\n setInputType('operator');\n return;\n }\n\n // focus back on alway wip input when you delete filter with backspace\n focusOnWipInputRef?.();\n\n model._handleComboboxBackspace(filter!);\n\n if (isAlwaysWip) {\n handleResetWip();\n }\n }\n },\n [\n inputValue,\n filterInputType,\n model,\n filter,\n isAlwaysWip,\n filterMultiValues.length,\n handleResetWip,\n focusOnWipInputRef,\n ]\n );\n\n const handleTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n // change filter to view mode when navigating away with Tab key\n // this is needed because useDismiss only reacts to mousedown\n if (event.key === 'Tab' && !event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n refs.domReference.current?.focus();\n }\n\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [\n filter,\n filterMultiValues,\n handleChangeViewMode,\n handleMultiValueFilterCommit,\n handleResetWip,\n model,\n refs.domReference,\n ]\n );\n\n const handleShiftTabInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Tab' && event.shiftKey) {\n if (multiValueEdit) {\n // commit multi value filter values on shift tab away\n event.preventDefault();\n handleMultiValueFilterCommit(model, filter!, filterMultiValues, true);\n }\n handleChangeViewMode?.();\n handleResetWip();\n }\n },\n [filter, filterMultiValues, handleChangeViewMode, handleMultiValueFilterCommit, handleResetWip, model]\n );\n\n const handleEnterInput = useCallback(\n (event: React.KeyboardEvent, multiValueEdit?: boolean) => {\n if (event.key === 'Enter' && activeIndex != null) {\n // safeguard for non existing items\n // note: custom item is added to filteredDropDownItems if allowed\n if (!filteredDropDownItems[activeIndex]) {\n return;\n }\n const selectedItem = filteredDropDownItems[activeIndex];\n\n if (multiValueEdit) {\n handleLocalMultiValueChange(selectedItem);\n setInputValue('');\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item: selectedItem,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item: selectedItem,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // preventing focus on filter pill only when last filter for better backspace experience\n isLastFilter ? false : undefined\n );\n setActiveIndex(null);\n if (isLastFilter) {\n focusOnWipInputRef?.();\n }\n }\n }\n },\n [\n activeIndex,\n filteredDropDownItems,\n handleLocalMultiValueChange,\n model,\n filter,\n filterInputType,\n populateInputOnEdit,\n handleChangeViewMode,\n refs.domReference,\n isLastFilter,\n focusOnWipInputRef,\n ]\n );\n\n const handleEditMultiValuePill = useCallback(\n (value: SelectableValue<string>) => {\n const valueLabel = value.label || value.value!;\n setFilterMultiValues((prev) => prev.filter((item) => item.value !== value.value));\n setInputValue(valueLabel);\n refs.domReference.current?.focus();\n },\n [refs.domReference]\n );\n\n //\n // Effects\n //\n\n useEffect(() => {\n // fetch options when dropdown is opened.\n if (open) {\n handleFetchOptions(filterInputType);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, filterInputType]);\n\n // when not in wip mode this is the point of switching from view to edit mode\n // and in this case we default to 'value' input type and focus input\n useEffect(() => {\n if (!isAlwaysWip) {\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n if (hasMultiValueOperator && filter?.values?.length) {\n // TODO remove when we're on the latest version of @grafana/data\n //@ts-expect-error\n const multiValueOptions = (filter.values as string[]).reduce<Array<SelectableValue<string>>>(\n (acc, value, i) => [\n ...acc,\n {\n label: filter.valueLabels?.[i] || value,\n value: value,\n },\n ],\n []\n );\n // populate filter multi values to local state on pill edit enter\n setFilterMultiValues(multiValueOptions);\n }\n\n // populate input when selecting pill for edit\n // this avoids populating input during delete with backspace\n if (!hasMultiValueOperator && populateInputOnEdit) {\n setInputValue(filter?.value || '');\n }\n\n refs.domReference.current?.focus();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // this is required only with multi value select in order to update position\n // of the multi value apply button\n useEffect(() => {\n if (isMultiValueEdit && filterMultiValues) {\n setTimeout(() => setForceRefresh({}));\n }\n }, [filterMultiValues, isMultiValueEdit]);\n\n useLayoutEffect(() => {\n // this is needed to scroll virtual list to the position of currently selected\n // dropdown item when navigating with arrow up/down keys to end/start of list\n if (\n activeIndex !== null &&\n rowVirtualizer.range &&\n (activeIndex > rowVirtualizer.range?.endIndex || activeIndex < rowVirtualizer.range?.startIndex)\n ) {\n rowVirtualizer.scrollToIndex(activeIndex);\n }\n }, [activeIndex, rowVirtualizer]);\n\n const keyLabel = filter?.keyLabel ?? filter?.key;\n\n return (\n <div className={styles.comboboxWrapper}>\n {filter ? (\n <div className={styles.pillWrapper}>\n {/* Filter key pill render */}\n {filter?.key ? <div className={cx(styles.basePill, styles.keyPill)}>{keyLabel}</div> : null}\n {/* Filter operator pill render */}\n {filter?.key && filter?.operator && filterInputType !== 'operator' ? (\n <div\n id={operatorIdentifier}\n className={cx(styles.basePill, styles.operatorPill, operatorIdentifier)}\n role=\"button\"\n aria-label=\"Edit filter operator\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }}\n onKeyDown={(event) => {\n handleShiftTabInput(event, hasMultiValueOperator);\n if (event.key === 'Enter') {\n setInputValue('');\n switchInputType('operator', setInputType, undefined, refs.domReference.current);\n }\n }}\n >\n {filter.operator}\n </div>\n ) : null}\n\n <div ref={multiValuePillWrapperRef}></div>\n {isMultiValueEdit\n ? filterMultiValues.map((item, i) => (\n <MultiValuePill\n key={`${item.value}-${i}`}\n item={item}\n index={i}\n handleRemoveMultiValue={handleRemoveMultiValue}\n handleEditMultiValuePill={handleEditMultiValuePill}\n />\n ))\n : null}\n </div>\n ) : null}\n\n <input\n {...getReferenceProps({\n ref: refs.setReference,\n onChange,\n value: inputValue,\n // dynamic placeholder to display operator and/or value in filter edit mode\n placeholder: generatePlaceholder(filter!, filterInputType, isMultiValueEdit, isAlwaysWip),\n 'aria-autocomplete': 'list',\n onKeyDown(event) {\n if (!open) {\n setOpen(true);\n return;\n }\n\n if (filterInputType === 'operator') {\n handleShiftTabInput(event);\n }\n handleBackspaceInput(event, isMultiValueEdit);\n handleTabInput(event, isMultiValueEdit);\n handleEnterInput(event, isMultiValueEdit);\n },\n })}\n className={cx(styles.inputStyle, { [styles.loadingInputPadding]: !optionsLoading })}\n onClick={(event) => {\n event.stopPropagation();\n setOpen(true);\n }}\n onFocus={() => {\n setOpen(true);\n }}\n />\n {optionsLoading ? <Spinner className={styles.loadingIndicator} inline={true} /> : null}\n <FloatingPortal>\n {open && (\n <FloatingFocusManager context={context} initialFocus={-1} visuallyHiddenDismiss modal={false}>\n <>\n <div\n style={{\n ...floatingStyles,\n width: `${optionsError ? ERROR_STATE_DROPDOWN_WIDTH : maxOptionWidth}px`,\n transform: isMultiValueEdit\n ? `translate(${multiValuePillWrapperRef.current?.getBoundingClientRect().left || 0}px, ${\n (refs.domReference.current?.getBoundingClientRect().bottom || 0) + 10\n }px )`\n : floatingStyles.transform,\n }}\n ref={refs.setFloating}\n className={styles.dropdownWrapper}\n tabIndex={-1}\n >\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize() || VIRTUAL_LIST_ITEM_HEIGHT}px`, // fallback to 38px for loading/error/no options placeholders\n }}\n {...getFloatingProps()}\n tabIndex={-1}\n >\n {optionsLoading ? (\n <LoadingOptionsPlaceholder />\n ) : optionsError ? (\n <OptionsErrorPlaceholder handleFetchOptions={() => handleFetchOptions(filterInputType)} />\n ) : !filteredDropDownItems.length &&\n (!allowCustomValue || filterInputType === 'operator' || !inputValue) ? (\n <NoOptionsPlaceholder />\n ) : (\n rowVirtualizer.getVirtualItems().map((virtualItem) => {\n const item = filteredDropDownItems[virtualItem.index];\n const index = virtualItem.index;\n\n // render group label\n if (item.options) {\n return (\n <div\n key={`${item.label}+${index}`}\n className={cx(styles.optionGroupLabel, styles.groupTopBorder)}\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n >\n <Text weight=\"bold\" variant=\"bodySmall\" color=\"secondary\">\n {item.label!}\n </Text>\n </div>\n );\n }\n\n const nextItem: SelectableValue<string> | undefined =\n filteredDropDownItems[virtualItem.index + 1];\n const shouldAddBottomBorder = nextItem && !nextItem.group && !nextItem.options && item.group;\n\n return (\n // key is included in getItemProps()\n // eslint-disable-next-line react/jsx-key\n <DropdownItem\n {...getItemProps({\n key: `${item.value!}-${index}`,\n ref(node) {\n listRef.current[index] = node;\n },\n onClick(event) {\n if (filterInputType !== 'value') {\n event.stopPropagation();\n }\n if (isMultiValueEdit) {\n event.preventDefault();\n event.stopPropagation();\n handleLocalMultiValueChange(item);\n setInputValue('');\n refs.domReference.current?.focus();\n } else {\n model._updateFilter(\n filter!,\n generateFilterUpdatePayload({\n filterInputType,\n item,\n filter: filter!,\n setFilterMultiValues,\n })\n );\n\n populateInputValueOnInputTypeSwitch({\n populateInputOnEdit,\n item,\n filterInputType,\n setInputValue,\n filter,\n });\n\n switchToNextInputType(\n filterInputType,\n setInputType,\n handleChangeViewMode,\n refs.domReference.current,\n // explicitly preventing focus on filter pill due to a11y error\n false\n );\n }\n },\n })}\n active={activeIndex === index}\n addGroupBottomBorder={shouldAddBottomBorder}\n // virtual item positioning and accessibility\n style={{\n height: `${virtualItem.size}px`,\n transform: `translateY(${virtualItem.start}px)`,\n }}\n aria-setsize={filteredDropDownItems.length}\n aria-posinset={virtualItem.index + 1}\n isMultiValueEdit={isMultiValueEdit}\n checked={filterMultiValues.some((val) => val.value === item.value)}\n >\n <span>\n {item.isCustom ? 'Use custom value: ' : ''} {item.label ?? item.value}\n </span>\n {item.description ? <div className={styles.descriptionText}>{item.description}</div> : null}\n </DropdownItem>\n );\n })\n )}\n </div>\n </div>\n {isMultiValueEdit && !optionsLoading && !optionsError && filteredDropDownItems.length ? (\n <MultiValueApplyButton\n onApply={() => {\n handleMultiValueFilterCommit(model, filter!, filterMultiValues);\n }}\n floatingElement={refs.floating.current}\n maxOptionWidth={maxOptionWidth}\n menuHeight={Math.min(rowVirtualizer.getTotalSize(), MAX_MENU_HEIGHT)}\n />\n ) : null}\n </>\n </FloatingFocusManager>\n )}\n </FloatingPortal>\n </div>\n );\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comboboxWrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n }),\n pillWrapper: css({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n }),\n basePill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.disabledBackground,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 1, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n cursor: 'pointer',\n }),\n keyPill: css({\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'default',\n }),\n operatorPill: css({\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n dropdownWrapper: css({\n backgroundColor: theme.colors.background.primary,\n color: theme.colors.text.primary,\n boxShadow: theme.shadows.z2,\n overflowY: 'auto',\n zIndex: theme.zIndex.dropdown,\n }),\n inputStyle: css({\n paddingBlock: 0,\n '&:focus': {\n outline: 'none',\n },\n }),\n loadingIndicator: css({\n color: theme.colors.text.secondary,\n marginLeft: theme.spacing(0.5),\n }),\n loadingInputPadding: css({\n paddingRight: theme.spacing(2.5),\n }),\n optionGroupLabel: css({\n padding: theme.spacing(1),\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n }),\n groupTopBorder: css({\n '&:not(:first-child)': {\n borderTop: `1px solid ${theme.colors.border.weak}`,\n },\n }),\n descriptionText: css({\n ...theme.typography.bodySmall,\n color: theme.colors.text.secondary,\n paddingTop: theme.spacing(0.5),\n }),\n});\n"],"names":["AdHocCombobox","model","filter","filterMultiValues","_a","_","options","_b"],"mappings":"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"}
|
@@ -45,13 +45,13 @@ function VariableValueSelectWrapper({ variable, layout, showAlways, hideLabel })
|
|
45
45
|
}));
|
46
46
|
}
|
47
47
|
function VariableLabel({ variable, layout, hideLabel }) {
|
48
|
-
var _a
|
48
|
+
var _a;
|
49
49
|
const { state } = variable;
|
50
50
|
if (variable.state.hide === VariableHide.hideLabel || hideLabel) {
|
51
51
|
return null;
|
52
52
|
}
|
53
53
|
const elementId = `var-${state.key}`;
|
54
|
-
const labelOrName =
|
54
|
+
const labelOrName = state.label || state.name;
|
55
55
|
return /* @__PURE__ */ React.createElement(ControlsLabel, {
|
56
56
|
htmlFor: elementId,
|
57
57
|
isLoading: state.loading,
|
@@ -62,7 +62,7 @@ function VariableLabel({ variable, layout, hideLabel }) {
|
|
62
62
|
label: labelOrName,
|
63
63
|
error: state.error,
|
64
64
|
layout,
|
65
|
-
description: (
|
65
|
+
description: (_a = state.description) != null ? _a : void 0
|
66
66
|
});
|
67
67
|
}
|
68
68
|
const containerStyle = css({ display: "flex" });
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"VariableValueSelectors.js","sources":["../../../../src/variables/components/VariableValueSelectors.tsx"],"sourcesContent":["import React from 'react';\n\nimport { VariableHide } from '@grafana/data';\n\nimport { SceneObjectBase, useSceneObjectState } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { ControlsLayout, SceneComponentProps, SceneObjectState } from '../../core/types';\nimport { SceneVariable, SceneVariableState } from '../types';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { css } from '@emotion/css';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport interface VariableValueSelectorsState extends SceneObjectState {\n layout?: ControlsLayout;\n}\n\nexport class VariableValueSelectors extends SceneObjectBase<VariableValueSelectorsState> {\n public static Component = VariableValueSelectorsRenderer;\n}\n\nfunction VariableValueSelectorsRenderer({ model }: SceneComponentProps<VariableValueSelectors>) {\n const variables = sceneGraph.getVariables(model)!.useState();\n\n return (\n <>\n {variables.variables.map((variable) => (\n <VariableValueSelectWrapper key={variable.state.key} variable={variable} layout={model.state.layout} />\n ))}\n </>\n );\n}\n\ninterface VariableSelectProps {\n layout?: ControlsLayout;\n variable: SceneVariable;\n /** To override hide from VariableValueSelectByName */\n showAlways?: boolean;\n /** To provide an option to hide the label in the variable value selector */\n hideLabel?: boolean;\n}\n\nexport function VariableValueSelectWrapper({ variable, layout, showAlways, hideLabel }: VariableSelectProps) {\n const state = useSceneObjectState<SceneVariableState>(variable, { shouldActivateOrKeepAlive: true });\n\n if (state.hide === VariableHide.hideVariable && !showAlways) {\n return null;\n }\n\n if (layout === 'vertical') {\n return (\n <div className={verticalContainer} data-testid={selectors.pages.Dashboard.SubMenu.submenuItem}>\n <VariableLabel variable={variable} layout={layout} hideLabel={hideLabel} />\n <variable.Component model={variable} />\n </div>\n );\n }\n\n return (\n <div className={containerStyle} data-testid={selectors.pages.Dashboard.SubMenu.submenuItem}>\n <VariableLabel variable={variable} hideLabel={hideLabel} />\n <variable.Component model={variable} />\n </div>\n );\n}\n\nfunction VariableLabel({ variable, layout, hideLabel }: VariableSelectProps) {\n const { state } = variable;\n\n if (variable.state.hide === VariableHide.hideLabel || hideLabel) {\n return null;\n }\n\n const elementId = `var-${state.key}`;\n const labelOrName = state.label
|
1
|
+
{"version":3,"file":"VariableValueSelectors.js","sources":["../../../../src/variables/components/VariableValueSelectors.tsx"],"sourcesContent":["import React from 'react';\n\nimport { VariableHide } from '@grafana/data';\n\nimport { SceneObjectBase, useSceneObjectState } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { ControlsLayout, SceneComponentProps, SceneObjectState } from '../../core/types';\nimport { SceneVariable, SceneVariableState } from '../types';\nimport { ControlsLabel } from '../../utils/ControlsLabel';\nimport { css } from '@emotion/css';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport interface VariableValueSelectorsState extends SceneObjectState {\n layout?: ControlsLayout;\n}\n\nexport class VariableValueSelectors extends SceneObjectBase<VariableValueSelectorsState> {\n public static Component = VariableValueSelectorsRenderer;\n}\n\nfunction VariableValueSelectorsRenderer({ model }: SceneComponentProps<VariableValueSelectors>) {\n const variables = sceneGraph.getVariables(model)!.useState();\n\n return (\n <>\n {variables.variables.map((variable) => (\n <VariableValueSelectWrapper key={variable.state.key} variable={variable} layout={model.state.layout} />\n ))}\n </>\n );\n}\n\ninterface VariableSelectProps {\n layout?: ControlsLayout;\n variable: SceneVariable;\n /** To override hide from VariableValueSelectByName */\n showAlways?: boolean;\n /** To provide an option to hide the label in the variable value selector */\n hideLabel?: boolean;\n}\n\nexport function VariableValueSelectWrapper({ variable, layout, showAlways, hideLabel }: VariableSelectProps) {\n const state = useSceneObjectState<SceneVariableState>(variable, { shouldActivateOrKeepAlive: true });\n\n if (state.hide === VariableHide.hideVariable && !showAlways) {\n return null;\n }\n\n if (layout === 'vertical') {\n return (\n <div className={verticalContainer} data-testid={selectors.pages.Dashboard.SubMenu.submenuItem}>\n <VariableLabel variable={variable} layout={layout} hideLabel={hideLabel} />\n <variable.Component model={variable} />\n </div>\n );\n }\n\n return (\n <div className={containerStyle} data-testid={selectors.pages.Dashboard.SubMenu.submenuItem}>\n <VariableLabel variable={variable} hideLabel={hideLabel} />\n <variable.Component model={variable} />\n </div>\n );\n}\n\nfunction VariableLabel({ variable, layout, hideLabel }: VariableSelectProps) {\n const { state } = variable;\n\n if (variable.state.hide === VariableHide.hideLabel || hideLabel) {\n return null;\n }\n\n const elementId = `var-${state.key}`;\n const labelOrName = state.label || state.name;\n\n return (\n <ControlsLabel\n htmlFor={elementId}\n isLoading={state.loading}\n onCancel={() => variable.onCancel?.()}\n label={labelOrName}\n error={state.error}\n layout={layout}\n description={state.description ?? undefined}\n />\n );\n}\n\nconst containerStyle = css({ display: 'flex' });\nconst verticalContainer = css({ display: 'flex', flexDirection: 'column' });\n"],"names":["_a"],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"GroupByVariable.js","sources":["../../../../src/variables/groupby/GroupByVariable.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\n// @ts-expect-error Remove when 11.1.x is released\nimport { AdHocVariableFilter, DataSourceApi, GetTagResponse, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { allActiveGroupByVariables } from './findActiveGroupByVariablesByUid';\nimport { DataSourceRef, VariableType } from '@grafana/schema';\nimport { SceneComponentProps, ControlsLayout, SceneObjectUrlSyncHandler } from '../../core/types';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { ValidateAndUpdateResult, VariableValueOption, VariableValueSingle } from '../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../variants/MultiValueVariable';\nimport { from, lastValueFrom, map, mergeMap, Observable, of, take, tap } from 'rxjs';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { InputActionMeta, MultiSelect } from '@grafana/ui';\nimport { isArray } from 'lodash';\nimport { dataFromResponse, getQueriesForVariables, handleOptionGroups, responseHasError } from '../utils';\nimport { OptionWithCheckbox } from '../components/VariableValueSelect';\nimport { GroupByVariableUrlSyncHandler } from './GroupByVariableUrlSyncHandler';\nimport { getOptionSearcher } from '../components/getOptionSearcher';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\n\nexport interface GroupByVariableState extends MultiValueVariableState {\n /** Defaults to \"Group\" */\n name: string;\n /** The visible keys to group on */\n // TODO review this type and name (naming is hard)\n defaultOptions?: MetricFindValue[];\n /** Base filters to always apply when looking up keys */\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and also controls which scene queries the group by should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the group by can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\n /**\n * Defaults to same-datasource which means group by will automatically be applied to all queries with the same data source as this GroupBySet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n}\n\nexport type getTagKeysProvider = (\n set: GroupByVariable,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] | GetTagResponse }>;\n\nexport class GroupByVariable extends MultiValueVariable<GroupByVariableState> {\n static Component = GroupByVariableRenderer;\n isLazy = true;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new GroupByVariableUrlSyncHandler(this);\n\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this._updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n private _updateValueGivenNewOptions(options: VariableValueOption[]) {\n const { value: currentValue, text: currentText } = this.state;\n\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue ?? [],\n text: currentText ?? [],\n };\n\n this.setState(stateUpdate);\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n // When default dimensions are provided, return the static list\n if (this.state.defaultOptions) {\n return of(\n this.state.defaultOptions.map((o) => ({\n label: o.text,\n value: String(o.value),\n // @ts-expect-error Remove when we update to @grafana/data > 11.1.0\n group: o.group,\n }))\n );\n }\n\n this.setState({ loading: true, error: null });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n })\n ).pipe(\n mergeMap((ds) => {\n return from(this._getKeys(ds)).pipe(\n tap((response) => {\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n }),\n map((response) => dataFromResponse(response)),\n take(1),\n mergeMap((data) => {\n // @ts-expect-error Remove when 11.1.x is released\n const a: VariableValueOption[] = data.map((i) => {\n return {\n label: i.text,\n value: i.value ? String(i.value) : i.text,\n group: i.group,\n };\n });\n return of(a);\n })\n );\n })\n );\n }\n\n public constructor(initialState: Partial<GroupByVariableState>) {\n super({\n isMulti: true,\n name: '',\n value: [],\n text: [],\n options: [],\n datasource: null,\n baseFilters: [],\n applyMode: 'auto',\n layout: 'horizontal',\n type: 'groupby' as VariableType,\n ...initialState,\n noValueOnClear: true,\n });\n\n this.addActivationHandler(() => {\n allActiveGroupByVariables.add(this);\n\n return () => allActiveGroupByVariables.delete(this);\n });\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public _getKeys = async (ds: DataSourceApi) => {\n // TODO: provide current dimensions?\n const override = await this.state.getTagKeysProvider?.(this, null);\n\n if (override && override.replace) {\n return override.values;\n }\n\n if (this.state.defaultOptions) {\n return this.state.defaultOptions.concat(dataFromResponse(override?.values ?? []));\n }\n\n if (!ds.getTagKeys) {\n return [];\n }\n\n const queries = getQueriesForVariables(this);\n\n const otherFilters = this.state.baseFilters || [];\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n ...getEnrichedFiltersRequest(this),\n });\n if (responseHasError(response)) {\n // @ts-expect-error Remove when 11.1.x is released\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n // @ts-expect-error Remove when 11.1.x is released\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys;\n };\n\n /**\n * Allows clearing the value of the variable to an empty value. Overrides default behavior of a MultiValueVariable\n */\n public getDefaultMultiState(options: VariableValueOption[]): { value: VariableValueSingle[]; text: string[] } {\n return { value: [], text: [] };\n }\n}\nexport function GroupByVariableRenderer({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, text, key, maxVisibleValues, noValueOnClear, options, includeAll } = model.useState();\n\n const values = useMemo<Array<SelectableValue<VariableValueSingle>>>(() => {\n const arrayValue = isArray(value) ? value : [value];\n const arrayText = isArray(text) ? text : [text];\n\n return arrayValue.map((value, idx) => ({\n value,\n label: String(arrayText[idx] ?? value),\n }));\n }, [value, text]);\n\n const [isFetchingOptions, setIsFetchingOptions] = useState(false);\n const [isOptionsOpen, setIsOptionsOpen] = useState(false);\n const [inputValue, setInputValue] = useState('');\n\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(values);\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(values);\n }, [values]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const filteredOptions = useMemo(\n () => handleOptionGroups(optionSearcher(inputValue).map(toSelectableValue)),\n [optionSearcher, inputValue]\n );\n\n return (\n <MultiSelect<VariableValueSingle>\n data-testid={`GroupBySelect-${key}`}\n id={key}\n placeholder={'Select value'}\n width=\"auto\"\n inputValue={inputValue}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n options={filteredOptions}\n filterOption={filterNoOp}\n closeMenuOnSelect={false}\n isOpen={isOptionsOpen}\n isClearable={true}\n hideSelectedOptions={false}\n isLoading={isFetchingOptions}\n components={{ Option: OptionWithCheckbox }}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(\n uncommittedValue.map((x) => x.value!),\n uncommittedValue.map((x) => x.label!)\n );\n }}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([]);\n }\n setUncommittedValue(newValue);\n }}\n onOpenMenu={async () => {\n setIsFetchingOptions(true);\n await lastValueFrom(model.validateAndUpdate());\n setIsFetchingOptions(false);\n setIsOptionsOpen(true);\n }}\n onCloseMenu={() => {\n setIsOptionsOpen(false);\n }}\n />\n );\n}\n\nconst filterNoOp = () => true;\n\nfunction toSelectableValue(input: VariableValueOption): SelectableValue<VariableValueSingle> {\n const { label, value, group } = input;\n const result: SelectableValue<VariableValueSingle> = {\n label,\n value,\n };\n\n if (group) {\n result.group = group;\n }\n\n return result;\n}\n"],"names":["value"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"GroupByVariable.js","sources":["../../../../src/variables/groupby/GroupByVariable.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\n// @ts-expect-error Remove when 11.1.x is released\nimport { AdHocVariableFilter, DataSourceApi, GetTagResponse, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { allActiveGroupByVariables } from './findActiveGroupByVariablesByUid';\nimport { DataSourceRef, VariableType } from '@grafana/schema';\nimport { SceneComponentProps, ControlsLayout, SceneObjectUrlSyncHandler } from '../../core/types';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { ValidateAndUpdateResult, VariableValueOption, VariableValueSingle } from '../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../variants/MultiValueVariable';\nimport { from, lastValueFrom, map, mergeMap, Observable, of, take, tap } from 'rxjs';\nimport { getDataSource } from '../../utils/getDataSource';\nimport { InputActionMeta, MultiSelect } from '@grafana/ui';\nimport { isArray } from 'lodash';\nimport { dataFromResponse, getQueriesForVariables, handleOptionGroups, responseHasError } from '../utils';\nimport { OptionWithCheckbox } from '../components/VariableValueSelect';\nimport { GroupByVariableUrlSyncHandler } from './GroupByVariableUrlSyncHandler';\nimport { getOptionSearcher } from '../components/getOptionSearcher';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\n\nexport interface GroupByVariableState extends MultiValueVariableState {\n /** Defaults to \"Group\" */\n name: string;\n /** The visible keys to group on */\n // TODO review this type and name (naming is hard)\n defaultOptions?: MetricFindValue[];\n /** Base filters to always apply when looking up keys */\n baseFilters?: AdHocVariableFilter[];\n /** Datasource to use for getTagKeys and also controls which scene queries the group by should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the group by can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n * Vertical layout does not yet support operator selector.\n */\n layout?: ControlsLayout;\n /**\n * Defaults to same-datasource which means group by will automatically be applied to all queries with the same data source as this GroupBySet.\n * In manual mode no queries are re-run on changes, and you have to manually apply the filter to whatever queries you want.\n */\n applyMode?: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n}\n\nexport type getTagKeysProvider = (\n set: GroupByVariable,\n currentKey: string | null\n) => Promise<{ replace?: boolean; values: MetricFindValue[] | GetTagResponse }>;\n\nexport class GroupByVariable extends MultiValueVariable<GroupByVariableState> {\n static Component = GroupByVariableRenderer;\n isLazy = true;\n\n protected _urlSync: SceneObjectUrlSyncHandler = new GroupByVariableUrlSyncHandler(this);\n\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this._updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n private _updateValueGivenNewOptions(options: VariableValueOption[]) {\n const { value: currentValue, text: currentText } = this.state;\n\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue ?? [],\n text: currentText ?? [],\n };\n\n this.setState(stateUpdate);\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n // When default dimensions are provided, return the static list\n if (this.state.defaultOptions) {\n return of(\n this.state.defaultOptions.map((o) => ({\n label: o.text,\n value: String(o.value),\n // @ts-expect-error Remove when we update to @grafana/data > 11.1.0\n group: o.group,\n }))\n );\n }\n\n this.setState({ loading: true, error: null });\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: wrapInSafeSerializableSceneObject(this),\n })\n ).pipe(\n mergeMap((ds) => {\n return from(this._getKeys(ds)).pipe(\n tap((response) => {\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n }),\n map((response) => dataFromResponse(response)),\n take(1),\n mergeMap((data) => {\n // @ts-expect-error Remove when 11.1.x is released\n const a: VariableValueOption[] = data.map((i) => {\n return {\n label: i.text,\n value: i.value ? String(i.value) : i.text,\n group: i.group,\n };\n });\n return of(a);\n })\n );\n })\n );\n }\n\n public constructor(initialState: Partial<GroupByVariableState>) {\n super({\n isMulti: true,\n name: '',\n value: [],\n text: [],\n options: [],\n datasource: null,\n baseFilters: [],\n applyMode: 'auto',\n layout: 'horizontal',\n type: 'groupby' as VariableType,\n ...initialState,\n noValueOnClear: true,\n });\n\n this.addActivationHandler(() => {\n allActiveGroupByVariables.add(this);\n\n return () => allActiveGroupByVariables.delete(this);\n });\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public _getKeys = async (ds: DataSourceApi) => {\n // TODO: provide current dimensions?\n const override = await this.state.getTagKeysProvider?.(this, null);\n\n if (override && override.replace) {\n return override.values;\n }\n\n if (this.state.defaultOptions) {\n return this.state.defaultOptions.concat(dataFromResponse(override?.values ?? []));\n }\n\n if (!ds.getTagKeys) {\n return [];\n }\n\n const queries = getQueriesForVariables(this);\n\n const otherFilters = this.state.baseFilters || [];\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n ...getEnrichedFiltersRequest(this),\n });\n if (responseHasError(response)) {\n // @ts-expect-error Remove when 11.1.x is released\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n // @ts-expect-error Remove when 11.1.x is released\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys;\n };\n\n /**\n * Allows clearing the value of the variable to an empty value. Overrides default behavior of a MultiValueVariable\n */\n public getDefaultMultiState(options: VariableValueOption[]): { value: VariableValueSingle[]; text: string[] } {\n return { value: [], text: [] };\n }\n}\nexport function GroupByVariableRenderer({ model }: SceneComponentProps<MultiValueVariable>) {\n const { value, text, key, maxVisibleValues, noValueOnClear, options, includeAll } = model.useState();\n\n const values = useMemo<Array<SelectableValue<VariableValueSingle>>>(() => {\n const arrayValue = isArray(value) ? value : [value];\n const arrayText = isArray(text) ? text : [text];\n\n return arrayValue.map((value, idx) => ({\n value,\n label: String(arrayText[idx] ?? value),\n }));\n }, [value, text]);\n\n const [isFetchingOptions, setIsFetchingOptions] = useState(false);\n const [isOptionsOpen, setIsOptionsOpen] = useState(false);\n const [inputValue, setInputValue] = useState('');\n\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(values);\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(values);\n }, [values]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const filteredOptions = useMemo(\n () => handleOptionGroups(optionSearcher(inputValue).map(toSelectableValue)),\n [optionSearcher, inputValue]\n );\n\n return (\n <MultiSelect<VariableValueSingle>\n data-testid={`GroupBySelect-${key}`}\n id={key}\n placeholder={'Select value'}\n width=\"auto\"\n allowCustomValue={true}\n inputValue={inputValue}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n options={filteredOptions}\n filterOption={filterNoOp}\n closeMenuOnSelect={false}\n isOpen={isOptionsOpen}\n isClearable={true}\n hideSelectedOptions={false}\n isLoading={isFetchingOptions}\n components={{ Option: OptionWithCheckbox }}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(\n uncommittedValue.map((x) => x.value!),\n uncommittedValue.map((x) => x.label!)\n );\n }}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([]);\n }\n setUncommittedValue(newValue);\n }}\n onOpenMenu={async () => {\n setIsFetchingOptions(true);\n await lastValueFrom(model.validateAndUpdate());\n setIsFetchingOptions(false);\n setIsOptionsOpen(true);\n }}\n onCloseMenu={() => {\n setIsOptionsOpen(false);\n }}\n />\n );\n}\n\nconst filterNoOp = () => true;\n\nfunction toSelectableValue(input: VariableValueOption): SelectableValue<VariableValueSingle> {\n const { label, value, group } = input;\n const result: SelectableValue<VariableValueSingle> = {\n label,\n value,\n };\n\n if (group) {\n result.group = group;\n }\n\n return result;\n}\n"],"names":["value"],"mappings":"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"}
|
@@ -55,7 +55,9 @@ class MultiValueVariable extends SceneObjectBase {
|
|
55
55
|
return stateUpdate;
|
56
56
|
}
|
57
57
|
if (this.hasAllValue()) {
|
58
|
-
if (
|
58
|
+
if (this.state.includeAll) {
|
59
|
+
stateUpdate.text = ALL_VARIABLE_TEXT;
|
60
|
+
} else {
|
59
61
|
stateUpdate.value = options[0].value;
|
60
62
|
stateUpdate.text = options[0].label;
|
61
63
|
if (this.state.isMulti) {
|