@looker/api-explorer 0.9.36 → 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 +34 -0
- 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 +17 -6
- package/lib/ApiExplorer.js.map +1 -1
- package/lib/components/DocMarkdown/DocMarkdown.js +3 -1
- 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 +3 -1
- 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 +20 -9
- package/lib/components/SideNav/SideNav.js.map +1 -1
- package/lib/components/SideNav/SideNavMethods.js +7 -6
- package/lib/components/SideNav/SideNavMethods.js.map +1 -1
- package/lib/components/SideNav/SideNavTypes.js +5 -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 +19 -8
- package/lib/esm/ApiExplorer.js.map +1 -1
- package/lib/esm/components/DocMarkdown/DocMarkdown.js +3 -1
- 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 +3 -1
- 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 +20 -10
- package/lib/esm/components/SideNav/SideNav.js.map +1 -1
- package/lib/esm/components/SideNav/SideNavMethods.js +8 -7
- package/lib/esm/components/SideNav/SideNavMethods.js.map +1 -1
- package/lib/esm/components/SideNav/SideNavTypes.js +6 -5
- 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 +9 -7
- package/lib/esm/scenes/DiffScene/DiffScene.js.map +1 -1
- package/lib/esm/scenes/DiffScene/DocDiff/DiffItem.js +3 -1
- 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 +28 -9
- 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 -11
- package/lib/esm/scenes/MethodTagScene/MethodTagScene.js.map +1 -1
- package/lib/esm/scenes/TypeScene/TypeScene.js +3 -1
- package/lib/esm/scenes/TypeScene/TypeScene.js.map +1 -1
- package/lib/esm/scenes/TypeTagScene/TypeTagScene.js +37 -10
- 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 -1
- package/lib/esm/utils/index.js.map +1 -1
- package/lib/esm/utils/path.js +21 -0
- 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 +3 -1
- 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 +23 -4
- 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 -12
- package/lib/scenes/MethodTagScene/MethodTagScene.js.map +1 -1
- package/lib/scenes/TypeScene/TypeScene.js +3 -1
- package/lib/scenes/TypeScene/TypeScene.js.map +1 -1
- package/lib/scenes/TypeTagScene/TypeTagScene.js +41 -11
- 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 -1
- package/lib/utils/index.js +29 -1
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/path.d.ts +4 -0
- package/lib/utils/path.js +32 -1
- 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 +13 -8
- package/src/components/DocMarkdown/DocMarkdown.tsx +1 -1
- 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.tsx +1 -1
- 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/{utils/hooks.ts → components/SelectorContainer/utils.ts} +13 -21
- package/src/components/SideNav/SideNav.tsx +26 -14
- package/src/components/SideNav/SideNavMethods.spec.tsx +6 -8
- package/src/components/SideNav/SideNavMethods.tsx +8 -12
- package/src/components/SideNav/SideNavTypes.tsx +5 -10
- package/src/components/index.ts +0 -1
- package/src/routes/AppRouter.tsx +7 -5
- package/src/scenes/DiffScene/DiffScene.tsx +8 -8
- package/src/scenes/DiffScene/DocDiff/DiffItem.tsx +1 -1
- 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 +21 -7
- 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 -11
- package/src/scenes/TypeScene/TypeScene.tsx +1 -1
- package/src/scenes/TypeTagScene/TypeTagScene.spec.tsx +21 -11
- package/src/scenes/TypeTagScene/TypeTagScene.tsx +44 -11
- 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 -1
- package/src/utils/path.spec.ts +67 -1
- package/src/utils/path.ts +35 -0
- 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/lib/esm/utils/hooks.js +0 -26
- package/lib/esm/utils/hooks.js.map +0 -1
- package/lib/utils/hooks.d.ts +0 -3
- package/lib/utils/hooks.js +0 -36
- package/lib/utils/hooks.js.map +0 -1
- package/src/components/DocResponses/DocResponses.spec.tsx +0 -60
- package/src/components/DocResponses/DocResponses.tsx +0 -69
- package/src/utils/hooks.spec.ts +0 -78
|
@@ -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,
|
|
@@ -61,15 +60,20 @@ var ApiExplorer = _ref => {
|
|
|
61
60
|
var {
|
|
62
61
|
initLodesAction
|
|
63
62
|
} = (0, _state.useLodeActions)();
|
|
63
|
+
var {
|
|
64
|
+
initialized
|
|
65
|
+
} = (0, _state.useSettingStoreState)();
|
|
64
66
|
var {
|
|
65
67
|
initSettingsAction,
|
|
66
|
-
setSearchPatternAction
|
|
68
|
+
setSearchPatternAction,
|
|
69
|
+
setSdkLanguageAction
|
|
67
70
|
} = (0, _state.useSettingActions)();
|
|
68
71
|
var {
|
|
69
72
|
initSpecsAction,
|
|
70
73
|
setCurrentSpecAction
|
|
71
74
|
} = (0, _state.useSpecActions)();
|
|
72
75
|
var location = (0, _reactRouterDom.useLocation)();
|
|
76
|
+
(0, _utils.useGlobalStoreSync)();
|
|
73
77
|
var [hasNavigation, setHasNavigation] = (0, _react.useState)(true);
|
|
74
78
|
|
|
75
79
|
var toggleNavigation = target => setHasNavigation(target || !hasNavigation);
|
|
@@ -97,17 +101,25 @@ var ApiExplorer = _ref => {
|
|
|
97
101
|
|
|
98
102
|
var maybeSpec = (_location$pathname = location.pathname) === null || _location$pathname === void 0 ? void 0 : _location$pathname.split('/')[1];
|
|
99
103
|
|
|
100
|
-
if (spec && maybeSpec && maybeSpec !==
|
|
104
|
+
if (spec && maybeSpec && maybeSpec !== spec.key) {
|
|
101
105
|
setCurrentSpecAction({
|
|
102
106
|
currentSpecKey: maybeSpec
|
|
103
107
|
});
|
|
104
108
|
}
|
|
105
109
|
}, [location.pathname, spec]);
|
|
106
110
|
(0, _react.useEffect)(() => {
|
|
111
|
+
if (!initialized) return;
|
|
107
112
|
var searchParams = new URLSearchParams(location.search);
|
|
108
113
|
var searchPattern = searchParams.get('s') || '';
|
|
114
|
+
var sdkParam = searchParams.get('sdk') || 'all';
|
|
115
|
+
var {
|
|
116
|
+
language: sdkLanguage
|
|
117
|
+
} = (0, _utils.findSdk)(sdkParam);
|
|
109
118
|
setSearchPatternAction({
|
|
110
|
-
searchPattern
|
|
119
|
+
searchPattern
|
|
120
|
+
});
|
|
121
|
+
setSdkLanguageAction({
|
|
122
|
+
sdkLanguage
|
|
111
123
|
});
|
|
112
124
|
}, [location.search]);
|
|
113
125
|
(0, _react.useEffect)(() => {
|
|
@@ -124,7 +136,7 @@ var ApiExplorer = _ref => {
|
|
|
124
136
|
var themeOverrides = adaptor.themeOverrides();
|
|
125
137
|
var neededSpec = (_location$pathname2 = location.pathname) === null || _location$pathname2 === void 0 ? void 0 : _location$pathname2.split('/')[1];
|
|
126
138
|
|
|
127
|
-
if (!neededSpec
|
|
139
|
+
if (!neededSpec) {
|
|
128
140
|
neededSpec = spec === null || spec === void 0 ? void 0 : spec.key;
|
|
129
141
|
}
|
|
130
142
|
|
|
@@ -182,7 +194,6 @@ var ApiExplorer = _ref => {
|
|
|
182
194
|
})), _react.default.createElement(_routes.AppRouter, {
|
|
183
195
|
specKey: spec.key,
|
|
184
196
|
api: spec.api,
|
|
185
|
-
specs: specs,
|
|
186
197
|
toggleNavigation: toggleNavigation
|
|
187
198
|
}))))), !headless && _react.default.createElement(BodyOverride, null));
|
|
188
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","setSearchPatternAction","initSpecsAction","setCurrentSpecAction","location","hasNavigation","setHasNavigation","toggleNavigation","target","hasNavigationToggle","e","origin","window","data","action","currentHasNavigation","specKey","maybeSpec","pathname","split","diffPath","key","currentSpecKey","searchParams","URLSearchParams","search","searchPattern","get","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, setSearchPatternAction } = 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 const searchParams = new URLSearchParams(location.search)\n const searchPattern = searchParams.get('s') || ''\n setSearchPatternAction({ searchPattern: searchPattern! })\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 || 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"}
|
|
@@ -27,7 +27,9 @@ 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))) {
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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"}
|
|
@@ -24,7 +24,9 @@ var ApiSpecSelector = _ref => {
|
|
|
24
24
|
spec
|
|
25
25
|
} = _ref;
|
|
26
26
|
var location = (0, _reactRouterDom.useLocation)();
|
|
27
|
-
var
|
|
27
|
+
var {
|
|
28
|
+
navigate
|
|
29
|
+
} = (0, _utils.useNavigation)();
|
|
28
30
|
var specs = (0, _reactRedux.useSelector)(_state.selectSpecs);
|
|
29
31
|
var options = Object.entries(specs).map(_ref2 => {
|
|
30
32
|
var [key, spec] = _ref2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/SelectorContainer/ApiSpecSelector.tsx"],"names":["ApiSpecSelector","spec","location","navigate","specs","selectSpecs","options","Object","entries","map","key","value","label","description","status","handleChange","specKey","matchPath","pathname","replace"],"mappings":";;;;;;;AA2BA;;AACA;;AACA;;AAEA;;AACA;;AAEA;;;;AAMO,IAAMA,eAAyC,GAAG,QAAc;AAAA,MAAb;AAAEC,IAAAA;AAAF,GAAa;AACrE,MAAMC,QAAQ,GAAG,kCAAjB;AACA,
|
|
1
|
+
{"version":3,"sources":["../../../src/components/SelectorContainer/ApiSpecSelector.tsx"],"names":["ApiSpecSelector","spec","location","navigate","specs","selectSpecs","options","Object","entries","map","key","value","label","description","status","handleChange","specKey","matchPath","pathname","replace"],"mappings":";;;;;;;AA2BA;;AACA;;AACA;;AAEA;;AACA;;AAEA;;;;AAMO,IAAMA,eAAyC,GAAG,QAAc;AAAA,MAAb;AAAEC,IAAAA;AAAF,GAAa;AACrE,MAAMC,QAAQ,GAAG,kCAAjB;AACA,MAAM;AAAEC,IAAAA;AAAF,MAAe,2BAArB;AACA,MAAMC,KAAK,GAAG,6BAAYC,kBAAZ,CAAd;AACA,MAAMC,OAAO,GAAGC,MAAM,CAACC,OAAP,CAAeJ,KAAf,EAAsBK,GAAtB,CAA0B;AAAA,QAAC,CAACC,GAAD,EAAMT,IAAN,CAAD;AAAA,WAAkB;AAC1DU,MAAAA,KAAK,EAAED,GADmD;AAE1DE,MAAAA,KAAK,EAAEF,GAFmD;AAG1DG,MAAAA,WAAW,EAAEZ,IAAI,CAACa;AAHwC,KAAlB;AAAA,GAA1B,CAAhB;;AAMA,MAAMC,YAAY,GAAIC,OAAD,IAAqB;AACxC,QAAMC,SAAS,GAAGf,QAAQ,CAACgB,QAAT,CAAkBC,OAAlB,YAA8BlB,IAAI,CAACS,GAAnC,cAA8CM,OAA9C,EAAlB;AACAb,IAAAA,QAAQ,CAACc,SAAD,CAAR;AACD,GAHD;;AAKA,SACE,6BAAC,kBAAD;AACE,IAAA,KAAK,EAAC,OADR;AAEE,kBAAW,eAFb;AAGE,IAAA,YAAY,EAAEhB,IAAI,CAACS,GAHrB;AAIE,IAAA,OAAO,EAAEJ,OAJX;AAKE,IAAA,QAAQ,EAAES;AALZ,IADF;AASD,CAxBM","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 { Select } from '@looker/components'\nimport { useLocation } from 'react-router-dom'\nimport type { SpecItem } from '@looker/sdk-codegen'\nimport { useSelector } from 'react-redux'\nimport { useNavigation } from '../../utils'\n\nimport { selectSpecs } from '../../state'\n\ninterface ApiSpecSelectorProps {\n spec: SpecItem\n}\n\nexport const ApiSpecSelector: FC<ApiSpecSelectorProps> = ({ spec }) => {\n const location = useLocation()\n const { navigate } = useNavigation()\n const specs = useSelector(selectSpecs)\n const options = Object.entries(specs).map(([key, spec]) => ({\n value: key,\n label: key,\n description: spec.status,\n }))\n\n const handleChange = (specKey: string) => {\n const matchPath = location.pathname.replace(`/${spec.key}`, `/${specKey}`)\n navigate(matchPath)\n }\n\n return (\n <Select\n width=\"10rem\"\n aria-label=\"spec selector\"\n defaultValue={spec.key}\n options={options}\n onChange={handleChange}\n />\n )\n}\n"],"file":"ApiSpecSelector.js"}
|