Skip to content

Commit c04d0f7

Browse files
author
Maja Grubic
committed
Using custom save method on attribute service
1 parent 020c104 commit c04d0f7

File tree

5 files changed

+59
-26
lines changed

5 files changed

+59
-26
lines changed

src/plugins/dashboard/public/attribute_service/attribute_service.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,5 +189,15 @@ describe('attributeService', () => {
189189
});
190190
expect(customSaveMethod).toHaveBeenCalledWith(defaultTestType, attributes, undefined);
191191
});
192+
193+
it('uses custom save method when passed through setOptions', async () => {
194+
const customSaveMethod = jest.fn().mockReturnValue({ id: '678' });
195+
const attributeService = mockAttributeService<TestAttributes>(defaultTestType);
196+
attributeService.setOptions({ customSaveMethod });
197+
expect(await attributeService.wrapAttributes(attributes, true)).toEqual({
198+
savedObjectId: '678',
199+
});
200+
expect(customSaveMethod).toHaveBeenCalledWith(defaultTestType, attributes, undefined);
201+
});
192202
});
193203
});

src/plugins/dashboard/public/attribute_service/attribute_service.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export interface AttributeServiceOptions<A extends { title: string }> {
5757
type: string,
5858
attributes: A,
5959
savedObjectId?: string
60-
) => Promise<{ id: string }>;
60+
) => Promise<{ id?: string } | { error: Error}>;
6161
customUnwrapMethod?: (savedObject: SimpleSavedObject<A>) => A;
6262
}
6363

@@ -124,7 +124,10 @@ export class AttributeService<
124124
newAttributes,
125125
savedObjectId
126126
);
127-
return { ...originalInput, savedObjectId: savedItem.id } as RefType;
127+
if ('id' in savedItem) {
128+
return { ...originalInput, savedObjectId: savedItem.id } as RefType;
129+
}
130+
return { ...originalInput } as RefType;
128131
}
129132

130133
if (savedObjectId) {
@@ -176,7 +179,6 @@ export class AttributeService<
176179
getInputAsRefType = async (
177180
input: ValType | RefType,
178181
saveOptions?: { showSaveModal: boolean; saveModalTitle?: string } | { title: string },
179-
customSaveMethod?: (props: OnSaveProps) => Promise<SaveResult>
180182
): Promise<RefType> => {
181183
if (this.inputIsRefType(input)) {
182184
return input;
@@ -209,11 +211,10 @@ export class AttributeService<
209211
return { error };
210212
}
211213
};
212-
const onSaveMethod = customSaveMethod ? customSaveMethod : onSave;
213214
if (saveOptions && (saveOptions as { showSaveModal: boolean }).showSaveModal) {
214215
this.showSaveModal(
215216
<SavedObjectSaveModal
216-
onSave={onSaveMethod}
217+
onSave={onSave}
217218
onClose={() => reject()}
218219
title={get(saveOptions, 'saveModalTitle', input[ATTRIBUTE_SERVICE_KEY].title)}
219220
showCopyOnSave={false}
@@ -225,4 +226,8 @@ export class AttributeService<
225226
}
226227
});
227228
};
229+
230+
public setOptions = (options: AttributeServiceOptions<SavedObjectAttributes>) => {
231+
this.options = options;
232+
};
228233
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ import { SavedVisualizationsLoader } from '../saved_visualizations';
4242
export const createVisEmbeddableFromObject = (deps: VisualizeEmbeddableFactoryDeps) => async (
4343
vis: Vis,
4444
input: Partial<VisualizeInput> & { id: string },
45+
savedVisualizationsLoader?: SavedVisualizationsLoader,
4546
attributeService?: AttributeService<
4647
VisualizeSavedObjectAttributes,
4748
VisualizeByValueInput,
4849
VisualizeByReferenceInput
4950
>,
50-
savedVisualizationsLoader?: SavedVisualizationsLoader,
5151
parent?: IContainer
5252
): Promise<VisualizeEmbeddable | ErrorEmbeddable | DisabledLabEmbeddable> => {
5353
const savedVisualizations = getSavedVisualizationsLoader();

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

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ import { SavedObjectAttributes } from '../../../../core/types';
5454
import { AttributeService } from '../../../dashboard/public';
5555
import { SavedVisualizationsLoader } from '../saved_visualizations';
5656
import { VisSavedObject } from '../types';
57-
import { OnSaveProps, SaveResult } from '../../../saved_objects/public';
5857

5958
const getKeys = <T extends {}>(o: T): Array<keyof T> => Object.keys(o) as Array<keyof T>;
6059

@@ -83,7 +82,11 @@ export interface VisualizeOutput extends EmbeddableOutput {
8382
visTypeName: string;
8483
}
8584

86-
export type VisualizeSavedObjectAttributes = SavedObjectAttributes & { title: string };
85+
export type VisualizeSavedObjectAttributes = SavedObjectAttributes & {
86+
title: string;
87+
vis?: Vis;
88+
savedVis?: VisSavedObject;
89+
};
8790
export type VisualizeByValueInput = { attributes: VisualizeSavedObjectAttributes } & VisualizeInput;
8891
export type VisualizeByReferenceInput = SavedObjectEmbeddableInput & VisualizeInput;
8992

@@ -426,49 +429,64 @@ export class VisualizeEmbeddable
426429
};
427430

