@backstage/plugin-scaffolder 1.11.0 → 1.12.0-next.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.
Files changed (31) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/alpha/package.json +4 -3
  3. package/dist/alpha.d.ts +73 -0
  4. package/dist/alpha.esm.js +93 -0
  5. package/dist/alpha.esm.js.map +1 -0
  6. package/dist/esm/alpha/ListTasksPage-b4ddb3e0.esm.js +192 -0
  7. package/dist/esm/alpha/ListTasksPage-b4ddb3e0.esm.js.map +1 -0
  8. package/dist/esm/alpha/Router-bd7f516b.esm.js +1558 -0
  9. package/dist/esm/alpha/Router-bd7f516b.esm.js.map +1 -0
  10. package/dist/esm/alpha/alpha-70a55083.esm.js +3405 -0
  11. package/dist/esm/alpha/alpha-70a55083.esm.js.map +1 -0
  12. package/dist/esm/alpha/index-b9f4d04a.esm.js +449 -0
  13. package/dist/esm/alpha/index-b9f4d04a.esm.js.map +1 -0
  14. package/dist/esm/{ListTasksPage-a0fe74a9.esm.js → index/ListTasksPage-b27c1155.esm.js} +2 -2
  15. package/dist/esm/index/ListTasksPage-b27c1155.esm.js.map +1 -0
  16. package/dist/esm/{Router-fae7a62f.esm.js → index/Router-a603d217.esm.js} +23 -27
  17. package/dist/esm/index/Router-a603d217.esm.js.map +1 -0
  18. package/dist/esm/{index-83c9fe8a.esm.js → index/index-a8d1949d.esm.js} +22 -18
  19. package/dist/esm/index/index-a8d1949d.esm.js.map +1 -0
  20. package/dist/esm/{index-5b3a75fa.esm.js → index/index-c5011019.esm.js} +36 -294
  21. package/dist/esm/index/index-c5011019.esm.js.map +1 -0
  22. package/dist/index.d.ts +292 -392
  23. package/dist/index.esm.js +30 -34
  24. package/dist/index.esm.js.map +1 -1
  25. package/package.json +40 -30
  26. package/dist/esm/ListTasksPage-a0fe74a9.esm.js.map +0 -1
  27. package/dist/esm/Router-fae7a62f.esm.js.map +0 -1
  28. package/dist/esm/index-5b3a75fa.esm.js.map +0 -1
  29. package/dist/esm/index-83c9fe8a.esm.js.map +0 -1
  30. package/dist/index.alpha.d.ts +0 -642
  31. package/dist/index.beta.d.ts +0 -598
package/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # @backstage/plugin-scaffolder
2
2
 
