Skip to content

Commit 0d5bad2

Browse files
committed
null/undefined cleanup
1 parent 0be9d1a commit 0d5bad2

File tree

16 files changed

+152
-243
lines changed

16 files changed

+152
-243
lines changed

src/platform/plugins/private/presentation_panel/public/panel_actions/customize_panel_action/cps_usage_overrides_badge.tsx

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ export class CpsUsageOverridesBadge
3333
public order = 8;
3434

3535
public getDisplayName({ embeddable }: EmbeddableApiContext) {
36-
if (!this.hasOverride(embeddable)) throw new IncompatibleActionError();
37-
3836
if (!apiPublishesProjectRouting(embeddable)) {
3937
throw new IncompatibleActionError();
4038
}
@@ -100,13 +98,13 @@ export class CpsUsageOverridesBadge
10098
return (
10199
<EuiPopover
102100
button={
103-
<span
101+
<button
104102
onClick={() => setIsPopoverOpen(!isPopoverOpen)}
105103
style={{ cursor: 'pointer' }}
106104
data-test-subj="cpsUsageOverridesBadgeButton"
107105
>
108106
{badgeLabel}
109-
</span>
107+
</button>
110108
}
111109
isOpen={isPopoverOpen}
112110
closePopover={() => setIsPopoverOpen(false)}
@@ -196,20 +194,9 @@ export class CpsUsageOverridesBadge
196194
}
197195

198196
private hasOverride(embeddable: unknown): boolean {
199-
if (
200-
!apiPublishesProjectRouting(embeddable) ||
201-
!apiHasParentApi(embeddable) ||
202-
!apiPublishesProjectRouting(embeddable.parentApi)
203-
) {
197+
if (!apiPublishesProjectRouting(embeddable)) {
204198
return false;
205199
}
206-
207-
const embeddableProjectRouting = embeddable.projectRouting$.value;
208-
const parentProjectRouting = embeddable.parentApi.projectRouting$.value;
209-
210-
// Only show badge if embeddable has an explicit (non-undefined) override that differs from dashboard
211-
return (
212-
embeddableProjectRouting !== undefined && embeddableProjectRouting !== parentProjectRouting
213-
);
200+
return embeddable.projectRouting$.value !== undefined;
214201
}
215202
}

src/platform/plugins/shared/discover/public/__mocks__/discover_state.mock.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,6 @@ export function getDiscoverStateMock({
289289
}),
290290
...additionalPersistedTabs,
291291
],
292-
projectRouting:
293-
finalSavedSearch.projectRouting === null ? undefined : finalSavedSearch.projectRouting,
294292
}
295293
: undefined;
296294
const mockUserId = 'mockUserId';

src/platform/plugins/shared/discover/public/application/main/state_management/discover_state.test.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -909,10 +909,7 @@ describe('Discover state', () => {
909909
services: mockServices,
910910
}),
911911
],
912-
projectRouting:
913-
savedSearchWithDefaults.projectRouting === null
914-
? undefined
915-
: savedSearchWithDefaults.projectRouting,
912+
projectRouting: savedSearchWithDefaults.projectRouting ?? undefined,
916913
});
917914
await state.internalState.dispatch(
918915
internalStateActions.initializeTabs({ discoverSessionId: savedSearchWithDefaults.id })
@@ -967,10 +964,7 @@ describe('Discover state', () => {
967964
services: mockServices,
968965
}),
969966
],
970-
projectRouting:
971-
savedSearchWithDefaults.projectRouting === null
972-
? undefined
973-
: savedSearchWithDefaults.projectRouting,
967+
projectRouting: savedSearchWithDefaults.projectRouting ?? undefined,
974968
});
975969
await state.internalState.dispatch(
976970
internalStateActions.initializeTabs({ discoverSessionId: savedSearchWithDefaults.id })

src/platform/plugins/shared/discover/public/application/main/state_management/redux/actions/save_discover_session.test.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ const setup = ({
5353
...discoverSession,
5454
id: discoverSession.id ?? 'new-session',
5555
managed: false,
56-
projectRouting:
57-
discoverSession.projectRouting === null ? undefined : discoverSession.projectRouting,
56+
projectRouting: discoverSession.projectRouting ?? undefined,
5857
})
5958
);
6059
const dataViewCreateSpy = jest.spyOn(services.dataViews, 'create');

