@looker/api-explorer 0.9.35 → 0.9.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -1
- package/dist/bundle.js +1 -1
- package/dist/bundle.js.map +1 -1
- package/e2e/MethodScene.spec.ts +80 -0
- package/e2e/diffScene.spec.ts +28 -20
- package/e2e/e2e.spec.ts +45 -7
- package/lib/ApiExplorer.js +24 -5
- package/lib/ApiExplorer.js.map +1 -1
- package/lib/components/DocMarkdown/DocMarkdown.js +9 -7
- package/lib/components/DocMarkdown/DocMarkdown.js.map +1 -1
- package/lib/components/DocSDKs/DocDeclarations.js +10 -15
- package/lib/components/DocSDKs/DocDeclarations.js.map +1 -1
- package/lib/components/SelectorContainer/ApiSpecSelector.js +6 -2
- package/lib/components/SelectorContainer/ApiSpecSelector.js.map +1 -1
- package/lib/components/SelectorContainer/SdkLanguageSelector.js +20 -21
- package/lib/components/SelectorContainer/SdkLanguageSelector.js.map +1 -1
- package/lib/components/SelectorContainer/SelectorContainer.js +4 -1
- package/lib/components/SelectorContainer/SelectorContainer.js.map +1 -1
- package/lib/components/SelectorContainer/utils.d.ts +2 -0
- package/lib/components/SelectorContainer/utils.js +32 -0
- package/lib/components/SelectorContainer/utils.js.map +1 -0
- package/lib/components/SideNav/SideNav.js +37 -16
- package/lib/components/SideNav/SideNav.js.map +1 -1
- package/lib/components/SideNav/SideNavMethods.js +9 -6
- package/lib/components/SideNav/SideNavMethods.js.map +1 -1
- package/lib/components/SideNav/SideNavTypes.js +7 -4
- package/lib/components/SideNav/SideNavTypes.js.map +1 -1
- package/lib/components/index.d.ts +0 -1
- package/lib/components/index.js +0 -8
- package/lib/components/index.js.map +1 -1
- package/lib/esm/ApiExplorer.js +26 -7
- package/lib/esm/ApiExplorer.js.map +1 -1
- package/lib/esm/components/DocMarkdown/DocMarkdown.js +6 -4
- package/lib/esm/components/DocMarkdown/DocMarkdown.js.map +1 -1
- package/lib/esm/components/DocSDKs/DocDeclarations.js +9 -14
- package/lib/esm/components/DocSDKs/DocDeclarations.js.map +1 -1
- package/lib/esm/components/SelectorContainer/ApiSpecSelector.js +6 -3
- package/lib/esm/components/SelectorContainer/ApiSpecSelector.js.map +1 -1
- package/lib/esm/components/SelectorContainer/SdkLanguageSelector.js +16 -18
- package/lib/esm/components/SelectorContainer/SdkLanguageSelector.js.map +1 -1
- package/lib/esm/components/SelectorContainer/SelectorContainer.js +5 -2
- package/lib/esm/components/SelectorContainer/SelectorContainer.js.map +1 -1
- package/lib/esm/components/SelectorContainer/utils.js +22 -0
- package/lib/esm/components/SelectorContainer/utils.js.map +1 -0
- package/lib/esm/components/SideNav/SideNav.js +40 -20
- package/lib/esm/components/SideNav/SideNav.js.map +1 -1
- package/lib/esm/components/SideNav/SideNavMethods.js +9 -6
- package/lib/esm/components/SideNav/SideNavMethods.js.map +1 -1
- package/lib/esm/components/SideNav/SideNavTypes.js +9 -6
- package/lib/esm/components/SideNav/SideNavTypes.js.map +1 -1
- package/lib/esm/components/index.js +0 -1
- package/lib/esm/components/index.js.map +1 -1
- package/lib/esm/routes/AppRouter.js +6 -4
- package/lib/esm/routes/AppRouter.js.map +1 -1
- package/lib/esm/scenes/DiffScene/DiffScene.js +11 -9
- package/lib/esm/scenes/DiffScene/DiffScene.js.map +1 -1
- package/lib/esm/scenes/DiffScene/DocDiff/DiffItem.js +5 -4
- package/lib/esm/scenes/DiffScene/DocDiff/DiffItem.js.map +1 -1
- package/lib/esm/scenes/DiffScene/DocDiff/DocDiff.js +4 -4
- package/lib/esm/scenes/DiffScene/DocDiff/DocDiff.js.map +1 -1
- package/lib/esm/scenes/ErrorDetailScene/ErrorDetailScene.js +31 -0
- package/lib/esm/scenes/ErrorDetailScene/ErrorDetailScene.js.map +1 -0
- package/lib/esm/scenes/ErrorDetailScene/index.js +2 -0
- package/lib/esm/scenes/ErrorDetailScene/index.js.map +1 -0
- package/lib/esm/scenes/MethodScene/MethodScene.js +30 -10
- package/lib/esm/scenes/MethodScene/MethodScene.js.map +1 -1
- package/lib/esm/{components → scenes/MethodScene/components}/DocResponses/DocResponseTypes.js +1 -1
- package/lib/esm/scenes/MethodScene/components/DocResponses/DocResponseTypes.js.map +1 -0
- package/lib/esm/scenes/MethodScene/components/DocResponses/DocResponses.js +73 -0
- package/lib/esm/scenes/MethodScene/components/DocResponses/DocResponses.js.map +1 -0
- package/lib/esm/{components → scenes/MethodScene/components}/DocResponses/index.js +0 -0
- package/lib/esm/scenes/MethodScene/components/DocResponses/index.js.map +1 -0
- package/lib/esm/{components → scenes/MethodScene/components}/DocResponses/utils.js +0 -0
- package/lib/esm/scenes/MethodScene/components/DocResponses/utils.js.map +1 -0
- package/lib/esm/scenes/MethodScene/components/index.js +1 -0
- package/lib/esm/scenes/MethodScene/components/index.js.map +1 -1
- package/lib/esm/scenes/MethodTagScene/MethodTagScene.js +38 -10
- package/lib/esm/scenes/MethodTagScene/MethodTagScene.js.map +1 -1
- package/lib/esm/scenes/TypeScene/TypeScene.js +7 -1
- package/lib/esm/scenes/TypeScene/TypeScene.js.map +1 -1
- package/lib/esm/scenes/TypeTagScene/TypeTagScene.js +39 -12
- package/lib/esm/scenes/TypeTagScene/TypeTagScene.js.map +1 -1
- package/lib/esm/scenes/index.js +1 -0
- package/lib/esm/scenes/index.js.map +1 -1
- package/lib/esm/scenes/utils/hooks/index.js +2 -0
- package/lib/esm/scenes/utils/hooks/index.js.map +1 -0
- package/lib/esm/scenes/utils/hooks/tagStoreSync.js +37 -0
- package/lib/esm/scenes/utils/hooks/tagStoreSync.js.map +1 -0
- package/lib/esm/scenes/utils/index.js +2 -0
- package/lib/esm/scenes/utils/index.js.map +1 -0
- package/lib/esm/state/settings/selectors.js +1 -0
- package/lib/esm/state/settings/selectors.js.map +1 -1
- package/lib/esm/state/settings/slice.js +6 -1
- package/lib/esm/state/settings/slice.js.map +1 -1
- package/lib/esm/utils/hooks/globalStoreSync.js +53 -0
- package/lib/esm/utils/hooks/globalStoreSync.js.map +1 -0
- package/lib/esm/utils/hooks/index.js +4 -0
- package/lib/esm/utils/hooks/index.js.map +1 -0
- package/lib/esm/utils/hooks/navigation.js +72 -0
- package/lib/esm/utils/hooks/navigation.js.map +1 -0
- package/lib/esm/utils/hooks/useQuery.js +9 -0
- package/lib/esm/utils/hooks/useQuery.js.map +1 -0
- package/lib/esm/utils/index.js +2 -0
- package/lib/esm/utils/index.js.map +1 -1
- package/lib/esm/utils/path.js +23 -2
- package/lib/esm/utils/path.js.map +1 -1
- package/lib/esm/utils/sdkLanguage.js +42 -0
- package/lib/esm/utils/sdkLanguage.js.map +1 -0
- package/lib/routes/AppRouter.d.ts +1 -2
- package/lib/routes/AppRouter.js +5 -3
- package/lib/routes/AppRouter.js.map +1 -1
- package/lib/scenes/DiffScene/DiffScene.d.ts +0 -2
- package/lib/scenes/DiffScene/DiffScene.js +8 -6
- package/lib/scenes/DiffScene/DiffScene.js.map +1 -1
- package/lib/scenes/DiffScene/DocDiff/DiffItem.js +4 -4
- package/lib/scenes/DiffScene/DocDiff/DiffItem.js.map +1 -1
- package/lib/scenes/DiffScene/DocDiff/DocDiff.js +4 -4
- package/lib/scenes/DiffScene/DocDiff/DocDiff.js.map +1 -1
- package/lib/scenes/ErrorDetailScene/ErrorDetailScene.d.ts +7 -0
- package/lib/scenes/ErrorDetailScene/ErrorDetailScene.js +47 -0
- package/lib/scenes/ErrorDetailScene/ErrorDetailScene.js.map +1 -0
- package/lib/scenes/ErrorDetailScene/index.d.ts +1 -0
- package/lib/scenes/ErrorDetailScene/index.js +14 -0
- package/lib/{components/DocResponses → scenes/ErrorDetailScene}/index.js.map +1 -1
- package/lib/scenes/MethodScene/MethodScene.js +25 -5
- package/lib/scenes/MethodScene/MethodScene.js.map +1 -1
- package/lib/{components → scenes/MethodScene/components}/DocResponses/DocResponseTypes.d.ts +2 -2
- package/lib/{components → scenes/MethodScene/components}/DocResponses/DocResponseTypes.js +2 -2
- package/lib/scenes/MethodScene/components/DocResponses/DocResponseTypes.js.map +1 -0
- package/lib/scenes/MethodScene/components/DocResponses/DocResponses.d.ts +9 -0
- package/lib/scenes/MethodScene/components/DocResponses/DocResponses.js +93 -0
- package/lib/scenes/MethodScene/components/DocResponses/DocResponses.js.map +1 -0
- package/lib/{components → scenes/MethodScene/components}/DocResponses/index.d.ts +0 -0
- package/lib/{components → scenes/MethodScene/components}/DocResponses/index.js +0 -0
- package/lib/scenes/MethodScene/components/DocResponses/index.js.map +1 -0
- package/lib/{components → scenes/MethodScene/components}/DocResponses/utils.d.ts +0 -0
- package/lib/{components → scenes/MethodScene/components}/DocResponses/utils.js +0 -0
- package/lib/scenes/MethodScene/components/DocResponses/utils.js.map +1 -0
- package/lib/scenes/MethodScene/components/index.d.ts +1 -0
- package/lib/scenes/MethodScene/components/index.js +8 -0
- package/lib/scenes/MethodScene/components/index.js.map +1 -1
- package/lib/scenes/MethodTagScene/MethodTagScene.js +42 -11
- package/lib/scenes/MethodTagScene/MethodTagScene.js.map +1 -1
- package/lib/scenes/TypeScene/TypeScene.js +8 -1
- package/lib/scenes/TypeScene/TypeScene.js.map +1 -1
- package/lib/scenes/TypeTagScene/TypeTagScene.js +42 -12
- package/lib/scenes/TypeTagScene/TypeTagScene.js.map +1 -1
- package/lib/scenes/index.d.ts +1 -0
- package/lib/scenes/index.js +8 -0
- package/lib/scenes/index.js.map +1 -1
- package/lib/scenes/utils/hooks/index.d.ts +1 -0
- package/lib/scenes/utils/hooks/index.js +14 -0
- package/lib/scenes/utils/hooks/index.js.map +1 -0
- package/lib/scenes/utils/hooks/tagStoreSync.d.ts +1 -0
- package/lib/scenes/utils/hooks/tagStoreSync.js +51 -0
- package/lib/scenes/utils/hooks/tagStoreSync.js.map +1 -0
- package/lib/scenes/utils/index.d.ts +1 -0
- package/lib/scenes/utils/index.js +14 -0
- package/lib/scenes/utils/index.js.map +1 -0
- package/lib/state/settings/selectors.d.ts +2 -1
- package/lib/state/settings/selectors.js +5 -1
- package/lib/state/settings/selectors.js.map +1 -1
- package/lib/state/settings/slice.d.ts +7 -1
- package/lib/state/settings/slice.js +6 -1
- package/lib/state/settings/slice.js.map +1 -1
- package/lib/test-data/index.d.ts +1 -0
- package/lib/test-data/index.js +14 -0
- package/lib/test-data/index.js.map +1 -1
- package/lib/test-data/sdkLanguages.d.ts +10 -0
- package/lib/test-data/sdkLanguages.js +19 -0
- package/lib/test-data/sdkLanguages.js.map +1 -0
- package/lib/utils/hooks/globalStoreSync.d.ts +1 -0
- package/lib/utils/hooks/globalStoreSync.js +67 -0
- package/lib/utils/hooks/globalStoreSync.js.map +1 -0
- package/lib/utils/hooks/index.d.ts +3 -0
- package/lib/utils/hooks/index.js +30 -0
- package/lib/utils/hooks/index.js.map +1 -0
- package/lib/utils/hooks/navigation.d.ts +11 -0
- package/lib/utils/hooks/navigation.js +83 -0
- package/lib/utils/hooks/navigation.js.map +1 -0
- package/lib/utils/hooks/useQuery.d.ts +1 -0
- package/lib/utils/hooks/useQuery.js +20 -0
- package/lib/utils/hooks/useQuery.js.map +1 -0
- package/lib/utils/index.d.ts +2 -0
- package/lib/utils/index.js +38 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/path.d.ts +6 -2
- package/lib/utils/path.js +34 -3
- package/lib/utils/path.js.map +1 -1
- package/lib/utils/sdkLanguage.d.ts +6 -0
- package/lib/utils/sdkLanguage.js +59 -0
- package/lib/utils/sdkLanguage.js.map +1 -0
- package/package.json +14 -14
- package/src/ApiExplorer.tsx +18 -7
- package/src/components/DocMarkdown/DocMarkdown.tsx +4 -4
- package/src/components/DocSDKs/DocDeclarations.tsx +11 -22
- package/src/components/DocSDKs/DocSDKs.spec.tsx +4 -1
- package/src/components/Header/Header.spec.tsx +1 -1
- package/src/components/SelectorContainer/ApiSpecSelector.spec.tsx +5 -2
- package/src/components/SelectorContainer/ApiSpecSelector.tsx +4 -3
- package/src/components/SelectorContainer/SdkLanguageSelector.spec.tsx +60 -33
- package/src/components/SelectorContainer/SdkLanguageSelector.tsx +15 -22
- package/src/components/SelectorContainer/SelectorContainer.spec.tsx +1 -1
- package/src/components/SelectorContainer/SelectorContainer.tsx +18 -15
- package/src/components/SelectorContainer/utils.ts +45 -0
- package/src/components/SideNav/SideNav.spec.tsx +39 -5
- package/src/components/SideNav/SideNav.tsx +42 -29
- package/src/components/SideNav/SideNavMethods.spec.tsx +5 -0
- package/src/components/SideNav/SideNavMethods.tsx +11 -8
- package/src/components/SideNav/SideNavTypes.spec.tsx +9 -2
- package/src/components/SideNav/SideNavTypes.tsx +10 -8
- package/src/components/index.ts +0 -1
- package/src/routes/AppRouter.tsx +7 -5
- package/src/scenes/DiffScene/DiffScene.tsx +10 -10
- package/src/scenes/DiffScene/DocDiff/DiffItem.spec.tsx +4 -3
- package/src/scenes/DiffScene/DocDiff/DiffItem.tsx +3 -4
- package/src/scenes/DiffScene/DocDiff/DocDiff.spec.tsx +73 -2
- package/src/scenes/DiffScene/DocDiff/DocDiff.tsx +4 -4
- package/src/scenes/ErrorDetailScene/ErrorDetailScene.tsx +72 -0
- package/src/scenes/ErrorDetailScene/index.ts +26 -0
- package/src/scenes/MethodScene/MethodScene.tsx +23 -8
- package/src/{components → scenes/MethodScene/components}/DocResponses/DocResponseTypes.tsx +3 -6
- package/src/scenes/MethodScene/components/DocResponses/DocResponses.spec.tsx +153 -0
- package/src/scenes/MethodScene/components/DocResponses/DocResponses.tsx +103 -0
- package/src/{components → scenes/MethodScene/components}/DocResponses/index.ts +0 -0
- package/src/{components → scenes/MethodScene/components}/DocResponses/utils.spec.ts +1 -1
- package/src/{components → scenes/MethodScene/components}/DocResponses/utils.ts +0 -0
- package/src/scenes/MethodScene/components/index.ts +1 -0
- package/src/scenes/MethodTagScene/MethodTagScene.spec.tsx +25 -14
- package/src/scenes/MethodTagScene/MethodTagScene.tsx +42 -10
- package/src/scenes/TypeScene/TypeScene.tsx +8 -2
- package/src/scenes/TypeTagScene/TypeTagScene.spec.tsx +21 -11
- package/src/scenes/TypeTagScene/TypeTagScene.tsx +46 -13
- package/src/scenes/index.ts +1 -0
- package/src/scenes/utils/hooks/index.ts +27 -0
- package/src/scenes/utils/hooks/tagStoreSync.spec.ts +102 -0
- package/src/scenes/utils/hooks/tagStoreSync.ts +68 -0
- package/src/scenes/utils/index.ts +27 -0
- package/src/state/settings/selectors.spec.ts +5 -1
- package/src/state/settings/selectors.ts +3 -0
- package/src/state/settings/slice.ts +6 -0
- package/src/test-data/index.ts +1 -0
- package/src/test-data/sdkLanguages.ts +36 -0
- package/src/utils/hooks/globalStoreSync.spec.tsx +146 -0
- package/src/utils/hooks/globalStoreSync.ts +77 -0
- package/src/utils/hooks/index.ts +28 -0
- package/src/utils/hooks/navigation.spec.ts +118 -0
- package/src/utils/hooks/navigation.ts +121 -0
- package/src/utils/hooks/useQuery.ts +36 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/path.spec.ts +92 -3
- package/src/utils/path.ts +46 -4
- package/src/utils/sdkLanguage.spec.ts +69 -0
- package/src/utils/sdkLanguage.ts +63 -0
- package/lib/components/DocResponses/DocResponseTypes.js.map +0 -1
- package/lib/components/DocResponses/DocResponses.d.ts +0 -8
- package/lib/components/DocResponses/DocResponses.js +0 -46
- package/lib/components/DocResponses/DocResponses.js.map +0 -1
- package/lib/components/DocResponses/utils.js.map +0 -1
- package/lib/esm/components/DocResponses/DocResponseTypes.js.map +0 -1
- package/lib/esm/components/DocResponses/DocResponses.js +0 -30
- package/lib/esm/components/DocResponses/DocResponses.js.map +0 -1
- package/lib/esm/components/DocResponses/index.js.map +0 -1
- package/lib/esm/components/DocResponses/utils.js.map +0 -1
- package/src/components/DocResponses/DocResponses.spec.tsx +0 -60
- package/src/components/DocResponses/DocResponses.tsx +0 -69
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/*
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2022 Looker Data Sciences, Inc.
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
in the Software without restriction, including without limitation the rights
|
|
10
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
copies or substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
SOFTWARE.
|
|
24
|
+
|
|
25
|
+
*/
|
|
26
|
+
import { goToPage, v40Url as v40, v40Url } from './helpers'
|
|
27
|
+
|
|
28
|
+
jest.setTimeout(120000)
|
|
29
|
+
|
|
30
|
+
describe('MethodScene', () => {
|
|
31
|
+
beforeEach(async () => {
|
|
32
|
+
await jestPuppeteer.resetBrowser()
|
|
33
|
+
await page.setDefaultNavigationTimeout(120000)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
afterEach(async () => {
|
|
37
|
+
await page.evaluate(() => {
|
|
38
|
+
localStorage.clear()
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('fetches error detail markdown when error code query param is present', async () => {
|
|
43
|
+
const errorCode = '400'
|
|
44
|
+
await goToPage(`${v40Url}/methods/Content/content_metadata?e=${errorCode}`)
|
|
45
|
+
|
|
46
|
+
// confirm method scene loaded
|
|
47
|
+
await expect(page).toMatchElement('h2', { text: 'Get Content Metadata' })
|
|
48
|
+
|
|
49
|
+
// confirm correct response tab is selected
|
|
50
|
+
await expect(page).toMatchElement('button[aria-selected=true]', {
|
|
51
|
+
text: '400: Bad Request',
|
|
52
|
+
})
|
|
53
|
+
// confirm error detail md file was fetched
|
|
54
|
+
await expect(page).toMatchElement('h2', {
|
|
55
|
+
text: `API Response ${errorCode} for `,
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('removes error code query param when user navigates away from method', async () => {
|
|
60
|
+
const errorCode = 400
|
|
61
|
+
await goToPage(
|
|
62
|
+
`${v40}/err/${errorCode}/get/content_metadata/:content_metadata_id`
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
// confirm method scene loaded
|
|
66
|
+
await expect(page).toMatchElement('h2', { text: 'Get Content Metadata' })
|
|
67
|
+
|
|
68
|
+
// confirm url and query param are set correctly
|
|
69
|
+
await expect(page.url()).toEqual(
|
|
70
|
+
`${v40}/methods/Content/content_metadata?sdk=py&e=${errorCode}`
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
// navigate to another method
|
|
74
|
+
await expect(page).toClick('h4', { text: 'Dashboard' })
|
|
75
|
+
await expect(page).toMatchElement('h2', {
|
|
76
|
+
text: 'Dashboard: Manage Dashboards',
|
|
77
|
+
})
|
|
78
|
+
await expect(page.url()).toEqual(`${v40}/methods/Dashboard?sdk=py`)
|
|
79
|
+
})
|
|
80
|
+
})
|
package/e2e/diffScene.spec.ts
CHANGED
|
@@ -44,13 +44,20 @@ describe('Diff Scene', () => {
|
|
|
44
44
|
await jestPuppeteer.resetBrowser()
|
|
45
45
|
await page.setDefaultNavigationTimeout(120000)
|
|
46
46
|
})
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
|
|
48
|
+
afterEach(async () => {
|
|
49
|
+
await page.evaluate(() => {
|
|
50
|
+
localStorage.clear()
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('loads the default scene (/3.1/diff)', async () => {
|
|
55
|
+
await goToPage(`${BASE_URL}/3.1/diff`)
|
|
49
56
|
const body = await page.$('body')
|
|
50
57
|
|
|
51
58
|
// "Base" input element
|
|
52
59
|
{
|
|
53
|
-
await body
|
|
60
|
+
await body?.click()
|
|
54
61
|
const baseInputElement = await page.$(baseInputSelector)
|
|
55
62
|
expect(baseInputElement).not.toBeNull()
|
|
56
63
|
const baseInputValue = await page.evaluate(
|
|
@@ -62,18 +69,18 @@ describe('Diff Scene', () => {
|
|
|
62
69
|
const baseOptionsOnLoad = await page.$(globalOptionsSelector)
|
|
63
70
|
expect(baseOptionsOnLoad).toBeNull()
|
|
64
71
|
|
|
65
|
-
await baseInputElement
|
|
72
|
+
await baseInputElement?.click()
|
|
66
73
|
const baseOptionsOnClick = await page.$$(globalOptionsSelector)
|
|
67
74
|
expect(baseOptionsOnClick).not.toHaveLength(0)
|
|
68
75
|
|
|
69
|
-
await body
|
|
76
|
+
await body?.click()
|
|
70
77
|
const baseOptionsOnClose = await page.$(globalOptionsSelector)
|
|
71
78
|
expect(baseOptionsOnClose).toBeNull()
|
|
72
79
|
}
|
|
73
80
|
|
|
74
81
|
// "Comparison" input element
|
|
75
82
|
{
|
|
76
|
-
await body
|
|
83
|
+
await body?.click()
|
|
77
84
|
const compInputElement = await page.$(compInputSelector)
|
|
78
85
|
expect(compInputElement).not.toBeNull()
|
|
79
86
|
const compInputValue = await page.evaluate(
|
|
@@ -85,11 +92,11 @@ describe('Diff Scene', () => {
|
|
|
85
92
|
const compOptionsOnLoad = await page.$(globalOptionsSelector)
|
|
86
93
|
expect(compOptionsOnLoad).toBeNull()
|
|
87
94
|
|
|
88
|
-
await compInputElement
|
|
95
|
+
await compInputElement?.click()
|
|
89
96
|
const compOptionsOnClick = await page.$$(globalOptionsSelector)
|
|
90
97
|
expect(compOptionsOnClick).not.toHaveLength(0)
|
|
91
98
|
|
|
92
|
-
await body
|
|
99
|
+
await body?.click()
|
|
93
100
|
const compOptionsOnClose = await page.$(globalOptionsSelector)
|
|
94
101
|
expect(compOptionsOnClose).toBeNull()
|
|
95
102
|
}
|
|
@@ -106,9 +113,8 @@ describe('Diff Scene', () => {
|
|
|
106
113
|
}
|
|
107
114
|
})
|
|
108
115
|
|
|
109
|
-
it('loads a comparison scene (/
|
|
110
|
-
await goToPage(`${BASE_URL}/
|
|
111
|
-
|
|
116
|
+
it('loads a comparison scene (/3.1/diff/4.0) and navigates from it', async () => {
|
|
117
|
+
await goToPage(`${BASE_URL}/3.1/diff/4.0`)
|
|
112
118
|
// "Base" input element
|
|
113
119
|
{
|
|
114
120
|
const baseInputElement = await page.$(baseInputSelector)
|
|
@@ -176,18 +182,20 @@ describe('Diff Scene', () => {
|
|
|
176
182
|
const methodLink = await page.$(`${resultCardsSelector} a[role=link]`)
|
|
177
183
|
expect(methodLink).not.toBeNull()
|
|
178
184
|
const methodText = await page.evaluate((e) => e.innerText, methodLink)
|
|
179
|
-
expect(methodText).toMatch(`
|
|
185
|
+
expect(methodText).toMatch(`delete_alert for 4.0`)
|
|
180
186
|
|
|
181
187
|
// Click and validate destination
|
|
182
|
-
await methodLink
|
|
188
|
+
await methodLink?.click()
|
|
183
189
|
await page.waitForSelector(`div[class*=MethodBadge]`, { timeout: 5000 })
|
|
184
190
|
const compUrl = page.url()
|
|
185
|
-
expect(compUrl).toEqual(
|
|
191
|
+
expect(compUrl).toEqual(
|
|
192
|
+
`${BASE_URL}/4.0/methods/Alert/delete_alert?sdk=py`
|
|
193
|
+
)
|
|
186
194
|
}
|
|
187
195
|
})
|
|
188
196
|
|
|
189
197
|
it('updates when a comparison is chosen or switched', async () => {
|
|
190
|
-
await goToPage(`${BASE_URL}/
|
|
198
|
+
await goToPage(`${BASE_URL}/3.1/diff`)
|
|
191
199
|
|
|
192
200
|
// "Base" input element
|
|
193
201
|
const baseInputElement = await page.$(baseInputSelector)
|
|
@@ -198,14 +206,14 @@ describe('Diff Scene', () => {
|
|
|
198
206
|
expect(compInputElement).not.toBeNull()
|
|
199
207
|
|
|
200
208
|
// Click comparison input
|
|
201
|
-
await compInputElement
|
|
209
|
+
await compInputElement?.click()
|
|
202
210
|
const compOptionsOnClick = await page.$$(globalOptionsSelector)
|
|
203
211
|
expect(compOptionsOnClick).not.toHaveLength(0)
|
|
204
212
|
expect(compOptionsOnClick).not.toHaveLength(1)
|
|
205
213
|
|
|
206
214
|
// Find an option containing the text 4.0
|
|
207
215
|
const option40Index = await page.$$eval(globalOptionsSelector, (els) =>
|
|
208
|
-
els.findIndex((el) => el
|
|
216
|
+
els.findIndex((el) => el?.textContent?.match(/4\.0/))
|
|
209
217
|
)
|
|
210
218
|
const option40 = compOptionsOnClick[option40Index]
|
|
211
219
|
expect(option40).not.toBeUndefined()
|
|
@@ -217,7 +225,7 @@ describe('Diff Scene', () => {
|
|
|
217
225
|
// Check the URL
|
|
218
226
|
// Would like to do this earlier, but not sure what to wait on
|
|
219
227
|
const compUrl = page.url()
|
|
220
|
-
expect(compUrl).toEqual(`${BASE_URL}/
|
|
228
|
+
expect(compUrl).toEqual(`${BASE_URL}/3.1/diff/4.0?sdk=py`)
|
|
221
229
|
|
|
222
230
|
// Check the results
|
|
223
231
|
const diffResultCards = await page.$$(resultCardsSelector)
|
|
@@ -239,13 +247,13 @@ describe('Diff Scene', () => {
|
|
|
239
247
|
switchButtonElement
|
|
240
248
|
)
|
|
241
249
|
expect(switchButtonDisabled).toEqual(false)
|
|
242
|
-
await switchButtonElement
|
|
250
|
+
await switchButtonElement?.click()
|
|
243
251
|
|
|
244
252
|
// A more precise timing mechanism would be better: https://github.com/puppeteer/puppeteer/issues/5328
|
|
245
253
|
await page.waitForTimeout(150)
|
|
246
254
|
|
|
247
255
|
const switchUrl = page.url()
|
|
248
|
-
expect(switchUrl).toEqual(`${BASE_URL}/
|
|
256
|
+
expect(switchUrl).toEqual(`${BASE_URL}/4.0/diff/3.1?sdk=py`)
|
|
249
257
|
|
|
250
258
|
// Check the results again, even though they should be the same
|
|
251
259
|
const diff40to31Page1Methods = await Promise.all(
|
package/e2e/e2e.spec.ts
CHANGED
|
@@ -25,21 +25,25 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import '@testing-library/jest-dom'
|
|
27
27
|
|
|
28
|
-
import { goToPage, pageReload,
|
|
28
|
+
import { goToPage, pageReload, v40Url as v40 } from './helpers'
|
|
29
29
|
|
|
30
30
|
// https://github.com/smooth-code/jest-puppeteer/tree/master/packages/expect-puppeteer
|
|
31
31
|
// https://github.com/puppeteer/puppeteer/blob/main/docs/api.md
|
|
32
32
|
|
|
33
33
|
jest.setTimeout(120000)
|
|
34
34
|
|
|
35
|
-
const v40 = `${BASE_URL}/4.0`
|
|
36
|
-
|
|
37
35
|
describe('API Explorer', () => {
|
|
38
36
|
beforeEach(async () => {
|
|
39
37
|
await jestPuppeteer.resetBrowser()
|
|
40
38
|
await page.setDefaultNavigationTimeout(120000)
|
|
41
39
|
})
|
|
42
40
|
|
|
41
|
+
afterEach(async () => {
|
|
42
|
+
await page.evaluate(() => {
|
|
43
|
+
localStorage.clear()
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
|
|
43
47
|
describe('general', () => {
|
|
44
48
|
beforeEach(async () => {
|
|
45
49
|
await goToPage(v40)
|
|
@@ -55,7 +59,7 @@ describe('API Explorer', () => {
|
|
|
55
59
|
expect(page).toClick('h3', { text: 'Get All Dashboards' }),
|
|
56
60
|
])
|
|
57
61
|
await expect(page.url()).toEqual(
|
|
58
|
-
`${v40}/methods/Dashboard/all_dashboards`
|
|
62
|
+
`${v40}/methods/Dashboard/all_dashboards?sdk=py`
|
|
59
63
|
)
|
|
60
64
|
|
|
61
65
|
// title
|
|
@@ -213,6 +217,30 @@ describe('API Explorer', () => {
|
|
|
213
217
|
await expect(page).toMatchElement('h2', { text: 'Query' })
|
|
214
218
|
await expect(page).toMatchElement('button', { text: 'Query' })
|
|
215
219
|
})
|
|
220
|
+
|
|
221
|
+
it('redirects error routes to the correct method page', async () => {
|
|
222
|
+
const errorCode = 400
|
|
223
|
+
await goToPage(
|
|
224
|
+
`${v40}/err/${errorCode}/get/content_metadata/:content_metadata_id`
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
// confirm method scene loaded
|
|
228
|
+
await expect(page).toMatchElement('h2', { text: 'Get Content Metadata' })
|
|
229
|
+
|
|
230
|
+
// confirm url and query param are set correctly
|
|
231
|
+
await expect(page.url()).toEqual(
|
|
232
|
+
`${v40}/methods/Content/content_metadata?sdk=py&e=${errorCode}`
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
// confirm correct response tab is selected
|
|
236
|
+
await expect(page).toMatchElement('button[aria-selected=true]', {
|
|
237
|
+
text: '400: Bad Request',
|
|
238
|
+
})
|
|
239
|
+
// confirm error detail md file was fetched
|
|
240
|
+
await expect(page).toMatchElement('h2', {
|
|
241
|
+
text: `API Response ${errorCode} for `,
|
|
242
|
+
})
|
|
243
|
+
})
|
|
216
244
|
})
|
|
217
245
|
|
|
218
246
|
describe('outbound navigation', () => {
|
|
@@ -228,7 +256,7 @@ describe('API Explorer', () => {
|
|
|
228
256
|
// page.waitForNavigation({timeout:5000}),
|
|
229
257
|
// exampleLink.click()
|
|
230
258
|
// ])
|
|
231
|
-
await exampleLink
|
|
259
|
+
await exampleLink?.click()
|
|
232
260
|
await page.waitForTimeout(150)
|
|
233
261
|
|
|
234
262
|
const body = await page.$('body')
|
|
@@ -245,6 +273,12 @@ describe('API Explorer', () => {
|
|
|
245
273
|
await goToPage(v40)
|
|
246
274
|
})
|
|
247
275
|
|
|
276
|
+
afterEach(async () => {
|
|
277
|
+
await page.evaluate(() => {
|
|
278
|
+
localStorage.clear()
|
|
279
|
+
})
|
|
280
|
+
})
|
|
281
|
+
|
|
248
282
|
it('searches methods', async () => {
|
|
249
283
|
await expect(page).toFill('input[aria-label="Search"]', 'get workspace')
|
|
250
284
|
// TODO: find a better way to avoid the scenario where L215 executes before search returns
|
|
@@ -255,7 +289,9 @@ describe('API Explorer', () => {
|
|
|
255
289
|
await expect(page).toMatchElement('button', { text: 'Types (0)' })
|
|
256
290
|
await expect(page).toClick('a', { text: 'Get Workspace' })
|
|
257
291
|
await expect(page).toMatchElement('h2', { text: 'Get Workspace' })
|
|
258
|
-
await expect(page.url()).toEqual(
|
|
292
|
+
await expect(page.url()).toEqual(
|
|
293
|
+
`${v40}/methods/Workspace/workspace?sdk=py&s=get+workspace`
|
|
294
|
+
)
|
|
259
295
|
})
|
|
260
296
|
|
|
261
297
|
it('searches types', async () => {
|
|
@@ -267,7 +303,9 @@ describe('API Explorer', () => {
|
|
|
267
303
|
await expect(page).toClick('button', { text: 'Types (1)' })
|
|
268
304
|
await expect(page).toClick('a', { text: 'WriteTheme' })
|
|
269
305
|
await expect(page).toMatchElement('h2', { text: 'WriteTheme' })
|
|
270
|
-
await expect(page.url()).toEqual(
|
|
306
|
+
await expect(page.url()).toEqual(
|
|
307
|
+
`${v40}/types/Theme/WriteTheme?sdk=py&s=writetheme`
|
|
308
|
+
)
|
|
271
309
|
})
|
|
272
310
|
})
|
|
273
311
|
})
|
package/lib/ApiExplorer.js
CHANGED
|
@@ -50,7 +50,6 @@ var ApiExplorer = _ref => {
|
|
|
50
50
|
declarationsLodeUrl = "".concat(_lodeUtils.apixFilesHost, "/declarationsIndex.json"),
|
|
51
51
|
headless = false
|
|
52
52
|
} = _ref;
|
|
53
|
-
(0, _state.useSettingStoreState)();
|
|
54
53
|
(0, _state.useLodesStoreState)();
|
|
55
54
|
var {
|
|
56
55
|
working,
|
|
@@ -62,13 +61,19 @@ var ApiExplorer = _ref => {
|
|
|
62
61
|
initLodesAction
|
|
63
62
|
} = (0, _state.useLodeActions)();
|
|
64
63
|
var {
|
|
65
|
-
|
|
64
|
+
initialized
|
|
65
|
+
} = (0, _state.useSettingStoreState)();
|
|
66
|
+
var {
|
|
67
|
+
initSettingsAction,
|
|
68
|
+
setSearchPatternAction,
|
|
69
|
+
setSdkLanguageAction
|
|
66
70
|
} = (0, _state.useSettingActions)();
|
|
67
71
|
var {
|
|
68
72
|
initSpecsAction,
|
|
69
73
|
setCurrentSpecAction
|
|
70
74
|
} = (0, _state.useSpecActions)();
|
|
71
75
|
var location = (0, _reactRouterDom.useLocation)();
|
|
76
|
+
(0, _utils.useGlobalStoreSync)();
|
|
72
77
|
var [hasNavigation, setHasNavigation] = (0, _react.useState)(true);
|
|
73
78
|
|
|
74
79
|
var toggleNavigation = target => setHasNavigation(target || !hasNavigation);
|
|
@@ -96,12 +101,27 @@ var ApiExplorer = _ref => {
|
|
|
96
101
|
|
|
97
102
|
var maybeSpec = (_location$pathname = location.pathname) === null || _location$pathname === void 0 ? void 0 : _location$pathname.split('/')[1];
|
|
98
103
|
|
|
99
|
-
if (spec && maybeSpec && maybeSpec !==
|
|
104
|
+
if (spec && maybeSpec && maybeSpec !== spec.key) {
|
|
100
105
|
setCurrentSpecAction({
|
|
101
106
|
currentSpecKey: maybeSpec
|
|
102
107
|
});
|
|
103
108
|
}
|
|
104
109
|
}, [location.pathname, spec]);
|
|
110
|
+
(0, _react.useEffect)(() => {
|
|
111
|
+
if (!initialized) return;
|
|
112
|
+
var searchParams = new URLSearchParams(location.search);
|
|
113
|
+
var searchPattern = searchParams.get('s') || '';
|
|
114
|
+
var sdkParam = searchParams.get('sdk') || 'all';
|
|
115
|
+
var {
|
|
116
|
+
language: sdkLanguage
|
|
117
|
+
} = (0, _utils.findSdk)(sdkParam);
|
|
118
|
+
setSearchPatternAction({
|
|
119
|
+
searchPattern
|
|
120
|
+
});
|
|
121
|
+
setSdkLanguageAction({
|
|
122
|
+
sdkLanguage
|
|
123
|
+
});
|
|
124
|
+
}, [location.search]);
|
|
105
125
|
(0, _react.useEffect)(() => {
|
|
106
126
|
if (headless) {
|
|
107
127
|
window.addEventListener('message', hasNavigationToggle);
|
|
@@ -116,7 +136,7 @@ var ApiExplorer = _ref => {
|
|
|
116
136
|
var themeOverrides = adaptor.themeOverrides();
|
|
117
137
|
var neededSpec = (_location$pathname2 = location.pathname) === null || _location$pathname2 === void 0 ? void 0 : _location$pathname2.split('/')[1];
|
|
118
138
|
|
|
119
|
-
if (!neededSpec
|
|
139
|
+
if (!neededSpec) {
|
|
120
140
|
neededSpec = spec === null || spec === void 0 ? void 0 : spec.key;
|
|
121
141
|
}
|
|
122
142
|
|
|
@@ -174,7 +194,6 @@ var ApiExplorer = _ref => {
|
|
|
174
194
|
})), _react.default.createElement(_routes.AppRouter, {
|
|
175
195
|
specKey: spec.key,
|
|
176
196
|
api: spec.api,
|
|
177
|
-
specs: specs,
|
|
178
197
|
toggleNavigation: toggleNavigation
|
|
179
198
|
}))))), !headless && _react.default.createElement(BodyOverride, null));
|
|
180
199
|
};
|
package/lib/ApiExplorer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ApiExplorer.tsx"],"names":["BodyOverride","createGlobalStyle","ApiExplorer","adaptor","examplesLodeUrl","declarationsLodeUrl","apixFilesHost","headless","working","description","specs","selectSpecs","spec","selectCurrentSpec","initLodesAction","initSettingsAction","initSpecsAction","setCurrentSpecAction","location","hasNavigation","setHasNavigation","toggleNavigation","target","hasNavigationToggle","e","origin","window","data","action","currentHasNavigation","specKey","maybeSpec","pathname","split","diffPath","key","currentSpecKey","addEventListener","removeEventListener","themeOverrides","neededSpec","loadGoogleFonts","themeCustomizations","logError","bind","overflow","HEADER_TOGGLE_LABEL","api","AsideBorder","Aside","isOpen"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react'\nimport React, { useState, useEffect, useCallback } from 'react'\nimport styled, { createGlobalStyle } from 'styled-components'\nimport {\n Aside,\n ComponentsProvider,\n Divider,\n Heading,\n IconButton,\n Layout,\n Page,\n Space,\n} from '@looker/components'\nimport { FirstPage } from '@styled-icons/material/FirstPage'\nimport { LastPage } from '@styled-icons/material/LastPage'\nimport {\n registerEnvAdaptor,\n unregisterEnvAdaptor,\n} from '@looker/extension-utils'\nimport { useSelector } from 'react-redux'\nimport { useLocation } from 'react-router-dom'\n\nimport type { IApixAdaptor } from './utils'\nimport {\n Header,\n SideNav,\n ErrorBoundary,\n SelectorContainer,\n HEADER_TOGGLE_LABEL,\n Loader,\n Banner,\n} from './components'\nimport { AppRouter } from './routes'\nimport { apixFilesHost } from './utils/lodeUtils'\nimport {\n useSettingActions,\n useSettingStoreState,\n useLodeActions,\n useLodesStoreState,\n useSpecActions,\n useSpecStoreState,\n selectSpecs,\n selectCurrentSpec,\n} from './state'\nimport { getSpecKey, diffPath } from './utils'\n\nexport interface ApiExplorerProps {\n adaptor: IApixAdaptor\n examplesLodeUrl?: string\n declarationsLodeUrl?: string\n headless?: boolean\n}\n\nconst BodyOverride = createGlobalStyle` html { height: 100%; overflow: hidden; } `\n\nexport const ApiExplorer: FC<ApiExplorerProps> = ({\n adaptor,\n examplesLodeUrl = 'https://raw.githubusercontent.com/looker-open-source/sdk-codegen/main/examplesIndex.json',\n declarationsLodeUrl = `${apixFilesHost}/declarationsIndex.json`,\n headless = false,\n}) => {\n useSettingStoreState()\n useLodesStoreState()\n const { working, description } = useSpecStoreState()\n const specs = useSelector(selectSpecs)\n const spec = useSelector(selectCurrentSpec)\n const { initLodesAction } = useLodeActions()\n const { initSettingsAction } = useSettingActions()\n const { initSpecsAction, setCurrentSpecAction } = useSpecActions()\n\n const location = useLocation()\n const [hasNavigation, setHasNavigation] = useState(true)\n const toggleNavigation = (target?: boolean) =>\n setHasNavigation(target || !hasNavigation)\n\n const hasNavigationToggle = useCallback((e: MessageEvent<any>) => {\n if (e.origin === window.origin && e.data.action === 'toggle_sidebar') {\n setHasNavigation((currentHasNavigation) => !currentHasNavigation)\n }\n }, [])\n\n registerEnvAdaptor(adaptor)\n\n useEffect(() => {\n initSettingsAction()\n initLodesAction({ examplesLodeUrl, declarationsLodeUrl })\n\n const specKey = getSpecKey(location)\n initSpecsAction({ specKey })\n return () => unregisterEnvAdaptor()\n }, [])\n\n useEffect(() => {\n const maybeSpec = location.pathname?.split('/')[1]\n if (spec && maybeSpec && maybeSpec !== diffPath && maybeSpec !== spec.key) {\n setCurrentSpecAction({ currentSpecKey: maybeSpec })\n }\n }, [location.pathname, spec])\n\n useEffect(() => {\n if (headless) {\n window.addEventListener('message', hasNavigationToggle)\n }\n return () => {\n if (headless) {\n window.removeEventListener('message', hasNavigationToggle)\n }\n }\n }, [headless, hasNavigationToggle])\n\n const themeOverrides = adaptor.themeOverrides()\n\n let neededSpec = location.pathname?.split('/')[1]\n if (!neededSpec || neededSpec === diffPath) {\n neededSpec = spec?.key\n }\n\n return (\n <>\n <ComponentsProvider\n loadGoogleFonts={themeOverrides.loadGoogleFonts}\n themeCustomizations={themeOverrides.themeCustomizations}\n >\n {working || !neededSpec || neededSpec !== spec.key ? (\n <Loader message={description} themeOverrides={themeOverrides} />\n ) : (\n <ErrorBoundary logError={adaptor.logError.bind(adaptor)}>\n <Banner adaptor={adaptor} specs={specs} />\n <Page style={{ overflow: 'hidden' }}>\n {!headless && (\n <Header spec={spec} toggleNavigation={toggleNavigation} />\n )}\n <Layout hasAside height=\"100%\">\n <AsideBorder\n borderRight\n isOpen={hasNavigation}\n headless={headless}\n >\n {headless && (\n <>\n <Space\n alignItems=\"center\"\n py=\"u3\"\n px={hasNavigation ? 'u5' : '0'}\n justifyContent={\n hasNavigation ? 'space-between' : 'center'\n }\n >\n {hasNavigation && (\n <Heading\n as=\"h2\"\n fontSize=\"xsmall\"\n fontWeight=\"bold\"\n color=\"text2\"\n >\n API DOCUMENTATION\n </Heading>\n )}\n <IconButton\n size=\"xsmall\"\n shape=\"round\"\n icon={hasNavigation ? <FirstPage /> : <LastPage />}\n label={HEADER_TOGGLE_LABEL}\n onClick={() => toggleNavigation()}\n />\n </Space>\n {hasNavigation && (\n <>\n <Divider mb=\"u3\" appearance=\"light\" />\n <SelectorContainer\n spec={spec}\n ml=\"large\"\n mr=\"large\"\n />\n </>\n )}\n </>\n )}\n {hasNavigation && <SideNav headless={headless} spec={spec} />}\n </AsideBorder>\n <AppRouter\n specKey={spec.key}\n api={spec.api!}\n specs={specs}\n toggleNavigation={toggleNavigation}\n />\n </Layout>\n </Page>\n </ErrorBoundary>\n )}\n </ComponentsProvider>\n {!headless && <BodyOverride />}\n </>\n )\n}\n\nconst AsideBorder = styled(Aside)<{\n isOpen: boolean\n headless: boolean\n}>`\n width: ${({ isOpen, headless }) =>\n isOpen ? '20rem' : headless ? '2.75rem' : '0rem'};\n`\n"],"file":"ApiExplorer.js"}
|
|
1
|
+
{"version":3,"sources":["../src/ApiExplorer.tsx"],"names":["BodyOverride","createGlobalStyle","ApiExplorer","adaptor","examplesLodeUrl","declarationsLodeUrl","apixFilesHost","headless","working","description","specs","selectSpecs","spec","selectCurrentSpec","initLodesAction","initialized","initSettingsAction","setSearchPatternAction","setSdkLanguageAction","initSpecsAction","setCurrentSpecAction","location","hasNavigation","setHasNavigation","toggleNavigation","target","hasNavigationToggle","e","origin","window","data","action","currentHasNavigation","specKey","maybeSpec","pathname","split","key","currentSpecKey","searchParams","URLSearchParams","search","searchPattern","get","sdkParam","language","sdkLanguage","addEventListener","removeEventListener","themeOverrides","neededSpec","loadGoogleFonts","themeCustomizations","logError","bind","overflow","HEADER_TOGGLE_LABEL","api","AsideBorder","Aside","isOpen"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react'\nimport React, { useState, useEffect, useCallback } from 'react'\nimport styled, { createGlobalStyle } from 'styled-components'\nimport {\n Aside,\n ComponentsProvider,\n Divider,\n Heading,\n IconButton,\n Layout,\n Page,\n Space,\n} from '@looker/components'\nimport { FirstPage } from '@styled-icons/material/FirstPage'\nimport { LastPage } from '@styled-icons/material/LastPage'\nimport {\n registerEnvAdaptor,\n unregisterEnvAdaptor,\n} from '@looker/extension-utils'\nimport { useSelector } from 'react-redux'\nimport { useLocation } from 'react-router-dom'\n\nimport type { IApixAdaptor } from './utils'\nimport {\n Header,\n SideNav,\n ErrorBoundary,\n SelectorContainer,\n HEADER_TOGGLE_LABEL,\n Loader,\n Banner,\n} from './components'\nimport { AppRouter } from './routes'\nimport { apixFilesHost } from './utils/lodeUtils'\nimport {\n useSettingActions,\n useLodeActions,\n useLodesStoreState,\n useSpecActions,\n useSpecStoreState,\n selectSpecs,\n selectCurrentSpec,\n useSettingStoreState,\n} from './state'\nimport { getSpecKey, findSdk, useGlobalStoreSync } from './utils'\n\nexport interface ApiExplorerProps {\n adaptor: IApixAdaptor\n examplesLodeUrl?: string\n declarationsLodeUrl?: string\n headless?: boolean\n}\n\nconst BodyOverride = createGlobalStyle` html { height: 100%; overflow: hidden; } `\n\nexport const ApiExplorer: FC<ApiExplorerProps> = ({\n adaptor,\n examplesLodeUrl = 'https://raw.githubusercontent.com/looker-open-source/sdk-codegen/main/examplesIndex.json',\n declarationsLodeUrl = `${apixFilesHost}/declarationsIndex.json`,\n headless = false,\n}) => {\n useLodesStoreState()\n const { working, description } = useSpecStoreState()\n const specs = useSelector(selectSpecs)\n const spec = useSelector(selectCurrentSpec)\n const { initLodesAction } = useLodeActions()\n const { initialized } = useSettingStoreState()\n const { initSettingsAction, setSearchPatternAction, setSdkLanguageAction } =\n useSettingActions()\n const { initSpecsAction, setCurrentSpecAction } = useSpecActions()\n\n const location = useLocation()\n useGlobalStoreSync()\n const [hasNavigation, setHasNavigation] = useState(true)\n const toggleNavigation = (target?: boolean) =>\n setHasNavigation(target || !hasNavigation)\n\n const hasNavigationToggle = useCallback((e: MessageEvent<any>) => {\n if (e.origin === window.origin && e.data.action === 'toggle_sidebar') {\n setHasNavigation((currentHasNavigation) => !currentHasNavigation)\n }\n }, [])\n\n registerEnvAdaptor(adaptor)\n\n useEffect(() => {\n initSettingsAction()\n initLodesAction({ examplesLodeUrl, declarationsLodeUrl })\n\n const specKey = getSpecKey(location)\n initSpecsAction({ specKey })\n return () => unregisterEnvAdaptor()\n }, [])\n\n useEffect(() => {\n const maybeSpec = location.pathname?.split('/')[1]\n if (spec && maybeSpec && maybeSpec !== spec.key) {\n setCurrentSpecAction({ currentSpecKey: maybeSpec })\n }\n }, [location.pathname, spec])\n\n useEffect(() => {\n if (!initialized) return\n const searchParams = new URLSearchParams(location.search)\n const searchPattern = searchParams.get('s') || ''\n const sdkParam = searchParams.get('sdk') || 'all'\n const { language: sdkLanguage } = findSdk(sdkParam)\n setSearchPatternAction({ searchPattern })\n setSdkLanguageAction({ sdkLanguage })\n }, [location.search])\n\n useEffect(() => {\n if (headless) {\n window.addEventListener('message', hasNavigationToggle)\n }\n return () => {\n if (headless) {\n window.removeEventListener('message', hasNavigationToggle)\n }\n }\n }, [headless, hasNavigationToggle])\n\n const themeOverrides = adaptor.themeOverrides()\n\n let neededSpec = location.pathname?.split('/')[1]\n if (!neededSpec) {\n neededSpec = spec?.key\n }\n\n return (\n <>\n <ComponentsProvider\n loadGoogleFonts={themeOverrides.loadGoogleFonts}\n themeCustomizations={themeOverrides.themeCustomizations}\n >\n {working || !neededSpec || neededSpec !== spec.key ? (\n <Loader message={description} themeOverrides={themeOverrides} />\n ) : (\n <ErrorBoundary logError={adaptor.logError.bind(adaptor)}>\n <Banner adaptor={adaptor} specs={specs} />\n <Page style={{ overflow: 'hidden' }}>\n {!headless && (\n <Header spec={spec} toggleNavigation={toggleNavigation} />\n )}\n <Layout hasAside height=\"100%\">\n <AsideBorder\n borderRight\n isOpen={hasNavigation}\n headless={headless}\n >\n {headless && (\n <>\n <Space\n alignItems=\"center\"\n py=\"u3\"\n px={hasNavigation ? 'u5' : '0'}\n justifyContent={\n hasNavigation ? 'space-between' : 'center'\n }\n >\n {hasNavigation && (\n <Heading\n as=\"h2\"\n fontSize=\"xsmall\"\n fontWeight=\"bold\"\n color=\"text2\"\n >\n API DOCUMENTATION\n </Heading>\n )}\n <IconButton\n size=\"xsmall\"\n shape=\"round\"\n icon={hasNavigation ? <FirstPage /> : <LastPage />}\n label={HEADER_TOGGLE_LABEL}\n onClick={() => toggleNavigation()}\n />\n </Space>\n {hasNavigation && (\n <>\n <Divider mb=\"u3\" appearance=\"light\" />\n <SelectorContainer\n spec={spec}\n ml=\"large\"\n mr=\"large\"\n />\n </>\n )}\n </>\n )}\n {hasNavigation && <SideNav headless={headless} spec={spec} />}\n </AsideBorder>\n <AppRouter\n specKey={spec.key}\n api={spec.api!}\n toggleNavigation={toggleNavigation}\n />\n </Layout>\n </Page>\n </ErrorBoundary>\n )}\n </ComponentsProvider>\n {!headless && <BodyOverride />}\n </>\n )\n}\n\nconst AsideBorder = styled(Aside)<{\n isOpen: boolean\n headless: boolean\n}>`\n width: ${({ isOpen, headless }) =>\n isOpen ? '20rem' : headless ? '2.75rem' : '0rem'};\n`\n"],"file":"ApiExplorer.js"}
|
|
@@ -7,8 +7,6 @@ exports.DocMarkdown = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _react = _interopRequireDefault(require("react"));
|
|
9
9
|
|
|
10
|
-
var _reactRouterDom = require("react-router-dom");
|
|
11
|
-
|
|
12
10
|
var _codeEditor = require("@looker/code-editor");
|
|
13
11
|
|
|
14
12
|
var _reactRedux = require("react-redux");
|
|
@@ -17,7 +15,9 @@ var _extensionUtils = require("@looker/extension-utils");
|
|
|
17
15
|
|
|
18
16
|
var _state = require("../../state");
|
|
19
17
|
|
|
20
|
-
var _utils = require("
|
|
18
|
+
var _utils = require("../../utils");
|
|
19
|
+
|
|
20
|
+
var _utils2 = require("./utils");
|
|
21
21
|
|
|
22
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
23
|
|
|
@@ -27,13 +27,15 @@ var DocMarkdown = _ref => {
|
|
|
27
27
|
specKey
|
|
28
28
|
} = _ref;
|
|
29
29
|
var searchPattern = (0, _reactRedux.useSelector)(_state.selectSearchPattern);
|
|
30
|
-
var
|
|
30
|
+
var {
|
|
31
|
+
navigate
|
|
32
|
+
} = (0, _utils.useNavigation)();
|
|
31
33
|
|
|
32
34
|
var linkClickHandler = (pathname, url) => {
|
|
33
35
|
if (pathname.startsWith("/".concat(specKey))) {
|
|
34
|
-
|
|
36
|
+
navigate(pathname);
|
|
35
37
|
} else if (url.startsWith("/".concat(specKey))) {
|
|
36
|
-
|
|
38
|
+
navigate(url);
|
|
37
39
|
} else if (url.startsWith('https://')) {
|
|
38
40
|
var adaptor = (0, _extensionUtils.getEnvAdaptor)();
|
|
39
41
|
adaptor.openBrowserWindow(url);
|
|
@@ -44,7 +46,7 @@ var DocMarkdown = _ref => {
|
|
|
44
46
|
source: source,
|
|
45
47
|
pattern: searchPattern,
|
|
46
48
|
linkClickHandler: linkClickHandler,
|
|
47
|
-
transformLinkUri:
|
|
49
|
+
transformLinkUri: _utils2.transformURL.bind(null, specKey)
|
|
48
50
|
});
|
|
49
51
|
};
|
|
50
52
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/DocMarkdown/DocMarkdown.tsx"],"names":["DocMarkdown","source","specKey","searchPattern","selectSearchPattern","
|
|
1
|
+
{"version":3,"sources":["../../../src/components/DocMarkdown/DocMarkdown.tsx"],"names":["DocMarkdown","source","specKey","searchPattern","selectSearchPattern","navigate","linkClickHandler","pathname","url","startsWith","adaptor","openBrowserWindow","transformURL","bind"],"mappings":";;;;;;;AA2BA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAOO,IAAMA,WAAiC,GAAG,QAAyB;AAAA,MAAxB;AAAEC,IAAAA,MAAF;AAAUC,IAAAA;AAAV,GAAwB;AACxE,MAAMC,aAAa,GAAG,6BAAYC,0BAAZ,CAAtB;AACA,MAAM;AAAEC,IAAAA;AAAF,MAAe,2BAArB;;AAEA,MAAMC,gBAAgB,GAAG,CAACC,QAAD,EAAmBC,GAAnB,KAAmC;AAC1D,QAAID,QAAQ,CAACE,UAAT,YAAwBP,OAAxB,EAAJ,EAAwC;AACtCG,MAAAA,QAAQ,CAACE,QAAD,CAAR;AACD,KAFD,MAEO,IAAIC,GAAG,CAACC,UAAJ,YAAmBP,OAAnB,EAAJ,EAAmC;AACxCG,MAAAA,QAAQ,CAACG,GAAD,CAAR;AACD,KAFM,MAEA,IAAIA,GAAG,CAACC,UAAJ,CAAe,UAAf,CAAJ,EAAgC;AACrC,UAAMC,OAAO,GAAG,oCAAhB;AACAA,MAAAA,OAAO,CAACC,iBAAR,CAA0BH,GAA1B;AACD;AACF,GATD;;AAUA,SACE,6BAAC,oBAAD;AACE,IAAA,MAAM,EAAEP,MADV;AAEE,IAAA,OAAO,EAAEE,aAFX;AAGE,IAAA,gBAAgB,EAAEG,gBAHpB;AAIE,IAAA,gBAAgB,EAAEM,qBAAaC,IAAb,CAAkB,IAAlB,EAAwBX,OAAxB;AAJpB,IADF;AAQD,CAtBM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react'\nimport React from 'react'\nimport { Markdown } from '@looker/code-editor'\nimport { useSelector } from 'react-redux'\nimport { getEnvAdaptor } from '@looker/extension-utils'\nimport { selectSearchPattern } from '../../state'\nimport { useNavigation } from '../../utils'\nimport { transformURL } from './utils'\n\ninterface DocMarkdownProps {\n source: string\n specKey: string\n}\n\nexport const DocMarkdown: FC<DocMarkdownProps> = ({ source, specKey }) => {\n const searchPattern = useSelector(selectSearchPattern)\n const { navigate } = useNavigation()\n\n const linkClickHandler = (pathname: string, url: string) => {\n if (pathname.startsWith(`/${specKey}`)) {\n navigate(pathname)\n } else if (url.startsWith(`/${specKey}`)) {\n navigate(url)\n } else if (url.startsWith('https://')) {\n const adaptor = getEnvAdaptor()\n adaptor.openBrowserWindow(url)\n }\n }\n return (\n <Markdown\n source={source}\n pattern={searchPattern}\n linkClickHandler={linkClickHandler}\n transformLinkUri={transformURL.bind(null, specKey)}\n />\n )\n}\n"],"file":"DocMarkdown.js"}
|
|
@@ -5,34 +5,29 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.DocDeclarations = void 0;
|
|
7
7
|
|
|
8
|
-
var _components = require("@looker/components");
|
|
9
|
-
|
|
10
8
|
var _react = _interopRequireDefault(require("react"));
|
|
11
9
|
|
|
10
|
+
var _components = require("@looker/components");
|
|
11
|
+
|
|
12
12
|
var _DocCode = require("../DocCode");
|
|
13
13
|
|
|
14
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
15
|
|
|
16
|
-
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
17
|
-
|
|
18
16
|
var DocDeclarations = _ref => {
|
|
19
17
|
var {
|
|
20
18
|
declarations
|
|
21
19
|
} = _ref;
|
|
22
|
-
|
|
23
|
-
return _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_components.TabList, tabs, Object.keys(declarations).map(language => _react.default.createElement(_components.Tab, {
|
|
24
|
-
key: language
|
|
25
|
-
}, language))), _react.default.createElement(_components.TabPanels, _extends({}, tabs, {
|
|
26
|
-
pt: "0"
|
|
27
|
-
}), Object.entries(declarations).map(_ref2 => {
|
|
20
|
+
return _react.default.createElement(_components.Tabs2, null, Object.entries(declarations).map(_ref2 => {
|
|
28
21
|
var [language, code] = _ref2;
|
|
29
|
-
return _react.default.createElement(_components.
|
|
30
|
-
key: language
|
|
22
|
+
return _react.default.createElement(_components.Tab2, {
|
|
23
|
+
key: language,
|
|
24
|
+
id: language,
|
|
25
|
+
label: language
|
|
31
26
|
}, _react.default.createElement(_DocCode.DocCode, {
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
code: code,
|
|
28
|
+
language: language
|
|
34
29
|
}));
|
|
35
|
-
}))
|
|
30
|
+
}));
|
|
36
31
|
};
|
|
37
32
|
|
|
38
33
|
exports.DocDeclarations = DocDeclarations;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/DocSDKs/DocDeclarations.tsx"],"names":["DocDeclarations","declarations","
|
|
1
|
+
{"version":3,"sources":["../../../src/components/DocSDKs/DocDeclarations.tsx"],"names":["DocDeclarations","declarations","Object","entries","map","language","code"],"mappings":";;;;;;;AAyBA;;AACA;;AAGA;;;;AAUO,IAAMA,eAAyC,GAAG;AAAA,MAAC;AAAEC,IAAAA;AAAF,GAAD;AAAA,SACvD,6BAAC,iBAAD,QACGC,MAAM,CAACC,OAAP,CAAeF,YAAf,EAA6BG,GAA7B,CAAiC;AAAA,QAAC,CAACC,QAAD,EAAWC,IAAX,CAAD;AAAA,WAChC,6BAAC,gBAAD;AAAM,MAAA,GAAG,EAAED,QAAX;AAAqB,MAAA,EAAE,EAAEA,QAAzB;AAAmC,MAAA,KAAK,EAAEA;AAA1C,OACE,6BAAC,gBAAD;AAAS,MAAA,IAAI,EAAEC,IAAf;AAAqB,MAAA,QAAQ,EAAED;AAA/B,MADF,CADgC;AAAA,GAAjC,CADH,CADuD;AAAA,CAAlD","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport React from 'react'\nimport { Tab2, Tabs2 } from '@looker/components'\nimport type { KeyedCollection } from '@looker/sdk-codegen'\nimport type { FC } from 'react'\nimport { DocCode } from '../DocCode'\n\ninterface DocDeclarationsProps {\n declarations: KeyedCollection<string>\n}\n\n/**\n * Renders all provided declarations\n * @param declarations A collection of SDK declarations in various languages\n */\nexport const DocDeclarations: FC<DocDeclarationsProps> = ({ declarations }) => (\n <Tabs2>\n {Object.entries(declarations).map(([language, code]) => (\n <Tab2 key={language} id={language} label={language}>\n <DocCode code={code} language={language} />\n </Tab2>\n ))}\n </Tabs2>\n)\n"],"file":"DocDeclarations.js"}
|
|
@@ -13,6 +13,8 @@ var _reactRouterDom = require("react-router-dom");
|
|
|
13
13
|
|
|
14
14
|
var _reactRedux = require("react-redux");
|
|
15
15
|
|
|
16
|
+
var _utils = require("../../utils");
|
|
17
|
+
|
|
16
18
|
var _state = require("../../state");
|
|
17
19
|
|
|
18
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -21,8 +23,10 @@ var ApiSpecSelector = _ref => {
|
|
|
21
23
|
var {
|
|
22
24
|
spec
|
|
23
25
|
} = _ref;
|
|
24
|
-
var history = (0, _reactRouterDom.useHistory)();
|
|
25
26
|
var location = (0, _reactRouterDom.useLocation)();
|
|
27
|
+
var {
|
|
28
|
+
navigate
|
|
29
|
+
} = (0, _utils.useNavigation)();
|
|
26
30
|
var specs = (0, _reactRedux.useSelector)(_state.selectSpecs);
|
|
27
31
|
var options = Object.entries(specs).map(_ref2 => {
|
|
28
32
|
var [key, spec] = _ref2;
|
|
@@ -35,7 +39,7 @@ var ApiSpecSelector = _ref => {
|
|
|
35
39
|
|
|
36
40
|
var handleChange = specKey => {
|
|
37
41
|
var matchPath = location.pathname.replace("/".concat(spec.key), "/".concat(specKey));
|
|
38
|
-
|
|
42
|
+
navigate(matchPath);
|
|
39
43
|
};
|
|
40
44
|
|
|
41
45
|
return _react.default.createElement(_components.Select, {
|