Skip to content

Commit

Permalink
Merge branch 'master' into index-templates/filter-simulate-view
Browse files Browse the repository at this point in the history
  • Loading branch information
elasticmachine authored Aug 18, 2020
2 parents cc23b06 + ce8a92e commit 1f73343
Show file tree
Hide file tree
Showing 168 changed files with 2,326 additions and 1,761 deletions.
5 changes: 3 additions & 2 deletions docs/developer/architecture/code-exploration.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -313,9 +313,10 @@ To access an elasticsearch instance that has live data you have two options:
WARNING: Missing README.
- {kib-repo}blob/{branch}/x-pack/plugins/beats_management[beats_management]
- {kib-repo}blob/{branch}/x-pack/plugins/beats_management/readme.md[beatsManagement]
WARNING: Missing README.
Notes:
Failure to have auth enabled in Kibana will make for a broken UI. UI-based errors not yet in place
- {kib-repo}blob/{branch}/x-pack/plugins/canvas/README.md[canvas]
Expand Down
14 changes: 7 additions & 7 deletions src/core/public/application/application_service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,15 @@ describe('#setup()', () => {
expect.objectContaining({
id: 'app1',
legacy: false,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
status: AppStatus.accessible,
})
);
expect(applications.get('app2')).toEqual(
expect.objectContaining({
id: 'app2',
legacy: false,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
status: AppStatus.accessible,
})
);
Expand All @@ -142,7 +142,7 @@ describe('#setup()', () => {
expect.objectContaining({
id: 'app1',
legacy: false,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.hidden,
status: AppStatus.inaccessible,
defaultPath: 'foo/bar',
tooltip: 'App inaccessible due to reason',
Expand All @@ -152,7 +152,7 @@ describe('#setup()', () => {
expect.objectContaining({
id: 'app2',
legacy: false,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
status: AppStatus.accessible,
})
);
Expand Down Expand Up @@ -268,7 +268,7 @@ describe('#setup()', () => {
expect.objectContaining({
id: 'app2',
legacy: false,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
status: AppStatus.accessible,
tooltip: 'App accessible',
})
Expand Down Expand Up @@ -523,7 +523,7 @@ describe('#start()', () => {
appRoute: '/app/app1',
id: 'app1',
legacy: false,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
status: AppStatus.accessible,
})
);
Expand All @@ -532,7 +532,7 @@ describe('#start()', () => {
appUrl: '/my-url',
id: 'app2',
legacy: true,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
status: AppStatus.accessible,
})
);
Expand Down
39 changes: 33 additions & 6 deletions src/core/public/application/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
*/

import { of } from 'rxjs';
import { LegacyApp, App, AppStatus, AppNavLinkStatus } from './types';
import { App, AppNavLinkStatus, AppStatus, LegacyApp } from './types';
import { BasePath } from '../http/base_path';
import {
removeSlashes,
appendAppPath,
getAppInfo,
isLegacyApp,
relativeToAbsolute,
parseAppUrl,
getAppInfo,
relativeToAbsolute,
removeSlashes,
} from './utils';

describe('removeSlashes', () => {
Expand Down Expand Up @@ -494,7 +494,7 @@ describe('getAppInfo', () => {
id: 'some-id',
title: 'some-title',
status: AppStatus.accessible,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
appRoute: `/app/some-id`,
legacy: false,
});
Expand All @@ -509,8 +509,35 @@ describe('getAppInfo', () => {
id: 'some-id',
title: 'some-title',
status: AppStatus.accessible,
navLinkStatus: AppNavLinkStatus.default,
navLinkStatus: AppNavLinkStatus.visible,
legacy: true,
});
});

it('computes the navLinkStatus depending on the app status', () => {
expect(
getAppInfo(
createApp({
navLinkStatus: AppNavLinkStatus.default,
status: AppStatus.inaccessible,
})
)
).toEqual(
expect.objectContaining({
navLinkStatus: AppNavLinkStatus.hidden,
})
);
expect(
getAppInfo(
createApp({
navLinkStatus: AppNavLinkStatus.default,
status: AppStatus.accessible,
})
)
).toEqual(
expect.objectContaining({
navLinkStatus: AppNavLinkStatus.visible,
})
);
});
});
20 changes: 17 additions & 3 deletions src/core/public/application/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,15 @@
*/

import { IBasePath } from '../http';
import { App, LegacyApp, PublicAppInfo, PublicLegacyAppInfo, ParsedAppUrl } from './types';
import {
App,
AppNavLinkStatus,
AppStatus,
LegacyApp,
ParsedAppUrl,
PublicAppInfo,
PublicLegacyAppInfo,
} from './types';

/**
* Utility to remove trailing, leading or duplicate slashes.
Expand Down Expand Up @@ -116,20 +124,26 @@ const removeBasePath = (url: string, basePath: IBasePath, origin: string): strin
};

export function getAppInfo(app: App<unknown> | LegacyApp): PublicAppInfo | PublicLegacyAppInfo {
const navLinkStatus =
app.navLinkStatus === AppNavLinkStatus.default
? app.status === AppStatus.inaccessible
? AppNavLinkStatus.hidden
: AppNavLinkStatus.visible
: app.navLinkStatus!;
if (isLegacyApp(app)) {
const { updater$, ...infos } = app;
return {
...infos,
status: app.status!,
navLinkStatus: app.navLinkStatus!,
navLinkStatus,
legacy: true,
};
} else {
const { updater$, mount, ...infos } = app;
return {
...infos,
status: app.status!,
navLinkStatus: app.navLinkStatus!,
navLinkStatus,
appRoute: app.appRoute!,
legacy: false,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -468,9 +468,14 @@ export class DashboardAppController {
const explicitInput = {
savedVis: input,
};
const embeddableId =
'embeddableId' in incomingEmbeddable
? incomingEmbeddable.embeddableId
: undefined;
container.addOrUpdateEmbeddable<EmbeddableInput>(
incomingEmbeddable.type,
explicitInput
explicitInput,
embeddableId
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ export class DashboardContainer extends Container<InheritedChildInput, Dashboard
// TODO: In the current infrastructure, embeddables in a container do not react properly to
// changes. Removing the existing embeddable, and adding a new one is a temporary workaround
// until the container logic is fixed.

const finalPanels = { ...this.input.panels };
delete finalPanels[previousPanelState.explicitInput.id];
const newPanelId = newPanelState.explicitInput?.id ? newPanelState.explicitInput.id : uuid.v4();
Expand All @@ -196,9 +197,10 @@ export class DashboardContainer extends Container<InheritedChildInput, Dashboard
EEI extends EmbeddableInput = EmbeddableInput,
EEO extends EmbeddableOutput = EmbeddableOutput,
E extends IEmbeddable<EEI, EEO> = IEmbeddable<EEI, EEO>
>(type: string, explicitInput: Partial<EEI>) {
if (explicitInput.id && this.input.panels[explicitInput.id]) {
this.replacePanel(this.input.panels[explicitInput.id], {
>(type: string, explicitInput: Partial<EEI>, embeddableId?: string) {
const idToReplace = embeddableId || explicitInput.id;
if (idToReplace && this.input.panels[idToReplace]) {
this.replacePanel(this.input.panels[idToReplace], {
type,
explicitInput: {
...explicitInput,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,18 @@ test('is compatible when edit url is available, in edit mode and editable', asyn
test('redirects to app using state transfer', async () => {
applicationMock.currentAppId$ = of('superCoolCurrentApp');
const action = new EditPanelAction(getFactory, applicationMock, stateTransferMock);
const embeddable = new EditableEmbeddable({ id: '123', viewMode: ViewMode.EDIT }, true);
const input = { id: '123', viewMode: ViewMode.EDIT };
const embeddable = new EditableEmbeddable(input, true);
embeddable.getOutput = jest.fn(() => ({ editApp: 'ultraVisualize', editPath: '/123' }));
await action.execute({ embeddable });
expect(stateTransferMock.navigateToEditor).toHaveBeenCalledWith('ultraVisualize', {
path: '/123',
state: { originatingApp: 'superCoolCurrentApp' },
state: {
originatingApp: 'superCoolCurrentApp',
byValueMode: true,
embeddableId: '123',
valueInput: input,
},
});
});

Expand Down
20 changes: 17 additions & 3 deletions src/plugins/embeddable/public/lib/actions/edit_panel_action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,12 @@ import { take } from 'rxjs/operators';
import { ViewMode } from '../types';
import { EmbeddableFactoryNotFoundError } from '../errors';
import { EmbeddableStart } from '../../plugin';
import { IEmbeddable, EmbeddableEditorState, EmbeddableStateTransfer } from '../..';
import {
IEmbeddable,
EmbeddableEditorState,
EmbeddableStateTransfer,
SavedObjectEmbeddableInput,
} from '../..';

export const ACTION_EDIT_PANEL = 'editPanel';

Expand Down Expand Up @@ -109,8 +114,17 @@ export class EditPanelAction implements Action<ActionContext> {
const app = embeddable ? embeddable.getOutput().editApp : undefined;
const path = embeddable ? embeddable.getOutput().editPath : undefined;
if (app && path) {
const state = this.currentAppId ? { originatingApp: this.currentAppId } : undefined;
return { app, path, state };
if (this.currentAppId) {
const byValueMode = !(embeddable.getInput() as SavedObjectEmbeddableInput).savedObjectId;
const state: EmbeddableEditorState = {
originatingApp: this.currentAppId,
byValueMode,
valueInput: byValueMode ? embeddable.getInput() : undefined,
embeddableId: embeddable.id,
};
return { app, path, state };
}
return { app, path };
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/plugins/embeddable/public/lib/state_transfer/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export interface EmbeddableEditorState {
originatingApp: string;
byValueMode?: boolean;
valueInput?: EmbeddableInput;
embeddableId?: string;
}

export function isEmbeddableEditorState(state: unknown): state is EmbeddableEditorState {
Expand All @@ -49,6 +50,7 @@ export interface EmbeddablePackageByReferenceState {
export interface EmbeddablePackageByValueState {
type: string;
input: EmbeddableInput;
embeddableId?: string;
}

export type EmbeddablePackageState =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export function TopNavMenuItem(props: TopNavMenuData) {
iconType: props.iconType,
iconSide: props.iconSide,
'data-test-subj': props.testId,
className: props.className,
};

const btn = props.emphasize ? (
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/usage_collection/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ New fields added to the telemetry payload currently mean that telemetry cluster

There are a few ways you can test that your usage collector is working properly.

1. The `/api/stats?extended=true` HTTP API in Kibana (added in 6.4.0) will call the fetch methods of all the registered collectors, and add them to a stats object you can see in a browser or in curl. To test that your usage collector has been registered correctly and that it has the model of data you expected it to have, call that HTTP API manually and you should see a key in the `usage` object of the response named after your usage collector's `type` field. This method tests the Metricbeat scenario described above where `callCluster` wraps `callWithRequest`.
1. The `/api/stats?extended=true&legacy=true` HTTP API in Kibana (added in 6.4.0) will call the fetch methods of all the registered collectors, and add them to a stats object you can see in a browser or in curl. To test that your usage collector has been registered correctly and that it has the model of data you expected it to have, call that HTTP API manually and you should see a key in the `usage` object of the response named after your usage collector's `type` field. This method tests the Metricbeat scenario described above where `callCluster` wraps `callWithRequest`.
2. There is a dev script in x-pack that will give a sample of a payload of data that gets sent up to the telemetry cluster for the sending phase of telemetry. Collected data comes from:
- The `.monitoring-*` indices, when Monitoring is enabled. Monitoring enhances the sent payload of telemetry by producing usage data potentially of multiple clusters that exist in the monitoring data. Monitoring data is time-based, and the time frame of collection is the last 15 minutes.
- Live-pulled from ES API endpoints. This will get just real-time stats without context of historical data.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ class DefaultEditorController {
]
: visType.editorConfig.optionTabs),
];

this.state = {
vis,
optionTabs,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ export const createVisEmbeddableFromObject = (deps: VisualizeEmbeddableFactoryDe
try {
const visId = vis.id as string;

const editPath = visId ? savedVisualizations.urlFor(visId) : '';
const editPath = visId ? savedVisualizations.urlFor(visId) : '#/edit_by_value';

const editUrl = visId
? getHttp().basePath.prepend(`/app/visualize${savedVisualizations.urlFor(visId)}`)
: '';
Expand Down
10 changes: 9 additions & 1 deletion src/plugins/visualize/public/application/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,12 @@ import { Route, Switch, useLocation } from 'react-router-dom';
import { syncQueryStateWithUrl } from '../../../data/public';
import { useKibana } from '../../../kibana_react/public';
import { VisualizeServices } from './types';
import { VisualizeEditor, VisualizeListing, VisualizeNoMatch } from './components';
import {
VisualizeEditor,
VisualizeListing,
VisualizeNoMatch,
VisualizeByValueEditor,
} from './components';
import { VisualizeConstants } from './visualize_constants';

export const VisualizeApp = () => {
Expand All @@ -48,6 +53,9 @@ export const VisualizeApp = () => {

return (
<Switch>
<Route exact path={`${VisualizeConstants.EDIT_BY_VALUE_PATH}`}>
<VisualizeByValueEditor />
</Route>
<Route path={[VisualizeConstants.CREATE_PATH, `${VisualizeConstants.EDIT_PATH}/:id`]}>
<VisualizeEditor />
</Route>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@
export { VisualizeListing } from './visualize_listing';
export { VisualizeEditor } from './visualize_editor';
export { VisualizeNoMatch } from './visualize_no_match';
export { VisualizeByValueEditor } from './visualize_byvalue_editor';
Loading

0 comments on commit 1f73343

Please sign in to comment.