@backstage/plugin-catalog 1.11.1-next.1 → 1.11.1

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 CHANGED
@@ -1,42 +1,11 @@
1
1
  # @backstage/plugin-catalog
2
2
 
3
- ## 1.11.1-next.1
3
+ ## 1.11.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - 08f177b91084: Add link from Template entity to the scaffolder launch page for the template in the AboutCard.
8
7
  - Updated dependencies
9
- - @backstage/errors@1.2.0-next.0
10
- - @backstage/plugin-search-react@1.6.1-next.1
11
- - @backstage/core-components@0.13.2-next.1
12
- - @backstage/plugin-catalog-react@1.7.0-next.1
13
- - @backstage/catalog-model@1.4.0-next.0
14
- - @backstage/core-plugin-api@1.5.2-next.0
15
- - @backstage/integration-react@1.1.14-next.1
16
- - @backstage/catalog-client@1.4.2-next.1
17
- - @backstage/plugin-catalog-common@1.0.14-next.0
18
- - @backstage/plugin-scaffolder-common@1.3.1-next.0
19
- - @backstage/theme@0.4.0-next.0
20
- - @backstage/types@1.0.2
21
- - @backstage/plugin-search-common@1.2.4-next.0
22
-
23
- ## 1.11.1-next.0
24
-
25
- ### Patch Changes
26
-
27
- - Updated dependencies
28
- - @backstage/catalog-client@1.4.2-next.0
29
- - @backstage/plugin-catalog-react@1.7.0-next.0
30
- - @backstage/theme@0.4.0-next.0
31
- - @backstage/core-components@0.13.2-next.0
32
- - @backstage/core-plugin-api@1.5.1
33
- - @backstage/integration-react@1.1.14-next.0
34
- - @backstage/plugin-search-react@1.6.1-next.0
35
- - @backstage/catalog-model@1.3.0
36
- - @backstage/errors@1.1.5
37
- - @backstage/types@1.0.2
38
- - @backstage/plugin-catalog-common@1.0.13
39
- - @backstage/plugin-search-common@1.2.3
8
+ - @backstage/plugin-search-react@1.6.1
40
9
 
41
10
  ## 1.11.0
42
11
 
@@ -2,12 +2,10 @@ import ObservableImpl from 'zen-observable';
2
2
  import { stringifyEntityRef, RELATION_PART_OF, RELATION_OWNED_BY, getEntitySourceLocation, ANNOTATION_EDIT_URL, DEFAULT_NAMESPACE, ANNOTATION_LOCATION, ANNOTATION_VIEW_URL } from '@backstage/catalog-model';
3
3
  import { isArray, isString, capitalize } from 'lodash';
4
4
  import { Link, MarkdownContent, HeaderIconLinkRow, OverflowTooltip, WarningPanel, CodeSnippet, Table, Page, Header, Progress, RoutedTabs, Content, HeaderLabel, ResponseErrorPanel, InfoCard } from '@backstage/core-components';
5
- import { createExternalRouteRef, createRouteRef, useElementFilter, useApp, useApi, alertApiRef, errorApiRef, useRouteRef, attachComponentData, useRouteRefParams, useApiHolder, createPlugin, createApiFactory, discoveryApiRef, fetchApiRef, storageApiRef, createRoutableExtension, createComponentExtension } from '@backstage/core-plugin-api';
5
+ import { createExternalRouteRef, createRouteRef, useElementFilter, useApi, alertApiRef, errorApiRef, useRouteRef, attachComponentData, useRouteRefParams, useApiHolder, createPlugin, createApiFactory, discoveryApiRef, fetchApiRef, storageApiRef, createRoutableExtension, createComponentExtension } from '@backstage/core-plugin-api';
6
6
  import { scmIntegrationsApiRef, ScmIntegrationIcon } from '@backstage/integration-react';
7
7
  import { getEntityRelations, EntityRefLinks, useEntity, catalogApiRef, getEntitySourceLocation as getEntitySourceLocation$1, useEntityList, EntityKindFilter, EntityRefLink, humanizeEntityRef, useStarredEntities, entityRouteRef, useAsyncEntity, UnregisterEntityDialog, InspectEntityDialog, FavoriteEntity, CatalogFilterLayout, starredEntitiesApiRef } from '@backstage/plugin-catalog-react';
8
- import { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';
9
8
  import { makeStyles, Typography, Grid, Box, useMediaQuery, ImageList, ImageListItem, Chip, Card, CardHeader, IconButton, Divider, CardContent, createStyles, Select, InputBase, MenuItem, ListItemIcon, ListItemText, Tooltip, Popover, MenuList, Dialog, DialogTitle, DialogActions, Button } from '@material-ui/core';
10
- import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
11
9
  import CachedIcon from '@material-ui/icons/Cached';
12
10
  import DocsIcon from '@material-ui/icons/Description';
13
11
  import EditIcon from '@material-ui/icons/Edit';
@@ -105,11 +103,6 @@ const viewTechDocRouteRef = createExternalRouteRef({
105
103
  optional: true,
106
104
  params: ["namespace", "kind", "name"]
107
105
  });
108
- const createFromTemplateRouteRef = createExternalRouteRef({
109
- id: "create-from-template",
110
- optional: true,
111
- params: ["namespace", "templateName"]
112
- });
113
106
  const rootRouteRef = createRouteRef({
114
107
  id: "catalog"
115
108
  });
@@ -351,9 +344,8 @@ const useStyles$4 = makeStyles({
351
344
  }
352
345
  });
353
346
  function AboutCard(props) {
354
- var _a, _b, _c, _d;
347
+ var _a, _b, _c;
355
348
  const { variant } = props;
356
- const app = useApp();
357
349
  const classes = useStyles$4();
358
350
  const { entity } = useEntity();
359
351
  const scmIntegrationsApi = useApi(scmIntegrationsApiRef);
@@ -361,7 +353,6 @@ function AboutCard(props) {
361
353
  const alertApi = useApi(alertApiRef);
362
354
  const errorApi = useApi(errorApiRef);
363
355
  const viewTechdocLink = useRouteRef(viewTechDocRouteRef);
364
- const templateRoute = useRouteRef(createFromTemplateRouteRef);
365
356
  const entitySourceLocation = getEntitySourceLocation$1(
366
357
  entity,
367
358
  scmIntegrationsApi
@@ -383,20 +374,6 @@ function AboutCard(props) {
383
374
  name: entity.metadata.name
384
375
  })
385
376
  };
386
- const subHeaderLinks = [viewInSource, viewInTechDocs];
387
- if (isTemplateEntityV1beta3(entity)) {
388
- const Icon = (_c = app.getSystemIcon("scaffolder")) != null ? _c : CreateComponentIcon;
389
- const launchTemplate = {
390
- label: "Launch Template",
391
- icon: /* @__PURE__ */ React.createElement(Icon, null),
392
- disabled: !templateRoute,
393
- href: templateRoute && templateRoute({
394
- templateName: entity.metadata.name,
395
- namespace: entity.metadata.namespace || DEFAULT_NAMESPACE
396
- })
397
- };
398
- subHeaderLinks.push(launchTemplate);
399
- }
400
377
  let cardClass = "";
401
378
  if (variant === "gridItem") {
402
379
  cardClass = classes.gridItemCard;
@@ -409,7 +386,7 @@ function AboutCard(props) {
409
386
  } else if (variant === "fullHeight") {
410
387
  cardContentClass = classes.fullHeightCardContent;
411
388
  }
412
- const entityLocation = (_d = entity.metadata.annotations) == null ? void 0 : _d[ANNOTATION_LOCATION];
389
+ const entityLocation = (_c = entity.metadata.annotations) == null ? void 0 : _c[ANNOTATION_LOCATION];
413
390
  const allowRefresh = (entityLocation == null ? void 0 : entityLocation.startsWith("url:")) || (entityLocation == null ? void 0 : entityLocation.startsWith("file:"));
414
391
  const refreshEntity = useCallback(async () => {
415
392
  try {
@@ -442,7 +419,7 @@ function AboutCard(props) {
442
419
  },
443
420
  /* @__PURE__ */ React.createElement(EditIcon, null)
444
421
  )),
445
- subheader: /* @__PURE__ */ React.createElement(HeaderIconLinkRow, { links: subHeaderLinks })
422
+ subheader: /* @__PURE__ */ React.createElement(HeaderIconLinkRow, { links: [viewInSource, viewInTechDocs] })
446
423
  }
447
424
  ), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(CardContent, { className: cardContentClass }, /* @__PURE__ */ React.createElement(AboutContent, { entity })));
448
425
  }
