Skip to content

Commit 27c412b

Browse files
[7.x] [Lens] Fix embeddable title and description for reporting and dashboard tooltip (#78767) (#79164)
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
1 parent a280157 commit 27c412b

File tree

24 files changed

+206
-39
lines changed

24 files changed

+206
-39
lines changed

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,11 @@ function renderTooltip(description: string) {
109109
);
110110
}
111111

112-
const VISUALIZE_EMBEDDABLE_TYPE = 'visualization';
113-
type VisualizeEmbeddable = any;
112+
type EmbeddableWithDescription = IEmbeddable & { getDescription: () => string };
114113

115-
function getViewDescription(embeddable: IEmbeddable | VisualizeEmbeddable) {
116-
if (embeddable.type === VISUALIZE_EMBEDDABLE_TYPE) {
117-
const description = embeddable.getVisualizationDescription();
114+
function getViewDescription(embeddable: IEmbeddable | EmbeddableWithDescription) {
115+
if ('getDescription' in embeddable) {
116+
const description = embeddable.getDescription();
118117

119118
if (description) {
120119
return description;

src/plugins/visualizations/public/embeddable/visualize_embeddable.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ export class VisualizeEmbeddable
167167
typeof inspectorAdapters === 'function' ? inspectorAdapters() : inspectorAdapters;
168168
}
169169
}
170-
public getVisualizationDescription() {
170+
public getDescription() {
171171
return this.vis.description;
172172
}
173173

x-pack/plugins/lens/public/datatable_visualization/__snapshots__/expression.test.tsx.snap

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

x-pack/plugins/lens/public/datatable_visualization/expression.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export interface DatatableColumns {
3333

3434
interface Args {
3535
title: string;
36+
description?: string;
3637
columns: DatatableColumns & { type: 'lens_datatable_columns' };
3738
}
3839

@@ -72,6 +73,10 @@ export const datatable: ExpressionFunctionDefinition<
7273
defaultMessage: 'Title',
7374
}),
7475
},
76+
description: {
77+
types: ['string'],
78+
help: '',
79+
},
7580
columns: {
7681
types: ['lens_datatable_columns'],
7782
help: '',
@@ -207,7 +212,10 @@ export function DatatableComponent(props: DatatableRenderProps) {
207212
}
208213

209214
return (
210-
<VisualizationContainer>
215+
<VisualizationContainer
216+
reportTitle={props.args.title}
217+
reportDescription={props.args.description}
218+
>
211219
<EuiBasicTable
212220
className="lnsDataTable"
213221
data-test-subj="lnsDataTable"

x-pack/plugins/lens/public/datatable_visualization/visualization.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ export const datatableVisualization: Visualization<DatatableVisualizationState>
194194
};
195195
},
196196

197-
toExpression(state, datasourceLayers): Ast {
197+
toExpression(state, datasourceLayers, { title, description } = {}): Ast {
198198
const layer = state.layers[0];
199199
const datasource = datasourceLayers[layer.layerId];
200200
const originalOrder = datasource.getTableSpec().map(({ columnId }) => columnId);
@@ -211,6 +211,8 @@ export const datatableVisualization: Visualization<DatatableVisualizationState>
211211
type: 'function',
212212
function: 'lens_datatable',
213213
arguments: {
214+
title: [title || ''],
215+
description: [description || ''],
214216
columns: [
215217
{
216218
type: 'expression',

x-pack/plugins/lens/public/editor_frame_service/editor_frame/expression_helpers.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,11 @@ export function buildExpression({
7373
datasourceMap,
7474
datasourceStates,
7575
datasourceLayers,
76+
title,
77+
description,
7678
}: {
79+
title?: string;
80+
description?: string;
7781
visualization: Visualization | null;
7882
visualizationState: unknown;
7983
datasourceMap: Record<string, Datasource>;
@@ -89,7 +93,10 @@ export function buildExpression({
8993
if (visualization === null) {
9094
return null;
9195
}
92-
const visualizationExpression = visualization.toExpression(visualizationState, datasourceLayers);
96+
const visualizationExpression = visualization.toExpression(visualizationState, datasourceLayers, {
97+
title,
98+
description,
99+
});
93100

94101
const completeExpression = prependDatasourceExpression(
95102
visualizationExpression,

x-pack/plugins/lens/public/editor_frame_service/editor_frame/state_helpers.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ export async function persistedStateToExpression(
6161
state: { visualization: visualizationState, datasourceStates: persistedDatasourceStates },
6262
visualizationType,
6363
references,
64+
title,
65+
description,
6466
} = doc;
6567
if (!visualizationType) return null;
6668
const visualization = visualizations[visualizationType!];
@@ -78,6 +80,8 @@ export async function persistedStateToExpression(
7880
const datasourceLayers = createDatasourceLayers(datasources, datasourceStates);
7981

8082
return buildExpression({
83+
title,
84+
description,
8185
visualization,
8286
visualizationState,
8387
datasourceMap: datasources,

x-pack/plugins/lens/public/editor_frame_service/embeddable/embeddable.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,12 @@ export class Embeddable
295295
return this.deps.attributeService.getInputAsValueType(input);
296296
};
297297

298+
// same API as Visualize
299+
public getDescription() {
300+
// mind that savedViz is loaded in async way here
301+
return this.savedVis && this.savedVis.description;
302+
}
303+
298304
destroy() {
299305
super.destroy();
300306
if (this.domNode) {

x-pack/plugins/lens/public/metric_visualization/expression.test.tsx

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,21 @@ function sampleArgs() {
3232
accessor: 'a',
3333
layerId: 'l1',
3434
title: 'My fanci metric chart',
35+
description: 'Fancy chart description',
36+
metricTitle: 'My fanci metric chart',
3537
mode: 'full',
3638
};
3739

38-
return { data, args };
40+
const noAttributesArgs: MetricConfig = {
41+
accessor: 'a',
42+
layerId: 'l1',
43+
title: '',
44+
description: '',
45+
metricTitle: 'My fanci metric chart',
46+
mode: 'full',
47+
};
48+
49+
return { data, args, noAttributesArgs };
3950
}
4051

4152
describe('metric_expression', () => {
@@ -53,14 +64,15 @@ describe('metric_expression', () => {
5364
});
5465

5566
describe('MetricChart component', () => {
56-
test('it renders the title and value', () => {
67+
test('it renders the all attributes when passed (title, description, metricTitle, value)', () => {
5768
const { data, args } = sampleArgs();
5869

5970
expect(
6071
shallow(<MetricChart data={data} args={args} formatFactory={(x) => x as IFieldFormat} />)
6172
).toMatchInlineSnapshot(`
6273
<VisualizationContainer
6374
className="lnsMetricExpression__container"
75+
reportDescription="Fancy chart description"
6476
reportTitle="My fanci metric chart"
6577
>
6678
<AutoScale>
@@ -90,21 +102,66 @@ describe('metric_expression', () => {
90102
`);
91103
});
92104

93-
test('it does not render title in reduced mode', () => {
94-
const { data, args } = sampleArgs();
105+
test('it renders only chart content when title and description are empty strings', () => {
106+
const { data, noAttributesArgs } = sampleArgs();
95107

96108
expect(
97109
shallow(
98110
<MetricChart
99111
data={data}
100-
args={{ ...args, mode: 'reduced' }}
112+
args={noAttributesArgs}
101113
formatFactory={(x) => x as IFieldFormat}
102114
/>
103115
)
104116
).toMatchInlineSnapshot(`
105117
<VisualizationContainer
106118
className="lnsMetricExpression__container"
107-
reportTitle="My fanci metric chart"
119+
reportDescription=""
120+
reportTitle=""
121+
>
122+
<AutoScale>
123+
<div
124+
data-test-subj="lns_metric_value"
125+
style={
126+
Object {
127+
"fontSize": "60pt",
128+
"fontWeight": 600,
129+
}
130+
}
131+
>
132+
10110
133+
</div>
134+
<div
135+
data-test-subj="lns_metric_title"
136+
style={
137+
Object {
138+
"fontSize": "24pt",
139+
}
140+
}
141+
>
142+
My fanci metric chart
143+
</div>
144+
</AutoScale>
145+
</VisualizationContainer>
146+
`);
147+
});
148+
149+
test('it does not render metricTitle in reduced mode', () => {
150+
const { data, noAttributesArgs } = sampleArgs();
151+
152+
expect(
153+
shallow(
154+
<MetricChart
155+
data={data}
156+
args={{ ...noAttributesArgs, mode: 'reduced' }}
157+
formatFactory={(x) => x as IFieldFormat}
158+
/>
159+
)
160+
).toMatchInlineSnapshot(`
161+
<VisualizationContainer
162+
className="lnsMetricExpression__container"
163+
reportDescription=""
164+
reportTitle=""
108165
>
109166
<AutoScale>
110167
<div

x-pack/plugins/lens/public/metric_visualization/expression.tsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ export const metricChart: ExpressionFunctionDefinition<
4343
types: ['string'],
4444
help: 'The chart title.',
4545
},
46+
description: {
47+
types: ['string'],
48+
help: '',
49+
},
50+
metricTitle: {
51+
types: ['string'],
52+
help: 'The title of the metric shown.',
53+
},
4654
accessor: {
4755
types: ['string'],
4856
help: 'The column whose value is being displayed',
@@ -98,12 +106,16 @@ export function MetricChart({
98106
args,
99107
formatFactory,
100108
}: MetricChartProps & { formatFactory: FormatFactory }) {
101-
const { title, accessor, mode } = args;
109+
const { metricTitle, title, description, accessor, mode } = args;
102110
let value = '-';
103111
const firstTable = Object.values(data.tables)[0];
104112
if (!accessor) {
105113
return (
106-
<VisualizationContainer reportTitle={title} className="lnsMetricExpression__container" />
114+
<VisualizationContainer
115+
reportTitle={title}
116+
reportDescription={description}
117+
className="lnsMetricExpression__container"
118+
/>
107119
);
108120
}
109121

@@ -119,14 +131,18 @@ export function MetricChart({
119131
}
120132

121133
return (
122-
<VisualizationContainer reportTitle={title} className="lnsMetricExpression__container">
134+
<VisualizationContainer
135+
reportTitle={title}
136+
reportDescription={description}
137+
className="lnsMetricExpression__container"
138+
>
123139
<AutoScale>
124140
<div data-test-subj="lns_metric_value" style={{ fontSize: '60pt', fontWeight: 600 }}>
125141
{value}
126142
</div>
127143
{mode === 'full' && (
128144
<div data-test-subj="lns_metric_title" style={{ fontSize: '24pt' }}>
129-
{title}
145+
{metricTitle}
130146
</div>
131147
)}
132148
</AutoScale>

0 commit comments

Comments
 (0)