Skip to content

Commit 6ae1032

Browse files
Merge pull request #5 from mportiz08/sidenav-feature-flag
Hide new navigator UX behind a feature flag
2 parents 10bc106 + 9601c06 commit 6ae1032

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

app/public/theme-settings.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
"docs": {
5454
"summary": {
5555
"hide": false
56+
},
57+
"navigator": {
58+
"enable": false
5659
}
5760
}
5861
}

src/components/AdjustableSidebarWidth.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import { waitFrames } from 'docc-render/utils/loading';
4949
import scrollLock from 'docc-render/utils/scroll-lock';
5050
import FocusTrap from 'docc-render/utils/FocusTrap';
5151
import changeElementVOVisibility from 'docc-render/utils/changeElementVOVisibility';
52-
import throttle from '@/utils/throttle';
52+
import throttle from 'docc-render/utils/throttle';
5353
5454
export const STORAGE_KEY = 'sidebar';
5555

src/views/DocumentationTopic.vue

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
@toggle-sidenav="isSideNavOpen = !isSideNavOpen"
2727
/>
2828
<component
29-
:is="isTargetIDE ? 'div': 'AdjustableSidebarWidth'"
29+
:is="enableNavigator ? 'AdjustableSidebarWidth' : 'div'"
3030
v-bind="sidebarProps"
3131
v-on="sidebarListeners"
3232
>
@@ -64,6 +64,7 @@
6464

6565
<script>
6666
import { apply } from 'docc-render/utils/json-patch';
67+
import { getSetting } from 'docc-render/utils/theme-settings';
6768
import {
6869
clone,
6970
fetchDataForRouteEnter,
@@ -224,11 +225,17 @@ export default {
224225
&& platforms.every(platform => platform.deprecatedAt)
225226
)
226227
),
227-
sidebarProps: ({ isSideNavOpen, isTargetIDE }) => (isTargetIDE ? {} : { class: 'full-width-container', openExternally: isSideNavOpen }),
228+
// Always disable the navigator for IDE targets. For other targets, allow
229+
// this feature to be enabled through the `features.docs.navigator.enable`
230+
// setting in `theme-settings.json`
231+
enableNavigator: ({ isTargetIDE }) => !isTargetIDE && (
232+
getSetting(['features', 'docs', 'navigator', 'enable'], false)
233+
),
234+
sidebarProps: ({ isSideNavOpen, enableNavigator }) => (enableNavigator ? { class: 'full-width-container', openExternally: isSideNavOpen } : {}),
228235
sidebarListeners() {
229-
return this.isTargetIDE ? {} : {
236+
return this.enableNavigator ? ({
230237
'update:openExternally': (v) => { this.isSideNavOpen = v; },
231-
};
238+
}) : {};
232239
},
233240
},
234241
methods: {

tests/unit/views/DocumentationTopic.spec.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import * as dataUtils from 'docc-render/utils/data';
1212
import { shallowMount } from '@vue/test-utils';
13+
import { getSetting } from 'docc-render/utils/theme-settings';
1314
import DocumentationTopic from 'docc-render/views/DocumentationTopic.vue';
1415
import DocumentationTopicStore from 'docc-render/stores/DocumentationTopicStore';
1516
import onPageLoadScrollToFragment from 'docc-render/mixins/onPageLoadScrollToFragment';
@@ -23,6 +24,14 @@ jest.mock('docc-render/mixins/onPageLoadScrollToFragment');
2324
jest.mock('docc-render/utils/FocusTrap');
2425
jest.mock('docc-render/utils/changeElementVOVisibility');
2526
jest.mock('docc-render/utils/scroll-lock');
27+
jest.mock('docc-render/utils/theme-settings');
28+
29+
const defaultGetSetting = (_, fallback) => fallback;
30+
const getSettingWithNavigatorEnabled = (settingKeyPath, fallback) => (
31+
(settingKeyPath.join('.') === 'features.docs.navigator.enable') || fallback
32+
);
33+
34+
getSetting.mockImplementation(defaultGetSetting);
2635

2736
const TechnologyWithChildren = {
2837
path: 'path/to/foo',
@@ -130,7 +139,9 @@ describe('DocumentationTopic', () => {
130139
expect(codeTheme.isEmpty()).toBe(true);
131140
});
132141

133-
it('renders the Navigator and AdjustableSidebarWidth', async () => {
142+
it('renders the Navigator and AdjustableSidebarWidth when enabled', async () => {
143+
getSetting.mockImplementation(getSettingWithNavigatorEnabled);
144+
134145
wrapper.setData({ topicData });
135146
expect(wrapper.find(AdjustableSidebarWidth).props()).toEqual({
136147
openExternally: false,
@@ -160,6 +171,8 @@ describe('DocumentationTopic', () => {
160171
references: topicData.references,
161172
technology: TechnologyWithChildren,
162173
});
174+
175+
getSetting.mockReset();
163176
});
164177

165178
it('renders a `Nav` component', () => {
@@ -186,6 +199,8 @@ describe('DocumentationTopic', () => {
186199
});
187200

188201
it('handles the `@close`, on Navigator', async () => {
202+
getSetting.mockImplementation(getSettingWithNavigatorEnabled);
203+
189204
wrapper.setData({ topicData });
190205
await flushPromises();
191206
const nav = wrapper.find(Nav);
@@ -195,6 +210,8 @@ describe('DocumentationTopic', () => {
195210
await flushPromises();
196211
wrapper.find(Navigator).vm.$emit('close');
197212
expect(sidebar.props('openExternally')).toBe(false);
213+
214+
getSetting.mockReset();
198215
});
199216

200217
it('renders a `Topic` with `topicData`', () => {

0 commit comments

Comments
 (0)