@@ -1464,8 +1441,7 @@ const catalogPlugin = createPlugin({
1464
1441
  },
1465
1442
  externalRoutes: {
1466
1443
  createComponent: createComponentRouteRef,
1467
- viewTechDoc: viewTechDocRouteRef,
1468
- createFromTemplate: createFromTemplateRouteRef
1444
+ viewTechDoc: viewTechDocRouteRef
1469
1445
  },
1470
1446
  __experimentalConfigure(options) {
1471
1447
  const defaultOptions = {
@@ -1477,7 +1453,7 @@ const catalogPlugin = createPlugin({
1477
1453
  const CatalogIndexPage = catalogPlugin.provide(
1478
1454
  createRoutableExtension({
1479
1455
  name: "CatalogIndexPage",
1480
- component: () => import('./index-0a0ebd3f.esm.js').then((m) => m.CatalogPage),
1456
+ component: () => import('./index-41f94bc9.esm.js').then((m) => m.CatalogPage),
1481
1457
  mountPoint: rootRouteRef
1482
1458
  })
1483
1459
  );
@@ -1492,7 +1468,7 @@ const EntityAboutCard = catalogPlugin.provide(
1492
1468
  createComponentExtension({
1493
1469
  name: "EntityAboutCard",
1494
1470
  component: {
1495
- lazy: () => import('./index-19f433db.esm.js').then((m) => m.AboutCard)
1471
+ lazy: () => import('./index-6391c20c.esm.js').then((m) => m.AboutCard)
1496
1472
  }
1497
1473
  })
1498
1474
  );
@@ -1500,7 +1476,7 @@ const EntityLinksCard = catalogPlugin.provide(
1500
1476
  createComponentExtension({
1501
1477
  name: "EntityLinksCard",
1502
1478
  component: {
1503
- lazy: () => import('./index-2dfcbc93.esm.js').then((m) => m.EntityLinksCard)
1479
+ lazy: () => import('./index-1c47c3d8.esm.js').then((m) => m.EntityLinksCard)
1504
1480
  }
1505
1481
  })
1506
1482
  );
@@ -1508,7 +1484,7 @@ const EntityLabelsCard = catalogPlugin.provide(
1508
1484
  createComponentExtension({
1509
1485
  name: "EntityLabelsCard",
1510
1486
  component: {
1511
- lazy: () => import('./index-3dc34235.esm.js').then((m) => m.EntityLabelsCard)
1487
+ lazy: () => import('./index-37b55325.esm.js').then((m) => m.EntityLabelsCard)
1512
1488
  }
1513
1489
  })
1514
1490
  );
@@ -1597,4 +1573,4 @@ const CatalogSearchResultListItem = catalogPlugin.provide(
1597
1573
  );
1598
1574
 
1599
1575
  export { AboutCard as A, isNamespace as B, CatalogTable as C, DefaultStarredEntitiesApi as D, EntityLabelsCard$1 as E, isComponentType as F, isResourceType as G, isEntityWith as H, FilteredEntityLayout as I, FilterContainer as J, EntityListContainer as K, LinksGridList as L, RelatedEntitiesCard as R, AboutContent as a, AboutField as b, createComponentRouteRef as c, CatalogEntityPage as d, CatalogIndexPage as e, catalogPlugin as f, EntityAboutCard as g, hasLabels as h, EntityDependencyOfComponentsCard as i, EntityDependsOnComponentsCard as j, EntityDependsOnResourcesCard as k, EntityHasComponentsCard as l, EntityHasResourcesCard as m, EntityHasSubcomponentsCard as n, EntityHasSystemsCard as o, EntityLinksCard as p, EntityLabelsCard as q, CatalogSearchResultListItem as r, CatalogKindHeader as s, EntityLayout as t, EntityOrphanWarning as u, isOrphan as v, EntityProcessingErrorsPanel as w, hasCatalogProcessingErrors as x, EntitySwitch as y, isKind as z };
1600
- //# sourceMappingURL=index-72280907.esm.js.map
1576
+ //# sourceMappingURL=index-06f6e8ce.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-06f6e8ce.esm.js","sources":["../../src/apis/StarredEntitiesApi/migration.ts","../../src/apis/StarredEntitiesApi/DefaultStarredEntitiesApi.ts","../../src/routes.ts","../../src/components/AboutCard/AboutField.tsx","../../src/components/EntityLinksCard/IconLink.tsx","../../src/components/EntityLinksCard/useDynamicColumns.tsx","../../src/components/EntityLinksCard/LinksGridList.tsx","../../src/components/AboutCard/AboutContent.tsx","../../src/components/AboutCard/AboutCard.tsx","../../src/components/CatalogKindHeader/kindFilterUtils.ts","../../src/components/CatalogKindHeader/CatalogKindHeader.tsx","../../src/components/CatalogTable/columns.tsx","../../src/components/CatalogTable/CatalogTable.tsx","../../src/components/EntityContextMenu/UnregisterEntity.tsx","../../src/components/EntityContextMenu/EntityContextMenu.tsx","../../src/components/EntityLayout/EntityLayout.tsx","../../src/components/EntityOrphanWarning/DeleteEntityDialog.tsx","../../src/components/EntityOrphanWarning/EntityOrphanWarning.tsx","../../src/components/EntityProcessingErrorsPanel/EntityProcessingErrorsPanel.tsx","../../src/components/EntitySwitch/EntitySwitch.tsx","../../src/components/EntitySwitch/conditions.ts","../../src/components/FilteredEntityLayout/index.ts","../../src/components/EntityLabelsCard/EntityLabelsEmptyState.tsx","../../src/components/EntityLabelsCard/EntityLabelsCard.tsx","../../src/components/EntityLabelsCard/conditions.ts","../../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 { stringifyEntityRef } from '@backstage/catalog-model';\nimport { StorageApi } from '@backstage/core-plugin-api';\nimport { isArray, isString } from 'lodash';\n\n/**\n * Migrate the starred entities from the old format (entity:<kind>:<namespace>:<name>) from the\n * old storage location (/settings/starredEntities) to entity references in the new location\n * (/starredEntities/entityRefs).\n *\n * This will only be executed once since the old location is cleared.\n *\n * @param storageApi - the StorageApi to migrate\n */\nexport async function performMigrationToTheNewBucket({\n storageApi,\n}: {\n storageApi: StorageApi;\n}) {\n const source = storageApi.forBucket('settings');\n const target = storageApi.forBucket('starredEntities');\n\n const oldStarredEntities = source.snapshot('starredEntities').value;\n\n if (!isArray(oldStarredEntities)) {\n // nothing to do\n return;\n }\n const targetEntities = new Set(\n target.snapshot<string[]>('entityRefs').value ?? [],\n );\n\n oldStarredEntities\n .filter(isString)\n // extract the old format 'entity:<kind>:<namespace>:<name>'\n .map(old => old.split(':'))\n // check if the format is valid\n .filter(split => split.length === 4 && split[0] === 'entity')\n // convert to entity references\n .map(([_, kind, namespace, name]) =>\n stringifyEntityRef({ kind, namespace, name }),\n )\n .forEach(e => targetEntities.add(e));\n\n await target.set('entityRefs', Array.from(targetEntities));\n\n await source.remove('starredEntities');\n}\n","/*\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 { StorageApi } from '@backstage/core-plugin-api';\nimport { StarredEntitiesApi } from '@backstage/plugin-catalog-react';\nimport { Observable } from '@backstage/types';\nimport ObservableImpl from 'zen-observable';\nimport { performMigrationToTheNewBucket } from './migration';\n\n/**\n * Default implementation of the StarredEntitiesApi that is backed by the StorageApi.\n *\n * @public\n */\nexport class DefaultStarredEntitiesApi implements StarredEntitiesApi {\n private readonly settingsStore: StorageApi;\n private starredEntities: Set<string>;\n\n constructor(opts: { storageApi: StorageApi }) {\n // no need to await. The updated content will be caught by the observe$\n performMigrationToTheNewBucket(opts).then();\n\n this.settingsStore = opts.storageApi.forBucket('starredEntities');\n\n this.starredEntities = new Set(\n this.settingsStore.snapshot<string[]>('entityRefs').value ?? [],\n );\n\n this.settingsStore.observe$<string[]>('entityRefs').subscribe({\n next: next => {\n this.starredEntities = new Set(next.value ?? []);\n this.notifyChanges();\n },\n });\n }\n\n async toggleStarred(entityRef: string): Promise<void> {\n if (this.starredEntities.has(entityRef)) {\n this.starredEntities.delete(entityRef);\n } else {\n this.starredEntities.add(entityRef);\n }\n\n await this.settingsStore.set(\n 'entityRefs',\n Array.from(this.starredEntities),\n );\n }\n\n starredEntitie$(): Observable<Set<string>> {\n return this.observable;\n }\n\n private readonly subscribers = new Set<\n ZenObservable.SubscriptionObserver<Set<string>>\n >();\n\n private readonly observable = new ObservableImpl<Set<string>>(subscriber => {\n // forward the the latest value\n subscriber.next(new Set(this.starredEntities));\n\n this.subscribers.add(subscriber);\n return () => {\n this.subscribers.delete(subscriber);\n };\n });\n\n private notifyChanges() {\n for (const subscription of this.subscribers) {\n subscription.next(new Set(this.starredEntities));\n }\n }\n}\n","/*\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 createExternalRouteRef,\n createRouteRef,\n} from '@backstage/core-plugin-api';\n\nexport const createComponentRouteRef = createExternalRouteRef({\n id: 'create-component',\n optional: true,\n});\n\nexport const viewTechDocRouteRef = createExternalRouteRef({\n id: 'view-techdoc',\n optional: true,\n params: ['namespace', 'kind', 'name'],\n});\n\nexport const rootRouteRef = createRouteRef({\n id: 'catalog',\n});\n","/*\n * Copyright 2020 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 { useElementFilter } from '@backstage/core-plugin-api';\nimport { Grid, makeStyles, Typography } from '@material-ui/core';\nimport React from 'react';\n\nconst useStyles = makeStyles(theme => ({\n value: {\n fontWeight: 'bold',\n overflow: 'hidden',\n lineHeight: '24px',\n wordBreak: 'break-word',\n },\n label: {\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n fontSize: '10px',\n fontWeight: 'bold',\n letterSpacing: 0.5,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n}));\n\n/**\n * Props for {@link AboutField}.\n *\n * @public\n */\nexport interface AboutFieldProps {\n label: string;\n value?: string;\n gridSizes?: Record<string, number>;\n children?: React.ReactNode;\n}\n\n/** @public */\nexport function AboutField(props: AboutFieldProps) {\n const { label, value, gridSizes, children } = props;\n const classes = useStyles();\n\n const childElements = useElementFilter(children, c => c.getElements());\n\n // Content is either children or a string prop `value`\n const content =\n childElements.length > 0 ? (\n childElements\n ) : (\n <Typography variant=\"body2\" className={classes.value}>\n {value || `unknown`}\n </Typography>\n );\n return (\n <Grid item {...gridSizes}>\n <Typography variant=\"h2\" className={classes.label}>\n {label}\n </Typography>\n {content}\n </Grid>\n );\n}\n","/*\n * Copyright 2020 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 { makeStyles, Box, Typography } from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport { Link } from '@backstage/core-components';\nimport { IconComponent } from '@backstage/core-plugin-api';\n\nconst useStyles = makeStyles({\n svgIcon: {\n display: 'inline-block',\n '& svg': {\n display: 'inline-block',\n fontSize: 'inherit',\n verticalAlign: 'baseline',\n },\n },\n});\n\nexport function IconLink(props: {\n href: string;\n text?: string;\n Icon?: IconComponent;\n}) {\n const { href, text, Icon } = props;\n const classes = useStyles();\n\n return (\n <Box display=\"flex\">\n <Box mr={1} className={classes.svgIcon}>\n <Typography component=\"div\">\n {Icon ? <Icon /> : <LanguageIcon />}\n </Typography>\n </Box>\n <Box flexGrow=\"1\">\n <Link to={href} target=\"_blank\" rel=\"noopener\">\n {text || href}\n </Link>\n </Box>\n </Box>\n );\n}\n","/*\n * Copyright 2020 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 { Theme, useMediaQuery } from '@material-ui/core';\nimport { Breakpoint, ColumnBreakpoints } from './types';\n\nconst colDefaults: ColumnBreakpoints = {\n xs: 1,\n sm: 1,\n md: 1,\n lg: 2,\n xl: 3,\n};\n\nexport function useDynamicColumns(\n cols: ColumnBreakpoints | number | undefined,\n): number {\n const matches: (Breakpoint | null)[] = [\n useMediaQuery((theme: Theme) => theme.breakpoints.up('xl')) ? 'xl' : null,\n useMediaQuery((theme: Theme) => theme.breakpoints.up('lg')) ? 'lg' : null,\n useMediaQuery((theme: Theme) => theme.breakpoints.up('md')) ? 'md' : null,\n useMediaQuery((theme: Theme) => theme.breakpoints.up('sm')) ? 'sm' : null,\n useMediaQuery((theme: Theme) => theme.breakpoints.up('xs')) ? 'xs' : null,\n ];\n\n let numOfCols = 1;\n\n if (typeof cols === 'number') {\n numOfCols = cols;\n } else {\n const breakpoint = matches.find(k => k !== null) ?? 'xs';\n numOfCols = cols?.[breakpoint] ?? colDefaults[breakpoint];\n }\n\n return numOfCols;\n}\n","/*\n * Copyright 2020 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 { ImageList, ImageListItem } from '@material-ui/core';\nimport React from 'react';\nimport { IconLink } from './IconLink';\nimport { ColumnBreakpoints } from './types';\nimport { useDynamicColumns } from './useDynamicColumns';\nimport { IconComponent } from '@backstage/core-plugin-api';\n\nexport interface LinksGridListItem {\n href: string;\n text?: string;\n Icon?: IconComponent;\n}\n\ninterface LinksGridListProps {\n items: LinksGridListItem[];\n cols?: ColumnBreakpoints | number;\n}\n\nexport function LinksGridList(props: LinksGridListProps) {\n const { items, cols = undefined } = props;\n const numOfCols = useDynamicColumns(cols);\n\n return (\n <ImageList rowHeight=\"auto\" cols={numOfCols}>\n {items.map(({ text, href, Icon }, i) => (\n <ImageListItem key={i}>\n <IconLink href={href} text={text ?? href} Icon={Icon} />\n </ImageListItem>\n ))}\n </ImageList>\n );\n}\n","/*\n * Copyright 2020 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 Entity,\n getEntitySourceLocation,\n RELATION_OWNED_BY,\n RELATION_PART_OF,\n} from '@backstage/catalog-model';\nimport {\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { JsonArray } from '@backstage/types';\nimport { Chip, Grid, makeStyles } from '@material-ui/core';\nimport { MarkdownContent } from '@backstage/core-components';\nimport React from 'react';\nimport { AboutField } from './AboutField';\nimport { LinksGridList } from '../EntityLinksCard/LinksGridList';\n\nconst useStyles = makeStyles({\n description: {\n wordBreak: 'break-word',\n },\n});\n\n/**\n * Props for {@link AboutContent}.\n *\n * @public\n */\nexport interface AboutContentProps {\n entity: Entity;\n}\n\nfunction getLocationTargetHref(\n target: string,\n type: string,\n entitySourceLocation: {\n type: string;\n target: string;\n },\n): string {\n if (type === 'url' || target.includes('://')) {\n return target;\n }\n\n const srcLocationUrl =\n entitySourceLocation.type === 'file'\n ? `file://${entitySourceLocation.target}`\n : entitySourceLocation.target;\n\n if (type === 'file' || entitySourceLocation.type === 'file') {\n return new URL(target, srcLocationUrl).href;\n }\n\n return srcLocationUrl;\n}\n\n/** @public */\nexport function AboutContent(props: AboutContentProps) {\n const { entity } = props;\n const classes = useStyles();\n const isSystem = entity.kind.toLocaleLowerCase('en-US') === 'system';\n const isResource = entity.kind.toLocaleLowerCase('en-US') === 'resource';\n const isComponent = entity.kind.toLocaleLowerCase('en-US') === 'component';\n const isAPI = entity.kind.toLocaleLowerCase('en-US') === 'api';\n const isTemplate = entity.kind.toLocaleLowerCase('en-US') === 'template';\n const isLocation = entity.kind.toLocaleLowerCase('en-US') === 'location';\n const isGroup = entity.kind.toLocaleLowerCase('en-US') === 'group';\n\n const partOfSystemRelations = getEntityRelations(entity, RELATION_PART_OF, {\n kind: 'system',\n });\n const partOfComponentRelations = getEntityRelations(\n entity,\n RELATION_PART_OF,\n {\n kind: 'component',\n },\n );\n const partOfDomainRelations = getEntityRelations(entity, RELATION_PART_OF, {\n kind: 'domain',\n });\n const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY);\n\n let entitySourceLocation:\n | {\n type: string;\n target: string;\n }\n | undefined;\n try {\n entitySourceLocation = getEntitySourceLocation(entity);\n } catch (e) {\n entitySourceLocation = undefined;\n }\n\n return (\n <Grid container>\n <AboutField label=\"Description\" gridSizes={{ xs: 12 }}>\n <MarkdownContent\n className={classes.description}\n content={entity?.metadata?.description || 'No description'}\n />\n </AboutField>\n <AboutField\n label=\"Owner\"\n value=\"No Owner\"\n gridSizes={{ xs: 12, sm: 6, lg: 4 }}\n >\n {ownedByRelations.length > 0 && (\n <EntityRefLinks entityRefs={ownedByRelations} defaultKind=\"group\" />\n )}\n </AboutField>\n {(isSystem || partOfDomainRelations.length > 0) && (\n <AboutField\n label=\"Domain\"\n value=\"No Domain\"\n gridSizes={{ xs: 12, sm: 6, lg: 4 }}\n >\n {partOfDomainRelations.length > 0 && (\n <EntityRefLinks\n entityRefs={partOfDomainRelations}\n defaultKind=\"domain\"\n />\n )}\n </AboutField>\n )}\n {(isAPI ||\n isComponent ||\n isResource ||\n partOfSystemRelations.length > 0) && (\n <AboutField\n label=\"System\"\n value=\"No System\"\n gridSizes={{ xs: 12, sm: 6, lg: 4 }}\n >\n {partOfSystemRelations.length > 0 && (\n <EntityRefLinks\n entityRefs={partOfSystemRelations}\n defaultKind=\"system\"\n />\n )}\n </AboutField>\n )}\n {isComponent && partOfComponentRelations.length > 0 && (\n <AboutField\n label=\"Parent Component\"\n value=\"No Parent Component\"\n gridSizes={{ xs: 12, sm: 6, lg: 4 }}\n >\n <EntityRefLinks\n entityRefs={partOfComponentRelations}\n defaultKind=\"component\"\n />\n </AboutField>\n )}\n {(isAPI ||\n isComponent ||\n isResource ||\n isTemplate ||\n isGroup ||\n isLocation ||\n typeof entity?.spec?.type === 'string') && (\n <AboutField\n label=\"Type\"\n value={entity?.spec?.type as string}\n gridSizes={{ xs: 12, sm: 6, lg: 4 }}\n />\n )}\n {(isAPI ||\n isComponent ||\n typeof entity?.spec?.lifecycle === 'string') && (\n <AboutField\n label=\"Lifecycle\"\n value={entity?.spec?.lifecycle as string}\n gridSizes={{ xs: 12, sm: 6, lg: 4 }}\n />\n )}\n <AboutField\n label=\"Tags\"\n value=\"No Tags\"\n gridSizes={{ xs: 12, sm: 6, lg: 4 }}\n >\n {(entity?.metadata?.tags || []).map(t => (\n <Chip key={t} size=\"small\" label={t} />\n ))}\n </AboutField>\n {isLocation && (entity?.spec?.targets || entity?.spec?.target) && (\n <AboutField label=\"Targets\" gridSizes={{ xs: 12 }}>\n <LinksGridList\n cols={1}\n items={((entity.spec.targets as JsonArray) || [entity.spec.target])\n .map(target => target as string)\n .map(target => ({\n text: target,\n href: getLocationTargetHref(\n target,\n (entity?.spec?.type || 'unknown') as string,\n entitySourceLocation!,\n ),\n }))}\n />\n </AboutField>\n )}\n </Grid>\n );\n}\n","/*\n * Copyright 2020 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 ANNOTATION_EDIT_URL,\n ANNOTATION_LOCATION,\n DEFAULT_NAMESPACE,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport {\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n InfoCardVariants,\n Link,\n} from '@backstage/core-components';\nimport {\n alertApiRef,\n errorApiRef,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport {\n ScmIntegrationIcon,\n scmIntegrationsApiRef,\n} from '@backstage/integration-react';\nimport {\n catalogApiRef,\n getEntitySourceLocation,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport {\n Card,\n CardContent,\n CardHeader,\n Divider,\n IconButton,\n makeStyles,\n} from '@material-ui/core';\nimport CachedIcon from '@material-ui/icons/Cached';\nimport DocsIcon from '@material-ui/icons/Description';\nimport EditIcon from '@material-ui/icons/Edit';\nimport React, { useCallback } from 'react';\nimport { viewTechDocRouteRef } from '../../routes';\nimport { AboutContent } from './AboutContent';\n\nconst useStyles = makeStyles({\n gridItemCard: {\n display: 'flex',\n flexDirection: 'column',\n height: 'calc(100% - 10px)', // for pages without content header\n marginBottom: '10px',\n },\n fullHeightCard: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n },\n gridItemCardContent: {\n flex: 1,\n },\n fullHeightCardContent: {\n flex: 1,\n },\n});\n\n/**\n * Props for {@link EntityAboutCard}.\n *\n * @public\n */\nexport interface AboutCardProps {\n variant?: InfoCardVariants;\n}\n\n/**\n * Exported publicly via the EntityAboutCard\n */\nexport function AboutCard(props: AboutCardProps) {\n const { variant } = props;\n const classes = useStyles();\n const { entity } = useEntity();\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n const catalogApi = useApi(catalogApiRef);\n const alertApi = useApi(alertApiRef);\n const errorApi = useApi(errorApiRef);\n const viewTechdocLink = useRouteRef(viewTechDocRouteRef);\n\n const entitySourceLocation = getEntitySourceLocation(\n entity,\n scmIntegrationsApi,\n );\n const entityMetadataEditUrl =\n entity.metadata.annotations?.[ANNOTATION_EDIT_URL];\n\n const viewInSource: IconLinkVerticalProps = {\n label: 'View Source',\n disabled: !entitySourceLocation,\n icon: <ScmIntegrationIcon type={entitySourceLocation?.integrationType} />,\n href: entitySourceLocation?.locationTargetUrl,\n };\n const viewInTechDocs: IconLinkVerticalProps = {\n label: 'View TechDocs',\n disabled:\n !entity.metadata.annotations?.['backstage.io/techdocs-ref'] ||\n !viewTechdocLink,\n icon: <DocsIcon />,\n href:\n viewTechdocLink &&\n viewTechdocLink({\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n kind: entity.kind,\n name: entity.metadata.name,\n }),\n };\n\n let cardClass = '';\n if (variant === 'gridItem') {\n cardClass = classes.gridItemCard;\n } else if (variant === 'fullHeight') {\n cardClass = classes.fullHeightCard;\n }\n\n let cardContentClass = '';\n if (variant === 'gridItem') {\n cardContentClass = classes.gridItemCardContent;\n } else if (variant === 'fullHeight') {\n cardContentClass = classes.fullHeightCardContent;\n }\n\n const entityLocation = entity.metadata.annotations?.[ANNOTATION_LOCATION];\n // Limiting the ability to manually refresh to the less expensive locations\n const allowRefresh =\n entityLocation?.startsWith('url:') || entityLocation?.startsWith('file:');\n const refreshEntity = useCallback(async () => {\n try {\n await catalogApi.refreshEntity(stringifyEntityRef(entity));\n alertApi.post({ message: 'Refresh scheduled', severity: 'info' });\n } catch (e) {\n errorApi.post(e);\n }\n }, [catalogApi, alertApi, errorApi, entity]);\n\n return (\n <Card className={cardClass}>\n <CardHeader\n title=\"About\"\n action={\n <>\n {allowRefresh && (\n <IconButton\n aria-label=\"Refresh\"\n title=\"Schedule entity refresh\"\n onClick={refreshEntity}\n >\n <CachedIcon />\n </IconButton>\n )}\n <IconButton\n component={Link}\n aria-label=\"Edit\"\n disabled={!entityMetadataEditUrl}\n title=\"Edit Metadata\"\n to={entityMetadataEditUrl ?? '#'}\n >\n <EditIcon />\n </IconButton>\n </>\n }\n subheader={<HeaderIconLinkRow links={[viewInSource, viewInTechDocs]} />}\n />\n <Divider />\n <CardContent className={cardContentClass}>\n <AboutContent entity={entity} />\n </CardContent>\n </Card>\n );\n}\n","/*\n * Copyright 2022 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 { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/lib/useAsync';\n\n/**\n * Fetch and return all availible kinds.\n */\nexport function useAllKinds(): {\n loading: boolean;\n error?: Error;\n allKinds: string[];\n} {\n const catalogApi = useApi(catalogApiRef);\n\n const {\n error,\n loading,\n value: allKinds,\n } = useAsync(async () => {\n const items = await catalogApi\n .getEntityFacets({ facets: ['kind'] })\n .then(response => response.facets.kind?.map(f => f.value).sort() || []);\n return items;\n }, [catalogApi]);\n\n return { loading, error, allKinds: allKinds ?? [] };\n}\n\n/**\n * Filter and capitalize accessible kinds.\n */\nexport function filterKinds(\n allKinds: string[],\n allowedKinds?: string[],\n forcedKinds?: string,\n): Record<string, string> {\n // Before allKinds is loaded, or when a kind is entered manually in the URL, selectedKind may not\n // be present in allKinds. It should still be shown in the dropdown, but may not have the nice\n // enforced casing from the catalog-backend. This makes a key/value record for the Select options,\n // including selectedKind if it's unknown - but allows the selectedKind to get clobbered by the\n // more proper catalog kind if it exists.\n let availableKinds = allKinds;\n if (allowedKinds) {\n availableKinds = availableKinds.filter(k =>\n allowedKinds.some(\n a => a.toLocaleLowerCase('en-US') === k.toLocaleLowerCase('en-US'),\n ),\n );\n }\n if (\n forcedKinds &&\n !allKinds.some(\n a =>\n a.toLocaleLowerCase('en-US') === forcedKinds.toLocaleLowerCase('en-US'),\n )\n ) {\n availableKinds = availableKinds.concat([forcedKinds]);\n }\n\n const kindsMap = availableKinds.sort().reduce((acc, kind) => {\n acc[kind.toLocaleLowerCase('en-US')] = kind;\n return acc;\n }, {} as Record<string, string>);\n\n return kindsMap;\n}\n","/*\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 React, { useEffect, useState, useMemo } from 'react';\nimport {\n createStyles,\n InputBase,\n makeStyles,\n MenuItem,\n Select,\n Theme,\n} from '@material-ui/core';\nimport {\n EntityKindFilter,\n useEntityList,\n} from '@backstage/plugin-catalog-react';\nimport pluralize from 'pluralize';\nimport { filterKinds, useAllKinds } from './kindFilterUtils';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n ...theme.typography.h4,\n },\n }),\n);\n\n/**\n * Props for {@link CatalogKindHeader}.\n *\n * @public\n */\nexport interface CatalogKindHeaderProps {\n /**\n * Entity kinds to show in the dropdown; by default all kinds are fetched from the catalog and\n * displayed.\n */\n allowedKinds?: string[];\n /**\n * The initial kind to select; defaults to 'component'. A kind filter entered directly in the\n * query parameter will override this value.\n */\n initialFilter?: string;\n}\n\n/**\n * @public\n * @deprecated This component has been deprecated in favour of the EntityKindPicker in the list of filters. If you wish to keep this component long term make sure to raise an issue at github.com/backstage/backstage\n */\nexport function CatalogKindHeader(props: CatalogKindHeaderProps) {\n const { initialFilter = 'component', allowedKinds } = props;\n const classes = useStyles();\n const { allKinds } = useAllKinds();\n const {\n filters,\n updateFilters,\n queryParameters: { kind: kindParameter },\n } = useEntityList();\n\n const queryParamKind = useMemo(\n () => [kindParameter].flat()[0],\n [kindParameter],\n );\n\n const [selectedKind, setSelectedKind] = useState(\n queryParamKind ?? filters.kind?.value ?? initialFilter,\n );\n\n // Set selected kinds on query parameter updates; this happens at initial page load and from\n // external updates to the page location.\n useEffect(() => {\n if (queryParamKind) {\n setSelectedKind(queryParamKind);\n }\n }, [queryParamKind]);\n\n // Set selected kind from filters; this happens when the kind filter is\n // updated from another component\n useEffect(() => {\n if (filters.kind?.value) {\n setSelectedKind(filters.kind?.value);\n }\n }, [filters.kind]);\n\n useEffect(() => {\n updateFilters({\n kind: selectedKind ? new EntityKindFilter(selectedKind) : undefined,\n });\n }, [selectedKind, updateFilters]);\n\n const options = filterKinds(allKinds, allowedKinds, selectedKind);\n\n return (\n <Select\n input={<InputBase />}\n value={selectedKind.toLocaleLowerCase('en-US')}\n onChange={e => setSelectedKind(e.target.value as string)}\n classes={classes}\n >\n {Object.keys(options).map(kind => (\n <MenuItem value={kind} key={kind}>\n {`${pluralize(options[kind])}`}\n </MenuItem>\n ))}\n </Select>\n );\n}\n","/*\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 React from 'react';\nimport {\n humanizeEntityRef,\n EntityRefLink,\n EntityRefLinks,\n} from '@backstage/plugin-catalog-react';\nimport { Chip } from '@material-ui/core';\nimport { CatalogTableRow } from './types';\nimport { OverflowTooltip, TableColumn } from '@backstage/core-components';\nimport { Entity } from '@backstage/catalog-model';\nimport { JsonArray } from '@backstage/types';\n\n// The columnFactories symbol is not directly exported, but through the\n// CatalogTable.columns field.\n/** @public */\nexport const columnFactories = Object.freeze({\n createNameColumn(options?: {\n defaultKind?: string;\n }): TableColumn<CatalogTableRow> {\n function formatContent(entity: Entity): string {\n return (\n entity.metadata?.title ||\n humanizeEntityRef(entity, {\n defaultKind: options?.defaultKind,\n })\n );\n }\n\n return {\n title: 'Name',\n field: 'resolved.name',\n highlight: true,\n customSort({ entity: entity1 }, { entity: entity2 }) {\n // TODO: We could implement this more efficiently by comparing field by field.\n // This has similar issues as above.\n return formatContent(entity1).localeCompare(formatContent(entity2));\n },\n render: ({ entity }) => (\n <EntityRefLink\n entityRef={entity}\n defaultKind={options?.defaultKind || 'Component'}\n title={entity.metadata?.title}\n />\n ),\n };\n },\n createSystemColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'System',\n field: 'resolved.partOfSystemRelationTitle',\n render: ({ resolved }) => (\n <EntityRefLinks\n entityRefs={resolved.partOfSystemRelations}\n defaultKind=\"system\"\n />\n ),\n };\n },\n createOwnerColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'Owner',\n field: 'resolved.ownedByRelationsTitle',\n render: ({ resolved }) => (\n <EntityRefLinks\n entityRefs={resolved.ownedByRelations}\n defaultKind=\"group\"\n />\n ),\n };\n },\n createSpecTargetsColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'Targets',\n field: 'entity.spec.targets',\n render: ({ entity }) => (\n <>\n {(entity?.spec?.targets || entity?.spec?.target) && (\n <OverflowTooltip\n text={(\n (entity!.spec!.targets as JsonArray) || [entity.spec.target]\n ).join(', ')}\n placement=\"bottom-start\"\n />\n )}\n </>\n ),\n };\n },\n createSpecTypeColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'Type',\n field: 'entity.spec.type',\n hidden: true,\n width: 'auto',\n };\n },\n createSpecLifecycleColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'Lifecycle',\n field: 'entity.spec.lifecycle',\n };\n },\n createMetadataDescriptionColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'Description',\n field: 'entity.metadata.description',\n render: ({ entity }) => (\n <OverflowTooltip\n text={entity.metadata.description}\n placement=\"bottom-start\"\n />\n ),\n width: 'auto',\n };\n },\n createTagsColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'Tags',\n field: 'entity.metadata.tags',\n cellStyle: {\n padding: '0px 16px 0px 20px',\n },\n render: ({ entity }) => (\n <>\n {entity.metadata.tags &&\n entity.metadata.tags.map(t => (\n <Chip\n key={t}\n label={t}\n size=\"small\"\n variant=\"outlined\"\n style={{ marginBottom: '0px' }}\n />\n ))}\n </>\n ),\n width: 'auto',\n };\n },\n createTitleColumn(options?: {\n hidden?: boolean;\n }): TableColumn<CatalogTableRow> {\n return {\n title: 'Title',\n field: 'entity.metadata.title',\n hidden: options?.hidden,\n searchable: true,\n };\n },\n createLabelColumn(\n key: string,\n options?: { title?: string; defaultValue?: string },\n ): TableColumn<CatalogTableRow> {\n return {\n title: options?.title || 'Label',\n field: 'entity.metadata.labels',\n cellStyle: {\n padding: '0px 16px 0px 20px',\n },\n render: ({ entity }: { entity: Entity }) => {\n const labels: Record<string, string> | undefined =\n entity.metadata?.labels;\n const specifiedLabelValue =\n (labels && labels[key]) || options?.defaultValue;\n return (\n <>\n {specifiedLabelValue && (\n <Chip\n key={specifiedLabelValue}\n label={specifiedLabelValue}\n size=\"small\"\n variant=\"outlined\"\n />\n )}\n </>\n );\n },\n width: 'auto',\n };\n },\n createNamespaceColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'Namespace',\n field: 'entity.metadata.namespace',\n width: 'auto',\n };\n },\n});\n","/*\n * Copyright 2020 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 {\n ANNOTATION_EDIT_URL,\n ANNOTATION_VIEW_URL,\n Entity,\n RELATION_OWNED_BY,\n RELATION_PART_OF,\n} from '@backstage/catalog-model';\nimport {\n CodeSnippet,\n Table,\n TableColumn,\n TableProps,\n WarningPanel,\n} from '@backstage/core-components';\nimport {\n getEntityRelations,\n humanizeEntityRef,\n useEntityList,\n useStarredEntities,\n} from '@backstage/plugin-catalog-react';\nimport { Typography } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport Edit from '@material-ui/icons/Edit';\nimport OpenInNew from '@material-ui/icons/OpenInNew';\nimport Star from '@material-ui/icons/Star';\nimport StarBorder from '@material-ui/icons/StarBorder';\nimport { capitalize } from 'lodash';\nimport React, { ReactNode, useMemo } from 'react';\nimport { columnFactories } from './columns';\nimport { CatalogTableRow } from './types';\n\n/**\n * Props for {@link CatalogTable}.\n *\n * @public\n */\nexport interface CatalogTableProps {\n columns?: TableColumn<CatalogTableRow>[];\n actions?: TableProps<CatalogTableRow>['actions'];\n tableOptions?: TableProps<CatalogTableRow>['options'];\n emptyContent?: ReactNode;\n subtitle?: string;\n}\n\nconst YellowStar = withStyles({\n root: {\n color: '#f3ba37',\n },\n})(Star);\n\nconst refCompare = (a: Entity, b: Entity) => {\n const toRef = (entity: Entity) =>\n entity.metadata.title ||\n humanizeEntityRef(entity, {\n defaultKind: 'Component',\n });\n\n return toRef(a).localeCompare(toRef(b));\n};\n\n/** @public */\nexport const CatalogTable = (props: CatalogTableProps) => {\n const { columns, actions, tableOptions, subtitle, emptyContent } = props;\n const { isStarredEntity, toggleStarredEntity } = useStarredEntities();\n const { loading, error, entities, filters } = useEntityList();\n\n const defaultColumns: TableColumn<CatalogTableRow>[] = useMemo(() => {\n return [\n columnFactories.createTitleColumn({ hidden: true }),\n columnFactories.createNameColumn({ defaultKind: filters.kind?.value }),\n ...createEntitySpecificColumns(),\n columnFactories.createMetadataDescriptionColumn(),\n columnFactories.createTagsColumn(),\n ];\n\n function createEntitySpecificColumns(): TableColumn<CatalogTableRow>[] {\n const baseColumns = [\n columnFactories.createSystemColumn(),\n columnFactories.createOwnerColumn(),\n columnFactories.createSpecTypeColumn(),\n columnFactories.createSpecLifecycleColumn(),\n ];\n switch (filters.kind?.value) {\n case 'user':\n return [];\n case 'domain':\n case 'system':\n return [columnFactories.createOwnerColumn()];\n case 'group':\n case 'template':\n return [columnFactories.createSpecTypeColumn()];\n case 'location':\n return [\n columnFactories.createSpecTypeColumn(),\n columnFactories.createSpecTargetsColumn(),\n ];\n default:\n return entities.every(\n entity => entity.metadata.namespace === 'default',\n )\n ? baseColumns\n : [...baseColumns, columnFactories.createNamespaceColumn()];\n }\n }\n }, [filters.kind?.value, entities]);\n\n const showTypeColumn = filters.type === undefined;\n // TODO(timbonicus): remove the title from the CatalogTable once using EntitySearchBar\n const titlePreamble = capitalize(filters.user?.value ?? 'all');\n\n if (error) {\n return (\n <div>\n <WarningPanel\n severity=\"error\"\n title=\"Could not fetch catalog entities.\"\n >\n <CodeSnippet language=\"text\" text={error.toString()} />\n </WarningPanel>\n </div>\n );\n }\n\n const defaultActions: TableProps<CatalogTableRow>['actions'] = [\n ({ entity }) => {\n const url = entity.metadata.annotations?.[ANNOTATION_VIEW_URL];\n const title = 'View';\n\n return {\n icon: () => (\n <>\n <Typography variant=\"srOnly\">{title}</Typography>\n <OpenInNew fontSize=\"small\" />\n </>\n ),\n tooltip: title,\n disabled: !url,\n onClick: () => {\n if (!url) return;\n window.open(url, '_blank');\n },\n };\n },\n ({ entity }) => {\n const url = entity.metadata.annotations?.[ANNOTATION_EDIT_URL];\n const title = 'Edit';\n\n return {\n icon: () => (\n <>\n <Typography variant=\"srOnly\">{title}</Typography>\n <Edit fontSize=\"small\" />\n </>\n ),\n tooltip: title,\n disabled: !url,\n onClick: () => {\n if (!url) return;\n window.open(url, '_blank');\n },\n };\n },\n ({ entity }) => {\n const isStarred = isStarredEntity(entity);\n const title = isStarred ? 'Remove from favorites' : 'Add to favorites';\n\n return {\n cellStyle: { paddingLeft: '1em' },\n icon: () => (\n <>\n <Typography variant=\"srOnly\">{title}</Typography>\n {isStarred ? <YellowStar /> : <StarBorder />}\n </>\n ),\n tooltip: title,\n onClick: () => toggleStarredEntity(entity),\n };\n },\n ];\n\n const rows = entities.sort(refCompare).map(entity => {\n const partOfSystemRelations = getEntityRelations(entity, RELATION_PART_OF, {\n kind: 'system',\n });\n const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY);\n\n return {\n entity,\n resolved: {\n name: humanizeEntityRef(entity, {\n defaultKind: 'Component',\n }),\n ownedByRelationsTitle: ownedByRelations\n .map(r => humanizeEntityRef(r, { defaultKind: 'group' }))\n .join(', '),\n ownedByRelations,\n partOfSystemRelationTitle: partOfSystemRelations\n .map(r =>\n humanizeEntityRef(r, {\n defaultKind: 'system',\n }),\n )\n .join(', '),\n partOfSystemRelations,\n },\n };\n });\n\n const typeColumn = (columns || defaultColumns).find(c => c.title === 'Type');\n if (typeColumn) {\n typeColumn.hidden = !showTypeColumn;\n }\n const showPagination = rows.length > 20;\n\n return (\n <Table<CatalogTableRow>\n isLoading={loading}\n columns={columns || defaultColumns}\n options={{\n paging: showPagination,\n pageSize: 20,\n actionsColumnIndex: -1,\n loadingType: 'linear',\n showEmptyDataSourceMessage: !loading,\n padding: 'dense',\n pageSizeOptions: [20, 50, 100],\n ...tableOptions,\n }}\n title={`${titlePreamble} (${entities.length})`}\n data={rows}\n actions={actions || defaultActions}\n subtitle={subtitle}\n emptyContent={emptyContent}\n />\n );\n};\n\nCatalogTable.columns = columnFactories;\n","/*\n * Copyright 2020 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 { ListItemIcon, ListItemText, MenuItem } from '@material-ui/core';\nimport CancelIcon from '@material-ui/icons/Cancel';\n\ntype VisibleType = 'visible' | 'hidden' | 'disable';\n\nexport type UnregisterEntityOptions = {\n disableUnregister: boolean | VisibleType;\n};\n\ninterface UnregisterEntityProps {\n unregisterEntityOptions?: UnregisterEntityOptions;\n isUnregisterAllowed: boolean;\n onUnregisterEntity: () => void;\n onClose: () => void;\n}\n\nexport function UnregisterEntity(props: UnregisterEntityProps) {\n const {\n unregisterEntityOptions,\n isUnregisterAllowed,\n onUnregisterEntity,\n onClose,\n } = props;\n\n const isBoolean =\n typeof unregisterEntityOptions?.disableUnregister === 'boolean';\n\n const isDisabled =\n (!isUnregisterAllowed ||\n (isBoolean\n ? !!unregisterEntityOptions?.disableUnregister\n : unregisterEntityOptions?.disableUnregister === 'disable')) ??\n false;\n\n let unregisterButton = <></>;\n\n if (unregisterEntityOptions?.disableUnregister !== 'hidden') {\n unregisterButton = (\n <MenuItem\n onClick={() => {\n onClose();\n onUnregisterEntity();\n }}\n disabled={isDisabled}\n >\n <ListItemIcon>\n <CancelIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary=\"Unregister entity\" />\n </MenuItem>\n );\n }\n\n return <>{unregisterButton}</>;\n}\n","/*\n * Copyright 2020 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 Divider,\n IconButton,\n ListItemIcon,\n ListItemText,\n MenuItem,\n MenuList,\n Popover,\n Tooltip,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport BugReportIcon from '@material-ui/icons/BugReport';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport FileCopyTwoToneIcon from '@material-ui/icons/FileCopyTwoTone';\nimport React, { useCallback, useState } from 'react';\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport { useEntityPermission } from '@backstage/plugin-catalog-react/alpha';\nimport { catalogEntityDeletePermission } from '@backstage/plugin-catalog-common/alpha';\nimport { BackstageTheme } from '@backstage/theme';\nimport { UnregisterEntity, UnregisterEntityOptions } from './UnregisterEntity';\nimport { useApi, alertApiRef } from '@backstage/core-plugin-api';\n\n/** @public */\nexport type EntityContextMenuClassKey = 'button';\n\nconst useStyles = makeStyles(\n (theme: BackstageTheme) => {\n return {\n button: {\n color: theme.page.fontColor,\n },\n };\n },\n { name: 'PluginCatalogEntityContextMenu' },\n);\n\n// NOTE(freben): Intentionally not exported at this point, since it's part of\n// the unstable extra context menu items concept below\ninterface ExtraContextMenuItem {\n title: string;\n Icon: IconComponent;\n onClick: () => void;\n}\n\ninterface EntityContextMenuProps {\n UNSTABLE_extraContextMenuItems?: ExtraContextMenuItem[];\n UNSTABLE_contextMenuOptions?: UnregisterEntityOptions;\n onUnregisterEntity: () => void;\n onInspectEntity: () => void;\n}\n\nexport function EntityContextMenu(props: EntityContextMenuProps) {\n const {\n UNSTABLE_extraContextMenuItems,\n UNSTABLE_contextMenuOptions,\n onUnregisterEntity,\n onInspectEntity,\n } = props;\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const classes = useStyles();\n const unregisterPermission = useEntityPermission(\n catalogEntityDeletePermission,\n );\n const isAllowed = unregisterPermission.allowed;\n\n const onOpen = (event: React.SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const onClose = () => {\n setAnchorEl(undefined);\n };\n\n const alertApi = useApi(alertApiRef);\n\n const copyToClipboard = useCallback(() => {\n window.navigator.clipboard.writeText(window.location.toString()).then(() =>\n alertApi.post({\n message: 'Copied!',\n severity: 'info',\n display: 'transient',\n }),\n );\n }, [alertApi]);\n\n const extraItems = UNSTABLE_extraContextMenuItems && [\n ...UNSTABLE_extraContextMenuItems.map(item => (\n <MenuItem\n key={item.title}\n onClick={() => {\n onClose();\n item.onClick();\n }}\n >\n <ListItemIcon>\n <item.Icon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={item.title} />\n </MenuItem>\n )),\n <Divider key=\"the divider is here!\" />,\n ];\n\n return (\n <>\n <Tooltip title=\"More\" arrow>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n aria-expanded={!!anchorEl}\n role=\"button\"\n onClick={onOpen}\n data-testid=\"menu-button\"\n className={classes.button}\n id=\"long-menu\"\n >\n <MoreVert />\n </IconButton>\n </Tooltip>\n <Popover\n open={Boolean(anchorEl)}\n onClose={onClose}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n aria-labelledby=\"long-menu\"\n >\n <MenuList>\n {extraItems}\n <UnregisterEntity\n unregisterEntityOptions={UNSTABLE_contextMenuOptions}\n isUnregisterAllowed={isAllowed}\n onUnregisterEntity={onUnregisterEntity}\n onClose={onClose}\n />\n <MenuItem\n onClick={() => {\n onClose();\n onInspectEntity();\n }}\n >\n <ListItemIcon>\n <BugReportIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary=\"Inspect entity\" />\n </MenuItem>\n <MenuItem\n onClick={() => {\n onClose();\n copyToClipboard();\n }}\n >\n <ListItemIcon>\n <FileCopyTwoToneIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary=\"Copy entity URL\" />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n}\n","/*\n * Copyright 2020 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 Entity,\n DEFAULT_NAMESPACE,\n RELATION_OWNED_BY,\n} from '@backstage/catalog-model';\nimport {\n Content,\n Header,\n HeaderLabel,\n Link,\n Page,\n Progress,\n RoutedTabs,\n WarningPanel,\n} from '@backstage/core-components';\nimport {\n attachComponentData,\n IconComponent,\n useElementFilter,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport {\n EntityRefLinks,\n entityRouteRef,\n FavoriteEntity,\n getEntityRelations,\n InspectEntityDialog,\n UnregisterEntityDialog,\n useAsyncEntity,\n} from '@backstage/plugin-catalog-react';\nimport { Box, TabProps } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useEffect, useState } from 'react';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { EntityContextMenu } from '../EntityContextMenu/EntityContextMenu';\n\n/** @public */\nexport type EntityLayoutRouteProps = {\n path: string;\n title: string;\n children: JSX.Element;\n if?: (entity: Entity) => boolean;\n tabProps?: TabProps<React.ElementType, { component?: React.ElementType }>;\n};\n\nconst dataKey = 'plugin.catalog.entityLayoutRoute';\n\nconst Route: (props: EntityLayoutRouteProps) => null = () => null;\nattachComponentData(Route, dataKey, true);\nattachComponentData(Route, 'core.gatherMountPoints', true); // This causes all mount points that are discovered within this route to use the path of the route itself\n\nfunction EntityLayoutTitle(props: {\n title: string;\n entity: Entity | undefined;\n}) {\n const { entity, title } = props;\n return (\n <Box display=\"inline-flex\" alignItems=\"center\" height=\"1em\" maxWidth=\"100%\">\n <Box\n component=\"span\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n overflow=\"hidden\"\n >\n {title}\n </Box>\n {entity && <FavoriteEntity entity={entity} />}\n </Box>\n );\n}\n\nfunction headerProps(\n paramKind: string | undefined,\n paramNamespace: string | undefined,\n paramName: string | undefined,\n entity: Entity | undefined,\n): { headerTitle: string; headerType: string } {\n const kind = paramKind ?? entity?.kind ?? '';\n const namespace = paramNamespace ?? entity?.metadata.namespace ?? '';\n const name =\n entity?.metadata.title ?? paramName ?? entity?.metadata.name ?? '';\n return {\n headerTitle: `${name}${\n namespace && namespace !== DEFAULT_NAMESPACE ? ` in ${namespace}` : ''\n }`,\n headerType: (() => {\n let t = kind.toLocaleLowerCase('en-US');\n if (entity && entity.spec && 'type' in entity.spec) {\n t += ' — ';\n t += (entity.spec as { type: string }).type.toLocaleLowerCase('en-US');\n }\n return t;\n })(),\n };\n}\n\nfunction EntityLabels(props: { entity: Entity }) {\n const { entity } = props;\n const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY);\n return (\n <>\n {ownedByRelations.length > 0 && (\n <HeaderLabel\n label=\"Owner\"\n value={\n <EntityRefLinks\n entityRefs={ownedByRelations}\n defaultKind=\"Group\"\n color=\"inherit\"\n />\n }\n />\n )}\n {entity.spec?.lifecycle && (\n <HeaderLabel label=\"Lifecycle\" value={entity.spec.lifecycle} />\n )}\n </>\n );\n}\n\n// NOTE(freben): Intentionally not exported at this point, since it's part of\n// the unstable extra context menu items concept below\ninterface ExtraContextMenuItem {\n title: string;\n Icon: IconComponent;\n onClick: () => void;\n}\n\ntype VisibleType = 'visible' | 'hidden' | 'disable';\n\n// NOTE(blam): Intentionally not exported at this point, since it's part of\n// unstable context menu option, eg: disable the unregister entity menu\ninterface EntityContextMenuOptions {\n disableUnregister: boolean | VisibleType;\n}\n\n/** @public */\nexport interface EntityLayoutProps {\n UNSTABLE_extraContextMenuItems?: ExtraContextMenuItem[];\n UNSTABLE_contextMenuOptions?: EntityContextMenuOptions;\n children?: React.ReactNode;\n NotFoundComponent?: React.ReactNode;\n}\n\n/**\n * EntityLayout is a compound component, which allows you to define a layout for\n * entities using a sub-navigation mechanism.\n *\n * Consists of two parts: EntityLayout and EntityLayout.Route\n *\n * @example\n * ```jsx\n * <EntityLayout>\n * <EntityLayout.Route path=\"/example\" title=\"Example tab\">\n * <div>This is rendered under /example/anything-here route</div>\n * </EntityLayout.Route>\n * </EntityLayout>\n * ```\n *\n * @public\n */\nexport const EntityLayout = (props: EntityLayoutProps) => {\n const {\n UNSTABLE_extraContextMenuItems,\n UNSTABLE_contextMenuOptions,\n children,\n NotFoundComponent,\n } = props;\n const { kind, namespace, name } = useRouteRefParams(entityRouteRef);\n const { entity, loading, error } = useAsyncEntity();\n const location = useLocation();\n const routes = useElementFilter(\n children,\n elements =>\n elements\n .selectByComponentData({\n key: dataKey,\n withStrictError:\n 'Child of EntityLayout must be an EntityLayout.Route',\n })\n .getElements<EntityLayoutRouteProps>() // all nodes, element data, maintain structure or not?\n .flatMap(({ props: elementProps }) => {\n if (!entity) {\n return [];\n } else if (elementProps.if && !elementProps.if(entity)) {\n return [];\n }\n\n return [\n {\n path: elementProps.path,\n title: elementProps.title,\n children: elementProps.children,\n tabProps: elementProps.tabProps,\n },\n ];\n }),\n [entity],\n );\n\n const { headerTitle, headerType } = headerProps(\n kind,\n namespace,\n name,\n entity,\n );\n\n const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);\n const [inspectionDialogOpen, setInspectionDialogOpen] = useState(false);\n const navigate = useNavigate();\n const cleanUpAfterRemoval = async () => {\n setConfirmationDialogOpen(false);\n setInspectionDialogOpen(false);\n navigate('/');\n };\n\n // Make sure to close the dialog if the user clicks links in it that navigate\n // to another entity.\n useEffect(() => {\n setConfirmationDialogOpen(false);\n setInspectionDialogOpen(false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location.pathname]);\n\n return (\n <Page themeId={entity?.spec?.type?.toString() ?? 'home'}>\n <Header\n title={<EntityLayoutTitle title={headerTitle} entity={entity!} />}\n pageTitleOverride={headerTitle}\n type={headerType}\n >\n {entity && (\n <>\n <EntityLabels entity={entity} />\n <EntityContextMenu\n UNSTABLE_extraContextMenuItems={UNSTABLE_extraContextMenuItems}\n UNSTABLE_contextMenuOptions={UNSTABLE_contextMenuOptions}\n onUnregisterEntity={() => setConfirmationDialogOpen(true)}\n onInspectEntity={() => setInspectionDialogOpen(true)}\n />\n </>\n )}\n </Header>\n\n {loading && <Progress />}\n\n {entity && <RoutedTabs routes={routes} />}\n\n {error && (\n <Content>\n <Alert severity=\"error\">{error.toString()}</Alert>\n </Content>\n )}\n\n {!loading && !error && !entity && (\n <Content>\n {NotFoundComponent ? (\n NotFoundComponent\n ) : (\n <WarningPanel title=\"Entity not found\">\n There is no {kind} with the requested{' '}\n <Link to=\"https://backstage.io/docs/features/software-catalog/references\">\n kind, namespace, and name\n </Link>\n .\n </WarningPanel>\n )}\n </Content>\n )}\n\n <UnregisterEntityDialog\n open={confirmationDialogOpen}\n entity={entity!}\n onConfirm={cleanUpAfterRemoval}\n onClose={() => setConfirmationDialogOpen(false)}\n />\n <InspectEntityDialog\n open={inspectionDialogOpen}\n entity={entity!}\n onClose={() => setInspectionDialogOpen(false)}\n />\n </Page>\n );\n};\n\nEntityLayout.Route = Route;\n","/*\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 { Entity } from '@backstage/catalog-model';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { Button, Dialog, DialogActions, DialogTitle } from '@material-ui/core';\nimport React, { useState } from 'react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { assertError } from '@backstage/errors';\n\ninterface DeleteEntityDialogProps {\n open: boolean;\n onClose: () => any;\n onConfirm: () => any;\n entity: Entity;\n}\n\nexport function DeleteEntityDialog(props: DeleteEntityDialogProps) {\n const { open, onClose, onConfirm, entity } = props;\n const [busy, setBusy] = useState(false);\n const catalogApi = useApi(catalogApiRef);\n const alertApi = useApi(alertApiRef);\n\n const onDelete = async () => {\n setBusy(true);\n try {\n const uid = entity.metadata.uid;\n await catalogApi.removeEntityByUid(uid!);\n onConfirm();\n } catch (err) {\n assertError(err);\n alertApi.post({ message: err.message });\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={onClose}>\n <DialogTitle id=\"responsive-dialog-title\">\n Are you sure you want to delete this entity?\n </DialogTitle>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n disabled={busy}\n onClick={onDelete}\n >\n Delete\n </Button>\n <Button onClick={onClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n","/*\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 { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Alert } from '@material-ui/lab';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { DeleteEntityDialog } from './DeleteEntityDialog';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { rootRouteRef } from '../../routes';\n\n/**\n * Returns true if the given entity has the orphan annotation given by the\n * catalog.\n *\n * @public\n */\nexport function isOrphan(entity: Entity): boolean {\n return entity?.metadata?.annotations?.['backstage.io/orphan'] === 'true';\n}\n\n/**\n * Displays a warning alert if the entity is marked as orphan with the ability\n * to delete said entity.\n *\n * @public\n */\nexport function EntityOrphanWarning() {\n const navigate = useNavigate();\n const catalogLink = useRouteRef(rootRouteRef);\n const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);\n const { entity } = useEntity();\n\n const cleanUpAfterRemoval = async () => {\n setConfirmationDialogOpen(false);\n navigate(catalogLink());\n };\n\n return (\n <>\n <Alert severity=\"warning\" onClick={() => setConfirmationDialogOpen(true)}>\n This entity is not referenced by any location and is therefore not\n receiving updates. Click here to delete.\n </Alert>\n <DeleteEntityDialog\n open={confirmationDialogOpen}\n entity={entity!}\n onConfirm={cleanUpAfterRemoval}\n onClose={() => setConfirmationDialogOpen(false)}\n />\n </>\n );\n}\n","/*\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 { AlphaEntity, EntityStatusItem } from '@backstage/catalog-model/alpha';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n catalogApiRef,\n EntityRefLink,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport { Box } from '@material-ui/core';\nimport React from 'react';\nimport { ResponseErrorPanel } from '@backstage/core-components';\nimport {\n CatalogApi,\n ENTITY_STATUS_CATALOG_PROCESSING_TYPE,\n} from '@backstage/catalog-client';\nimport { useApi, ApiHolder } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { SerializedError } from '@backstage/errors';\n\nconst errorFilter = (i: EntityStatusItem) =>\n i.error &&\n i.level === 'error' &&\n i.type === ENTITY_STATUS_CATALOG_PROCESSING_TYPE;\n\ninterface GetOwnAndAncestorsErrorsResponse {\n items: {\n errors: SerializedError[];\n entity: Entity;\n }[];\n}\n\nasync function getOwnAndAncestorsErrors(\n entityRef: string,\n catalogApi: CatalogApi,\n): Promise<GetOwnAndAncestorsErrorsResponse> {\n const ancestors = await catalogApi.getEntityAncestors({ entityRef });\n const items = ancestors.items\n .map(item => {\n const statuses = (item.entity as AlphaEntity).status?.items ?? [];\n const errors = statuses\n .filter(errorFilter)\n .map(e => e.error)\n .filter((e): e is SerializedError => Boolean(e));\n return { errors: errors, entity: item.entity };\n })\n .filter(item => item.errors.length > 0);\n return { items };\n}\n\n/**\n * Returns true if the given entity has any processing errors on it.\n *\n * @public\n */\nexport async function hasCatalogProcessingErrors(\n entity: Entity,\n context: { apis: ApiHolder },\n) {\n const catalogApi = context.apis.get(catalogApiRef);\n if (!catalogApi) {\n throw new Error(`No implementation available for ${catalogApiRef}`);\n }\n\n const errors = await getOwnAndAncestorsErrors(\n stringifyEntityRef(entity),\n catalogApi,\n );\n return errors.items.length > 0;\n}\n\n/**\n * Displays a list of errors from the ancestors of the current entity.\n *\n * @public\n */\nexport function EntityProcessingErrorsPanel() {\n const { entity } = useEntity();\n const entityRef = stringifyEntityRef(entity);\n const catalogApi = useApi(catalogApiRef);\n const { loading, error, value } = useAsync(async () => {\n return getOwnAndAncestorsErrors(entityRef, catalogApi);\n }, [entityRef, catalogApi]);\n\n if (error) {\n return (\n <Box mb={1}>\n <ResponseErrorPanel error={error} />\n </Box>\n );\n }\n\n if (loading || !value) {\n return null;\n }\n\n return (\n <>\n {value.items.map((ancestorError, index) => (\n <Box key={index} mb={1}>\n {stringifyEntityRef(entity) !==\n stringifyEntityRef(ancestorError.entity) && (\n <Box p={1}>\n The error below originates from{' '}\n <EntityRefLink entityRef={ancestorError.entity} />\n </Box>\n )}\n {ancestorError.errors.map((e, i) => (\n <ResponseErrorPanel key={i} error={e} />\n ))}\n </Box>\n ))}\n </>\n );\n}\n","/*\n * Copyright 2020 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 { Entity } from '@backstage/catalog-model';\nimport { useAsyncEntity } from '@backstage/plugin-catalog-react';\nimport React, { ReactNode, ReactElement } from 'react';\nimport {\n attachComponentData,\n useApiHolder,\n useElementFilter,\n ApiHolder,\n} from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/lib/useAsync';\n\nconst ENTITY_SWITCH_KEY = 'core.backstage.entitySwitch';\n\n/** @public */\nexport interface EntitySwitchCaseProps {\n if?: (\n entity: Entity,\n context: { apis: ApiHolder },\n ) => boolean | Promise<boolean>;\n children: ReactNode;\n}\n\nconst EntitySwitchCaseComponent = (_props: EntitySwitchCaseProps) => null;\n\nattachComponentData(EntitySwitchCaseComponent, ENTITY_SWITCH_KEY, true);\n\ninterface EntitySwitchCase {\n if?: (\n entity: Entity,\n context: { apis: ApiHolder },\n ) => boolean | Promise<boolean>;\n children: JSX.Element;\n}\n\ntype SwitchCaseResult = {\n if?: boolean | Promise<boolean>;\n children: JSX.Element;\n};\n\n/**\n * Props for the {@link EntitySwitch} component.\n * @public\n */\nexport interface EntitySwitchProps {\n children: ReactNode;\n renderMultipleMatches?: 'first' | 'all';\n}\n\n/** @public */\nexport const EntitySwitch = (props: EntitySwitchProps) => {\n const { entity, loading } = useAsyncEntity();\n const apis = useApiHolder();\n const results = useElementFilter(\n props.children,\n collection =>\n collection\n .selectByComponentData({\n key: ENTITY_SWITCH_KEY,\n withStrictError: 'Child of EntitySwitch is not an EntitySwitch.Case',\n })\n .getElements()\n .flatMap<SwitchCaseResult>((element: ReactElement) => {\n // Nothing is rendered while loading\n if (loading) {\n return [];\n }\n\n const { if: condition, children: elementsChildren } =\n element.props as EntitySwitchCase;\n\n // If the entity is missing or there is an error, render the default page\n if (!entity) {\n return [\n {\n if: condition === undefined,\n children: elementsChildren,\n },\n ];\n }\n return [\n {\n if: condition?.(entity, { apis }),\n children: elementsChildren,\n },\n ];\n }),\n [apis, entity, loading],\n );\n\n const hasAsyncCases = results.some(\n r => typeof r.if === 'object' && 'then' in r.if,\n );\n\n if (hasAsyncCases) {\n return (\n <AsyncEntitySwitch\n results={results}\n renderMultipleMatches={props.renderMultipleMatches}\n />\n );\n }\n\n if (props.renderMultipleMatches === 'all') {\n const children = results.filter(r => r.if).map(r => r.children);\n if (children.length === 0) {\n return getDefaultChildren(results);\n }\n return <>{children}</>;\n }\n\n return results.find(r => r.if)?.children ?? getDefaultChildren(results);\n};\n\nfunction AsyncEntitySwitch({\n results,\n renderMultipleMatches,\n}: {\n results: SwitchCaseResult[];\n renderMultipleMatches?: 'first' | 'all';\n}) {\n const { loading, value } = useAsync(async () => {\n const promises = results.map(\n async ({ if: condition, children: output }) => {\n try {\n if (await condition) {\n return output;\n }\n } catch {\n /* ignored */\n }\n return null;\n },\n );\n\n if (renderMultipleMatches === 'all') {\n const children = (await Promise.all(promises)).filter(Boolean);\n if (children.length === 0) {\n return getDefaultChildren(results);\n }\n return <>{children}</>;\n }\n\n return (\n (await Promise.all(promises)).find(Boolean) ?? getDefaultChildren(results)\n );\n }, [results]);\n\n if (loading || !value) {\n return null;\n }\n\n return value;\n}\n\nfunction getDefaultChildren(results: SwitchCaseResult[]) {\n return results.filter(r => r.if === undefined)[0]?.children ?? null;\n}\n\nEntitySwitch.Case = EntitySwitchCaseComponent;\n","/*\n * Copyright 2020 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 { Entity } from '@backstage/catalog-model';\n\n/** @public */\nexport interface EntityPredicates {\n kind?: string | string[];\n type?: string | string[];\n}\n\nfunction strCmp(a: unknown, b: string | undefined): boolean {\n return Boolean(\n a &&\n typeof a === 'string' &&\n a?.toLocaleLowerCase('en-US') === b?.toLocaleLowerCase('en-US'),\n );\n}\n\nfunction strCmpAll(value: unknown, cmpValues: string | string[]) {\n return typeof cmpValues === 'string'\n ? strCmp(value, cmpValues)\n : cmpValues.length === 0 || cmpValues.some(cmpVal => strCmp(value, cmpVal));\n}\n\n/**\n * For use in EntitySwitch.Case. Matches if the entity is of a given kind.\n * @public\n */\nexport function isKind(kinds: string | string[]) {\n return isEntityWith({ kind: kinds });\n}\n\n/**\n * For use in EntitySwitch.Case. Matches if the entity is a Component of a given spec.type.\n * @public\n */\nexport function isComponentType(types: string | string[]) {\n return isEntityWith({ kind: 'component', type: types });\n}\n\n/**\n * For use in EntitySwitch.Case. Matches if the entity is a Resource of a given spec.type.\n * @public\n */\nexport function isResourceType(types: string | string[]) {\n return isEntityWith({ kind: 'resource', type: types });\n}\n\n/**\n * For use in EntitySwitch.Case. Matches if the entity is the specified kind and type (if present).\n * @public\n */\nexport function isEntityWith(predicate: EntityPredicates) {\n return (entity: Entity) => {\n if (predicate.kind && !strCmpAll(entity.kind, predicate.kind)) {\n return false;\n }\n\n if (predicate.type && !strCmpAll(entity.spec?.type, predicate.type)) {\n return false;\n }\n\n // there's no type check, return true\n return true;\n };\n}\n\n/**\n * For use in EntitySwitch.Case. Matches if the entity is in a given namespace.\n * @public\n */\nexport function isNamespace(namespaces: string | string[]) {\n return (entity: Entity) => strCmpAll(entity.metadata?.namespace, namespaces);\n}\n","/*\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 { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\n\n/**\n * @public\n * @deprecated Use `CatalogFilterLayout` from `@backstage/plugin-catalog-react` instead.\n */\nexport const FilteredEntityLayout = CatalogFilterLayout as (props: {\n children: React.ReactNode;\n}) => JSX.Element;\n\n/**\n * @public\n * @deprecated Use `CatalogFilterLayout.Filters` from `@backstage/plugin-catalog-react` instead.\n */\nexport const FilterContainer = CatalogFilterLayout.Filters;\n\n/**\n * @public\n * @deprecated Use `CatalogFilterLayout.Content` from `@backstage/plugin-catalog-react` instead.\n */\nexport const EntityListContainer = CatalogFilterLayout.Content;\n","/*\n * Copyright 2020 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 { BackstageTheme } from '@backstage/theme';\nimport { Button, makeStyles, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { CodeSnippet } from '@backstage/core-components';\n\nconst ENTITY_YAML = `metadata:\n name: example\n labels:\n javaVersion: 1.2.3`;\n\nconst useStyles = makeStyles<BackstageTheme>(\n theme => ({\n code: {\n borderRadius: 6,\n margin: `${theme.spacing(2)}px 0px`,\n background:\n theme.palette.type === 'dark' ? '#444' : theme.palette.common.white,\n },\n }),\n { name: 'PluginCatalogEntityLabelsEmptyState' },\n);\n\nexport function EntityLabelsEmptyState() {\n const classes = useStyles();\n\n return (\n <>\n <Typography variant=\"body1\">\n No labels defined for this entity. You can add labels to your entity\n YAML as shown in the highlighted example below:\n </Typography>\n <div className={classes.code}>\n <CodeSnippet\n text={ENTITY_YAML}\n language=\"yaml\"\n showLineNumbers\n highlightedNumbers={[3, 4, 5, 6]}\n customStyle={{ background: 'inherit', fontSize: '115%' }}\n />\n </div>\n <Button\n variant=\"contained\"\n color=\"primary\"\n target=\"_blank\"\n href=\"https://backstage.io/docs/features/software-catalog/descriptor-format#labels-optional\"\n >\n Read more\n </Button>\n </>\n );\n}\n","/*\n * Copyright 2022 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 { useEntity } from '@backstage/plugin-catalog-react';\nimport React from 'react';\nimport {\n InfoCard,\n InfoCardVariants,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport { EntityLabelsEmptyState } from './EntityLabelsEmptyState';\nimport { makeStyles, Typography } from '@material-ui/core';\n\n/** @public */\nexport interface EntityLabelsCardProps {\n variant?: InfoCardVariants;\n title?: string;\n}\n\nconst useStyles = makeStyles(_ => ({\n key: {\n fontWeight: 'bold',\n },\n}));\n\nexport const EntityLabelsCard = (props: EntityLabelsCardProps) => {\n const { variant, title } = props;\n const { entity } = useEntity();\n const classes = useStyles();\n\n const columns: TableColumn<{ key: string; value: string }>[] = [\n {\n render: row => {\n return (\n <Typography className={classes.key} variant=\"body2\">\n {row.key}\n </Typography>\n );\n },\n },\n {\n field: 'value',\n },\n ];\n\n const labels = entity?.metadata?.labels;\n\n return (\n <InfoCard title={title || 'Labels'} variant={variant}>\n {!labels || Object.keys(labels).length === 0 ? (\n <EntityLabelsEmptyState />\n ) : (\n <Table\n columns={columns}\n data={Object.keys(labels).map(labelKey => ({\n key: labelKey,\n value: labels[labelKey],\n }))}\n options={{\n search: false,\n showTitle: true,\n loadingType: 'linear',\n header: false,\n padding: 'dense',\n pageSize: 5,\n toolbar: false,\n paging: Object.keys(labels).length > 5,\n }}\n />\n )}\n </InfoCard>\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 { Entity } from '@backstage/catalog-model';\n\n/**\n * Returns true if the given entity has labels annotation given by the\n * catalog. For use by EntitySwitch\n *\n * @public\n */\nexport function hasLabels(entity: Entity) {\n return entity?.metadata?.labels\n ? Object.keys(entity?.metadata?.labels).some(Boolean)\n : false;\n}\n","/*\n * Copyright 2020 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 { CatalogClient } from '@backstage/catalog-client';\nimport { Entity } from '@backstage/catalog-model';\nimport {\n catalogApiRef,\n entityRouteRef,\n starredEntitiesApiRef,\n} from '@backstage/plugin-catalog-react';\nimport { createComponentRouteRef, viewTechDocRouteRef } from './routes';\nimport {\n createApiFactory,\n createComponentExtension,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n storageApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n createSearchResultListItemExtension,\n SearchResultListItemExtensionProps,\n} from '@backstage/plugin-search-react';\nimport { DefaultStarredEntitiesApi } from './apis';\nimport { AboutCardProps } from './components/AboutCard';\nimport { DefaultCatalogPageProps } from './components/CatalogPage';\nimport { DependencyOfComponentsCardProps } from './components/DependencyOfComponentsCard';\nimport { DependsOnComponentsCardProps } from './components/DependsOnComponentsCard';\nimport { DependsOnResourcesCardProps } from './components/DependsOnResourcesCard';\nimport { HasComponentsCardProps } from './components/HasComponentsCard';\nimport { HasResourcesCardProps } from './components/HasResourcesCard';\nimport { HasSubcomponentsCardProps } from './components/HasSubcomponentsCard';\nimport { HasSystemsCardProps } from './components/HasSystemsCard';\nimport { RelatedEntitiesCardProps } from './components/RelatedEntitiesCard';\nimport { CatalogSearchResultListItemProps } from './components/CatalogSearchResultListItem';\nimport { rootRouteRef } from './routes';\nimport { CatalogInputPluginOptions, CatalogPluginOptions } from './options';\n\n/** @public */\nexport const catalogPlugin = createPlugin({\n id: 'catalog',\n apis: [\n createApiFactory({\n api: catalogApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ discoveryApi, fetchApi }) =>\n new CatalogClient({ discoveryApi, fetchApi }),\n }),\n createApiFactory({\n api: starredEntitiesApiRef,\n deps: { storageApi: storageApiRef },\n factory: ({ storageApi }) =>\n new DefaultStarredEntitiesApi({ storageApi }),\n }),\n ],\n routes: {\n catalogIndex: rootRouteRef,\n catalogEntity: entityRouteRef,\n },\n externalRoutes: {\n createComponent: createComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n },\n __experimentalConfigure(\n options?: CatalogInputPluginOptions,\n ): CatalogPluginOptions {\n const defaultOptions = {\n createButtonTitle: 'Create',\n };\n return { ...defaultOptions, ...options };\n },\n});\n\n/** @public */\nexport const CatalogIndexPage: (props: DefaultCatalogPageProps) => JSX.Element =\n catalogPlugin.provide(\n createRoutableExtension({\n name: 'CatalogIndexPage',\n component: () =>\n import('./components/CatalogPage').then(m => m.CatalogPage),\n mountPoint: rootRouteRef,\n }),\n );\n\n/** @public */\nexport const CatalogEntityPage: () => JSX.Element = catalogPlugin.provide(\n createRoutableExtension({\n name: 'CatalogEntityPage',\n component: () =>\n import('./components/CatalogEntityPage').then(m => m.CatalogEntityPage),\n mountPoint: entityRouteRef,\n }),\n);\n\n/** @public */\nexport const EntityAboutCard: (props: AboutCardProps) => JSX.Element =\n catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityAboutCard',\n component: {\n lazy: () => import('./components/AboutCard').then(m => m.AboutCard),\n },\n }),\n );\n\n/** @public */\nexport const EntityLinksCard = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityLinksCard',\n component: {\n lazy: () =>\n import('./components/EntityLinksCard').then(m => m.EntityLinksCard),\n },\n }),\n);\n\n/** @public */\nexport const EntityLabelsCard = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityLabelsCard',\n component: {\n lazy: () =>\n import('./components/EntityLabelsCard').then(m => m.EntityLabelsCard),\n },\n }),\n);\n\n/** @public */\nexport const EntityHasSystemsCard: (props: HasSystemsCardProps) => JSX.Element =\n catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityHasSystemsCard',\n component: {\n lazy: () =>\n import('./components/HasSystemsCard').then(m => m.HasSystemsCard),\n },\n }),\n );\n\n/** @public */\nexport const EntityHasComponentsCard: (\n props: HasComponentsCardProps,\n) => JSX.Element = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityHasComponentsCard',\n component: {\n lazy: () =>\n import('./components/HasComponentsCard').then(m => m.HasComponentsCard),\n },\n }),\n);\n\n/** @public */\nexport const EntityHasSubcomponentsCard: (\n props: HasSubcomponentsCardProps,\n) => JSX.Element = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityHasSubcomponentsCard',\n component: {\n lazy: () =>\n import('./components/HasSubcomponentsCard').then(\n m => m.HasSubcomponentsCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const EntityHasResourcesCard: (\n props: HasResourcesCardProps,\n) => JSX.Element = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityHasResourcesCard',\n component: {\n lazy: () =>\n import('./components/HasResourcesCard').then(m => m.HasResourcesCard),\n },\n }),\n);\n\n/** @public */\nexport const EntityDependsOnComponentsCard: (\n props: DependsOnComponentsCardProps,\n) => JSX.Element = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityDependsOnComponentsCard',\n component: {\n lazy: () =>\n import('./components/DependsOnComponentsCard').then(\n m => m.DependsOnComponentsCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const EntityDependencyOfComponentsCard: (\n props: DependencyOfComponentsCardProps,\n) => JSX.Element = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityDependencyOfComponentsCard',\n component: {\n lazy: () =>\n import('./components/DependencyOfComponentsCard').then(\n m => m.DependencyOfComponentsCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const EntityDependsOnResourcesCard: (\n props: DependsOnResourcesCardProps,\n) => JSX.Element = catalogPlugin.provide(\n createComponentExtension({\n name: 'EntityDependsOnResourcesCard',\n component: {\n lazy: () =>\n import('./components/DependsOnResourcesCard').then(\n m => m.DependsOnResourcesCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const RelatedEntitiesCard: <T extends Entity>(\n props: RelatedEntitiesCardProps<T>,\n) => JSX.Element = catalogPlugin.provide(\n createComponentExtension({\n name: 'RelatedEntitiesCard',\n component: {\n lazy: () =>\n import('./components/RelatedEntitiesCard').then(\n m => m.RelatedEntitiesCard,\n ),\n },\n }),\n);\n\n/** @public */\nexport const CatalogSearchResultListItem: (\n props: SearchResultListItemExtensionProps<CatalogSearchResultListItemProps>,\n) => JSX.Element | null = catalogPlugin.provide(\n createSearchResultListItemExtension({\n name: 'CatalogSearchResultListItem',\n component: () =>\n import('./components/CatalogSearchResultListItem').then(\n m => m.CatalogSearchResultListItem,\n ),\n predicate: result => result.type === 'software-catalog',\n }),\n);\n"],"names":["_a","useStyles","getEntitySourceLocation","_b","Edit","makeStyles","EntityLabelsCard"],"mappings":"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"}
@@ -3,14 +3,12 @@ import LanguageIcon from '@material-ui/icons/Language';
3
3
  import React from 'react';
4
4
  import { makeStyles, Typography, Button } from '@material-ui/core';
5
5
  import { CodeSnippet, InfoCard } from '@backstage/core-components';
6
- import { L as LinksGridList } from './index-72280907.esm.js';
6
+ import { L as LinksGridList } from './index-06f6e8ce.esm.js';
7
7
  import { useApp } from '@backstage/core-plugin-api';
8
8
  import 'zen-observable';
9
9
  import '@backstage/catalog-model';
10
10
  import 'lodash';
11
11
  import '@backstage/integration-react';
12
- import '@backstage/plugin-scaffolder-common';
13
- import '@material-ui/icons/AddCircleOutline';
14
12
  import '@material-ui/icons/Cached';
15
13
  import '@material-ui/icons/Description';
16
14
  import '@material-ui/icons/Edit';
@@ -95,4 +93,4 @@ const EntityLinksCard = (props) => {
95
93
  };
96
94
 
97
95
  export { EntityLinksCard };
98
- //# sourceMappingURL=index-2dfcbc93.esm.js.map
96
+ //# sourceMappingURL=index-1c47c3d8.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-2dfcbc93.esm.js","sources":["../../src/components/EntityLinksCard/EntityLinksEmptyState.tsx","../../src/components/EntityLinksCard/EntityLinksCard.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 { BackstageTheme } from '@backstage/theme';\nimport { Button, makeStyles, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { CodeSnippet } from '@backstage/core-components';\n\nconst ENTITY_YAML = `metadata:\n name: example\n links:\n - url: https://dashboard.example.com\n title: My Dashboard\n icon: dashboard`;\n\n/** @public */\nexport type EntityLinksEmptyStateClassKey = 'code';\n\nconst useStyles = makeStyles<BackstageTheme>(\n theme => ({\n code: {\n borderRadius: 6,\n margin: `${theme.spacing(2)}px 0px`,\n background:\n theme.palette.type === 'dark' ? '#444' : theme.palette.common.white,\n },\n }),\n { name: 'PluginCatalogEntityLinksEmptyState' },\n);\n\nexport function EntityLinksEmptyState() {\n const classes = useStyles();\n\n return (\n <>\n <Typography variant=\"body1\">\n No links defined for this entity. You can add links to your entity YAML\n as shown in the highlighted example below:\n </Typography>\n <div className={classes.code}>\n <CodeSnippet\n text={ENTITY_YAML}\n language=\"yaml\"\n showLineNumbers\n highlightedNumbers={[3, 4, 5, 6]}\n customStyle={{ background: 'inherit', fontSize: '115%' }}\n />\n </div>\n <Button\n variant=\"contained\"\n color=\"primary\"\n target=\"_blank\"\n href=\"https://backstage.io/docs/features/software-catalog/descriptor-format#links-optional\"\n >\n Read more\n </Button>\n </>\n );\n}\n","/*\n * Copyright 2020 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 { useEntity } from '@backstage/plugin-catalog-react';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport { EntityLinksEmptyState } from './EntityLinksEmptyState';\nimport { LinksGridList } from './LinksGridList';\nimport { ColumnBreakpoints } from './types';\nimport { IconComponent, useApp } from '@backstage/core-plugin-api';\nimport { InfoCard, InfoCardVariants } from '@backstage/core-components';\n\n/** @public */\nexport interface EntityLinksCardProps {\n cols?: ColumnBreakpoints | number;\n variant?: InfoCardVariants;\n}\n\nexport const EntityLinksCard = (props: EntityLinksCardProps) => {\n const { cols = undefined, variant } = props;\n const { entity } = useEntity();\n const app = useApp();\n\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n const links = entity?.metadata?.links;\n\n return (\n <InfoCard title=\"Links\" variant={variant}>\n {!links || links.length === 0 ? (\n <EntityLinksEmptyState />\n ) : (\n <LinksGridList\n cols={cols}\n items={links.map(({ url, title, icon }) => ({\n text: title ?? url,\n href: url,\n Icon: iconResolver(icon),\n }))}\n />\n )}\n </InfoCard>\n );\n};\n"],"names":["_a"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,MAAM,WAAc,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAA,CAAA,CAAA;AAUpB,MAAM,SAAY,GAAA,UAAA;AAAA,EAChB,CAAU,KAAA,MAAA;AAAA,IACR,IAAM,EAAA;AAAA,MACJ,YAAc,EAAA,CAAA;AAAA,MACd,MAAQ,EAAA,CAAA,EAAG,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAA,MAAA,CAAA;AAAA,MAC1B,UAAA,EACE,MAAM,OAAQ,CAAA,IAAA,KAAS,SAAS,MAAS,GAAA,KAAA,CAAM,QAAQ,MAAO,CAAA,KAAA;AAAA,KAClE;AAAA,GACF,CAAA;AAAA,EACA,EAAE,MAAM,oCAAqC,EAAA;AAC/C,CAAA,CAAA;AAEO,SAAS,qBAAwB,GAAA;AACtC,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAE1B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAQ,oHAG5B,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,IACtB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,IAAM,EAAA,WAAA;AAAA,MACN,QAAS,EAAA,MAAA;AAAA,MACT,eAAe,EAAA,IAAA;AAAA,MACf,kBAAoB,EAAA,CAAC,CAAG,EAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MAC/B,WAAa,EAAA,EAAE,UAAY,EAAA,SAAA,EAAW,UAAU,MAAO,EAAA;AAAA,KAAA;AAAA,GAE3D,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,KAAM,EAAA,SAAA;AAAA,MACN,MAAO,EAAA,QAAA;AAAA,MACP,IAAK,EAAA,sFAAA;AAAA,KAAA;AAAA,IACN,WAAA;AAAA,GAGH,CAAA,CAAA;AAEJ;;ACxCa,MAAA,eAAA,GAAkB,CAAC,KAAgC,KAAA;AA/BhE,EAAA,IAAA,EAAA,CAAA;AAgCE,EAAA,MAAM,EAAE,IAAA,GAAO,KAAW,CAAA,EAAA,OAAA,EAAY,GAAA,KAAA,CAAA;AACtC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA,CAAA;AAC7B,EAAA,MAAM,MAAM,MAAO,EAAA,CAAA;AAEnB,EAAM,MAAA,YAAA,GAAe,CAAC,GAA6B,KAAA;AApCrD,IAAAA,IAAAA,GAAAA,CAAAA;AAqCI,IAAA,OAAA,GAAA,GAAA,CAAMA,MAAA,GAAI,CAAA,aAAA,CAAc,GAAG,CAArB,KAAA,IAAA,GAAAA,MAA0B,YAAe,GAAA,YAAA,CAAA;AAAA,GAAA,CAAA;AAEjD,EAAM,MAAA,KAAA,GAAA,CAAQ,EAAQ,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,QAAA,KAAR,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,CAAA;AAEhC,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,KAAM,EAAA,OAAA,EAAQ,OACrB,EAAA,EAAA,CAAC,KAAS,IAAA,KAAA,CAAM,MAAW,KAAA,CAAA,mBACzB,KAAA,CAAA,aAAA,CAAA,qBAAA,EAAA,IAAsB,CAEvB,mBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,KAAA,EAAO,MAAM,GAAI,CAAA,CAAC,EAAE,GAAK,EAAA,KAAA,EAAO,MAAY,MAAA;AAAA,QAC1C,MAAM,KAAS,IAAA,IAAA,GAAA,KAAA,GAAA,GAAA;AAAA,QACf,IAAM,EAAA,GAAA;AAAA,QACN,IAAA,EAAM,aAAa,IAAI,CAAA;AAAA,OACvB,CAAA,CAAA;AAAA,KAAA;AAAA,GAGR,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"index-1c47c3d8.esm.js","sources":["../../src/components/EntityLinksCard/EntityLinksEmptyState.tsx","../../src/components/EntityLinksCard/EntityLinksCard.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 { BackstageTheme } from '@backstage/theme';\nimport { Button, makeStyles, Typography } from '@material-ui/core';\nimport React from 'react';\nimport { CodeSnippet } from '@backstage/core-components';\n\nconst ENTITY_YAML = `metadata:\n name: example\n links:\n - url: https://dashboard.example.com\n title: My Dashboard\n icon: dashboard`;\n\n/** @public */\nexport type EntityLinksEmptyStateClassKey = 'code';\n\nconst useStyles = makeStyles<BackstageTheme>(\n theme => ({\n code: {\n borderRadius: 6,\n margin: `${theme.spacing(2)}px 0px`,\n background:\n theme.palette.type === 'dark' ? '#444' : theme.palette.common.white,\n },\n }),\n { name: 'PluginCatalogEntityLinksEmptyState' },\n);\n\nexport function EntityLinksEmptyState() {\n const classes = useStyles();\n\n return (\n <>\n <Typography variant=\"body1\">\n No links defined for this entity. You can add links to your entity YAML\n as shown in the highlighted example below:\n </Typography>\n <div className={classes.code}>\n <CodeSnippet\n text={ENTITY_YAML}\n language=\"yaml\"\n showLineNumbers\n highlightedNumbers={[3, 4, 5, 6]}\n customStyle={{ background: 'inherit', fontSize: '115%' }}\n />\n </div>\n <Button\n variant=\"contained\"\n color=\"primary\"\n target=\"_blank\"\n href=\"https://backstage.io/docs/features/software-catalog/descriptor-format#links-optional\"\n >\n Read more\n </Button>\n </>\n );\n}\n","/*\n * Copyright 2020 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 { useEntity } from '@backstage/plugin-catalog-react';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport { EntityLinksEmptyState } from './EntityLinksEmptyState';\nimport { LinksGridList } from './LinksGridList';\nimport { ColumnBreakpoints } from './types';\nimport { IconComponent, useApp } from '@backstage/core-plugin-api';\nimport { InfoCard, InfoCardVariants } from '@backstage/core-components';\n\n/** @public */\nexport interface EntityLinksCardProps {\n cols?: ColumnBreakpoints | number;\n variant?: InfoCardVariants;\n}\n\nexport const EntityLinksCard = (props: EntityLinksCardProps) => {\n const { cols = undefined, variant } = props;\n const { entity } = useEntity();\n const app = useApp();\n\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n const links = entity?.metadata?.links;\n\n return (\n <InfoCard title=\"Links\" variant={variant}>\n {!links || links.length === 0 ? (\n <EntityLinksEmptyState />\n ) : (\n <LinksGridList\n cols={cols}\n items={links.map(({ url, title, icon }) => ({\n text: title ?? url,\n href: url,\n Icon: iconResolver(icon),\n }))}\n />\n )}\n </InfoCard>\n );\n};\n"],"names":["_a"],"mappings":"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"}