3
+ ## 1.12.0-next.1
4
+
5
+ ### Minor Changes
6
+
7
+ - 8f4d13f21cf: Move `useTaskStream`, `TaskBorder`, `TaskLogStream` and `TaskSteps` into `scaffolder-react`.
8
+
9
+ ### Patch Changes
10
+
11
+ - be3cddaab5f: Getting credentials in the RepoUrlPicker now also works for targets without owner (e.g. Bitbucket Server).
12
+ - cb8ec97cdeb: Change black & white colors to be theme aware
13
+ - eb877bad736: Create an "Other Templates" group when groups are given to scaffolder/next.
14
+ - c10384a9235: Switch to using `LinkButton` instead of the deprecated `Button`
15
+ - 52b0022dab7: Updated dependency `msw` to `^1.0.0`.
16
+ - Updated dependencies
17
+ - @backstage/plugin-scaffolder-react@1.2.0-next.1
18
+ - @backstage/core-components@0.12.5-next.1
19
+ - @backstage/errors@1.1.5-next.0
20
+ - @backstage/catalog-client@1.4.0-next.1
21
+ - @backstage/core-plugin-api@1.4.1-next.1
22
+ - @backstage/integration-react@1.1.11-next.1
23
+ - @backstage/integration@1.4.3-next.0
24
+ - @backstage/config@1.0.7-next.0
25
+ - @backstage/theme@0.2.18-next.0
26
+ - @backstage/plugin-catalog-react@1.4.0-next.1
27
+ - @backstage/catalog-model@1.2.1-next.1
28
+ - @backstage/types@1.0.2
29
+ - @backstage/plugin-catalog-common@1.0.12-next.1
30
+ - @backstage/plugin-permission-react@0.4.11-next.1
31
+ - @backstage/plugin-scaffolder-common@1.2.6-next.1
32
+
33
+ ## 1.11.1-next.0
34
+
35
+ ### Patch Changes
36
+
37
+ - 928a12a9b3: Internal refactor of `/alpha` exports.
38
+ - Updated dependencies
39
+ - @backstage/catalog-client@1.4.0-next.0
40
+ - @backstage/plugin-scaffolder-react@1.1.1-next.0
41
+ - @backstage/plugin-catalog-react@1.4.0-next.0
42
+ - @backstage/core-plugin-api@1.4.1-next.0
43
+ - @backstage/catalog-model@1.2.1-next.0
44
+ - @backstage/plugin-catalog-common@1.0.12-next.0
45
+ - @backstage/config@1.0.6
46
+ - @backstage/core-components@0.12.5-next.0
47
+ - @backstage/errors@1.1.4
48
+ - @backstage/integration@1.4.2
49
+ - @backstage/integration-react@1.1.11-next.0
50
+ - @backstage/theme@0.2.17
51
+ - @backstage/types@1.0.2
52
+ - @backstage/plugin-permission-react@0.4.11-next.0
53
+ - @backstage/plugin-scaffolder-common@1.2.6-next.0
54
+
3
55
  ## 1.11.0
4
56
 
5
57
  ### Minor Changes
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder",
3
- "version": "1.11.0",
4
- "main": "../dist/index.esm.js",
5
- "types": "../dist/index.alpha.d.ts"
3
+ "version": "1.12.0-next.1",
4
+ "main": "../dist/alpha.esm.js",
5
+ "module": "../dist/alpha.esm.js",
6
+ "types": "../dist/alpha.d.ts"
6
7
  }
