Skip to content

Commit 02524f1

Browse files
Dosantmattkimestreamichppisljar
authored
[Drilldowns] Dashboard to dashboard drilldown (#63108)
* partial progress on async loading / searching of dashboard titles * feat: 🎸 make combobox full width * filtering combobox polish * storybook fix * implement navigating to dashboard, seems like a type problem * try navToApp * filter out current dashboard * rough draft linking to a dashboard * remove note * typefix * fix navigation from dashboard to dashboard except for back button - that would be addressed separatly * partial progress getting filters from action data * fix issue with getIndexPatterns undefined we can’t import those functions as static functions, instead we have to expose them on plugin contract because they are statefull * fix filter / time passing into url * typefix * dashboard to dashboard drilldown functional test and back button fix * documentation update * chore clean-ups fix type * basic unit test for dashboard drilldown * remove test todos decided to skip those tests because not clear how to test due to EuiCombobox is using react-virtualized and options list is not rendered in jsdom env * remove config * improve back button with filter comparison tweak * dashboard filters/date option off by default * revert change to config/kibana.yml * remove unneeded comments * use default time range as appropriate * fix type, add filter icon, add text * fix test * change how time range is restored and improve back button for drilldowns * resolve conflicts * fix async compile issue * remove redundant test * wip * wip * fix * temp skip tests * fix * handle missing dashboard edge case * fix api * refactor action filter creation utils * updating * updating docs * improve * fix storybook * post merge fixes * fix payload emitted in brush event * properly export createRange action * improve tests * add test * post merge fixes * improve * fix * improve * fix build * wip getHref support * implement getHref() * give proper name to a story * use sync start services * update text * fix types * fix ts * fix docs * move clone below drilldowns (near replace) * remove redundant comments * refactor action filter creation utils * updating * updating docs * fix payload emitted in brush event * properly export createRange action * some more updates * fixing types * ... * inline EventData * fix typescript in lens and update docs * improve filters types * docs * merge * @mdefazio review * adjust actions order * docs * @stacey-gammon review Co-authored-by: Matt Kime <matt@mattki.me> Co-authored-by: streamich <streamich@gmail.com> Co-authored-by: ppisljar <peter.pisljar@gmail.com>
1 parent cd4693b commit 02524f1

File tree

57 files changed

+1504
-227
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1504
-227
lines changed

docs/development/plugins/data/public/kibana-plugin-plugins-data-public.esfilters.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ esFilters: {
4949
generateFilters: typeof generateFilters;
5050
onlyDisabledFiltersChanged: (newFilters?: import("../common").Filter[] | undefined, oldFilters?: import("../common").Filter[] | undefined) => boolean;
5151
changeTimeFilter: typeof changeTimeFilter;
52+
convertRangeFilterToTimeRangeString: typeof convertRangeFilterToTimeRangeString;
5253
mapAndFlattenFilters: (filters: import("../common").Filter[]) => import("../common").Filter[];
5354
extractTimeFilter: typeof extractTimeFilter;
5455
}

src/plugins/dashboard/public/application/actions/clone_panel_action.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export interface ClonePanelActionContext {
3939
export class ClonePanelAction implements ActionByType<typeof ACTION_CLONE_PANEL> {
4040
public readonly type = ACTION_CLONE_PANEL;
4141
public readonly id = ACTION_CLONE_PANEL;
42-
public order = 11;
42+
public order = 45;
4343

4444
constructor(private core: CoreStart) {}
4545

src/plugins/data/public/actions/apply_filter_action.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export function createFilterAction(
4242
return createAction<typeof ACTION_GLOBAL_APPLY_FILTER>({
4343
type: ACTION_GLOBAL_APPLY_FILTER,
4444
id: ACTION_GLOBAL_APPLY_FILTER,
45+
getIconType: () => 'filter',
4546
getDisplayName: () => {
4647
return i18n.translate('data.filter.applyFilterActionTitle', {
4748
defaultMessage: 'Apply filter to current view',

src/plugins/data/public/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ import {
5959
changeTimeFilter,
6060
mapAndFlattenFilters,
6161
extractTimeFilter,
62+
convertRangeFilterToTimeRangeString,
6263
} from './query';
6364

6465
// Filter helpers namespace:
@@ -96,6 +97,7 @@ export const esFilters = {
9697
onlyDisabledFiltersChanged,
9798

9899
changeTimeFilter,
100+
convertRangeFilterToTimeRangeString,
99101
mapAndFlattenFilters,
100102
extractTimeFilter,
101103
};

src/plugins/data/public/public.api.md

Lines changed: 50 additions & 48 deletions
Large diffs are not rendered by default.

src/plugins/data/public/query/timefilter/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@ export * from './types';
2323
export { Timefilter, TimefilterContract } from './timefilter';
2424
export { TimeHistory, TimeHistoryContract } from './time_history';
2525
export { getTime } from './get_time';
26-
export { changeTimeFilter } from './lib/change_time_filter';
26+
export { changeTimeFilter, convertRangeFilterToTimeRangeString } from './lib/change_time_filter';
2727
export { extractTimeFilter } from './lib/extract_time_filter';

src/plugins/data/public/query/timefilter/lib/change_time_filter.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import moment from 'moment';
2121
import { keys } from 'lodash';
2222
import { TimefilterContract } from '../../timefilter';
23-
import { RangeFilter } from '../../../../common';
23+
import { RangeFilter, TimeRange } from '../../../../common';
2424

2525
export function convertRangeFilterToTimeRange(filter: RangeFilter) {
2626
const key = keys(filter.range)[0];
@@ -32,6 +32,14 @@ export function convertRangeFilterToTimeRange(filter: RangeFilter) {
3232
};
3333
}
3434

35+
export function convertRangeFilterToTimeRangeString(filter: RangeFilter): TimeRange {
36+
const { from, to } = convertRangeFilterToTimeRange(filter);
37+
return {
38+
from: from?.toISOString(),
39+
to: to?.toISOString(),
40+
};
41+
}
42+
3543
export function changeTimeFilter(timeFilter: TimefilterContract, filter: RangeFilter) {
3644
timeFilter.setTime(convertRangeFilterToTimeRange(filter));
3745
}

src/plugins/embeddable/public/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ export {
6767
withEmbeddableSubscription,
6868
SavedObjectEmbeddableInput,
6969
isSavedObjectEmbeddableInput,
70+
isRangeSelectTriggerContext,
71+
isValueClickTriggerContext,
7072
} from './lib';
7173

7274
export function plugin(initializerContext: PluginInitializerContext) {

src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ function renderNotifications(
6464
) {
6565
return notifications.map(notification => (
6666
<EuiNotificationBadge
67+
data-test-subj={`embeddablePanelNotification-${notification.id}`}
6768
key={notification.id}
6869
style={{ marginTop: '4px', marginRight: '4px' }}
6970
onClick={() => notification.execute({ embeddable })}

src/plugins/embeddable/public/lib/triggers/triggers.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@
1717
* under the License.
1818
*/
1919

20-
import { Trigger } from '../../../../ui_actions/public';
2120
import { KibanaDatatable } from '../../../../expressions';
21+
import { Trigger } from '../../../../ui_actions/public';
2222
import { IEmbeddable } from '..';
2323

2424
export interface EmbeddableContext {
2525
embeddable: IEmbeddable;
2626
}
2727

28-
export interface ValueClickTriggerContext {
29-
embeddable?: IEmbeddable;
28+
export interface ValueClickTriggerContext<T extends IEmbeddable = IEmbeddable> {
29+
embeddable?: T;
3030
timeFieldName?: string;
3131
data: {
3232
data: Array<{
@@ -39,8 +39,12 @@ export interface ValueClickTriggerContext {
3939
};
4040
}
4141

42-
export interface RangeSelectTriggerContext {
43-
embeddable?: IEmbeddable;
42+
export const isValueClickTriggerContext = (
43+
context: ValueClickTriggerContext | RangeSelectTriggerContext
44+
): context is ValueClickTriggerContext => context.data && 'data' in context.data;
45+
46+
export interface RangeSelectTriggerContext<T extends IEmbeddable = IEmbeddable> {
47+
embeddable?: T;
4448
timeFieldName?: string;
4549
data: {
4650
table: KibanaDatatable;
@@ -49,6 +53,10 @@ export interface RangeSelectTriggerContext {
4953
};
5054
}
5155

56+
export const isRangeSelectTriggerContext = (
57+
context: ValueClickTriggerContext | RangeSelectTriggerContext
58+
): context is RangeSelectTriggerContext => context.data && 'range' in context.data;
59+
5260
export const CONTEXT_MENU_TRIGGER = 'CONTEXT_MENU_TRIGGER';
5361
export const contextMenuTrigger: Trigger<'CONTEXT_MENU_TRIGGER'> = {
5462
id: CONTEXT_MENU_TRIGGER,

0 commit comments

Comments
 (0)