428431
getInputAsRefType = async (): Promise<VisualizeByReferenceInput> => {
432+
const savedVis: VisSavedObject = await this.savedVisualizationsLoader?.get({});
433+
if (!savedVis) {
434+
throw new Error('No Saved Vis');
435+
}
429436
return new Promise<VisualizeByReferenceInput>((resolve, reject) => {
430-
const onSave = async (props: OnSaveProps): Promise<SaveResult> => {
437+
const onSave = async (
438+
type: string,
439+
attributes: VisualizeSavedObjectAttributes
440+
): Promise<{ id: string }> => {
431441
try {
432-
const savedVis: VisSavedObject = await this.savedVisualizationsLoader?.get({});
442+
const { title, vis } = attributes;
433443
const saveOptions = {
434444
confirmOverwrite: false,
435445
returnToOrigin: true,
436446
};
437-
savedVis.title = props.newTitle;
438-
savedVis.copyOnSave = props.newCopyOnSave || false;
439-
savedVis.description = props.newDescription || '';
440-
savedVis.searchSourceFields = this.vis?.data.searchSource?.getSerializedFields();
441-
const serializedVis = this.vis.serialize();
442-
const { title, type, params, data } = serializedVis;
447+
savedVis.title = title;
448+
savedVis.copyOnSave = false;
449+
savedVis.description = '';
450+
savedVis.searchSourceFields = vis?.data.searchSource?.getSerializedFields();
451+
const serializedVis = ((vis as unknown) as Vis).serialize();
452+
const { params, data } = serializedVis;
443453
savedVis.visState = {
444454
title,
445-
type,
455+
type: serializedVis.type,
446456
params,
447457
aggs: data.aggs,
448458
};
449-
savedVis.uiStateJSON = this.vis.uiState.toString();
459+
if (vis) {
460+
savedVis.uiStateJSON = vis.uiState.toString();
461+
}
450462
const id = await savedVis.save(saveOptions);
451463
resolve({ savedObjectId: id, id: this.id });
452464
return { id };
453465
} catch (error) {
454466
reject(error);
455-
return { error };
467+
return { id: '' };
456468
}
457469
};
458470
const saveModalTitle = this.getTitle()
459471
? this.getTitle()
460472
: i18n.translate('visualize.embeddable.placeholderTitle', {
461473
defaultMessage: 'Placeholder Title',
462474
});
475+
// @ts-ignore
476+
const attributes: VisualizeSavedObjectAttributes = {
477+
savedVis,
478+
vis: this.vis,
479+
title: this.vis.title,
480+
};
481+
this.attributeService.setOptions({
482+
customSaveMethod: onSave,
483+
});
463484
return this.attributeService.getInputAsRefType(
464485
{
465486
id: this.id,
466-
attributes: {
467-
title: this.vis.title,
468-
},
487+
attributes,
469488
},
470-
{ showSaveModal: true, saveModalTitle },
471-
onSave
489+
{ showSaveModal: true, saveModalTitle }
472490
);
473491
});
474492
};

src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ export class VisualizeEmbeddableFactory
149149
return createVisEmbeddableFromObject(this.deps)(
150150
vis,
151151
input,
152-
await this.getAttributeService(),
153152
savedVisualizations,
153+
await this.getAttributeService(),
154154
parent
155155
);
156156
} catch (e) {
@@ -170,8 +170,8 @@ export class VisualizeEmbeddableFactory
170170
return createVisEmbeddableFromObject(this.deps)(
171171
vis,
172172
input,
173-
await this.getAttributeService(),
174173
savedVisualizations,
174+
await this.getAttributeService(),
175175
parent
176176
);
177177
} else {

0 commit comments

Comments
 (0)