@backstage/plugin-catalog 1.28.0-next.2 → 1.29.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,148 @@
1
1
  # @backstage/plugin-catalog
2
2
 
3
+ ## 1.29.0-next.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 9454ef9: Added support of filtering based on system columns in catalog table
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @backstage/plugin-catalog-react@1.16.1-next.0
13
+ - @backstage/core-compat-api@0.4.1-next.0
14
+ - @backstage/catalog-client@1.9.1
15
+ - @backstage/catalog-model@1.7.3
16
+ - @backstage/core-components@0.17.0
17
+ - @backstage/core-plugin-api@1.10.5
18
+ - @backstage/errors@1.2.7
19
+ - @backstage/frontend-plugin-api@0.10.0
20
+ - @backstage/integration-react@1.2.5
21
+ - @backstage/types@1.2.1
22
+ - @backstage/plugin-catalog-common@1.1.3
23
+ - @backstage/plugin-permission-react@0.4.32
24
+ - @backstage/plugin-scaffolder-common@1.5.10
25
+ - @backstage/plugin-search-common@1.2.17
26
+ - @backstage/plugin-search-react@1.8.7
27
+
28
+ ## 1.28.0
29
+
30
+ ### Minor Changes
31
+
32
+ - 247a40b: Now a custom entity page header can be passed as input to the default entity page.
33
+ - a3d93ca: The default layout of the entity page can now optionally be customized with 3 card types: info, peek and full.
34
+
35
+ - Cards of type `info` are rendered in a fixed area on the right;
36
+ - Cards of type `peek` are rendered on top of the main content area;
37
+ - Cards of type `full` and cards with undefined type are rendered as they were before, in the main content area, below the peek cards.
38
+
39
+ If you want to keep the layout as it was before, you don't need to do anything. But if you want to experiment with the card types and see how they render, here is an example setting the about card to be rendered as an `info` card:
40
+
41
+ ```diff
42
+ app:
43
+ extensions:
44
+ # Entity page cards
45
+ + - entity-card:catalog/about:
46
+ + config:
47
+ + type: info # or peek or full
48
+ ```
49
+
50
+ - 93533bd: The order in which group tabs appear on the entity page has been changed.
51
+
52
+ ### Before
53
+
54
+ Previously, entity contents determined the order in which groups were rendered, so a group was rendered as soon as its first entity content was detected.
55
+
56
+ ### After
57
+
58
+ Groups are now rendered first by default based on their order in the `app-config.yaml` file:
59
+
60
+ ```diff
61
+ app:
62
+ extensions:
63
+ - page:catalog/entity:
64
+ + config:
65
+ + groups:
66
+ + # this will be the first tab of the default entity page
67
+ + - deployment:
68
+ + title: Deployment
69
+ + # this will be the second tab of the default entiy page
70
+ + - documentation:
71
+ + title: Documentation
72
+ ```
73
+
74
+ If you wish to place a normal tab before a group, you must add the tab to a group and place the group in the order you wish it to appear on the entity page (groups that contains only one tab are rendered as normal tabs).
75
+
76
+ ```diff
77
+ app:
78
+ extensions:
79
+ - page:catalog/entity:
80
+ config:
81
+ groups:
82
+ + # Example placing the overview tab first
83
+ + - overview:
84
+ + title: Overview
85
+ - deployment:
86
+ title: Deployment
87
+ # this will be the second tab of the default entiy page
88
+ - documentation:
89
+ title: Documentation
90
+ - entity-content:catalog/overview:
91
+ + config:
92
+ + group: 'overview'
93
+ ```
94
+
95
+ - 06d1226: Allow providing `kind` parameters to replace the default `Component` kind for `SubComponents` card
96
+
97
+ ### Patch Changes
98
+
99
+ - 31731b0: Internal refactor to avoid `expiry-map` dependency.
100
+ - ba9649a: Update the default entity page extension component to support grouping multiple entity content items in the same tab.
101
+
102
+ Disable all default groups:
103
+
104
+ ```diff
105
+ # app-config.yaml
106
+ app:
107
+ extensions:
108
+ # Pages
109
+ + - page:catalog/entity:
110
+ + config:
111
+ + groups: []
112
+ ```
113
+
114
+ Create a custom list of :
115
+
116
+ ```diff
117
+ # app-config.yaml
118
+ app:
119
+ extensions:
120
+ # Pages
121
+ + - page:catalog/entity:
122
+ + config:
123
+ + groups:
124
+ + # This array of groups completely replaces the default groups
125
+ + - custom:
126
+ + title: 'Custom'
127
+ ```
128
+
129
+ - Updated dependencies
130
+ - @backstage/core-components@0.17.0
131
+ - @backstage/core-plugin-api@1.10.5
132
+ - @backstage/plugin-search-react@1.8.7
133
+ - @backstage/frontend-plugin-api@0.10.0
134
+ - @backstage/plugin-catalog-react@1.16.0
135
+ - @backstage/core-compat-api@0.4.0
136
+ - @backstage/plugin-scaffolder-common@1.5.10
137
+ - @backstage/integration-react@1.2.5
138
+ - @backstage/plugin-permission-react@0.4.32
139
+ - @backstage/catalog-client@1.9.1
140
+ - @backstage/catalog-model@1.7.3
141
+ - @backstage/errors@1.2.7
142
+ - @backstage/types@1.2.1
143
+ - @backstage/plugin-catalog-common@1.1.3
144
+ - @backstage/plugin-search-common@1.2.17
145
+
3
146
  ## 1.28.0-next.2
