Skip to content

Commit 3806ccf

Browse files
authored
Merge pull request #14607 from codyrancher/harvester-masthead
Resolve new masthead issues in regards to harvester
2 parents 41a7cbe + 81b50c5 commit 3806ccf

File tree

10 files changed

+75
-36
lines changed

10 files changed

+75
-36
lines changed

shell/components/Drawer/ResourceDetailDrawer/ConfigTab.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Tab from '@shell/components/Tabbed/Tab.vue';
77
export interface Props {
88
resource: any;
99
component: any;
10+
resourceType: string;
1011
}
1112
</script>
1213
<script setup lang="ts">
@@ -25,6 +26,7 @@ const i18n = useI18n(store);
2526
:is="props.component"
2627
:value="props.resource"
2728
:liveValue="props.resource"
29+
:resourceType="props.resourceType"
2830
:mode="_VIEW"
2931
:real-mode="_VIEW"
3032
:initial-value="props.resource"

shell/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,13 @@ describe('composables: ResourceDetailDrawer', () => {
6969
expect(useDrawerSpy).toHaveBeenCalledTimes(1);
7070
expect(openSpy).toHaveBeenCalledWith({ name: 'ResourceDetailDrawer' }, selector, {
7171
resource,
72-
onClose: closeSpy,
73-
width: '73%',
72+
onClose: closeSpy,
73+
width: '73%',
7474
// We want this to be full viewport height top to bottom
75-
height: '100vh',
76-
top: '0',
77-
'z-index': 101, // We want this to be above the main side menu
75+
height: '100vh',
76+
top: '0',
77+
'z-index': 101, // We want this to be above the main side menu
78+
closeOnRouteChange: ['name', 'params', 'query']
7879
});
7980
});
8081
});

shell/components/Drawer/ResourceDetailDrawer/composables.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ export function useResourceDetailDrawer() {
1313
returnFocusSelector,
1414
{
1515
resource,
16-
onClose: close,
17-
width: '73%',
16+
onClose: close,
17+
width: '73%',
1818
// We want this to be full viewport height top to bottom
19-
height: '100vh',
20-
top: '0',
21-
'z-index': 101 // We want this to be above the main side menu
19+
height: '100vh',
20+
top: '0',
21+
'z-index': 101, // We want this to be above the main side menu
22+
closeOnRouteChange: ['name', 'params', 'query'] // We want to ignore hash changes, tables in extensions can trigger the drawer to close while opening
2223
});
2324
};
2425

@@ -43,6 +44,7 @@ export function useDefaultConfigTabProps(resource: any): ConfigTabProps | undefi
4344

4445
return {
4546
resource,
46-
component: store.getters['type-map/importEdit'](resource.type)
47+
component: store.getters['type-map/importEdit'](resource.type),
48+
resourceType: resource.type
4749
};
4850
}