@@ -0,0 +1,73 @@
1
+ /// <reference types="react" />
2
+ import * as React from 'react';
3
+ import React__default from 'react';
4
+ import { FormProps as FormProps$1 } from '@backstage/plugin-scaffolder-react/alpha';
5
+ import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react';
6
+ import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';
7
+ import { Entity } from '@backstage/catalog-model';
8
+ import { FormProps as FormProps$2 } from '@rjsf/core-v5';
9
+ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
10
+
11
+ /**
12
+ * @alpha
13
+ */
14
+ declare type TemplateGroupFilter = {
15
+ title?: React__default.ReactNode;
16
+ filter: (entity: Entity) => boolean;
17
+ };
18
+
19
+ /**
20
+ * The Props for the Scaffolder Router
21
+ *
22
+ * @alpha
23
+ */
24
+ declare type NextRouterProps = {
25
+ components?: {
26
+ TemplateCardComponent?: React__default.ComponentType<{
27
+ template: TemplateEntityV1beta3;
28
+ }>;
29
+ TaskPageComponent?: React__default.ComponentType<{}>;
30
+ TemplateOutputsComponent?: React__default.ComponentType<{
31
+ output?: ScaffolderTaskOutput;
32
+ }>;
33
+ };
34
+ groups?: TemplateGroupFilter[];
35
+ FormProps?: FormProps$1;
36
+ contextMenu?: {
37
+ /** Whether to show a link to the template editor */
38
+ editor?: boolean;
39
+ /** Whether to show a link to the actions documentation */
40
+ actions?: boolean;
41
+ /** Whether to show a link to the tasks page */
42
+ tasks?: boolean;
43
+ };
44
+ };
45
+
46
+ /**
47
+ * These types will be replaced eventually by the one in the scaffolder-react plugin.
48
+ * It is a temporary solution to avoid the `/alpha` types being re-exported and that not being supported right now.
49
+ * It exists already in the `scaffolder-react` plugin, so you may have to update both files.
50
+ */
51
+
52
+ /**
53
+ * Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderPage`
54
+ *
55
+ * @alpha
56
+ * @deprecated use the import from {@link @backstage/plugin-scaffolder-react/alpha#FormProps} instead
57
+ */
58
+ declare type FormProps = Pick<FormProps$2, 'transformErrors' | 'noHtml5Validate'>;
59
+
60
+ /** @alpha */
61
+ declare const nextRouteRef: _backstage_core_plugin_api.RouteRef<undefined>;
62
+ /** @alpha */
63
+ declare const nextSelectedTemplateRouteRef: _backstage_core_plugin_api.SubRouteRef<_backstage_core_plugin_api.PathParams<"/templates/:namespace/:templateName">>;
64
+ /** @alpha */
65
+ declare const nextScaffolderTaskRouteRef: _backstage_core_plugin_api.SubRouteRef<_backstage_core_plugin_api.PathParams<"/tasks/:taskId">>;
66
+
67
+ /**
68
+ * @alpha
69
+ * The Router and main entrypoint to the Alpha Scaffolder plugin.
70
+ */
71
+ declare const NextScaffolderPage: (props: React.PropsWithChildren<NextRouterProps>) => JSX.Element;
72
+
73
+ export { FormProps, NextRouterProps, NextScaffolderPage, TemplateGroupFilter, nextRouteRef, nextScaffolderTaskRouteRef, nextSelectedTemplateRouteRef };
@@ -0,0 +1,93 @@
1
+ export { S as NextScaffolderPage, H as nextRouteRef, I as nextScaffolderTaskRouteRef, F as nextSelectedTemplateRouteRef } from './esm/alpha/alpha-70a55083.esm.js';
2
+ import 'react';
3
+ import 'react-router-dom';
4
+ import '@backstage/core-components';
5
+ import '@backstage/plugin-catalog-react';
6
+ import 'lodash/capitalize';
7
+ import '@material-ui/core';
8
+ import '@material-ui/icons/CheckBox';
9
+ import '@material-ui/icons/CheckBoxOutlineBlank';
10
+ import '@material-ui/icons/ExpandMore';
11
+ import '@material-ui/lab';
12
+ import '@backstage/core-plugin-api';
13
+ import '@material-ui/core/Button';
14
+ import '@material-ui/core/IconButton';
15
+ import '@material-ui/core/useMediaQuery';
16
+ import '@material-ui/icons/AddCircleOutline';
17
+ import '@backstage/plugin-catalog-common/alpha';
18
+ import '@backstage/plugin-permission-react';
19
+ import '@backstage/catalog-model';
20
+ import '@backstage/plugin-scaffolder-react/alpha';
21
+ import '@backstage/plugin-scaffolder-react';
22
+ import '@material-ui/core/FormControl';
23
+ import '@material-ui/lab/Autocomplete';
24
+ import 'react-use/lib/useAsync';
25
+ import 'react-use/lib/useEffectOnce';
26
+ import '@backstage/integration-react';
27
+ import '@material-ui/core/FormHelperText';
28
+ import '@material-ui/core/Input';
29
+ import '@material-ui/core/InputLabel';
30
+ import 'react-use/lib/useDebounce';
31
+ import 'luxon';
32
+ import 'humanize-duration';
33
+ import '@material-ui/core/Typography';
34
+ import '@backstage/errors';
35
+ import 'qs';
36
+ import 'zen-observable';
37
+ import 'zod';
38
+ import 'zod-to-json-schema';
39
+ import '@material-ui/core/ListItemIcon';
40
+ import '@material-ui/core/ListItemText';
41
+ import '@material-ui/core/MenuItem';
42
+ import '@material-ui/core/MenuList';
43
+ import '@material-ui/core/Popover';
44
+ import '@material-ui/core/styles';
45
+ import '@material-ui/icons/Description';
46
+ import '@material-ui/icons/Edit';
47
+ import '@material-ui/icons/List';
48
+ import '@material-ui/icons/MoreVert';
49
+ import '@material-ui/icons/Repeat';
50
+ import '@material-ui/icons/Toc';
51
+ import 'classnames';
52
+ import '@material-ui/icons/Settings';
53
+ import '@material-ui/icons/FontDownload';
54
+ import '@codemirror/language';
55
+ import '@codemirror/legacy-modes/mode/yaml';
56
+ import '@material-ui/icons/Close';
57
+ import '@uiw/react-codemirror';
58
+ import 'yaml';
59
+ import '@react-hookz/web';
60
+ import '@rjsf/validator-ajv8';
61
+ import '@material-ui/core/Accordion';
62
+ import '@material-ui/core/AccordionDetails';
63
+ import '@material-ui/core/AccordionSummary';
64
+ import '@material-ui/core/Divider';
65
+ import '@material-ui/icons/ExpandLess';
66
+ import '@material-ui/core/List';
67
+ import '@material-ui/core/ListItem';
68
+ import '@material-ui/core/ListItemSecondaryAction';
69
+ import '@material-ui/icons/Cancel';
70
+ import '@material-ui/icons/Check';
71
+ import '@material-ui/icons/Delete';
72
+ import '@material-ui/core/Box';
73
+ import '@material-ui/core/Tab';
74
+ import '@material-ui/core/Tabs';
75
+ import '@material-ui/core/Grid';
76
+ import '@material-ui/core/Step';
77
+ import '@material-ui/core/StepLabel';
78
+ import '@material-ui/core/Stepper';
79
+ import '@material-ui/icons/FiberManualRecord';
80
+ import 'react-use/lib/useInterval';
81
+ import '@material-ui/icons/Language';
82
+ import '@material-ui/lab/TreeView';
83
+ import '@material-ui/icons/ChevronRight';
84
+ import '@material-ui/lab/TreeItem';
85
+ import '@material-ui/icons/Refresh';
86
+ import '@material-ui/icons/Save';
87
+ import '@codemirror/view';
88
+ import '@material-ui/core/Card';
89
+ import '@material-ui/core/CardActionArea';
90
+ import '@material-ui/core/CardContent';
91
+ import '@material-ui/core/Tooltip';
92
+ import '@material-ui/icons/InfoOutlined';
93
+ //# sourceMappingURL=alpha.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alpha.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,192 @@
1
+ import { E as EntityPicker, m as EntityPickerSchema, n as EntityNamePicker, o as entityNamePickerValidation, p as EntityNamePickerSchema, q as EntityTagsPicker, t as EntityTagsPickerSchema, R as RepoUrlPicker, w as repoPickerValidation, x as RepoUrlPickerSchema, O as OwnerPicker, y as OwnerPickerSchema, z as OwnedEntityPicker, B as OwnedEntityPickerSchema, d as rootRouteRef, C as OwnerListPicker } from './alpha-70a55083.esm.js';
2
+ import { StatusError, StatusOK, StatusPending, Page, Header, Lifecycle, Content, Progress, ErrorPanel, EmptyState, Table, Link } from '@backstage/core-components';
3
+ import { useApi, useRouteRef } from '@backstage/core-plugin-api';
4
+ import { catalogApiRef, EntityRefLink, CatalogFilterLayout } from '@backstage/plugin-catalog-react';
5
+ import useAsync from 'react-use/lib/useAsync';
6
+ import React, { useState } from 'react';
7
+ import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
8
+ import { DateTime, Interval } from 'luxon';
9
+ import humanizeDuration from 'humanize-duration';
10
+ import Typography from '@material-ui/core/Typography';
11
+ import { parseEntityRef } from '@backstage/catalog-model';
12
+
13
+ const DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS = [
14
+ {
15
+ component: EntityPicker,
16
+ name: "EntityPicker",
17
+ schema: EntityPickerSchema
18
+ },
19
+ {
20
+ component: EntityNamePicker,
21
+ name: "EntityNamePicker",
22
+ validation: entityNamePickerValidation,
23
+ schema: EntityNamePickerSchema
24
+ },
25
+ {
26
+ component: EntityTagsPicker,
27
+ name: "EntityTagsPicker",
28
+ schema: EntityTagsPickerSchema
29
+ },
30
+ {
31
+ component: RepoUrlPicker,
32
+ name: "RepoUrlPicker",
33
+ validation: repoPickerValidation,
34
+ schema: RepoUrlPickerSchema
35
+ },
36
+ {
37
+ component: OwnerPicker,
38
+ name: "OwnerPicker",
39
+ schema: OwnerPickerSchema
40
+ },
41
+ {
42
+ component: OwnedEntityPicker,
43
+ name: "OwnedEntityPicker",
44
+ schema: OwnedEntityPickerSchema
45
+ }
46
+ ];
47
+
48
+ const CreatedAtColumn = ({ createdAt }) => {
49
+ const createdAtTime = DateTime.fromISO(createdAt);
50
+ const formatted = Interval.fromDateTimes(createdAtTime, DateTime.local()).toDuration().valueOf();
51
+ return /* @__PURE__ */ React.createElement(Typography, { paragraph: true }, humanizeDuration(formatted, { round: true }), " ago");
52
+ };
53
+
54
+ const OwnerEntityColumn = ({ entityRef }) => {
55
+ var _a, _b, _c;
56
+ const catalogApi = useApi(catalogApiRef);
57
+ const { value, loading, error } = useAsync(
58
+ () => catalogApi.getEntityByRef(entityRef || ""),
59
+ [catalogApi, entityRef]
60
+ );
61
+ if (!entityRef) {
62
+ return /* @__PURE__ */ React.createElement(Typography, { paragraph: true }, "Unknown");
63
+ }
64
+ if (loading || error) {
65
+ return null;
66
+ }
67
+ return /* @__PURE__ */ React.createElement(
68
+ EntityRefLink,
69
+ {
70
+ entityRef: parseEntityRef(entityRef),
71
+ title: (_c = (_b = (_a = value == null ? void 0 : value.spec) == null ? void 0 : _a.profile) == null ? void 0 : _b.displayName) != null ? _c : value == null ? void 0 : value.metadata.name
72
+ }
73
+ );
74
+ };
75
+
76
+ const TaskStatusColumn = ({ status }) => {
77
+ switch (status) {
78
+ case "processing":
79
+ return /* @__PURE__ */ React.createElement(StatusPending, null, status);
80
+ case "completed":
81
+ return /* @__PURE__ */ React.createElement(StatusOK, null, status);
82
+ case "error":
83
+ default:
84
+ return /* @__PURE__ */ React.createElement(StatusError, null, status);
85
+ }
86
+ };
87
+
88
+ const TemplateTitleColumn = ({ entityRef }) => {
89
+ const scaffolder = useApi(scaffolderApiRef);
90
+ const { value, loading, error } = useAsync(
91
+ () => scaffolder.getTemplateParameterSchema(entityRef || ""),
92
+ [scaffolder, entityRef]
93
+ );
94
+ if (loading || error || !entityRef) {
95
+ return null;
96
+ }
97
+ return /* @__PURE__ */ React.createElement(EntityRefLink, { entityRef: parseEntityRef(entityRef), title: value == null ? void 0 : value.title });
98
+ };
99
+
100
+ const ListTaskPageContent = (props) => {
101
+ var _a;
102
+ const { initiallySelectedFilter = "owned" } = props;
103
+ const scaffolderApi = useApi(scaffolderApiRef);
104
+ const rootLink = useRouteRef(rootRouteRef);
105
+ const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);
106
+ const { value, loading, error } = useAsync(() => {
107
+ var _a2;
108
+ if (scaffolderApi.listTasks) {
109
+ return (_a2 = scaffolderApi.listTasks) == null ? void 0 : _a2.call(scaffolderApi, { filterByOwnership: ownerFilter });
110
+ }
111
+ console.warn(
112
+ "listTasks is not implemented in the scaffolderApi, please make sure to implement this method."
113
+ );
114
+ return Promise.resolve({ tasks: [] });
115
+ }, [scaffolderApi, ownerFilter]);
116
+ if (loading) {
117
+ return /* @__PURE__ */ React.createElement(Progress, null);
118
+ }
119
+ if (error) {
120
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ErrorPanel, { error }), /* @__PURE__ */ React.createElement(
121
+ EmptyState,
122
+ {
123
+ missing: "info",
124
+ title: "No information to display",
125
+ description: "There is no Tasks or there was an issue communicating with backend."
126
+ }
127
+ ));
128
+ }
129
+ return /* @__PURE__ */ React.createElement(CatalogFilterLayout, null, /* @__PURE__ */ React.createElement(CatalogFilterLayout.Filters, null, /* @__PURE__ */ React.createElement(
130
+ OwnerListPicker,
131
+ {
132
+ filter: ownerFilter,
133
+ onSelectOwner: (id) => setOwnerFilter(id)
134
+ }
135
+ )), /* @__PURE__ */ React.createElement(CatalogFilterLayout.Content, null, /* @__PURE__ */ React.createElement(
136
+ Table,
137
+ {
138
+ data: (_a = value == null ? void 0 : value.tasks) != null ? _a : [],
139
+ title: "Tasks",
140
+ columns: [
141
+ {
142
+ title: "Task ID",
143
+ field: "id",
144
+ render: (row) => /* @__PURE__ */ React.createElement(Link, { to: `${rootLink()}/tasks/${row.id}` }, row.id)
145
+ },
146
+ {
147
+ title: "Template",
148
+ render: (row) => {
149
+ var _a2;
150
+ return /* @__PURE__ */ React.createElement(
151
+ TemplateTitleColumn,
152
+ {
153
+ entityRef: (_a2 = row.spec.templateInfo) == null ? void 0 : _a2.entityRef
154
+ }
155
+ );
156
+ }
157
+ },
158
+ {
159
+ title: "Created",
160
+ field: "createdAt",
161
+ render: (row) => /* @__PURE__ */ React.createElement(CreatedAtColumn, { createdAt: row.createdAt })
162
+ },
163
+ {
164
+ title: "Owner",
165
+ field: "createdBy",
166
+ render: (row) => {
167
+ var _a2, _b;
168
+ return /* @__PURE__ */ React.createElement(OwnerEntityColumn, { entityRef: (_b = (_a2 = row.spec) == null ? void 0 : _a2.user) == null ? void 0 : _b.ref });
169
+ }
170
+ },
171
+ {
172
+ title: "Status",
173
+ field: "status",
174
+ render: (row) => /* @__PURE__ */ React.createElement(TaskStatusColumn, { status: row.status })
175
+ }
176
+ ]
177
+ }
178
+ )));
179
+ };
180
+ const ListTasksPage = (props) => {
181
+ return /* @__PURE__ */ React.createElement(Page, { themeId: "home" }, /* @__PURE__ */ React.createElement(
182
+ Header,
183
+ {
184
+ pageTitleOverride: "Templates Tasks",
185
+ title: /* @__PURE__ */ React.createElement(React.Fragment, null, "List template tasks ", /* @__PURE__ */ React.createElement(Lifecycle, { shorthand: true, alpha: true })),
186
+ subtitle: "All tasks that have been started"
187
+ }
188
+ ), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ListTaskPageContent, { ...props })));
189
+ };
190
+
191
+ export { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS as D, ListTasksPage as L };
192
+ //# sourceMappingURL=ListTasksPage-b4ddb3e0.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListTasksPage-b4ddb3e0.esm.js","sources":["../../../src/extensions/default.ts","../../../src/components/ListTasksPage/columns/CreatedAtColumn.tsx","../../../src/components/ListTasksPage/columns/OwnerEntityColumn.tsx","../../../src/components/ListTasksPage/columns/TaskStatusColumn.tsx","../../../src/components/ListTasksPage/columns/TemplateTitleColumn.tsx","../../../src/components/ListTasksPage/ListTasksPage.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 {\n EntityPicker,\n EntityPickerSchema,\n} from '../components/fields/EntityPicker/EntityPicker';\nimport {\n EntityNamePicker,\n EntityNamePickerSchema,\n} from '../components/fields/EntityNamePicker/EntityNamePicker';\nimport { entityNamePickerValidation } from '../components/fields/EntityNamePicker/validation';\nimport {\n EntityTagsPicker,\n EntityTagsPickerSchema,\n} from '../components/fields/EntityTagsPicker/EntityTagsPicker';\nimport {\n OwnerPicker,\n OwnerPickerSchema,\n} from '../components/fields/OwnerPicker/OwnerPicker';\nimport {\n RepoUrlPicker,\n RepoUrlPickerSchema,\n} from '../components/fields/RepoUrlPicker/RepoUrlPicker';\nimport { repoPickerValidation } from '../components/fields/RepoUrlPicker/validation';\nimport {\n OwnedEntityPicker,\n OwnedEntityPickerSchema,\n} from '../components/fields/OwnedEntityPicker/OwnedEntityPicker';\n\nexport const DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS = [\n {\n component: EntityPicker,\n name: 'EntityPicker',\n schema: EntityPickerSchema,\n },\n {\n component: EntityNamePicker,\n name: 'EntityNamePicker',\n validation: entityNamePickerValidation,\n schema: EntityNamePickerSchema,\n },\n {\n component: EntityTagsPicker,\n name: 'EntityTagsPicker',\n schema: EntityTagsPickerSchema,\n },\n {\n component: RepoUrlPicker,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n schema: RepoUrlPickerSchema,\n },\n {\n component: OwnerPicker,\n name: 'OwnerPicker',\n schema: OwnerPickerSchema,\n },\n {\n component: OwnedEntityPicker,\n name: 'OwnedEntityPicker',\n schema: OwnedEntityPickerSchema,\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 */\nimport { DateTime, Interval } from 'luxon';\nimport humanizeDuration from 'humanize-duration';\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\n\nexport const CreatedAtColumn = ({ createdAt }: { createdAt: string }) => {\n const createdAtTime = DateTime.fromISO(createdAt);\n const formatted = Interval.fromDateTimes(createdAtTime, DateTime.local())\n .toDuration()\n .valueOf();\n\n return (\n <Typography paragraph>\n {humanizeDuration(formatted, { round: true })} ago\n </Typography>\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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport React from 'react';\n\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { catalogApiRef, EntityRefLink } from '@backstage/plugin-catalog-react';\nimport { parseEntityRef, UserEntity } from '@backstage/catalog-model';\nimport Typography from '@material-ui/core/Typography';\n\nexport const OwnerEntityColumn = ({ entityRef }: { entityRef?: string }) => {\n const catalogApi = useApi(catalogApiRef);\n\n const { value, loading, error } = useAsync(\n () => catalogApi.getEntityByRef(entityRef || ''),\n [catalogApi, entityRef],\n );\n\n if (!entityRef) {\n return <Typography paragraph>Unknown</Typography>;\n }\n\n if (loading || error) {\n return null;\n }\n\n return (\n <EntityRefLink\n entityRef={parseEntityRef(entityRef)}\n title={\n (value as UserEntity)?.spec?.profile?.displayName ??\n value?.metadata.name\n }\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 */\nimport {\n StatusError,\n StatusOK,\n StatusPending,\n} from '@backstage/core-components';\nimport React from 'react';\n\nexport const TaskStatusColumn = ({ status }: { status: string }) => {\n switch (status) {\n case 'processing':\n return <StatusPending>{status}</StatusPending>;\n case 'completed':\n return <StatusOK>{status}</StatusOK>;\n case 'error':\n default:\n return <StatusError>{status}</StatusError>;\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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport React from 'react';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { EntityRefLink } from '@backstage/plugin-catalog-react';\n\nexport const TemplateTitleColumn = ({ entityRef }: { entityRef?: string }) => {\n const scaffolder = useApi(scaffolderApiRef);\n const { value, loading, error } = useAsync(\n () => scaffolder.getTemplateParameterSchema(entityRef || ''),\n [scaffolder, entityRef],\n );\n\n if (loading || error || !entityRef) {\n return null;\n }\n\n return (\n <EntityRefLink entityRef={parseEntityRef(entityRef)} title={value?.title} />\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 */\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Lifecycle,\n Link,\n Page,\n Progress,\n Table,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/lib/useAsync';\nimport React, { useState } from 'react';\nimport {\n ScaffolderTask,\n scaffolderApiRef,\n} from '@backstage/plugin-scaffolder-react';\nimport { OwnerListPicker } from './OwnerListPicker';\nimport {\n CreatedAtColumn,\n OwnerEntityColumn,\n TaskStatusColumn,\n TemplateTitleColumn,\n} from './columns';\nimport { rootRouteRef } from '../../routes';\n\nexport interface MyTaskPageProps {\n initiallySelectedFilter?: 'owned' | 'all';\n}\n\nconst ListTaskPageContent = (props: MyTaskPageProps) => {\n const { initiallySelectedFilter = 'owned' } = props;\n\n const scaffolderApi = useApi(scaffolderApiRef);\n const rootLink = useRouteRef(rootRouteRef);\n\n const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);\n const { value, loading, error } = useAsync(() => {\n if (scaffolderApi.listTasks) {\n return scaffolderApi.listTasks?.({ filterByOwnership: ownerFilter });\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.',\n );\n\n return Promise.resolve({ tasks: [] });\n }, [scaffolderApi, ownerFilter]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title=\"No information to display\"\n description=\"There is no Tasks or there was an issue communicating with backend.\"\n />\n </>\n );\n }\n\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <Table<ScaffolderTask>\n data={value?.tasks ?? []}\n title=\"Tasks\"\n columns={[\n {\n title: 'Task ID',\n field: 'id',\n render: row => (\n <Link to={`${rootLink()}/tasks/${row.id}`}>{row.id}</Link>\n ),\n },\n {\n title: 'Template',\n render: row => (\n <TemplateTitleColumn\n entityRef={row.spec.templateInfo?.entityRef}\n />\n ),\n },\n {\n title: 'Created',\n field: 'createdAt',\n render: row => <CreatedAtColumn createdAt={row.createdAt} />,\n },\n {\n title: 'Owner',\n field: 'createdBy',\n render: row => (\n <OwnerEntityColumn entityRef={row.spec?.user?.ref} />\n ),\n },\n {\n title: 'Status',\n field: 'status',\n render: row => <TaskStatusColumn status={row.status} />,\n },\n ]}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n};\n\nexport const ListTasksPage = (props: MyTaskPageProps) => {\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride=\"Templates Tasks\"\n title={\n <>\n List template tasks <Lifecycle shorthand alpha />\n </>\n }\n subtitle=\"All tasks that have been started\"\n />\n <Content>\n <ListTaskPageContent {...props} />\n </Content>\n </Page>\n );\n};\n"],"names":["_a"],"mappings":"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"}