src/platform/plugins/shared/discover/public/embeddable/utils/serialization_utils.test.ts

Lines changed: 2 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -153,65 +153,6 @@ describe('Serialization utils', () => {
153153
expect(deserializedState.title).toEqual('test panel title');
154154
expect(deserializedState.sort).toEqual([['order_date', 'asc']]);
155155
});
156-
157-
test('by reference with null projectRouting should transform to undefined', async () => {
158-
const baseSearch = await discoverServiceMock.savedSearch.byValueToSavedSearch(
159-
{
160-
attributes: mockedSavedSearchAttributes,
161-
},
162-
true
163-
);
164-
165-
discoverServiceMock.savedSearch.get = jest.fn().mockResolvedValue({
166-
...baseSearch,
167-
savedObjectId: 'savedSearch',
168-
projectRouting: null,
169-
});
170-
171-
const serializedState: SerializedPanelState<SearchEmbeddableState> = {
172-
rawState: {
173-
savedObjectId: 'savedSearch',
174-
},
175-
references: [],
176-
};
177-
178-
const deserializedState = await deserializeState({
179-
serializedState,
180-
discoverServices: discoverServiceMock,
181-
});
182-
183-
expect(deserializedState.projectRouting).toBeUndefined();
184-
expect('projectRouting' in deserializedState).toBe(false);
185-
});
186-
187-
test('by reference with projectRouting should preserve it', async () => {
188-
const baseSearch = await discoverServiceMock.savedSearch.byValueToSavedSearch(
189-
{
190-
attributes: mockedSavedSearchAttributes,
191-
},
192-
true
193-
);
194-
195-
discoverServiceMock.savedSearch.get = jest.fn().mockResolvedValue({
196-
...baseSearch,
197-
savedObjectId: 'savedSearch',
198-
projectRouting: 'ALL',
199-
});
200-
201-
const serializedState: SerializedPanelState<SearchEmbeddableState> = {
202-
rawState: {
203-
savedObjectId: 'savedSearch',
204-
},
205-
references: [],
206-
};
207-
208-
const deserializedState = await deserializeState({
209-
serializedState,
210-
discoverServices: discoverServiceMock,
211-
});
212-
213-
expect(deserializedState.projectRouting).toBe('ALL');
214-
});
215156
});
216157