shell/components/Resource/Detail/TitleBar/composables.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@ export const useDefaultTitleBarProps = (resource: any, resourceSubtype?: Ref<str
1616
const schema = store.getters[`${ currentStore }/schemaFor`](resourceValue.type);
1717
const resourceTypeLabel = resourceValue.parentNameOverride || store.getters['type-map/labelFor'](schema);
1818
const resourceName = resourceSubtypeValue ? `${ resourceSubtypeValue } - ${ resourceValue.nameDisplay }` : resourceValue.nameDisplay;
19+
const resourceTo = resourceValue.listLocation || {
20+
name: 'c-cluster-product-resource',
21+
params: {
22+
product: 'explorer',
23+
cluster: route?.params.cluster,
24+
namespace: resourceValue.namespace,
25+
resource: resourceValue.type
26+
}
27+
};
1928

2029
return {
2130
resourceTypeLabel,
22-
resourceTo: {
23-
name: 'c-cluster-product-resource',
24-
params: {
25-
product: 'explorer',
26-
cluster: route.params.cluster,
27-
namespace: resourceValue.namespace,
28-
resource: resourceValue.type
29-
}
30-
},
31+
resourceTo,
3132
resourceName,
3233
actionMenuResource: resourceValue,
3334
badge: {

shell/components/ResourceDetail/Masthead/__tests__/index.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { mount } from '@vue/test-utils';
22
import { _VIEW } from '@shell/config/query-params';
33
import Index from '@shell/components/ResourceDetail/Masthead/index.vue';
44
import * as PageEnabled from '@shell/composables/useIsNewDetailPageEnabled';
5+
import { computed } from 'vue';
56

67
jest.mock('@shell/composables/useIsNewDetailPageEnabled');
78
jest.mock('@shell/components/ResourceDetail/Masthead/latest.vue', () => ({
@@ -22,7 +23,7 @@ describe('component: Masthead/index', () => {
2223
});
2324

2425
it('should render Latest if useIsNewDetailPageEnabled is true and mode is _VIEW', () => {
25-
useIsNewDetailPageEnabledSpy.mockReturnValue(true);
26+
useIsNewDetailPageEnabledSpy.mockReturnValue(computed(() => true));
2627
const props = {
2728
value: { type: 'VALUE' },
2829
mode: _VIEW,
@@ -38,7 +39,7 @@ describe('component: Masthead/index', () => {
3839
});
3940

4041
it('should render Legacy if useIsNewDetailPageEnabled is false and mode is _VIEW', () => {
41-
useIsNewDetailPageEnabledSpy.mockReturnValue(false);
42+
useIsNewDetailPageEnabledSpy.mockReturnValue(computed(() => false));
4243
const props = {
4344
value: { type: 'VALUE' },
4445
mode: _VIEW,
@@ -53,7 +54,7 @@ describe('component: Masthead/index', () => {
5354
});
5455

5556
it('should render Legacy if useIsNewDetailPageEnabled is true and mode is not _VIEW', () => {
56-
useIsNewDetailPageEnabledSpy.mockReturnValue(true);
57+
useIsNewDetailPageEnabledSpy.mockReturnValue(computed(() => true));
5758
const props = {
5859
value: { type: 'VALUE' },
5960
mode: 'ANYTHING',

shell/components/ResourceDetail/Masthead/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ const props = withDefaults(defineProps<Props>(), {
4040
4141
const isNewDetailPageEnabled = useIsNewDetailPageEnabled();
4242
const isView = computed(() => props.mode === _VIEW);
43-
const showLatestMasthead = computed(() => isNewDetailPageEnabled && isView.value );
43+
const showLatestMasthead = computed(() => isNewDetailPageEnabled.value && isView.value );
4444
</script>
4545

4646
<template>

shell/components/ResourceDetail/__tests__/index.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ResourceDetail from '@shell/components/ResourceDetail/index.vue';
33
import { _EDIT, _VIEW, LEGACY, MODE } from '@shell/config/query-params';
44
import * as pageEnabled from '@shell/composables/useIsNewDetailPageEnabled';
55
import flushPromises from 'flush-promises';
6+
import { computed } from 'vue';
67

78
const mockQuery: any = {};
89
const mockParams: any = {};
@@ -44,7 +45,7 @@ describe('component: ResourceDetail/index', () => {
4445
mockParams.resource = resourceName;
4546
mockQuery[MODE] = _VIEW;
4647

47-
useIsNewDetailPageEnabledSpy.mockReturnValue(false);
48+
useIsNewDetailPageEnabledSpy.mockReturnValue(computed(() => false));
4849

4950
const wrapper = mount(ResourceDetail, { });
5051
const legacyComponent = wrapper.findComponent<any>({ name: 'Legacy' });
@@ -62,7 +63,7 @@ describe('component: ResourceDetail/index', () => {
6263
mockParams.resource = 'notMapped';
6364
mockQuery[MODE] = _VIEW;
6465

65-
useIsNewDetailPageEnabledSpy.mockReturnValue(false);
66+
useIsNewDetailPageEnabledSpy.mockReturnValue(computed(() => false));
6667

6768
const wrapper = mount(ResourceDetail, {});
6869
const legacyComponent = wrapper.findComponent<any>({ name: 'Legacy' });
@@ -75,7 +76,7 @@ describe('component: ResourceDetail/index', () => {
7576
mockParams.resource = resourceName;
7677
mockQuery[MODE] = _EDIT;
7778

78-
useIsNewDetailPageEnabledSpy.mockReturnValue(false);
79+
useIsNewDetailPageEnabledSpy.mockReturnValue(computed(() => false));
7980

8081
const wrapper = mount(ResourceDetail, {});
8182
const legacyComponent = wrapper.findComponent<any>({ name: 'Legacy' });
@@ -121,7 +122,7 @@ describe('component: ResourceDetail/index', () => {
121122
mockQuery[MODE] = _VIEW;
122123
mockQuery[LEGACY] = 'false';
123124

124-
useIsNewDetailPageEnabledSpy.mockReturnValue(true);
125+
useIsNewDetailPageEnabledSpy.mockReturnValue(computed(() => true));
125126

126127
const wrapper = mount(ResourceDetail);
127128

shell/components/ResourceDetail/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const isView = computed(() => route?.params?.id && (!mode.value || mode.value ==
6666
// We're defaulting to legacy being on, we'll switch this once we want to enable the new detail page by default
6767
const iseNewDetailPageEnabled = useIsNewDetailPageEnabled();
6868
const page = computed(() => currentResourceName.value ? resourceToPage[currentResourceName.value] : undefined);
69-
const useLatest = computed(() => !!(iseNewDetailPageEnabled && isView.value && page.value));
69+
const useLatest = computed(() => !!(iseNewDetailPageEnabled.value && isView.value && page.value));
7070
</script>
7171

7272
<template>

shell/components/SlideInPanelManager.vue

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
DEFAULT_FOCUS_TRAP_OPTS,
66
useWatcherBasedSetupFocusTrapWithDestroyIncluded
77
} from '@shell/composables/focusTrap';
8+
import { isEqual } from 'lodash';
9+
import { useRouter } from 'vue-router';
810
911
const HEADER_HEIGHT = 55;
1012
@@ -38,6 +40,16 @@ const panelZIndex = computed(() => `${ (isOpen?.value ? 1 : 2) * (currentProps?.
3840
3941
const showHeader = computed(() => currentProps?.value?.showHeader ?? true);
4042
const panelTitle = showHeader.value ? computed(() => currentProps?.value?.title || 'Details') : null;
43+
const closeOnRouteChange = computed(() => {
44+
const propsCloseOnRouteChange = currentProps?.value.closeOnRouteChange;
45+
46+
if (!propsCloseOnRouteChange) {
47+
return ['name', 'params', 'hash', 'query'];
48+
}
49+
50+
return propsCloseOnRouteChange;
51+
});
52+
const router = useRouter();
4153
4254
watch(
4355
/**
@@ -81,9 +93,25 @@ watch(
8193
);
8294
8395
watch(
84-
() => (store as any).$router?.currentRoute,
85-
() => {
86-
if (isOpen?.value && currentProps?.value.closeOnRouteChange !== false) {
96+
() => router?.currentRoute?.value,
97+
(newValue, oldValue) => {
98+
if (!isOpen?.value) {
99+
return;
100+
}
101+
102+
if (closeOnRouteChange.value.includes('name') && !isEqual(newValue?.name, oldValue?.name)) {
103+
closePanel();
104+
}
105+
106+
if (closeOnRouteChange.value.includes('params') && !isEqual(newValue?.params, oldValue?.params)) {
107+
closePanel();
108+
}
109+
110+
if (closeOnRouteChange.value.includes('hash') && !isEqual(newValue?.hash, oldValue?.hash)) {
111+
closePanel();
112+
}
113+
114+
if (closeOnRouteChange.value.includes('query') && !isEqual(newValue?.query, oldValue?.query)) {
87115
closePanel();
88116
}
89117
},
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import { useRoute } from 'vue-router';
22
import { LEGACY } from '@shell/config/query-params';
3+
import { computed } from 'vue';
34

45
const enabledByDefault = true;
56

67
export const useIsNewDetailPageEnabled = () => {
78
const route = useRoute();
89

9-
if (enabledByDefault) {
10-
return route.query[LEGACY] !== 'true';
11-
}
10+
return computed(() => {
11+
if (enabledByDefault) {
12+
return route?.query?.[LEGACY] !== 'true';
13+
}
1214

13-
return route.query[LEGACY] === 'false';
15+
return route?.query?.[LEGACY] === 'false';
16+
});
1417
};

0 commit comments

Comments
 (0)