@backstage/plugin-home 0.7.3-next.1 → 0.7.4-next.0
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 +41 -0
- package/alpha/package.json +1 -1
- package/dist/alpha.esm.js +1 -1
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api/VisitsApi.esm.js +11 -0
- package/dist/api/VisitsApi.esm.js.map +1 -0
- package/dist/api/VisitsStorageApi.esm.js +118 -0
- package/dist/api/VisitsStorageApi.esm.js.map +1 -0
- package/dist/api/VisitsWebStorageApi.esm.js +15 -0
- package/dist/api/VisitsWebStorageApi.esm.js.map +1 -0
- package/dist/api/config.esm.js +37 -0
- package/dist/api/config.esm.js.map +1 -0
- package/dist/assets/TemplateBackstageLogo.esm.js +22 -0
- package/dist/assets/TemplateBackstageLogo.esm.js.map +1 -0
- package/dist/assets/TemplateBackstageLogoIcon.esm.js +33 -0
- package/dist/assets/TemplateBackstageLogoIcon.esm.js.map +1 -0
- package/dist/{esm/index-BNfZuEhy.esm.js → componentRenderers/ComponentAccordion.esm.js} +2 -26
- package/dist/componentRenderers/ComponentAccordion.esm.js.map +1 -0
- package/dist/componentRenderers/ComponentTabs/ComponentTab.esm.js +9 -0
- package/dist/componentRenderers/ComponentTabs/ComponentTab.esm.js.map +1 -0
- package/dist/componentRenderers/ComponentTabs/ComponentTabs.esm.js +23 -0
- package/dist/componentRenderers/ComponentTabs/ComponentTabs.esm.js.map +1 -0
- package/dist/componentRenderers/index.esm.js +4 -0
- package/dist/componentRenderers/index.esm.js.map +1 -0
- package/dist/components/CustomHomepage/AddWidgetDialog.esm.js +45 -0
- package/dist/components/CustomHomepage/AddWidgetDialog.esm.js.map +1 -0
- package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js +90 -0
- package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js.map +1 -0
- package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js +319 -0
- package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js.map +1 -0
- package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js +88 -0
- package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js.map +1 -0
- package/dist/components/CustomHomepage/types.esm.js +48 -0
- package/dist/components/CustomHomepage/types.esm.js.map +1 -0
- package/dist/components/HomepageCompositionRoot.esm.js +12 -0
- package/dist/components/HomepageCompositionRoot.esm.js.map +1 -0
- package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js +31 -0
- package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js.map +1 -0
- package/dist/components/VisitList/ItemCategory.esm.js +63 -0
- package/dist/components/VisitList/ItemCategory.esm.js.map +1 -0
- package/dist/components/VisitList/ItemDetail.esm.js +26 -0
- package/dist/components/VisitList/ItemDetail.esm.js.map +1 -0
- package/dist/components/VisitList/ItemName.esm.js +27 -0
- package/dist/components/VisitList/ItemName.esm.js.map +1 -0
- package/dist/components/VisitList/VisitList.esm.js +46 -0
- package/dist/components/VisitList/VisitList.esm.js.map +1 -0
- package/dist/components/VisitList/VisitListEmpty.esm.js +7 -0
- package/dist/components/VisitList/VisitListEmpty.esm.js.map +1 -0
- package/dist/components/VisitList/VisitListFew.esm.js +7 -0
- package/dist/components/VisitList/VisitListFew.esm.js.map +1 -0
- package/dist/components/VisitList/VisitListItem.esm.js +31 -0
- package/dist/components/VisitList/VisitListItem.esm.js.map +1 -0
- package/dist/components/VisitList/VisitListSkeleton.esm.js +39 -0
- package/dist/components/VisitList/VisitListSkeleton.esm.js.map +1 -0
- package/dist/components/VisitListener.esm.js +62 -0
- package/dist/components/VisitListener.esm.js.map +1 -0
- package/dist/components/index.esm.js +4 -0
- package/dist/components/index.esm.js.map +1 -0
- package/dist/deprecated.esm.js +7 -0
- package/dist/deprecated.esm.js.map +1 -0
- package/dist/{esm/index-FqRX6ImF.esm.js → homePageComponents/CompanyLogo/CompanyLogo.esm.js} +1 -1
- package/dist/{esm/index-FqRX6ImF.esm.js.map → homePageComponents/CompanyLogo/CompanyLogo.esm.js.map} +1 -1
- package/dist/homePageComponents/CompanyLogo/index.esm.js +2 -0
- package/dist/homePageComponents/CompanyLogo/index.esm.js.map +1 -0
- package/dist/{esm/index-D7JTE1IL.esm.js → homePageComponents/FeaturedDocsCard/Content.esm.js} +1 -1
- package/dist/homePageComponents/FeaturedDocsCard/Content.esm.js.map +1 -0
- package/dist/homePageComponents/FeaturedDocsCard/index.esm.js +2 -0
- package/dist/homePageComponents/FeaturedDocsCard/index.esm.js.map +1 -0
- package/dist/{esm/index-BvvJGS3L.esm.js → homePageComponents/HeaderWorldClock/HeaderWorldClock.esm.js} +1 -1
- package/dist/homePageComponents/HeaderWorldClock/HeaderWorldClock.esm.js.map +1 -0
- package/dist/homePageComponents/HeaderWorldClock/index.esm.js +2 -0
- package/dist/homePageComponents/HeaderWorldClock/index.esm.js.map +1 -0
- package/dist/homePageComponents/RandomJoke/Actions.esm.js +11 -0
- package/dist/homePageComponents/RandomJoke/Actions.esm.js.map +1 -0
- package/dist/homePageComponents/RandomJoke/Content.esm.js +13 -0
- package/dist/homePageComponents/RandomJoke/Content.esm.js.map +1 -0
- package/dist/homePageComponents/RandomJoke/Context.esm.js +48 -0
- package/dist/homePageComponents/RandomJoke/Context.esm.js.map +1 -0
- package/dist/homePageComponents/RandomJoke/Settings.esm.js +33 -0
- package/dist/homePageComponents/RandomJoke/Settings.esm.js.map +1 -0
- package/dist/homePageComponents/RandomJoke/index.esm.js +5 -0
- package/dist/homePageComponents/RandomJoke/index.esm.js.map +1 -0
- package/dist/{esm/index-SfHoDIi1.esm.js → homePageComponents/StarredEntities/Content.esm.js} +4 -27
- package/dist/homePageComponents/StarredEntities/Content.esm.js.map +1 -0
- package/dist/homePageComponents/StarredEntities/index.esm.js +2 -0
- package/dist/homePageComponents/StarredEntities/index.esm.js.map +1 -0
- package/dist/{esm/index-CeXFfTX2.esm.js → homePageComponents/Toolkit/Content.esm.js} +4 -17
- package/dist/homePageComponents/Toolkit/Content.esm.js.map +1 -0
- package/dist/homePageComponents/Toolkit/Context.esm.js +18 -0
- package/dist/homePageComponents/Toolkit/Context.esm.js.map +1 -0
- package/dist/homePageComponents/Toolkit/index.esm.js +3 -0
- package/dist/homePageComponents/Toolkit/index.esm.js.map +1 -0
- package/dist/homePageComponents/VisitedByType/Actions.esm.js +18 -0
- package/dist/homePageComponents/VisitedByType/Actions.esm.js.map +1 -0
- package/dist/homePageComponents/VisitedByType/Content.esm.js +68 -0
- package/dist/homePageComponents/VisitedByType/Content.esm.js.map +1 -0
- package/dist/homePageComponents/VisitedByType/Context.esm.js +77 -0
- package/dist/homePageComponents/VisitedByType/Context.esm.js.map +1 -0
- package/dist/homePageComponents/VisitedByType/RecentlyVisited.esm.js +9 -0
- package/dist/homePageComponents/VisitedByType/RecentlyVisited.esm.js.map +1 -0
- package/dist/homePageComponents/VisitedByType/TopVisited.esm.js +9 -0
- package/dist/homePageComponents/VisitedByType/TopVisited.esm.js.map +1 -0
- package/dist/homePageComponents/VisitedByType/VisitedByType.esm.js +21 -0
- package/dist/homePageComponents/VisitedByType/VisitedByType.esm.js.map +1 -0
- package/dist/homePageComponents/WelcomeTitle/WelcomeTitle.esm.js +27 -0
- package/dist/homePageComponents/WelcomeTitle/WelcomeTitle.esm.js.map +1 -0
- package/dist/homePageComponents/WelcomeTitle/index.esm.js +2 -0
- package/dist/homePageComponents/WelcomeTitle/index.esm.js.map +1 -0
- package/dist/homePageComponents/WelcomeTitle/locales/goodAfternoon.locales.json.esm.js +256 -0
- package/dist/homePageComponents/WelcomeTitle/locales/goodAfternoon.locales.json.esm.js.map +1 -0
- package/dist/homePageComponents/WelcomeTitle/locales/goodEvening.locales.json.esm.js +196 -0
- package/dist/homePageComponents/WelcomeTitle/locales/goodEvening.locales.json.esm.js.map +1 -0
- package/dist/homePageComponents/WelcomeTitle/locales/goodMorning.locales.json.esm.js +131 -0
- package/dist/homePageComponents/WelcomeTitle/locales/goodMorning.locales.json.esm.js.map +1 -0
- package/dist/homePageComponents/WelcomeTitle/timeUtil.esm.js +41 -0
- package/dist/homePageComponents/WelcomeTitle/timeUtil.esm.js.map +1 -0
- package/dist/index.esm.js +10 -352
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +144 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/package.json +20 -20
- package/dist/esm/Content-Quo42yad.esm.js +0 -396
- package/dist/esm/Content-Quo42yad.esm.js.map +0 -1
- package/dist/esm/RecentlyVisited-qOUgoCVu.esm.js +0 -48
- package/dist/esm/RecentlyVisited-qOUgoCVu.esm.js.map +0 -1
- package/dist/esm/TopVisited-B_KhSJit.esm.js +0 -48
- package/dist/esm/TopVisited-B_KhSJit.esm.js.map +0 -1
- package/dist/esm/VisitListener-dDLtFiIW.esm.js +0 -627
- package/dist/esm/VisitListener-dDLtFiIW.esm.js.map +0 -1
- package/dist/esm/index-BMySa_Iw.esm.js +0 -638
- package/dist/esm/index-BMySa_Iw.esm.js.map +0 -1
- package/dist/esm/index-BNfZuEhy.esm.js.map +0 -1
- package/dist/esm/index-BvvJGS3L.esm.js.map +0 -1
- package/dist/esm/index-Bzg5mDMo.esm.js +0 -45
- package/dist/esm/index-Bzg5mDMo.esm.js.map +0 -1
- package/dist/esm/index-CeXFfTX2.esm.js.map +0 -1
- package/dist/esm/index-D7JTE1IL.esm.js.map +0 -1
- package/dist/esm/index-Dg9lslkf.esm.js +0 -90
- package/dist/esm/index-Dg9lslkf.esm.js.map +0 -1
- package/dist/esm/index-SfHoDIi1.esm.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createApiFactory,\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n identityApiRef,\n storageApiRef,\n} from '@backstage/core-plugin-api';\nimport { createCardExtension } from '@backstage/plugin-home-react';\nimport {\n ToolkitContentProps,\n VisitedByTypeProps,\n FeaturedDocsCardProps,\n} from './homePageComponents';\nimport { rootRouteRef } from './routes';\nimport { VisitsStorageApi, visitsApiRef } from './api';\nimport { StarredEntitiesProps } from './homePageComponents/StarredEntities/Content';\n\n/** @public */\nexport const homePlugin = createPlugin({\n id: 'home',\n apis: [\n createApiFactory({\n api: visitsApiRef,\n deps: {\n storageApi: storageApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ storageApi, identityApi }) =>\n VisitsStorageApi.create({ storageApi, identityApi }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n});\n\n/** @public */\nexport const HomepageCompositionRoot = homePlugin.provide(\n createRoutableExtension({\n name: 'HomepageCompositionRoot',\n component: () =>\n import('./components').then(m => m.HomepageCompositionRoot),\n mountPoint: rootRouteRef,\n }),\n);\n\n/** @public */\nexport const ComponentAccordion = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentAccordion',\n component: {\n lazy: () =>\n import('./componentRenderers').then(m => m.ComponentAccordion),\n },\n }),\n);\n\n/** @public */\nexport const ComponentTabs = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentTabs',\n component: {\n lazy: () => import('./componentRenderers').then(m => m.ComponentTabs),\n },\n }),\n);\n\n/** @public */\nexport const ComponentTab = homePlugin.provide(\n createComponentExtension({\n name: 'ComponentTab',\n component: {\n lazy: () => import('./componentRenderers').then(m => m.ComponentTab),\n },\n }),\n);\n\n/**\n * A component to display a playful greeting for the user.\n *\n * @public\n */\nexport const WelcomeTitle = homePlugin.provide(\n createComponentExtension({\n name: 'WelcomeTitle',\n component: {\n lazy: () =>\n import('./homePageComponents/WelcomeTitle').then(m => m.WelcomeTitle),\n },\n }),\n);\n\n/**\n * A component to display a company logo for the user.\n *\n * @public\n */\nexport const HomePageCompanyLogo = homePlugin.provide(\n createComponentExtension({\n name: 'CompanyLogo',\n component: {\n lazy: () =>\n import('./homePageComponents/CompanyLogo').then(m => m.CompanyLogo),\n },\n }),\n);\n\n/** @public */\nexport const HomePageRandomJoke = homePlugin.provide(\n createCardExtension<{ defaultCategory?: 'any' | 'programming' }>({\n name: 'HomePageRandomJoke',\n title: 'Random Joke',\n components: () => import('./homePageComponents/RandomJoke'),\n description: 'Shows a random joke about optional category',\n layout: {\n height: { minRows: 4 },\n width: { minColumns: 3 },\n },\n settings: {\n schema: {\n title: 'Random Joke settings',\n type: 'object',\n properties: {\n defaultCategory: {\n title: 'Category',\n type: 'string',\n enum: ['any', 'programming', 'dad'],\n default: 'any',\n },\n },\n },\n },\n }),\n);\n\n/**\n * A component to display a list of tools for the user.\n *\n * @public\n */\nexport const HomePageToolkit = homePlugin.provide(\n createCardExtension<ToolkitContentProps>({\n name: 'HomePageToolkit',\n title: 'Toolkit',\n components: () => import('./homePageComponents/Toolkit'),\n }),\n);\n\n/**\n * A component to display a list of starred entities for the user.\n *\n * @public\n */\nexport const HomePageStarredEntities = homePlugin.provide(\n createCardExtension<Partial<StarredEntitiesProps>>({\n name: 'HomePageStarredEntities',\n title: 'Your Starred Entities',\n components: () => import('./homePageComponents/StarredEntities'),\n }),\n);\n\n/**\n * A component to display a configurable list of clocks for various time zones.\n *\n * @public\n */\nexport const HeaderWorldClock = homePlugin.provide(\n createComponentExtension({\n name: 'HeaderWorldClock',\n component: {\n lazy: () =>\n import('./homePageComponents/HeaderWorldClock').then(\n m => m.HeaderWorldClock,\n ),\n },\n }),\n);\n\n/**\n * Display top visited pages for the homepage\n * @public\n */\nexport const HomePageTopVisited = homePlugin.provide(\n createCardExtension<Partial<VisitedByTypeProps>>({\n name: 'HomePageTopVisited',\n title: 'Top Visited',\n components: () => import('./homePageComponents/VisitedByType/TopVisited'),\n }),\n);\n\n/**\n * Display recently visited pages for the homepage\n * @public\n */\nexport const HomePageRecentlyVisited = homePlugin.provide(\n createCardExtension<Partial<VisitedByTypeProps>>({\n name: 'HomePageRecentlyVisited',\n title: 'Recently Visited',\n components: () =>\n import('./homePageComponents/VisitedByType/RecentlyVisited'),\n }),\n);\n\n/**\n * A component to display specific Featured Docs.\n *\n * @public\n */\nexport const FeaturedDocsCard = homePlugin.provide(\n createCardExtension<FeaturedDocsCardProps>({\n name: 'FeaturedDocsCard',\n title: 'Featured Docs',\n components: () => import('./homePageComponents/FeaturedDocsCard'),\n }),\n);\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'home',\n});\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA,MAAA;AACN,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-home",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4-next.0",
|
|
4
4
|
"description": "A Backstage plugin that helps you build a home page",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin"
|
|
@@ -50,24 +50,24 @@
|
|
|
50
50
|
"test": "backstage-cli package test"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@backstage/catalog-client": "^1.6.
|
|
54
|
-
"@backstage/catalog-model": "^1.
|
|
53
|
+
"@backstage/catalog-client": "^1.6.5-next.0",
|
|
54
|
+
"@backstage/catalog-model": "^1.5.0-next.0",
|
|
55
55
|
"@backstage/config": "^1.2.0",
|
|
56
|
-
"@backstage/core-app-api": "^1.12.4
|
|
57
|
-
"@backstage/core-compat-api": "^0.2.
|
|
58
|
-
"@backstage/core-components": "^0.14.
|
|
59
|
-
"@backstage/core-plugin-api": "^1.9.
|
|
60
|
-
"@backstage/frontend-plugin-api": "^0.6.
|
|
61
|
-
"@backstage/plugin-catalog-react": "^1.11.
|
|
62
|
-
"@backstage/plugin-home-react": "^0.1.
|
|
63
|
-
"@backstage/theme": "^0.5.
|
|
56
|
+
"@backstage/core-app-api": "^1.12.4",
|
|
57
|
+
"@backstage/core-compat-api": "^0.2.5-next.0",
|
|
58
|
+
"@backstage/core-components": "^0.14.5-next.0",
|
|
59
|
+
"@backstage/core-plugin-api": "^1.9.2",
|
|
60
|
+
"@backstage/frontend-plugin-api": "^0.6.5-next.0",
|
|
61
|
+
"@backstage/plugin-catalog-react": "^1.11.4-next.0",
|
|
62
|
+
"@backstage/plugin-home-react": "^0.1.13-next.0",
|
|
63
|
+
"@backstage/theme": "^0.5.4-next.0",
|
|
64
64
|
"@material-ui/core": "^4.12.2",
|
|
65
65
|
"@material-ui/icons": "^4.9.1",
|
|
66
66
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
67
|
-
"@rjsf/core": "5.
|
|
68
|
-
"@rjsf/material-ui": "5.
|
|
69
|
-
"@rjsf/utils": "5.
|
|
70
|
-
"@rjsf/validator-ajv8": "5.
|
|
67
|
+
"@rjsf/core": "5.18.2",
|
|
68
|
+
"@rjsf/material-ui": "5.18.2",
|
|
69
|
+
"@rjsf/utils": "5.18.2",
|
|
70
|
+
"@rjsf/validator-ajv8": "5.18.2",
|
|
71
71
|
"@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|
|
72
72
|
"lodash": "^4.17.21",
|
|
73
73
|
"luxon": "^3.4.3",
|
|
@@ -77,12 +77,12 @@
|
|
|
77
77
|
"zod": "^3.22.4"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
-
"@backstage/cli": "^0.26.
|
|
81
|
-
"@backstage/dev-utils": "^1.0.
|
|
82
|
-
"@backstage/test-utils": "^1.5.
|
|
83
|
-
"@testing-library/dom": "^
|
|
80
|
+
"@backstage/cli": "^0.26.5-next.0",
|
|
81
|
+
"@backstage/dev-utils": "^1.0.32-next.0",
|
|
82
|
+
"@backstage/test-utils": "^1.5.5-next.0",
|
|
83
|
+
"@testing-library/dom": "^10.0.0",
|
|
84
84
|
"@testing-library/jest-dom": "^6.0.0",
|
|
85
|
-
"@testing-library/react": "^
|
|
85
|
+
"@testing-library/react": "^15.0.0",
|
|
86
86
|
"@testing-library/user-event": "^14.0.0",
|
|
87
87
|
"@types/react-grid-layout": "^1.3.2"
|
|
88
88
|
},
|
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
import React, { createContext, useMemo, useCallback, useEffect } from 'react';
|
|
2
|
-
import Button from '@material-ui/core/Button';
|
|
3
|
-
import { i as isOperator, v as visitsApiRef } from './VisitListener-dDLtFiIW.esm.js';
|
|
4
|
-
import Collapse from '@material-ui/core/Collapse';
|
|
5
|
-
import List from '@material-ui/core/List';
|
|
6
|
-
import ListItem from '@material-ui/core/ListItem';
|
|
7
|
-
import ListItemAvatar from '@material-ui/core/ListItemAvatar';
|
|
8
|
-
import ListItemText from '@material-ui/core/ListItemText';
|
|
9
|
-
import { makeStyles } from '@material-ui/core/styles';
|
|
10
|
-
import Typography from '@material-ui/core/Typography';
|
|
11
|
-
import { Link } from '@backstage/core-components';
|
|
12
|
-
import { DateTime } from 'luxon';
|
|
13
|
-
import Chip from '@material-ui/core/Chip';
|
|
14
|
-
import { colorVariants } from '@backstage/theme';
|
|
15
|
-
import { parseEntityRef } from '@backstage/catalog-model';
|
|
16
|
-
import Skeleton from '@material-ui/lab/Skeleton';
|
|
17
|
-
import '@backstage/core-app-api';
|
|
18
|
-
import { useApi, configApiRef } from '@backstage/core-plugin-api';
|
|
19
|
-
import useAsync from 'react-use/esm/useAsync';
|
|
20
|
-
|
|
21
|
-
const defaultContextValueOnly = {
|
|
22
|
-
collapsed: true,
|
|
23
|
-
numVisitsOpen: 3,
|
|
24
|
-
numVisitsTotal: 8,
|
|
25
|
-
visits: [],
|
|
26
|
-
loading: true,
|
|
27
|
-
kind: "recent"
|
|
28
|
-
};
|
|
29
|
-
const defaultContextValue = {
|
|
30
|
-
...defaultContextValueOnly,
|
|
31
|
-
setCollapsed: () => {
|
|
32
|
-
},
|
|
33
|
-
setNumVisitsOpen: () => {
|
|
34
|
-
},
|
|
35
|
-
setNumVisitsTotal: () => {
|
|
36
|
-
},
|
|
37
|
-
setVisits: () => {
|
|
38
|
-
},
|
|
39
|
-
setLoading: () => {
|
|
40
|
-
},
|
|
41
|
-
setKind: () => {
|
|
42
|
-
},
|
|
43
|
-
setContext: () => {
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
const Context = createContext(defaultContextValue);
|
|
47
|
-
const getFilteredSet = (setContext, contextKey) => (e) => setContext((state) => ({
|
|
48
|
-
...state,
|
|
49
|
-
[contextKey]: typeof e === "function" ? e(state[contextKey]) : e
|
|
50
|
-
}));
|
|
51
|
-
const ContextProvider = ({ children }) => {
|
|
52
|
-
const [context, setContext] = React.useState(
|
|
53
|
-
defaultContextValueOnly
|
|
54
|
-
);
|
|
55
|
-
const {
|
|
56
|
-
setCollapsed,
|
|
57
|
-
setNumVisitsOpen,
|
|
58
|
-
setNumVisitsTotal,
|
|
59
|
-
setVisits,
|
|
60
|
-
setLoading,
|
|
61
|
-
setKind
|
|
62
|
-
} = useMemo(
|
|
63
|
-
() => ({
|
|
64
|
-
setCollapsed: getFilteredSet(setContext, "collapsed"),
|
|
65
|
-
setNumVisitsOpen: getFilteredSet(setContext, "numVisitsOpen"),
|
|
66
|
-
setNumVisitsTotal: getFilteredSet(setContext, "numVisitsTotal"),
|
|
67
|
-
setVisits: getFilteredSet(setContext, "visits"),
|
|
68
|
-
setLoading: getFilteredSet(setContext, "loading"),
|
|
69
|
-
setKind: getFilteredSet(setContext, "kind")
|
|
70
|
-
}),
|
|
71
|
-
[setContext]
|
|
72
|
-
);
|
|
73
|
-
const value = {
|
|
74
|
-
...context,
|
|
75
|
-
setContext,
|
|
76
|
-
setCollapsed,
|
|
77
|
-
setNumVisitsOpen,
|
|
78
|
-
setNumVisitsTotal,
|
|
79
|
-
setVisits,
|
|
80
|
-
setLoading,
|
|
81
|
-
setKind
|
|
82
|
-
};
|
|
83
|
-
return /* @__PURE__ */ React.createElement(Context.Provider, { value }, children);
|
|
84
|
-
};
|
|
85
|
-
const useContext = () => {
|
|
86
|
-
const value = React.useContext(Context);
|
|
87
|
-
if (value === void 0)
|
|
88
|
-
throw new Error(
|
|
89
|
-
"VisitedByType useContext found undefined ContextValue, <ContextProvider/> could be missing"
|
|
90
|
-
);
|
|
91
|
-
return value;
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
const Actions = () => {
|
|
95
|
-
const { collapsed, setCollapsed, visits, numVisitsOpen, loading } = useContext();
|
|
96
|
-
const onClick = useCallback(
|
|
97
|
-
() => setCollapsed((prevCollapsed) => !prevCollapsed),
|
|
98
|
-
[setCollapsed]
|
|
99
|
-
);
|
|
100
|
-
const label = collapsed ? "View More" : "View Less";
|
|
101
|
-
if (!loading && visits.length <= numVisitsOpen)
|
|
102
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
103
|
-
return /* @__PURE__ */ React.createElement(Button, { variant: "text", onClick }, label);
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
function readFilterConfig(config) {
|
|
107
|
-
try {
|
|
108
|
-
const field = config.getString("field");
|
|
109
|
-
const operator = config.getString("operator");
|
|
110
|
-
const value = getValue(config);
|
|
111
|
-
if (isOperator(operator) && value !== void 0) {
|
|
112
|
-
return { field, operator, value };
|
|
113
|
-
}
|
|
114
|
-
return void 0;
|
|
115
|
-
} catch (error) {
|
|
116
|
-
return void 0;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
function getValue(config) {
|
|
120
|
-
let value = void 0;
|
|
121
|
-
try {
|
|
122
|
-
value = config.getString("value");
|
|
123
|
-
} catch (error) {
|
|
124
|
-
try {
|
|
125
|
-
value = config.getNumber("value");
|
|
126
|
-
} catch {
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return value;
|
|
130
|
-
}
|
|
131
|
-
function createFilterByQueryParamFromConfig(configs) {
|
|
132
|
-
try {
|
|
133
|
-
return configs.map(readFilterConfig).filter(Boolean);
|
|
134
|
-
} catch {
|
|
135
|
-
return void 0;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const useStyles$3 = makeStyles((_theme) => ({
|
|
140
|
-
name: {
|
|
141
|
-
marginLeft: "0.8rem",
|
|
142
|
-
marginRight: "0.8rem"
|
|
143
|
-
}
|
|
144
|
-
}));
|
|
145
|
-
const ItemName = ({ visit }) => {
|
|
146
|
-
const classes = useStyles$3();
|
|
147
|
-
return /* @__PURE__ */ React.createElement(
|
|
148
|
-
Typography,
|
|
149
|
-
{
|
|
150
|
-
component: Link,
|
|
151
|
-
to: visit.pathname,
|
|
152
|
-
noWrap: true,
|
|
153
|
-
className: classes.name
|
|
154
|
-
},
|
|
155
|
-
visit.name
|
|
156
|
-
);
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
const ItemDetailHits = ({ visit }) => /* @__PURE__ */ React.createElement(Typography, { component: "span", variant: "caption", color: "textSecondary" }, visit.hits, " time", visit.hits > 1 ? "s" : "");
|
|
160
|
-
const ItemDetailTimeAgo = ({ visit }) => {
|
|
161
|
-
var _a;
|
|
162
|
-
const visitDate = DateTime.fromMillis(visit.timestamp);
|
|
163
|
-
return /* @__PURE__ */ React.createElement(
|
|
164
|
-
Typography,
|
|
165
|
-
{
|
|
166
|
-
component: "time",
|
|
167
|
-
variant: "caption",
|
|
168
|
-
color: "textSecondary",
|
|
169
|
-
dateTime: (_a = visitDate.toISO()) != null ? _a : void 0
|
|
170
|
-
},
|
|
171
|
-
visitDate >= DateTime.now().startOf("day") ? visitDate.toFormat("HH:mm") : visitDate.toRelative()
|
|
172
|
-
);
|
|
173
|
-
};
|
|
174
|
-
const ItemDetail = ({
|
|
175
|
-
visit,
|
|
176
|
-
type
|
|
177
|
-
}) => type === "time-ago" ? /* @__PURE__ */ React.createElement(ItemDetailTimeAgo, { visit }) : /* @__PURE__ */ React.createElement(ItemDetailHits, { visit });
|
|
178
|
-
|
|
179
|
-
const useStyles$2 = makeStyles((theme) => ({
|
|
180
|
-
chip: {
|
|
181
|
-
color: theme.palette.common.white,
|
|
182
|
-
fontWeight: "bold",
|
|
183
|
-
margin: 0
|
|
184
|
-
}
|
|
185
|
-
}));
|
|
186
|
-
const maybeEntity = (visit) => {
|
|
187
|
-
var _a;
|
|
188
|
-
try {
|
|
189
|
-
return parseEntityRef((_a = visit == null ? void 0 : visit.entityRef) != null ? _a : "");
|
|
190
|
-
} catch (e) {
|
|
191
|
-
return void 0;
|
|
192
|
-
}
|
|
193
|
-
};
|
|
194
|
-
const getColorByIndex = (index) => {
|
|
195
|
-
const variants = Object.keys(colorVariants);
|
|
196
|
-
const variantIndex = index % variants.length;
|
|
197
|
-
return colorVariants[variants[variantIndex]][0];
|
|
198
|
-
};
|
|
199
|
-
const getChipColor = (entity) => {
|
|
200
|
-
const defaultColor = getColorByIndex(0);
|
|
201
|
-
if (!entity)
|
|
202
|
-
return defaultColor;
|
|
203
|
-
const entityKinds = [
|
|
204
|
-
"component",
|
|
205
|
-
"template",
|
|
206
|
-
"api",
|
|
207
|
-
"group",
|
|
208
|
-
"user",
|
|
209
|
-
"resource",
|
|
210
|
-
"system",
|
|
211
|
-
"domain",
|
|
212
|
-
"location"
|
|
213
|
-
];
|
|
214
|
-
const foundIndex = entityKinds.indexOf(
|
|
215
|
-
entity.kind.toLocaleLowerCase("en-US")
|
|
216
|
-
);
|
|
217
|
-
return foundIndex === -1 ? defaultColor : getColorByIndex(foundIndex + 1);
|
|
218
|
-
};
|
|
219
|
-
const ItemCategory = ({ visit }) => {
|
|
220
|
-
var _a;
|
|
221
|
-
const classes = useStyles$2();
|
|
222
|
-
const entity = maybeEntity(visit);
|
|
223
|
-
return /* @__PURE__ */ React.createElement(
|
|
224
|
-
Chip,
|
|
225
|
-
{
|
|
226
|
-
size: "small",
|
|
227
|
-
className: classes.chip,
|
|
228
|
-
label: ((_a = entity == null ? void 0 : entity.kind) != null ? _a : "Other").toLocaleLowerCase("en-US"),
|
|
229
|
-
style: { background: getChipColor(entity) }
|
|
230
|
-
}
|
|
231
|
-
);
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
const useStyles$1 = makeStyles((_theme) => ({
|
|
235
|
-
avatar: {
|
|
236
|
-
minWidth: 0
|
|
237
|
-
}
|
|
238
|
-
}));
|
|
239
|
-
const VisitListItem = ({
|
|
240
|
-
visit,
|
|
241
|
-
detailType
|
|
242
|
-
}) => {
|
|
243
|
-
const classes = useStyles$1();
|
|
244
|
-
return /* @__PURE__ */ React.createElement(ListItem, { disableGutters: true }, /* @__PURE__ */ React.createElement(ListItemAvatar, { className: classes.avatar }, /* @__PURE__ */ React.createElement(ItemCategory, { visit })), /* @__PURE__ */ React.createElement(
|
|
245
|
-
ListItemText,
|
|
246
|
-
{
|
|
247
|
-
primary: /* @__PURE__ */ React.createElement(ItemName, { visit }),
|
|
248
|
-
secondary: /* @__PURE__ */ React.createElement(ItemDetail, { visit, type: detailType }),
|
|
249
|
-
disableTypography: true
|
|
250
|
-
}
|
|
251
|
-
));
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
const VisitListEmpty = () => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, "There are no visits to show yet."), /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, "Once you start using Backstage, your visits will appear here as a quick link to carry on where you left off."));
|
|
255
|
-
|
|
256
|
-
const VisitListFew = () => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary" }, "The more pages you visit, the more pages will appear here."));
|
|
257
|
-
|
|
258
|
-
const useStyles = makeStyles((_theme) => ({
|
|
259
|
-
skeleton: {
|
|
260
|
-
borderRadius: 30
|
|
261
|
-
}
|
|
262
|
-
}));
|
|
263
|
-
const VisitListItemSkeleton = () => {
|
|
264
|
-
const classes = useStyles();
|
|
265
|
-
return /* @__PURE__ */ React.createElement(ListItem, { disableGutters: true }, /* @__PURE__ */ React.createElement(ListItemAvatar, null, /* @__PURE__ */ React.createElement(
|
|
266
|
-
Skeleton,
|
|
267
|
-
{
|
|
268
|
-
className: classes.skeleton,
|
|
269
|
-
variant: "rect",
|
|
270
|
-
width: 50,
|
|
271
|
-
height: 24
|
|
272
|
-
}
|
|
273
|
-
)), /* @__PURE__ */ React.createElement(
|
|
274
|
-
ListItemText,
|
|
275
|
-
{
|
|
276
|
-
primary: /* @__PURE__ */ React.createElement(Skeleton, { variant: "text", width: "100%", height: 28 }),
|
|
277
|
-
disableTypography: true
|
|
278
|
-
}
|
|
279
|
-
));
|
|
280
|
-
};
|
|
281
|
-
const VisitListSkeleton = ({
|
|
282
|
-
numVisitsOpen,
|
|
283
|
-
numVisitsTotal,
|
|
284
|
-
collapsed
|
|
285
|
-
}) => /* @__PURE__ */ React.createElement(React.Fragment, null, Array(numVisitsOpen).fill(null).map((_e, index) => /* @__PURE__ */ React.createElement(VisitListItemSkeleton, { key: index })), numVisitsTotal > numVisitsOpen && /* @__PURE__ */ React.createElement(Collapse, { in: !collapsed }, Array(numVisitsTotal - numVisitsOpen).fill(null).map((_e, index) => /* @__PURE__ */ React.createElement(VisitListItemSkeleton, { key: index }))));
|
|
286
|
-
|
|
287
|
-
const VisitList = ({
|
|
288
|
-
detailType,
|
|
289
|
-
visits = [],
|
|
290
|
-
numVisitsOpen = 3,
|
|
291
|
-
numVisitsTotal = 8,
|
|
292
|
-
collapsed = true,
|
|
293
|
-
loading = false,
|
|
294
|
-
title = ""
|
|
295
|
-
}) => {
|
|
296
|
-
let listBody = /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
297
|
-
if (loading) {
|
|
298
|
-
listBody = /* @__PURE__ */ React.createElement(
|
|
299
|
-
VisitListSkeleton,
|
|
300
|
-
{
|
|
301
|
-
numVisitsOpen,
|
|
302
|
-
numVisitsTotal,
|
|
303
|
-
collapsed
|
|
304
|
-
}
|
|
305
|
-
);
|
|
306
|
-
} else if (visits.length === 0) {
|
|
307
|
-
listBody = /* @__PURE__ */ React.createElement(VisitListEmpty, null);
|
|
308
|
-
} else if (visits.length < numVisitsOpen) {
|
|
309
|
-
listBody = /* @__PURE__ */ React.createElement(React.Fragment, null, visits.map((visit, index) => /* @__PURE__ */ React.createElement(VisitListItem, { visit, key: index, detailType })), /* @__PURE__ */ React.createElement(VisitListFew, null));
|
|
310
|
-
} else {
|
|
311
|
-
listBody = /* @__PURE__ */ React.createElement(React.Fragment, null, visits.slice(0, numVisitsOpen).map((visit, index) => /* @__PURE__ */ React.createElement(VisitListItem, { visit, key: index, detailType })), visits.length > numVisitsOpen && /* @__PURE__ */ React.createElement(Collapse, { in: !collapsed }, visits.slice(numVisitsOpen, numVisitsTotal).map((visit, index) => /* @__PURE__ */ React.createElement(
|
|
312
|
-
VisitListItem,
|
|
313
|
-
{
|
|
314
|
-
visit,
|
|
315
|
-
key: index,
|
|
316
|
-
detailType
|
|
317
|
-
}
|
|
318
|
-
))));
|
|
319
|
-
}
|
|
320
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, title && /* @__PURE__ */ React.createElement("h5", null, title), /* @__PURE__ */ React.createElement(List, { dense: true, disablePadding: true }, listBody));
|
|
321
|
-
};
|
|
322
|
-
|
|
323
|
-
const VisitedByType = () => {
|
|
324
|
-
const { collapsed, numVisitsOpen, numVisitsTotal, visits, loading, kind } = useContext();
|
|
325
|
-
return /* @__PURE__ */ React.createElement(
|
|
326
|
-
VisitList,
|
|
327
|
-
{
|
|
328
|
-
visits,
|
|
329
|
-
detailType: kind === "top" ? "hits" : "time-ago",
|
|
330
|
-
collapsed,
|
|
331
|
-
numVisitsOpen,
|
|
332
|
-
numVisitsTotal,
|
|
333
|
-
loading
|
|
334
|
-
}
|
|
335
|
-
);
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
const Content = ({
|
|
339
|
-
visits,
|
|
340
|
-
numVisitsOpen,
|
|
341
|
-
numVisitsTotal,
|
|
342
|
-
loading,
|
|
343
|
-
kind
|
|
344
|
-
}) => {
|
|
345
|
-
const { setContext, setVisits, setLoading } = useContext();
|
|
346
|
-
useEffect(() => {
|
|
347
|
-
const context = {};
|
|
348
|
-
context.kind = kind;
|
|
349
|
-
if (visits) {
|
|
350
|
-
context.visits = visits;
|
|
351
|
-
context.loading = false;
|
|
352
|
-
} else if (loading) {
|
|
353
|
-
context.loading = loading;
|
|
354
|
-
}
|
|
355
|
-
if (numVisitsOpen)
|
|
356
|
-
context.numVisitsOpen = numVisitsOpen;
|
|
357
|
-
if (numVisitsTotal)
|
|
358
|
-
context.numVisitsTotal = numVisitsTotal;
|
|
359
|
-
setContext((state) => ({ ...state, ...context }));
|
|
360
|
-
}, [setContext, kind, visits, loading, numVisitsOpen, numVisitsTotal]);
|
|
361
|
-
const config = useApi(configApiRef);
|
|
362
|
-
const visitsApi = useApi(visitsApiRef);
|
|
363
|
-
const { loading: reqLoading } = useAsync(async () => {
|
|
364
|
-
var _a, _b;
|
|
365
|
-
if (!visits && !loading && kind === "recent") {
|
|
366
|
-
const filterBy = createFilterByQueryParamFromConfig(
|
|
367
|
-
(_a = config.getOptionalConfigArray("home.recentVisits.filterBy")) != null ? _a : []
|
|
368
|
-
);
|
|
369
|
-
return await visitsApi.list({
|
|
370
|
-
limit: numVisitsTotal != null ? numVisitsTotal : 8,
|
|
371
|
-
orderBy: [{ field: "timestamp", direction: "desc" }],
|
|
372
|
-
...filterBy && { filterBy }
|
|
373
|
-
}).then(setVisits);
|
|
374
|
-
}
|
|
375
|
-
if (!visits && !loading && kind === "top") {
|
|
376
|
-
const filterBy = createFilterByQueryParamFromConfig(
|
|
377
|
-
(_b = config.getOptionalConfigArray("home.topVisits.filterBy")) != null ? _b : []
|
|
378
|
-
);
|
|
379
|
-
return await visitsApi.list({
|
|
380
|
-
limit: numVisitsTotal != null ? numVisitsTotal : 8,
|
|
381
|
-
orderBy: [{ field: "hits", direction: "desc" }],
|
|
382
|
-
...filterBy && { filterBy }
|
|
383
|
-
}).then(setVisits);
|
|
384
|
-
}
|
|
385
|
-
return void 0;
|
|
386
|
-
}, [visitsApi, visits, loading, setVisits]);
|
|
387
|
-
useEffect(() => {
|
|
388
|
-
if (!loading) {
|
|
389
|
-
setLoading(reqLoading);
|
|
390
|
-
}
|
|
391
|
-
}, [loading, setLoading, reqLoading]);
|
|
392
|
-
return /* @__PURE__ */ React.createElement(VisitedByType, null);
|
|
393
|
-
};
|
|
394
|
-
|
|
395
|
-
export { Actions as A, Content as C, ContextProvider as a };
|
|
396
|
-
//# sourceMappingURL=Content-Quo42yad.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Content-Quo42yad.esm.js","sources":["../../src/homePageComponents/VisitedByType/Context.tsx","../../src/homePageComponents/VisitedByType/Actions.tsx","../../src/api/config.ts","../../src/components/VisitList/ItemName.tsx","../../src/components/VisitList/ItemDetail.tsx","../../src/components/VisitList/ItemCategory.tsx","../../src/components/VisitList/VisitListItem.tsx","../../src/components/VisitList/VisitListEmpty.tsx","../../src/components/VisitList/VisitListFew.tsx","../../src/components/VisitList/VisitListSkeleton.tsx","../../src/components/VisitList/VisitList.tsx","../../src/homePageComponents/VisitedByType/VisitedByType.tsx","../../src/homePageComponents/VisitedByType/Content.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { Dispatch, SetStateAction, createContext, useMemo } from 'react';\nimport { Visit } from '../../api/VisitsApi';\nimport { VisitedByTypeKind } from './Content';\n\nexport type ContextValueOnly = {\n collapsed: boolean;\n numVisitsOpen: number;\n numVisitsTotal: number;\n visits: Array<Visit>;\n loading: boolean;\n kind: VisitedByTypeKind;\n};\n\nexport type ContextValue = ContextValueOnly & {\n setCollapsed: Dispatch<SetStateAction<boolean>>;\n setNumVisitsOpen: Dispatch<SetStateAction<number>>;\n setNumVisitsTotal: Dispatch<SetStateAction<number>>;\n setVisits: Dispatch<SetStateAction<Array<Visit>>>;\n setLoading: Dispatch<SetStateAction<boolean>>;\n setKind: Dispatch<SetStateAction<VisitedByTypeKind>>;\n setContext: Dispatch<SetStateAction<ContextValueOnly>>;\n};\n\nconst defaultContextValueOnly: ContextValueOnly = {\n collapsed: true,\n numVisitsOpen: 3,\n numVisitsTotal: 8,\n visits: [],\n loading: true,\n kind: 'recent',\n};\n\nexport const defaultContextValue: ContextValue = {\n ...defaultContextValueOnly,\n setCollapsed: () => {},\n setNumVisitsOpen: () => {},\n setNumVisitsTotal: () => {},\n setVisits: () => {},\n setLoading: () => {},\n setKind: () => {},\n setContext: () => {},\n};\n\nexport const Context = createContext<ContextValue>(defaultContextValue);\n\nconst getFilteredSet =\n <T,>(\n setContext: Dispatch<SetStateAction<ContextValueOnly>>,\n contextKey: keyof ContextValueOnly,\n ) =>\n (e: SetStateAction<T>) =>\n setContext(state => ({\n ...state,\n [contextKey]:\n typeof e === 'function' ? (e as Function)(state[contextKey]) : e,\n }));\n\nexport const ContextProvider = ({ children }: { children: JSX.Element }) => {\n const [context, setContext] = React.useState<ContextValueOnly>(\n defaultContextValueOnly,\n );\n const {\n setCollapsed,\n setNumVisitsOpen,\n setNumVisitsTotal,\n setVisits,\n setLoading,\n setKind,\n } = useMemo(\n () => ({\n setCollapsed: getFilteredSet(setContext, 'collapsed'),\n setNumVisitsOpen: getFilteredSet(setContext, 'numVisitsOpen'),\n setNumVisitsTotal: getFilteredSet(setContext, 'numVisitsTotal'),\n setVisits: getFilteredSet(setContext, 'visits'),\n setLoading: getFilteredSet(setContext, 'loading'),\n setKind: getFilteredSet(setContext, 'kind'),\n }),\n [setContext],\n );\n\n const value: ContextValue = {\n ...context,\n setContext,\n setCollapsed,\n setNumVisitsOpen,\n setNumVisitsTotal,\n setVisits,\n setLoading,\n setKind,\n };\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n};\n\nexport const useContext = () => {\n const value = React.useContext(Context);\n\n if (value === undefined)\n throw new Error(\n 'VisitedByType useContext found undefined ContextValue, <ContextProvider/> could be missing',\n );\n\n return value;\n};\n\nexport default Context;\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useCallback } from 'react';\nimport Button from '@material-ui/core/Button';\nimport { useContext } from './Context';\n\nexport const Actions = () => {\n const { collapsed, setCollapsed, visits, numVisitsOpen, loading } =\n useContext();\n const onClick = useCallback(\n () => setCollapsed(prevCollapsed => !prevCollapsed),\n [setCollapsed],\n );\n const label = collapsed ? 'View More' : 'View Less';\n\n if (!loading && visits.length <= numVisitsOpen) return <></>;\n\n return (\n <Button variant=\"text\" onClick={onClick}>\n {label}\n </Button>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Visit,\n VisitsApiQueryParams,\n Operators,\n isOperator,\n} from './VisitsApi';\nimport { Config } from '@backstage/config';\n\n/**\n * Reads a single FilterBy config.\n *\n * @param config - The single config object\n *\n * @public\n */\n\nexport function readFilterConfig(config: Config):\n | {\n field: keyof Visit;\n operator: Operators;\n value: string | number;\n }\n | undefined {\n try {\n const field = config.getString('field') as keyof Visit;\n const operator = config.getString('operator');\n const value = getValue(config);\n if (isOperator(operator) && value !== undefined) {\n return { field, operator, value };\n }\n return undefined;\n } catch (error) {\n // invalid filter config - ignore filter\n return undefined;\n }\n}\n\nfunction getValue(config: Config) {\n let value = undefined;\n try {\n value = config.getString('value');\n } catch (error) {\n try {\n value = config.getNumber('value');\n } catch {\n // value is not string or number - ignore filter\n }\n }\n return value;\n}\n\n/**\n * Reads a set of filter by configs.\n *\n * @param configs - All of the config objects\n *\n * @public\n */\nexport function createFilterByQueryParamFromConfig(\n configs: Config[],\n): VisitsApiQueryParams['filterBy'] | undefined {\n try {\n return configs\n .map(readFilterConfig)\n .filter(Boolean) as VisitsApiQueryParams['filterBy'];\n } catch {\n return undefined;\n }\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Visit } from '../../api/VisitsApi';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles(_theme => ({\n name: {\n marginLeft: '0.8rem',\n marginRight: '0.8rem',\n },\n}));\nexport const ItemName = ({ visit }: { visit: Visit }) => {\n const classes = useStyles();\n\n return (\n <Typography\n component={Link}\n to={visit.pathname}\n noWrap\n className={classes.name}\n >\n {visit.name}\n </Typography>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport { Visit } from '../../api/VisitsApi';\nimport { DateTime } from 'luxon';\n\nconst ItemDetailHits = ({ visit }: { visit: Visit }) => (\n <Typography component=\"span\" variant=\"caption\" color=\"textSecondary\">\n {visit.hits} time{visit.hits > 1 ? 's' : ''}\n </Typography>\n);\n\nconst ItemDetailTimeAgo = ({ visit }: { visit: Visit }) => {\n const visitDate = DateTime.fromMillis(visit.timestamp);\n\n return (\n <Typography\n component=\"time\"\n variant=\"caption\"\n color=\"textSecondary\"\n dateTime={visitDate.toISO() ?? undefined}\n >\n {visitDate >= DateTime.now().startOf('day')\n ? visitDate.toFormat('HH:mm')\n : visitDate.toRelative()}\n </Typography>\n );\n};\n\nexport type ItemDetailType = 'time-ago' | 'hits';\n\nexport const ItemDetail = ({\n visit,\n type,\n}: {\n visit: Visit;\n type: ItemDetailType;\n}) =>\n type === 'time-ago' ? (\n <ItemDetailTimeAgo visit={visit} />\n ) : (\n <ItemDetailHits visit={visit} />\n );\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Chip from '@material-ui/core/Chip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { colorVariants } from '@backstage/theme';\nimport { Visit } from '../../api/VisitsApi';\nimport { CompoundEntityRef, parseEntityRef } from '@backstage/catalog-model';\n\nconst useStyles = makeStyles(theme => ({\n chip: {\n color: theme.palette.common.white,\n fontWeight: 'bold',\n margin: 0,\n },\n}));\nconst maybeEntity = (visit: Visit): CompoundEntityRef | undefined => {\n try {\n return parseEntityRef(visit?.entityRef ?? '');\n } catch (e) {\n return undefined;\n }\n};\nconst getColorByIndex = (index: number) => {\n const variants = Object.keys(colorVariants);\n const variantIndex = index % variants.length;\n return colorVariants[variants[variantIndex]][0];\n};\nconst getChipColor = (entity: CompoundEntityRef | undefined): string => {\n const defaultColor = getColorByIndex(0);\n if (!entity) return defaultColor;\n\n // IDEA: Use or replicate useAllKinds hook thus supporting all software catalog\n // registered kinds. See:\n // plugins/catalog-react/src/components/EntityKindPicker/kindFilterUtils.ts\n // Provide extension point to register your own color code.\n const entityKinds = [\n 'component',\n 'template',\n 'api',\n 'group',\n 'user',\n 'resource',\n 'system',\n 'domain',\n 'location',\n ];\n const foundIndex = entityKinds.indexOf(\n entity.kind.toLocaleLowerCase('en-US'),\n );\n return foundIndex === -1 ? defaultColor : getColorByIndex(foundIndex + 1);\n};\n\nexport const ItemCategory = ({ visit }: { visit: Visit }) => {\n const classes = useStyles();\n const entity = maybeEntity(visit);\n\n return (\n <Chip\n size=\"small\"\n className={classes.chip}\n label={(entity?.kind ?? 'Other').toLocaleLowerCase('en-US')}\n style={{ background: getChipColor(entity) }}\n />\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Visit } from '../../api/VisitsApi';\nimport { ItemName } from './ItemName';\nimport { ItemDetail, ItemDetailType } from './ItemDetail';\nimport { ItemCategory } from './ItemCategory';\n\nconst useStyles = makeStyles(_theme => ({\n avatar: {\n minWidth: 0,\n },\n}));\nexport const VisitListItem = ({\n visit,\n detailType,\n}: {\n visit: Visit;\n detailType: ItemDetailType;\n}) => {\n const classes = useStyles();\n\n return (\n <ListItem disableGutters>\n <ListItemAvatar className={classes.avatar}>\n <ItemCategory visit={visit} />\n </ListItemAvatar>\n <ListItemText\n primary={<ItemName visit={visit} />}\n secondary={<ItemDetail visit={visit} type={detailType} />}\n disableTypography\n />\n </ListItem>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\n\nexport const VisitListEmpty = () => (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n There are no visits to show yet.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Once you start using Backstage, your visits will appear here as a quick\n link to carry on where you left off.\n </Typography>\n </>\n);\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\n\nexport const VisitListFew = () => (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n The more pages you visit, the more pages will appear here.\n </Typography>\n </>\n);\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Collapse from '@material-ui/core/Collapse';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Skeleton from '@material-ui/lab/Skeleton';\n\nconst useStyles = makeStyles(_theme => ({\n skeleton: {\n borderRadius: 30,\n },\n}));\n\nconst VisitListItemSkeleton = () => {\n const classes = useStyles();\n\n return (\n <ListItem disableGutters>\n <ListItemAvatar>\n <Skeleton\n className={classes.skeleton}\n variant=\"rect\"\n width={50}\n height={24}\n />\n </ListItemAvatar>\n <ListItemText\n primary={<Skeleton variant=\"text\" width=\"100%\" height={28} />}\n disableTypography\n />\n </ListItem>\n );\n};\n\nexport const VisitListSkeleton = ({\n numVisitsOpen,\n numVisitsTotal,\n collapsed,\n}: {\n numVisitsOpen: number;\n numVisitsTotal: number;\n collapsed: boolean;\n}) => (\n <>\n {Array(numVisitsOpen)\n .fill(null)\n .map((_e, index) => (\n <VisitListItemSkeleton key={index} />\n ))}\n {numVisitsTotal > numVisitsOpen && (\n <Collapse in={!collapsed}>\n {Array(numVisitsTotal - numVisitsOpen)\n .fill(null)\n .map((_e, index) => (\n <VisitListItemSkeleton key={index} />\n ))}\n </Collapse>\n )}\n </>\n);\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport Collapse from '@material-ui/core/Collapse';\nimport List from '@material-ui/core/List';\nimport { Visit } from '../../api/VisitsApi';\nimport { VisitListItem } from './VisitListItem';\nimport { ItemDetailType } from './ItemDetail';\nimport { VisitListEmpty } from './VisitListEmpty';\nimport { VisitListFew } from './VisitListFew';\nimport { VisitListSkeleton } from './VisitListSkeleton';\n\nexport const VisitList = ({\n detailType,\n visits = [],\n numVisitsOpen = 3,\n numVisitsTotal = 8,\n collapsed = true,\n loading = false,\n title = '',\n}: {\n detailType: ItemDetailType;\n visits?: Visit[];\n numVisitsOpen?: number;\n numVisitsTotal?: number;\n collapsed?: boolean;\n loading?: boolean;\n title?: string;\n}) => {\n let listBody: React.ReactElement = <></>;\n if (loading) {\n listBody = (\n <VisitListSkeleton\n numVisitsOpen={numVisitsOpen}\n numVisitsTotal={numVisitsTotal}\n collapsed={collapsed}\n />\n );\n } else if (visits.length === 0) {\n listBody = <VisitListEmpty />;\n } else if (visits.length < numVisitsOpen) {\n listBody = (\n <>\n {visits.map((visit, index) => (\n <VisitListItem visit={visit} key={index} detailType={detailType} />\n ))}\n <VisitListFew />\n </>\n );\n } else {\n listBody = (\n <>\n {visits.slice(0, numVisitsOpen).map((visit, index) => (\n <VisitListItem visit={visit} key={index} detailType={detailType} />\n ))}\n {visits.length > numVisitsOpen && (\n <Collapse in={!collapsed}>\n {visits.slice(numVisitsOpen, numVisitsTotal).map((visit, index) => (\n <VisitListItem\n visit={visit}\n key={index}\n detailType={detailType}\n />\n ))}\n </Collapse>\n )}\n </>\n );\n }\n\n return (\n <>\n {title && <h5>{title}</h5>}\n <List dense disablePadding>\n {listBody}\n </List>\n </>\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { VisitList } from '../../components/VisitList';\nimport { useContext } from './Context';\n\nexport const VisitedByType = () => {\n const { collapsed, numVisitsOpen, numVisitsTotal, visits, loading, kind } =\n useContext();\n\n return (\n <VisitList\n visits={visits}\n detailType={kind === 'top' ? 'hits' : 'time-ago'}\n collapsed={collapsed}\n numVisitsOpen={numVisitsOpen}\n numVisitsTotal={numVisitsTotal}\n loading={loading}\n />\n );\n};\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect } from 'react';\nimport { createFilterByQueryParamFromConfig } from '../../api/config';\nimport { VisitedByType } from './VisitedByType';\nimport { Visit, visitsApiRef } from '../../api';\nimport { ContextValueOnly, useContext } from './Context';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\n\n/** @public */\nexport type VisitedByTypeKind = 'recent' | 'top';\n\n/** @public */\nexport type VisitedByTypeProps = {\n visits?: Array<Visit>;\n numVisitsOpen?: number;\n numVisitsTotal?: number;\n loading?: boolean;\n kind: VisitedByTypeKind;\n};\n\n/**\n * Display recently visited pages for the homepage\n * @public\n */\nexport const Content = ({\n visits,\n numVisitsOpen,\n numVisitsTotal,\n loading,\n kind,\n}: VisitedByTypeProps) => {\n const { setContext, setVisits, setLoading } = useContext();\n // Allows behavior override from properties\n useEffect(() => {\n const context: Partial<ContextValueOnly> = {};\n context.kind = kind;\n if (visits) {\n context.visits = visits;\n context.loading = false;\n } else if (loading) {\n context.loading = loading;\n }\n if (numVisitsOpen) context.numVisitsOpen = numVisitsOpen;\n if (numVisitsTotal) context.numVisitsTotal = numVisitsTotal;\n setContext(state => ({ ...state, ...context }));\n }, [setContext, kind, visits, loading, numVisitsOpen, numVisitsTotal]);\n\n const config = useApi(configApiRef);\n // Fetches data from visitsApi in case visits and loading are not provided\n const visitsApi = useApi(visitsApiRef);\n const { loading: reqLoading } = useAsync(async () => {\n if (!visits && !loading && kind === 'recent') {\n const filterBy = createFilterByQueryParamFromConfig(\n config.getOptionalConfigArray('home.recentVisits.filterBy') ?? [],\n );\n return await visitsApi\n .list({\n limit: numVisitsTotal ?? 8,\n orderBy: [{ field: 'timestamp', direction: 'desc' }],\n ...(filterBy && { filterBy }),\n })\n .then(setVisits);\n }\n if (!visits && !loading && kind === 'top') {\n const filterBy = createFilterByQueryParamFromConfig(\n config.getOptionalConfigArray('home.topVisits.filterBy') ?? [],\n );\n return await visitsApi\n .list({\n limit: numVisitsTotal ?? 8,\n orderBy: [{ field: 'hits', direction: 'desc' }],\n ...(filterBy && { filterBy }),\n })\n .then(setVisits);\n }\n return undefined;\n }, [visitsApi, visits, loading, setVisits]);\n useEffect(() => {\n if (!loading) {\n setLoading(reqLoading);\n }\n }, [loading, setLoading, reqLoading]);\n\n return <VisitedByType />;\n};\n"],"names":["useStyles"],"mappings":"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"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { C as Content } from './Content-Quo42yad.esm.js';
|
|
2
|
-
export { A as Actions, a as ContextProvider } from './Content-Quo42yad.esm.js';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import '@material-ui/core/Button';
|
|
5
|
-
import './VisitListener-dDLtFiIW.esm.js';
|
|
6
|
-
import 'react-grid-layout';
|
|
7
|
-
import '@backstage/core-plugin-api';
|
|
8
|
-
import 'react-grid-layout/css/styles.css';
|
|
9
|
-
import 'react-resizable/css/styles.css';
|
|
10
|
-
import '@material-ui/core/Dialog';
|
|
11
|
-
import '@material-ui/core/styles';
|
|
12
|
-
import 'lodash';
|
|
13
|
-
import 'react-use/esm/useObservable';
|
|
14
|
-
import '@backstage/core-components';
|
|
15
|
-
import '@material-ui/core/Typography';
|
|
16
|
-
import '@material-ui/core/DialogContent';
|
|
17
|
-
import '@material-ui/core/Grid';
|
|
18
|
-
import '@material-ui/core/Tooltip';
|
|
19
|
-
import '@material-ui/core/IconButton';
|
|
20
|
-
import '@material-ui/icons/Settings';
|
|
21
|
-
import '@material-ui/icons/Delete';
|
|
22
|
-
import '@rjsf/core';
|
|
23
|
-
import '@rjsf/material-ui';
|
|
24
|
-
import '@rjsf/validator-ajv8';
|
|
25
|
-
import '@material-ui/core/List';
|
|
26
|
-
import '@material-ui/core/ListItem';
|
|
27
|
-
import '@material-ui/core/DialogTitle';
|
|
28
|
-
import '@material-ui/core/ListItemAvatar';
|
|
29
|
-
import '@material-ui/icons/Add';
|
|
30
|
-
import '@material-ui/core/ListItemText';
|
|
31
|
-
import '@material-ui/icons/Save';
|
|
32
|
-
import '@material-ui/icons/Edit';
|
|
33
|
-
import '@material-ui/icons/Cancel';
|
|
34
|
-
import 'zod';
|
|
35
|
-
import 'react-router-dom';
|
|
36
|
-
import '@backstage/core-app-api';
|
|
37
|
-
import '@backstage/catalog-model';
|
|
38
|
-
import '@material-ui/core/Collapse';
|
|
39
|
-
import 'luxon';
|
|
40
|
-
import '@material-ui/core/Chip';
|
|
41
|
-
import '@backstage/theme';
|
|
42
|
-
import '@material-ui/lab/Skeleton';
|
|
43
|
-
import 'react-use/esm/useAsync';
|
|
44
|
-
|
|
45
|
-
const RecentlyVisitedContent = (props) => /* @__PURE__ */ React.createElement(Content, { ...props, kind: "recent" });
|
|
46
|
-
|
|
47
|
-
export { RecentlyVisitedContent as Content };
|
|
48
|
-
//# sourceMappingURL=RecentlyVisited-qOUgoCVu.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RecentlyVisited-qOUgoCVu.esm.js","sources":["../../src/homePageComponents/VisitedByType/RecentlyVisited.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport { Actions } from './Actions';\nexport { ContextProvider } from './Context';\nexport type { VisitedByTypeProps, VisitedByTypeKind } from './Content';\nimport React from 'react';\nimport { Content, VisitedByTypeProps } from './Content';\n\nconst RecentlyVisitedContent = (props: Partial<VisitedByTypeProps>) => (\n <Content {...props} kind=\"recent\" />\n);\n\nexport { RecentlyVisitedContent as Content };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBM,MAAA,sBAAA,GAAyB,CAAC,KAC9B,qBAAA,KAAA,CAAA,aAAA,CAAC,WAAS,GAAG,KAAA,EAAO,MAAK,QAAS,EAAA;;;;"}
|