4
147
 
5
148
  ### Minor Changes
@@ -30,6 +30,16 @@ const columnFactories = Object.freeze({
30
30
  return {
31
31
  title: "System",
32
32
  field: "resolved.partOfSystemRelationTitle",
33
+ customFilterAndSearch: (query, row) => {
34
+ if (!row.resolved.partOfSystemRelations) {
35
+ return false;
36
+ }
37
+ const systemNames = row.resolved.partOfSystemRelations.map(
38
+ (ref) => ref.name
39
+ );
40
+ const searchText = systemNames.join(", ").toLocaleUpperCase("en-US");
41
+ return searchText.includes(query.toLocaleUpperCase("en-US"));
42
+ },
33
43
  render: ({ resolved }) => /* @__PURE__ */ React.createElement(
34
44
  EntityRefLinks,
35
45
  {
@@ -1 +1 @@
1
- {"version":3,"file":"columns.esm.js","sources":["../../../src/components/CatalogTable/columns.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport {\n humanizeEntityRef,\n EntityRefLink,\n EntityRefLinks,\n} from '@backstage/plugin-catalog-react';\nimport Chip from '@material-ui/core/Chip';\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.entityRef',\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 />\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 customFilterAndSearch: (query, row) => {\n let targets: JsonArray = [];\n if (\n row.entity?.spec?.targets &&\n Array.isArray(row.entity?.spec?.targets)\n ) {\n targets = row.entity?.spec?.targets;\n } else if (row.entity?.spec?.target) {\n targets = [row.entity?.spec?.target];\n }\n return targets\n .join(', ')\n .toLocaleUpperCase('en-US')\n .includes(query.toLocaleUpperCase('en-US'));\n },\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(\n options: {\n hidden: boolean;\n } = { hidden: false },\n ): TableColumn<CatalogTableRow> {\n return {\n title: 'Type',\n field: 'entity.spec.type',\n hidden: options.hidden,\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 function formatContent(keyLabel: string, entity: Entity): string {\n const labels: Record<string, string> | undefined =\n entity.metadata?.labels;\n return (labels && labels[keyLabel]) || '';\n }\n\n return {\n title: options?.title || 'Label',\n field: 'entity.metadata.labels',\n cellStyle: {\n padding: '0px 16px 0px 20px',\n },\n customSort({ entity: entity1 }, { entity: entity2 }) {\n return formatContent(key, entity1).localeCompare(\n formatContent(key, entity2),\n );\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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"columns.esm.js","sources":["../../../src/components/CatalogTable/columns.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport {\n humanizeEntityRef,\n EntityRefLink,\n EntityRefLinks,\n} from '@backstage/plugin-catalog-react';\nimport Chip from '@material-ui/core/Chip';\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.entityRef',\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 />\n ),\n };\n },\n createSystemColumn(): TableColumn<CatalogTableRow> {\n return {\n title: 'System',\n field: 'resolved.partOfSystemRelationTitle',\n customFilterAndSearch: (query, row) => {\n if (!row.resolved.partOfSystemRelations) {\n return false;\n }\n\n const systemNames = row.resolved.partOfSystemRelations.map(\n ref => ref.name,\n ); // Extract system names from entityRefs\n\n const searchText = systemNames.join(', ').toLocaleUpperCase('en-US');\n return searchText.includes(query.toLocaleUpperCase('en-US'));\n },\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 customFilterAndSearch: (query, row) => {\n let targets: JsonArray = [];\n if (\n row.entity?.spec?.targets &&\n Array.isArray(row.entity?.spec?.targets)\n ) {\n targets = row.entity?.spec?.targets;\n } else if (row.entity?.spec?.target) {\n targets = [row.entity?.spec?.target];\n }\n return targets\n .join(', ')\n .toLocaleUpperCase('en-US')\n .includes(query.toLocaleUpperCase('en-US'));\n },\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(\n options: {\n hidden: boolean;\n } = { hidden: false },\n ): TableColumn<CatalogTableRow> {\n return {\n title: 'Type',\n field: 'entity.spec.type',\n hidden: options.hidden,\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 function formatContent(keyLabel: string, entity: Entity): string {\n const labels: Record<string, string> | undefined =\n entity.metadata?.labels;\n return (labels && labels[keyLabel]) || '';\n }\n\n return {\n title: options?.title || 'Label',\n field: 'entity.metadata.labels',\n cellStyle: {\n padding: '0px 16px 0px 20px',\n },\n customSort({ entity: entity1 }, { entity: entity2 }) {\n return formatContent(key, entity1).localeCompare(\n formatContent(key, entity2),\n );\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"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog",
3
- "version": "1.28.0-next.2",
3
+ "version": "1.29.0-next.0",
4
4
  "description": "The Backstage plugin for browsing the Backstage catalog",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -72,18 +72,18 @@
72
72
  "dependencies": {
73
73
  "@backstage/catalog-client": "1.9.1",
74
74
  "@backstage/catalog-model": "1.7.3",
75
- "@backstage/core-compat-api": "0.4.0-next.2",
76
- "@backstage/core-components": "0.16.5-next.1",
77
- "@backstage/core-plugin-api": "1.10.4",
75
+ "@backstage/core-compat-api": "0.4.1-next.0",
76
+ "@backstage/core-components": "0.17.0",
77
+ "@backstage/core-plugin-api": "1.10.5",
78
78
  "@backstage/errors": "1.2.7",
79
- "@backstage/frontend-plugin-api": "0.10.0-next.2",
80
- "@backstage/integration-react": "1.2.5-next.0",
79
+ "@backstage/frontend-plugin-api": "0.10.0",
80
+ "@backstage/integration-react": "1.2.5",
81
81
  "@backstage/plugin-catalog-common": "1.1.3",
82
- "@backstage/plugin-catalog-react": "1.16.0-next.2",
83
- "@backstage/plugin-permission-react": "0.4.31",
84
- "@backstage/plugin-scaffolder-common": "1.5.10-next.0",
82
+ "@backstage/plugin-catalog-react": "1.16.1-next.0",
83
+ "@backstage/plugin-permission-react": "0.4.32",
84
+ "@backstage/plugin-scaffolder-common": "1.5.10",
85
85
  "@backstage/plugin-search-common": "1.2.17",
86
- "@backstage/plugin-search-react": "1.8.7-next.2",
86
+ "@backstage/plugin-search-react": "1.8.7",
87
87
  "@backstage/types": "1.2.1",
88
88
  "@material-ui/core": "^4.12.2",
89
89
  "@material-ui/icons": "^4.9.1",
@@ -99,12 +99,12 @@
99
99
  "zen-observable": "^0.10.0"
100
100
  },
101
101
  "devDependencies": {
102
- "@backstage/cli": "0.31.0-next.1",
103
- "@backstage/core-app-api": "1.16.0-next.0",
104
- "@backstage/dev-utils": "1.1.8-next.2",
105
- "@backstage/frontend-test-utils": "0.3.0-next.2",
102
+ "@backstage/cli": "0.32.0-next.0",
103
+ "@backstage/core-app-api": "1.16.0",
104
+ "@backstage/dev-utils": "1.1.9-next.0",
105
+ "@backstage/frontend-test-utils": "0.3.0",
106
106
  "@backstage/plugin-permission-common": "0.8.4",
107
- "@backstage/test-utils": "1.7.6-next.0",
107
+ "@backstage/test-utils": "1.7.6",
108
108
  "@testing-library/dom": "^10.0.0",
109
109
  "@testing-library/jest-dom": "^6.0.0",
110
110
  "@testing-library/react": "^16.0.0",