217158
describe('serialize state', () => {
@@ -223,6 +164,7 @@ describe('Serialization utils', () => {
223164
...mockedSavedSearchAttributes,
224165
managed: false,
225166
searchSource,
167+
projectRouting: undefined,
226168
};
227169

228170
const serializedState = serializeState({
@@ -269,6 +211,7 @@ describe('Serialization utils', () => {
269211
...mockedSavedSearchAttributes,
270212
managed: false,
271213
searchSource,
214+
projectRouting: undefined,
272215
};
273216

274217
test('equal state', () => {

src/platform/plugins/shared/discover/public/embeddable/utils/serialization_utils.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,8 @@ export const deserializeState = async ({
4747
// what is this??
4848
const rawSavedObjectAttributes = pick(so, EDITABLE_SAVED_SEARCH_KEYS);
4949
const savedObjectOverride = pick(serializedState.rawState, EDITABLE_SAVED_SEARCH_KEYS);
50-
// Filter out null projectRouting for type safety (runtime already filtered by fromSavedSearchAttributes)
51-
const { projectRouting, ...soWithoutTimeRangeAndProjectRouting } = omit(so, 'timeRange');
5250
return {
53-
...soWithoutTimeRangeAndProjectRouting,
54-
// Only include projectRouting if it's not null (SearchEmbeddableRuntimeState doesn't allow null)
55-
...(projectRouting !== null && projectRouting !== undefined && { projectRouting }),
51+
...omit(so, 'timeRange'),
5652
savedObjectId,
5753
savedObjectTitle: so.title,
5854
savedObjectDescription: so.description,
@@ -71,12 +67,8 @@ export const deserializeState = async ({
7167
serializedState.rawState as SearchEmbeddableByValueState,
7268
true
7369
);
74-
// Filter out null projectRouting for type safety (runtime already filtered by fromSavedSearchAttributes)
75-
const { projectRouting, ...savedSearchWithoutProjectRouting } = savedSearch;
7670
return {
77-
...savedSearchWithoutProjectRouting,
78-
// Only include projectRouting if it's not null (SearchEmbeddableRuntimeState doesn't allow null)
79-
...(projectRouting !== null && projectRouting !== undefined && { projectRouting }),
71+
...savedSearch,
8072
...panelState,
8173
nonPersistedDisplayOptions: serializedState.rawState.nonPersistedDisplayOptions,
8274
};

src/platform/plugins/shared/saved_search/common/saved_searches_utils.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ export const fromSavedSearchAttributes = <
5050
visContext: attributes.visContext,
5151
controlGroupJson: attributes.controlGroupJson,
5252
density: attributes.density,
53-
// Only include projectRouting if it's not null/undefined (saved state allows null, runtime doesn't)
54-
...(projectRouting !== null && projectRouting !== undefined && { projectRouting }),
53+
projectRouting: projectRouting ?? undefined,
5554
tabs,
5655
managed,
5756
} as ReturnType;

src/platform/plugins/shared/saved_search/common/service/get_discover_session.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@ export const getDiscoverSession = async (
5050
visContext: tab.attributes.visContext,
5151
controlGroupJson: tab.attributes.controlGroupJson,
5252
})),
53-
// Session-level projectRouting - normalize null to undefined for runtime usage
54-
projectRouting:
55-
so.item.attributes.projectRouting === null ? undefined : so.item.attributes.projectRouting,
53+
projectRouting: so.item.attributes.projectRouting ?? undefined,
5654
managed: Boolean(so.item.managed),
5755
tags: deps.savedObjectsTagging
5856
? deps.savedObjectsTagging.ui.getTagIdsFromReferences(so.item.references)

src/platform/plugins/shared/saved_search/common/service/get_saved_searches.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ describe('getSavedSearch', () => {
9393
"id": "ccf1af80-2297-11ec-86e0-1155ffb9c7a7",
9494
"isTextBasedQuery": undefined,
9595
"managed": false,
96+
"projectRouting": undefined,
9697
"references": Array [
9798
Object {
9899
"id": "ff959d40-b880-11e8-a6d9-e546fe2bba5f",
@@ -244,6 +245,7 @@ describe('getSavedSearch', () => {
244245
"id": "ccf1af80-2297-11ec-86e0-1155ffb9c7a7",
245246
"isTextBasedQuery": true,
246247
"managed": false,
248+
"projectRouting": undefined,
247249
"references": Array [
248250
Object {
249251
"id": "ff959d40-b880-11e8-a6d9-e546fe2bba5f",

src/platform/plugins/shared/saved_search/common/service/saved_searches_utils.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ describe('saved_searches_utils', () => {
7979
"id": "id",
8080
"isTextBasedQuery": false,
8181
"managed": false,
82+
"projectRouting": undefined,
8283
"references": Array [],
8384
"refreshInterval": undefined,
8485
"rowHeight": undefined,
@@ -165,7 +166,7 @@ describe('saved_searches_utils', () => {
165166
};
166167

167168
const result = toSavedSearchAttributes(savedSearch, '{}');
168-
expect(result).toEqual({
169+
expect(result).toMatchObject({
169170
kibanaSavedObjectMeta: {
170171
searchSourceJSON: '{}',
171172
},
@@ -178,6 +179,7 @@ describe('saved_searches_utils', () => {
178179
isTextBasedQuery: true,
179180
usesAdHocDataView: false,
180181
timeRestore: false,
182+
projectRouting: null,
181183
tabs: [
182184
{
183185
id: expect.any(String),
@@ -193,6 +195,7 @@ describe('saved_searches_utils', () => {
193195
isTextBasedQuery: true,
194196
usesAdHocDataView: false,
195197
timeRestore: false,
198+
projectRouting: null,
196199
},
197200
},
198201
],

0 commit comments

Comments
 (0)