@backstage/plugin-home 0.8.9-next.2 → 0.8.10-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 +37 -0
- package/dist/alpha.d.ts +32 -1
- package/dist/alpha.esm.js +1 -0
- package/dist/alpha.esm.js.map +1 -1
- package/dist/components/CustomHomepage/AddWidgetDialog.esm.js +4 -1
- package/dist/components/CustomHomepage/AddWidgetDialog.esm.js.map +1 -1
- package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js +8 -5
- package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js.map +1 -1
- package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js +4 -1
- package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js.map +1 -1
- package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js +7 -4
- package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js.map +1 -1
- package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js +4 -1
- package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js.map +1 -1
- package/dist/components/VisitList/VisitListEmpty.esm.js +9 -4
- package/dist/components/VisitList/VisitListEmpty.esm.js.map +1 -1
- package/dist/components/VisitList/VisitListFew.esm.js +6 -1
- package/dist/components/VisitList/VisitListFew.esm.js.map +1 -1
- package/dist/homePageComponents/FeaturedDocsCard/Content.esm.js +7 -4
- package/dist/homePageComponents/FeaturedDocsCard/Content.esm.js.map +1 -1
- package/dist/homePageComponents/QuickStart/Content.esm.js +6 -3
- package/dist/homePageComponents/QuickStart/Content.esm.js.map +1 -1
- package/dist/homePageComponents/StarredEntities/Content.esm.js +4 -1
- package/dist/homePageComponents/StarredEntities/Content.esm.js.map +1 -1
- package/dist/homePageComponents/VisitedByType/Actions.esm.js +4 -1
- package/dist/homePageComponents/VisitedByType/Actions.esm.js.map +1 -1
- package/dist/package.json.esm.js +1 -1
- package/dist/translation.esm.js +63 -0
- package/dist/translation.esm.js.map +1 -0
- package/package.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# @backstage/plugin-home
|
|
2
2
|
|
|
3
|
+
## 0.8.10-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @backstage/theme@0.6.7-next.0
|
|
9
|
+
- @backstage/plugin-catalog-react@1.19.1-next.0
|
|
10
|
+
- @backstage/core-components@0.17.4-next.0
|
|
11
|
+
- @backstage/catalog-client@1.10.1
|
|
12
|
+
- @backstage/catalog-model@1.7.4
|
|
13
|
+
- @backstage/config@1.3.2
|
|
14
|
+
- @backstage/core-app-api@1.17.1
|
|
15
|
+
- @backstage/core-compat-api@0.4.4-next.0
|
|
16
|
+
- @backstage/core-plugin-api@1.10.8
|
|
17
|
+
- @backstage/frontend-plugin-api@0.10.4-next.0
|
|
18
|
+
- @backstage/plugin-home-react@0.1.28-next.0
|
|
19
|
+
|
|
20
|
+
## 0.8.9
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- 18c64e9: Added the `info.packageJson` option to the plugin instance for the new frontend system.
|
|
25
|
+
- 0ebad54: Fixed the `WelcomeTitle` to properly default to the previous value of `inherit`
|
|
26
|
+
- cef60db: Home plugin support i18n
|
|
27
|
+
- Updated dependencies
|
|
28
|
+
- @backstage/core-components@0.17.3
|
|
29
|
+
- @backstage/catalog-client@1.10.1
|
|
30
|
+
- @backstage/core-plugin-api@1.10.8
|
|
31
|
+
- @backstage/plugin-home-react@0.1.27
|
|
32
|
+
- @backstage/frontend-plugin-api@0.10.3
|
|
33
|
+
- @backstage/plugin-catalog-react@1.19.0
|
|
34
|
+
- @backstage/catalog-model@1.7.4
|
|
35
|
+
- @backstage/config@1.3.2
|
|
36
|
+
- @backstage/core-app-api@1.17.1
|
|
37
|
+
- @backstage/core-compat-api@0.4.3
|
|
38
|
+
- @backstage/theme@0.6.6
|
|
39
|
+
|
|
3
40
|
## 0.8.9-next.2
|
|
4
41
|
|
|
5
42
|
### Patch Changes
|
package/dist/alpha.d.ts
CHANGED
|
@@ -1,6 +1,37 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @alpha
|
|
6
|
+
*/
|
|
7
|
+
declare const homeTranslationRef: _backstage_frontend_plugin_api.TranslationRef<"home", {
|
|
8
|
+
readonly "starredEntities.noStarredEntitiesMessage": "Click the star beside an entity name to add it to this list!";
|
|
9
|
+
readonly "addWidgetDialog.title": "Add new widget to dashboard";
|
|
10
|
+
readonly "customHomepageButtons.clearAll": "Clear all";
|
|
11
|
+
readonly "customHomepageButtons.edit": "Edit";
|
|
12
|
+
readonly "customHomepageButtons.restoreDefaults": "Restore defaults";
|
|
13
|
+
readonly "customHomepageButtons.addWidget": "Add widget";
|
|
14
|
+
readonly "customHomepageButtons.save": "Save";
|
|
15
|
+
readonly "customHomepage.noWidgets": "No widgets added. Start by clicking the 'Add widget' button.";
|
|
16
|
+
readonly "widgetSettingsOverlay.cancelButtonTitle": "Cancel";
|
|
17
|
+
readonly "widgetSettingsOverlay.editSettingsTooptip": "Edit settings";
|
|
18
|
+
readonly "widgetSettingsOverlay.deleteWidgetTooltip": "Delete widget";
|
|
19
|
+
readonly "widgetSettingsOverlay.submitButtonTitle": "Submit";
|
|
20
|
+
readonly "starredEntityListItem.removeFavoriteEntityTitle": "Remove entity from favorites";
|
|
21
|
+
readonly "visitList.empty.title": "There are no visits to show yet.";
|
|
22
|
+
readonly "visitList.empty.description": "Once you start using Backstage, your visits will appear here as a quick link to carry on where you left off.";
|
|
23
|
+
readonly "visitList.few.title": "The more pages you visit, the more pages will appear here.";
|
|
24
|
+
readonly "quickStart.title": "Onboarding";
|
|
25
|
+
readonly "quickStart.description": "Get started with Backstage";
|
|
26
|
+
readonly "quickStart.learnMoreLinkTitle": "Learn more";
|
|
27
|
+
readonly "visitedByType.action.viewMore": "View more";
|
|
28
|
+
readonly "visitedByType.action.viewLess": "View less";
|
|
29
|
+
readonly "featuredDocsCard.empty.title": "No documents to show";
|
|
30
|
+
readonly "featuredDocsCard.empty.description": "Create your own document. Check out our Getting Started Information";
|
|
31
|
+
readonly "featuredDocsCard.empty.learnMoreLinkTitle": "DOCS";
|
|
32
|
+
readonly "featuredDocsCard.learnMoreTitle": "LEARN MORE";
|
|
33
|
+
}>;
|
|
34
|
+
|
|
4
35
|
/**
|
|
5
36
|
* @alpha
|
|
6
37
|
*/
|
|
@@ -41,4 +72,4 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
|
|
|
41
72
|
}>;
|
|
42
73
|
}>;
|
|
43
74
|
|
|
44
|
-
export { _default as default, titleExtensionDataRef };
|
|
75
|
+
export { _default as default, homeTranslationRef, titleExtensionDataRef };
|
package/dist/alpha.esm.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { createRouteRef, createExtensionDataRef, PageBlueprint, createExtensionInput, coreExtensionData, createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
3
3
|
import { compatWrapper } from '@backstage/core-compat-api';
|
|
4
|
+
export { homeTranslationRef } from './translation.esm.js';
|
|
4
5
|
|
|
5
6
|
const rootRouteRef = createRouteRef();
|
|
6
7
|
const titleExtensionDataRef = createExtensionDataRef().with({
|
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreExtensionData,\n createExtensionDataRef,\n createExtensionInput,\n PageBlueprint,\n createFrontendPlugin,\n createRouteRef,\n} from '@backstage/frontend-plugin-api';\nimport { compatWrapper } from '@backstage/core-compat-api';\n\nconst rootRouteRef = createRouteRef();\n\n/**\n * @alpha\n */\nexport const titleExtensionDataRef = createExtensionDataRef<string>().with({\n id: 'title',\n});\n\nconst homePage = PageBlueprint.makeWithOverrides({\n inputs: {\n props: createExtensionInput(\n [\n coreExtensionData.reactElement.optional(),\n titleExtensionDataRef.optional(),\n ],\n {\n singleton: true,\n optional: true,\n },\n ),\n },\n factory: (originalFactory, { inputs }) => {\n return originalFactory({\n defaultPath: '/home',\n routeRef: rootRouteRef,\n loader: () =>\n import('./components/').then(m =>\n compatWrapper(\n <m.HomepageCompositionRoot\n children={inputs.props?.get(coreExtensionData.reactElement)}\n title={inputs.props?.get(titleExtensionDataRef)}\n />,\n ),\n ),\n });\n },\n});\n\n/**\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'home',\n info: { packageJson: () => import('../package.json') },\n extensions: [homePage],\n routes: {\n root: rootRouteRef,\n },\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreExtensionData,\n createExtensionDataRef,\n createExtensionInput,\n PageBlueprint,\n createFrontendPlugin,\n createRouteRef,\n} from '@backstage/frontend-plugin-api';\nimport { compatWrapper } from '@backstage/core-compat-api';\n\nconst rootRouteRef = createRouteRef();\n\n/**\n * @alpha\n */\nexport const titleExtensionDataRef = createExtensionDataRef<string>().with({\n id: 'title',\n});\n\nconst homePage = PageBlueprint.makeWithOverrides({\n inputs: {\n props: createExtensionInput(\n [\n coreExtensionData.reactElement.optional(),\n titleExtensionDataRef.optional(),\n ],\n {\n singleton: true,\n optional: true,\n },\n ),\n },\n factory: (originalFactory, { inputs }) => {\n return originalFactory({\n defaultPath: '/home',\n routeRef: rootRouteRef,\n loader: () =>\n import('./components/').then(m =>\n compatWrapper(\n <m.HomepageCompositionRoot\n children={inputs.props?.get(coreExtensionData.reactElement)}\n title={inputs.props?.get(titleExtensionDataRef)}\n />,\n ),\n ),\n });\n },\n});\n\n/**\n * @alpha\n */\nexport default createFrontendPlugin({\n pluginId: 'home',\n info: { packageJson: () => import('../package.json') },\n extensions: [homePage],\n routes: {\n root: rootRouteRef,\n },\n});\n\nexport { homeTranslationRef } from './translation';\n"],"names":[],"mappings":";;;;;AA0BA,MAAM,eAAe,cAAe,EAAA;AAKvB,MAAA,qBAAA,GAAwB,sBAA+B,EAAA,CAAE,IAAK,CAAA;AAAA,EACzE,EAAI,EAAA;AACN,CAAC;AAED,MAAM,QAAA,GAAW,cAAc,iBAAkB,CAAA;AAAA,EAC/C,MAAQ,EAAA;AAAA,IACN,KAAO,EAAA,oBAAA;AAAA,MACL;AAAA,QACE,iBAAA,CAAkB,aAAa,QAAS,EAAA;AAAA,QACxC,sBAAsB,QAAS;AAAA,OACjC;AAAA,MACA;AAAA,QACE,SAAW,EAAA,IAAA;AAAA,QACX,QAAU,EAAA;AAAA;AACZ;AACF,GACF;AAAA,EACA,OAAS,EAAA,CAAC,eAAiB,EAAA,EAAE,QAAa,KAAA;AACxC,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,WAAa,EAAA,OAAA;AAAA,MACb,QAAU,EAAA,YAAA;AAAA,MACV,MAAQ,EAAA,MACN,OAAO,2BAAe,CAAE,CAAA,IAAA;AAAA,QAAK,CAC3B,CAAA,KAAA,aAAA;AAAA,0BACE,GAAA;AAAA,YAAC,CAAE,CAAA,uBAAA;AAAA,YAAF;AAAA,cACC,QAAU,EAAA,MAAA,CAAO,KAAO,EAAA,GAAA,CAAI,kBAAkB,YAAY,CAAA;AAAA,cAC1D,KAAO,EAAA,MAAA,CAAO,KAAO,EAAA,GAAA,CAAI,qBAAqB;AAAA;AAAA;AAChD;AACF;AACF,KACH,CAAA;AAAA;AAEL,CAAC,CAAA;AAKD,YAAe,oBAAqB,CAAA;AAAA,EAClC,QAAU,EAAA,MAAA;AAAA,EACV,MAAM,EAAE,WAAA,EAAa,MAAM,OAAO,uBAAiB,CAAE,EAAA;AAAA,EACrD,UAAA,EAAY,CAAC,QAAQ,CAAA;AAAA,EACrB,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA;AAEV,CAAC,CAAA;;;;"}
|
|
@@ -7,14 +7,17 @@ import ListItemAvatar from '@material-ui/core/ListItemAvatar';
|
|
|
7
7
|
import AddIcon from '@material-ui/icons/Add';
|
|
8
8
|
import ListItemText from '@material-ui/core/ListItemText';
|
|
9
9
|
import Typography from '@material-ui/core/Typography';
|
|
10
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
11
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
10
12
|
|
|
11
13
|
const getTitle = (widget) => {
|
|
12
14
|
return widget.title || widget.name;
|
|
13
15
|
};
|
|
14
16
|
const AddWidgetDialog = (props) => {
|
|
15
17
|
const { widgets, handleAdd } = props;
|
|
18
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
16
19
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
17
|
-
/* @__PURE__ */ jsx(DialogTitle, { children: "
|
|
20
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: t("addWidgetDialog.title") }),
|
|
18
21
|
/* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(List, { dense: true, children: widgets.map((widget) => {
|
|
19
22
|
return /* @__PURE__ */ jsxs(
|
|
20
23
|
ListItem,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddWidgetDialog.esm.js","sources":["../../../src/components/CustomHomepage/AddWidgetDialog.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Widget } from './types';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport AddIcon from '@material-ui/icons/Add';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Typography from '@material-ui/core/Typography';\n\ninterface AddWidgetDialogProps {\n widgets: Widget[];\n handleAdd: (widget: Widget) => void;\n}\n\nconst getTitle = (widget: Widget) => {\n return widget.title || widget.name;\n};\n\nexport const AddWidgetDialog = (props: AddWidgetDialogProps) => {\n const { widgets, handleAdd } = props;\n return (\n <>\n <DialogTitle>
|
|
1
|
+
{"version":3,"file":"AddWidgetDialog.esm.js","sources":["../../../src/components/CustomHomepage/AddWidgetDialog.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Widget } from './types';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport AddIcon from '@material-ui/icons/Add';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Typography from '@material-ui/core/Typography';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\ninterface AddWidgetDialogProps {\n widgets: Widget[];\n handleAdd: (widget: Widget) => void;\n}\n\nconst getTitle = (widget: Widget) => {\n return widget.title || widget.name;\n};\n\nexport const AddWidgetDialog = (props: AddWidgetDialogProps) => {\n const { widgets, handleAdd } = props;\n const { t } = useTranslationRef(homeTranslationRef);\n return (\n <>\n <DialogTitle>{t('addWidgetDialog.title')}</DialogTitle>\n <DialogContent>\n <List dense>\n {widgets.map(widget => {\n return (\n <ListItem\n key={widget.name}\n button\n onClick={() => handleAdd(widget)}\n >\n <ListItemAvatar>\n <AddIcon />\n </ListItemAvatar>\n <ListItemText\n secondary={\n widget.description && (\n <Typography\n component=\"span\"\n variant=\"caption\"\n color=\"textPrimary\"\n >\n {widget.description}\n </Typography>\n )\n }\n primary={\n <Typography variant=\"body1\" color=\"textPrimary\">\n {getTitle(widget)}\n </Typography>\n }\n />\n </ListItem>\n );\n })}\n </List>\n </DialogContent>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAiCA,MAAM,QAAA,GAAW,CAAC,MAAmB,KAAA;AACnC,EAAO,OAAA,MAAA,CAAO,SAAS,MAAO,CAAA,IAAA;AAChC,CAAA;AAEa,MAAA,eAAA,GAAkB,CAAC,KAAgC,KAAA;AAC9D,EAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,KAAA;AAC/B,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,WAAA,EAAA,EAAa,QAAE,EAAA,CAAA,CAAA,uBAAuB,CAAE,EAAA,CAAA;AAAA,oBACzC,GAAA,CAAC,iBACC,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,OAAK,IACR,EAAA,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAU,MAAA,KAAA;AACrB,MACE,uBAAA,IAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,MAAM,EAAA,IAAA;AAAA,UACN,OAAA,EAAS,MAAM,SAAA,CAAU,MAAM,CAAA;AAAA,UAE/B,QAAA,EAAA;AAAA,4BAAC,GAAA,CAAA,cAAA,EAAA,EACC,QAAC,kBAAA,GAAA,CAAA,OAAA,EAAA,EAAQ,CACX,EAAA,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EACE,OAAO,WACL,oBAAA,GAAA;AAAA,kBAAC,UAAA;AAAA,kBAAA;AAAA,oBACC,SAAU,EAAA,MAAA;AAAA,oBACV,OAAQ,EAAA,SAAA;AAAA,oBACR,KAAM,EAAA,aAAA;AAAA,oBAEL,QAAO,EAAA,MAAA,CAAA;AAAA;AAAA,iBACV;AAAA,gBAGJ,OAAA,sBACG,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAQ,KAAM,EAAA,aAAA,EAC/B,QAAS,EAAA,QAAA,CAAA,MAAM,CAClB,EAAA;AAAA;AAAA;AAEJ;AAAA,SAAA;AAAA,QAxBK,MAAO,CAAA;AAAA,OAyBd;AAAA,KAEH,GACH,CACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -6,6 +6,8 @@ import DeleteIcon from '@material-ui/icons/Delete';
|
|
|
6
6
|
import AddIcon from '@material-ui/icons/Add';
|
|
7
7
|
import EditIcon from '@material-ui/icons/Edit';
|
|
8
8
|
import CancelIcon from '@material-ui/icons/Cancel';
|
|
9
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
10
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
9
11
|
|
|
10
12
|
const useStyles = makeStyles(
|
|
11
13
|
(theme) => createStyles({
|
|
@@ -31,6 +33,7 @@ const CustomHomepageButtons = (props) => {
|
|
|
31
33
|
restoreDefault
|
|
32
34
|
} = props;
|
|
33
35
|
const styles = useStyles();
|
|
36
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
34
37
|
return /* @__PURE__ */ jsx(Fragment, { children: !editMode && numWidgets > 0 ? /* @__PURE__ */ jsx(
|
|
35
38
|
Button,
|
|
36
39
|
{
|
|
@@ -39,7 +42,7 @@ const CustomHomepageButtons = (props) => {
|
|
|
39
42
|
onClick: () => changeEditMode(true),
|
|
40
43
|
size: "small",
|
|
41
44
|
startIcon: /* @__PURE__ */ jsx(EditIcon, {}),
|
|
42
|
-
children: "
|
|
45
|
+
children: t("customHomepageButtons.edit")
|
|
43
46
|
}
|
|
44
47
|
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
45
48
|
defaultConfigAvailable && /* @__PURE__ */ jsx(
|
|
@@ -50,7 +53,7 @@ const CustomHomepageButtons = (props) => {
|
|
|
50
53
|
onClick: restoreDefault,
|
|
51
54
|
size: "small",
|
|
52
55
|
startIcon: /* @__PURE__ */ jsx(CancelIcon, {}),
|
|
53
|
-
children: "
|
|
56
|
+
children: t("customHomepageButtons.restoreDefaults")
|
|
54
57
|
}
|
|
55
58
|
),
|
|
56
59
|
numWidgets > 0 && /* @__PURE__ */ jsx(
|
|
@@ -62,7 +65,7 @@ const CustomHomepageButtons = (props) => {
|
|
|
62
65
|
onClick: clearLayout,
|
|
63
66
|
size: "small",
|
|
64
67
|
startIcon: /* @__PURE__ */ jsx(DeleteIcon, {}),
|
|
65
|
-
children: "
|
|
68
|
+
children: t("customHomepageButtons.clearAll")
|
|
66
69
|
}
|
|
67
70
|
),
|
|
68
71
|
/* @__PURE__ */ jsx(
|
|
@@ -73,7 +76,7 @@ const CustomHomepageButtons = (props) => {
|
|
|
73
76
|
onClick: () => setAddWidgetDialogOpen(true),
|
|
74
77
|
size: "small",
|
|
75
78
|
startIcon: /* @__PURE__ */ jsx(AddIcon, {}),
|
|
76
|
-
children: "
|
|
79
|
+
children: t("customHomepageButtons.addWidget")
|
|
77
80
|
}
|
|
78
81
|
),
|
|
79
82
|
numWidgets > 0 && /* @__PURE__ */ jsx(
|
|
@@ -85,7 +88,7 @@ const CustomHomepageButtons = (props) => {
|
|
|
85
88
|
onClick: () => changeEditMode(false),
|
|
86
89
|
size: "small",
|
|
87
90
|
startIcon: /* @__PURE__ */ jsx(SaveIcon, {}),
|
|
88
|
-
children: "
|
|
91
|
+
children: t("customHomepageButtons.save")
|
|
89
92
|
}
|
|
90
93
|
)
|
|
91
94
|
] }) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomHomepageButtons.esm.js","sources":["../../../src/components/CustomHomepage/CustomHomepageButtons.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport Button from '@material-ui/core/Button';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport SaveIcon from '@material-ui/icons/Save';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport AddIcon from '@material-ui/icons/Add';\nimport EditIcon from '@material-ui/icons/Edit';\nimport CancelIcon from '@material-ui/icons/Cancel';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n contentHeaderBtn: {\n marginLeft: theme.spacing(2),\n },\n widgetWrapper: {\n '& > *:first-child': {\n width: '100%',\n height: '100%',\n },\n },\n }),\n);\n\ninterface CustomHomepageButtonsProps {\n editMode: boolean;\n numWidgets: number;\n clearLayout: () => void;\n setAddWidgetDialogOpen: (open: boolean) => void;\n changeEditMode: (mode: boolean) => void;\n defaultConfigAvailable: boolean;\n restoreDefault: () => void;\n}\nexport const CustomHomepageButtons = (props: CustomHomepageButtonsProps) => {\n const {\n editMode,\n numWidgets,\n clearLayout,\n setAddWidgetDialogOpen,\n changeEditMode,\n defaultConfigAvailable,\n restoreDefault,\n } = props;\n const styles = useStyles();\n\n return (\n <>\n {!editMode && numWidgets > 0 ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => changeEditMode(true)}\n size=\"small\"\n startIcon={<EditIcon />}\n >\n
|
|
1
|
+
{"version":3,"file":"CustomHomepageButtons.esm.js","sources":["../../../src/components/CustomHomepage/CustomHomepageButtons.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport Button from '@material-ui/core/Button';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport SaveIcon from '@material-ui/icons/Save';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport AddIcon from '@material-ui/icons/Add';\nimport EditIcon from '@material-ui/icons/Edit';\nimport CancelIcon from '@material-ui/icons/Cancel';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n contentHeaderBtn: {\n marginLeft: theme.spacing(2),\n },\n widgetWrapper: {\n '& > *:first-child': {\n width: '100%',\n height: '100%',\n },\n },\n }),\n);\n\ninterface CustomHomepageButtonsProps {\n editMode: boolean;\n numWidgets: number;\n clearLayout: () => void;\n setAddWidgetDialogOpen: (open: boolean) => void;\n changeEditMode: (mode: boolean) => void;\n defaultConfigAvailable: boolean;\n restoreDefault: () => void;\n}\nexport const CustomHomepageButtons = (props: CustomHomepageButtonsProps) => {\n const {\n editMode,\n numWidgets,\n clearLayout,\n setAddWidgetDialogOpen,\n changeEditMode,\n defaultConfigAvailable,\n restoreDefault,\n } = props;\n const styles = useStyles();\n const { t } = useTranslationRef(homeTranslationRef);\n\n return (\n <>\n {!editMode && numWidgets > 0 ? (\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => changeEditMode(true)}\n size=\"small\"\n startIcon={<EditIcon />}\n >\n {t('customHomepageButtons.edit')}\n </Button>\n ) : (\n <>\n {defaultConfigAvailable && (\n <Button\n variant=\"contained\"\n className={styles.contentHeaderBtn}\n onClick={restoreDefault}\n size=\"small\"\n startIcon={<CancelIcon />}\n >\n {t('customHomepageButtons.restoreDefaults')}\n </Button>\n )}\n {numWidgets > 0 && (\n <Button\n variant=\"contained\"\n color=\"secondary\"\n className={styles.contentHeaderBtn}\n onClick={clearLayout}\n size=\"small\"\n startIcon={<DeleteIcon />}\n >\n {t('customHomepageButtons.clearAll')}\n </Button>\n )}\n <Button\n variant=\"contained\"\n className={styles.contentHeaderBtn}\n onClick={() => setAddWidgetDialogOpen(true)}\n size=\"small\"\n startIcon={<AddIcon />}\n >\n {t('customHomepageButtons.addWidget')}\n </Button>\n {numWidgets > 0 && (\n <Button\n className={styles.contentHeaderBtn}\n variant=\"contained\"\n color=\"primary\"\n onClick={() => changeEditMode(false)}\n size=\"small\"\n startIcon={<SaveIcon />}\n >\n {t('customHomepageButtons.save')}\n </Button>\n )}\n </>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAyBA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,gBAAkB,EAAA;AAAA,MAChB,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,KAC7B;AAAA,IACA,aAAe,EAAA;AAAA,MACb,mBAAqB,EAAA;AAAA,QACnB,KAAO,EAAA,MAAA;AAAA,QACP,MAAQ,EAAA;AAAA;AACV;AACF,GACD;AACH,CAAA;AAWa,MAAA,qBAAA,GAAwB,CAAC,KAAsC,KAAA;AAC1E,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,sBAAA;AAAA,IACA,cAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACE,GAAA,KAAA;AACJ,EAAA,MAAM,SAAS,SAAU,EAAA;AACzB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,uBAEK,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA,CAAC,QAAY,IAAA,UAAA,GAAa,CACzB,mBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,KAAM,EAAA,SAAA;AAAA,MACN,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,MAClC,IAAK,EAAA,OAAA;AAAA,MACL,SAAA,sBAAY,QAAS,EAAA,EAAA,CAAA;AAAA,MAEpB,YAAE,4BAA4B;AAAA;AAAA,sBAI9B,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IACC,sBAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,WAAA;AAAA,QACR,WAAW,MAAO,CAAA,gBAAA;AAAA,QAClB,OAAS,EAAA,cAAA;AAAA,QACT,IAAK,EAAA,OAAA;AAAA,QACL,SAAA,sBAAY,UAAW,EAAA,EAAA,CAAA;AAAA,QAEtB,YAAE,uCAAuC;AAAA;AAAA,KAC5C;AAAA,IAED,aAAa,CACZ,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,WAAA;AAAA,QACR,KAAM,EAAA,WAAA;AAAA,QACN,WAAW,MAAO,CAAA,gBAAA;AAAA,QAClB,OAAS,EAAA,WAAA;AAAA,QACT,IAAK,EAAA,OAAA;AAAA,QACL,SAAA,sBAAY,UAAW,EAAA,EAAA,CAAA;AAAA,QAEtB,YAAE,gCAAgC;AAAA;AAAA,KACrC;AAAA,oBAEF,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,WAAA;AAAA,QACR,WAAW,MAAO,CAAA,gBAAA;AAAA,QAClB,OAAA,EAAS,MAAM,sBAAA,CAAuB,IAAI,CAAA;AAAA,QAC1C,IAAK,EAAA,OAAA;AAAA,QACL,SAAA,sBAAY,OAAQ,EAAA,EAAA,CAAA;AAAA,QAEnB,YAAE,iCAAiC;AAAA;AAAA,KACtC;AAAA,IACC,aAAa,CACZ,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,WAAW,MAAO,CAAA,gBAAA;AAAA,QAClB,OAAQ,EAAA,WAAA;AAAA,QACR,KAAM,EAAA,SAAA;AAAA,QACN,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,QACnC,IAAK,EAAA,OAAA;AAAA,QACL,SAAA,sBAAY,QAAS,EAAA,EAAA,CAAA;AAAA,QAEpB,YAAE,4BAA4B;AAAA;AAAA;AACjC,GAAA,EAEJ,CAEJ,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -14,6 +14,8 @@ import { WidgetSettingsOverlay } from './WidgetSettingsOverlay.esm.js';
|
|
|
14
14
|
import { AddWidgetDialog } from './AddWidgetDialog.esm.js';
|
|
15
15
|
import { CustomHomepageButtons } from './CustomHomepageButtons.esm.js';
|
|
16
16
|
import { CustomHomepageGridStateV1Schema, LayoutConfigurationSchema, WidgetSchema } from './types.esm.js';
|
|
17
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
18
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
17
19
|
|
|
18
20
|
const ResponsiveGrid = WidthProvider(Responsive);
|
|
19
21
|
const useStyles = makeStyles(
|
|
@@ -158,6 +160,7 @@ const CustomHomepageGrid = (props) => {
|
|
|
158
160
|
const getWidgetNameFromKey = (key) => {
|
|
159
161
|
return key.split("__")[0];
|
|
160
162
|
};
|
|
163
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
161
164
|
const handleAdd = (widget) => {
|
|
162
165
|
const widgetId = `${widget.name}__${widgets.length + 1}${Math.random().toString(36).slice(2)}`;
|
|
163
166
|
setWidgets([
|
|
@@ -262,7 +265,7 @@ const CustomHomepageGrid = (props) => {
|
|
|
262
265
|
children: /* @__PURE__ */ jsx(AddWidgetDialog, { widgets: availableWidgets, handleAdd })
|
|
263
266
|
}
|
|
264
267
|
),
|
|
265
|
-
!editMode && widgets.length === 0 && /* @__PURE__ */ jsx(Typography, { variant: "h5", align: "center", children: "
|
|
268
|
+
!editMode && widgets.length === 0 && /* @__PURE__ */ jsx(Typography, { variant: "h5", align: "center", children: t("customHomepage.noWidgets") }),
|
|
266
269
|
/* @__PURE__ */ jsx(
|
|
267
270
|
ResponsiveGrid,
|
|
268
271
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomHomepageGrid.esm.js","sources":["../../../src/components/CustomHomepage/CustomHomepageGrid.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isValidElement, useState, useCallback, useMemo } from 'react';\nimport { Layout, Layouts, Responsive, WidthProvider } from 'react-grid-layout';\nimport {\n ElementCollection,\n getComponentData,\n storageApiRef,\n useApi,\n useElementFilter,\n} from '@backstage/core-plugin-api';\nimport 'react-grid-layout/css/styles.css';\nimport 'react-resizable/css/styles.css';\nimport Dialog from '@material-ui/core/Dialog';\nimport {\n createStyles,\n makeStyles,\n Theme,\n useTheme,\n} from '@material-ui/core/styles';\nimport { compact } from 'lodash';\nimport useObservable from 'react-use/esm/useObservable';\nimport { ContentHeader, ErrorBoundary } from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\nimport { WidgetSettingsOverlay } from './WidgetSettingsOverlay';\nimport { AddWidgetDialog } from './AddWidgetDialog';\nimport { CustomHomepageButtons } from './CustomHomepageButtons';\nimport {\n CustomHomepageGridProps,\n CustomHomepageGridStateV1,\n CustomHomepageGridStateV1Schema,\n GridWidget,\n LayoutConfiguration,\n LayoutConfigurationSchema,\n Widget,\n WidgetSchema,\n} from './types';\nimport { CardConfig } from '@backstage/plugin-home-react';\n\n// eslint-disable-next-line new-cap\nconst ResponsiveGrid = WidthProvider(Responsive);\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n responsiveGrid: {\n '& .react-grid-item > .react-resizable-handle:after': {\n position: 'absolute',\n content: '\"\"',\n borderStyle: 'solid',\n borderWidth: '0 0 20px 20px',\n borderColor: `transparent transparent ${theme.palette.primary.light} transparent`,\n },\n },\n contentHeaderBtn: {\n marginLeft: theme.spacing(2),\n },\n widgetWrapper: {\n '& > div[class*=\"MuiCard-root\"]': {\n width: '100%',\n height: '100%',\n },\n '& div[class*=\"MuiCardContent-root\"]': {\n overflow: 'auto',\n },\n '& + .react-grid-placeholder': {\n backgroundColor: theme.palette.primary.light,\n },\n '&.edit > :active': {\n cursor: 'move',\n },\n },\n }),\n);\n\nfunction useHomeStorage(\n defaultWidgets: GridWidget[],\n): [GridWidget[], (value: GridWidget[]) => void] {\n const key = 'home';\n const storageApi = useApi(storageApiRef).forBucket('home.customHomepage');\n // TODO: Support multiple home pages\n const setWidgets = useCallback(\n (value: GridWidget[]) => {\n const grid: CustomHomepageGridStateV1 = {\n version: 1,\n pages: {\n default: value,\n },\n };\n storageApi.set(key, JSON.stringify(grid));\n },\n [key, storageApi],\n );\n const homeSnapshot = useObservable(\n storageApi.observe$<string>(key),\n storageApi.snapshot(key),\n );\n const widgets: GridWidget[] = useMemo(() => {\n if (homeSnapshot.presence === 'absent') {\n return defaultWidgets;\n }\n try {\n const grid: CustomHomepageGridStateV1 = JSON.parse(homeSnapshot.value!);\n return CustomHomepageGridStateV1Schema.parse(grid).pages.default;\n } catch (e) {\n return defaultWidgets;\n }\n }, [homeSnapshot, defaultWidgets]);\n\n return [widgets, setWidgets];\n}\n\nconst convertConfigToDefaultWidgets = (\n config: LayoutConfiguration[],\n availableWidgets: Widget[],\n): GridWidget[] => {\n const ret = config.map((conf, i) => {\n const c = LayoutConfigurationSchema.parse(conf);\n const name = isValidElement(c.component)\n ? getComponentData(c.component, 'core.extensionName')\n : (c.component as unknown as string);\n if (!name) {\n return null;\n }\n const widget = availableWidgets.find(w => w.name === name);\n if (!widget) {\n return null;\n }\n const widgetId = `${widget.name}__${i}${Math.random()\n .toString(36)\n .slice(2)}`;\n return {\n id: widgetId,\n layout: {\n i: widgetId,\n x: c.x,\n y: c.y,\n w: Math.min(widget.maxWidth ?? Number.MAX_VALUE, c.width),\n h: Math.min(widget.maxHeight ?? Number.MAX_VALUE, c.height),\n minW: widget.minWidth,\n maxW: widget.maxWidth,\n minH: widget.minHeight,\n maxH: widget.maxHeight,\n isDraggable: false,\n isResizable: false,\n },\n settings: {},\n movable: conf.movable,\n deletable: conf.deletable,\n resizable: conf.resizable,\n };\n });\n return compact(ret);\n};\n\nconst availableWidgetsFilter = (elements: ElementCollection) => {\n return elements\n .selectByComponentData({\n key: 'core.extensionName',\n })\n .getElements<Widget>()\n .flatMap(elem => {\n const config = getComponentData<CardConfig>(elem, 'home.widget.config');\n return [\n WidgetSchema.parse({\n component: elem,\n name: getComponentData<string>(elem, 'core.extensionName'),\n title: getComponentData<string>(elem, 'title'),\n description: getComponentData<string>(elem, 'description'),\n settingsSchema: config?.settings?.schema,\n uiSchema: config?.settings?.uiSchema,\n width: config?.layout?.width?.defaultColumns,\n minWidth: config?.layout?.width?.minColumns,\n maxWidth: config?.layout?.width?.maxColumns,\n height: config?.layout?.height?.defaultRows,\n minHeight: config?.layout?.height?.minRows,\n maxHeight: config?.layout?.height?.maxRows,\n }),\n ];\n });\n};\n\n/**\n * A component that allows customizing components in home grid layout.\n *\n * @public\n */\nexport const CustomHomepageGrid = (props: CustomHomepageGridProps) => {\n const styles = useStyles();\n const theme = useTheme();\n const availableWidgets = useElementFilter(\n props.children,\n availableWidgetsFilter,\n [props],\n );\n const defaultLayout = useMemo(() => {\n return props.config\n ? convertConfigToDefaultWidgets(props.config, availableWidgets)\n : [];\n }, [props.config, availableWidgets]);\n const [widgets, setWidgets] = useHomeStorage(defaultLayout);\n const [addWidgetDialogOpen, setAddWidgetDialogOpen] = useState(false);\n const editModeOn = widgets.find(w => w.layout.isResizable) !== undefined;\n const [editMode, setEditMode] = useState(editModeOn);\n const getWidgetByName = (name: string) => {\n return availableWidgets.find(widget => widget.name === name);\n };\n\n const getWidgetNameFromKey = (key: string) => {\n return key.split('__')[0];\n };\n\n const handleAdd = (widget: Widget) => {\n const widgetId = `${widget.name}__${widgets.length + 1}${Math.random()\n .toString(36)\n .slice(2)}`;\n\n setWidgets([\n ...widgets,\n {\n id: widgetId,\n layout: {\n i: widgetId,\n x: 0,\n y: Math.max(...widgets.map(w => w.layout.y + w.layout.h)) + 1,\n w: Math.min(widget.maxWidth ?? Number.MAX_VALUE, widget.width ?? 12),\n h: Math.min(widget.maxHeight ?? Number.MAX_VALUE, widget.height ?? 4),\n minW: widget.minWidth,\n maxW: widget.maxWidth,\n minH: widget.minHeight,\n maxH: widget.maxHeight,\n isResizable: editMode,\n isDraggable: editMode,\n },\n settings: {},\n movable: widget.movable,\n deletable: widget.deletable,\n resizable: widget.resizable,\n },\n ]);\n setAddWidgetDialogOpen(false);\n };\n\n const handleRemove = (widgetId: string) => {\n setWidgets(widgets.filter(w => w.id !== widgetId));\n };\n\n const handleSettingsSave = (\n widgetId: string,\n widgetSettings: Record<string, any>,\n ) => {\n const idx = widgets.findIndex(w => w.id === widgetId);\n if (idx >= 0) {\n const widget = widgets[idx];\n widget.settings = widgetSettings;\n widgets[idx] = widget;\n setWidgets(widgets);\n }\n };\n\n const clearLayout = () => {\n setWidgets([]);\n };\n\n const changeEditMode = (mode: boolean) => {\n setEditMode(mode);\n setWidgets(\n widgets.map(w => {\n const resizable = w.resizable === false ? false : mode;\n const movable = w.movable === false ? false : mode;\n return {\n ...w,\n layout: { ...w.layout, isDraggable: movable, isResizable: resizable },\n };\n }),\n );\n };\n\n const handleLayoutChange = (newLayout: Layout[], _: Layouts) => {\n if (editMode) {\n const newWidgets = newLayout.map(l => {\n const widget = widgets.find(w => w.id === l.i);\n return {\n ...widget,\n layout: l,\n } as GridWidget;\n });\n setWidgets(newWidgets);\n }\n };\n\n const handleRestoreDefaultConfig = () => {\n setWidgets(\n defaultLayout.map(w => {\n const resizable = w.resizable === false ? false : editMode;\n const movable = w.movable === false ? false : editMode;\n return {\n ...w,\n layout: {\n ...w.layout,\n isDraggable: movable,\n isResizable: resizable,\n },\n };\n }),\n );\n };\n\n return (\n <>\n <ContentHeader title={props.title}>\n <CustomHomepageButtons\n editMode={editMode}\n numWidgets={widgets.length}\n clearLayout={clearLayout}\n setAddWidgetDialogOpen={setAddWidgetDialogOpen}\n changeEditMode={changeEditMode}\n defaultConfigAvailable={props.config !== undefined}\n restoreDefault={handleRestoreDefaultConfig}\n />\n </ContentHeader>\n <Dialog\n open={addWidgetDialogOpen}\n onClose={() => setAddWidgetDialogOpen(false)}\n >\n <AddWidgetDialog widgets={availableWidgets} handleAdd={handleAdd} />\n </Dialog>\n {!editMode && widgets.length === 0 && (\n <Typography variant=\"h5\" align=\"center\">\n No widgets added. Start by clicking the 'Add widget' button.\n </Typography>\n )}\n <ResponsiveGrid\n className={styles.responsiveGrid}\n measureBeforeMount\n compactType={props.compactType}\n style={props.style}\n allowOverlap={props.allowOverlap}\n preventCollision={props.preventCollision ?? true}\n draggableCancel=\".overlayGridItem,.widgetSettingsDialog,.disabled\"\n containerPadding={props.containerPadding}\n margin={props.containerMargin}\n breakpoints={\n props.breakpoints ? props.breakpoints : theme.breakpoints.values\n }\n cols={\n props.cols\n ? props.cols\n : { xl: 12, lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }\n }\n rowHeight={props.rowHeight ?? 60}\n onLayoutChange={handleLayoutChange}\n layouts={{ xl: widgets.map(w => w.layout) }}\n >\n {widgets.map((w: GridWidget) => {\n const l = w.layout;\n const widgetName = getWidgetNameFromKey(l.i);\n const widget = getWidgetByName(widgetName);\n if (!widget || !widget.component) {\n return null;\n }\n\n const widgetProps = {\n ...widget.component.props,\n ...(w.settings ?? {}),\n };\n\n return (\n <div\n key={l.i}\n className={`${styles.widgetWrapper} ${editMode && 'edit'} ${\n w.movable === false && 'disabled'\n }`}\n >\n <ErrorBoundary>\n <widget.component.type {...widgetProps} />\n </ErrorBoundary>\n {editMode && (\n <WidgetSettingsOverlay\n id={l.i}\n widget={widget}\n handleRemove={handleRemove}\n handleSettingsSave={handleSettingsSave}\n settings={w.settings}\n deletable={w.deletable}\n />\n )}\n </div>\n );\n })}\n </ResponsiveGrid>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomHomepageGrid.esm.js","sources":["../../../src/components/CustomHomepage/CustomHomepageGrid.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isValidElement, useState, useCallback, useMemo } from 'react';\nimport { Layout, Layouts, Responsive, WidthProvider } from 'react-grid-layout';\nimport {\n ElementCollection,\n getComponentData,\n storageApiRef,\n useApi,\n useElementFilter,\n} from '@backstage/core-plugin-api';\nimport 'react-grid-layout/css/styles.css';\nimport 'react-resizable/css/styles.css';\nimport Dialog from '@material-ui/core/Dialog';\nimport {\n createStyles,\n makeStyles,\n Theme,\n useTheme,\n} from '@material-ui/core/styles';\nimport { compact } from 'lodash';\nimport useObservable from 'react-use/esm/useObservable';\nimport { ContentHeader, ErrorBoundary } from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\nimport { WidgetSettingsOverlay } from './WidgetSettingsOverlay';\nimport { AddWidgetDialog } from './AddWidgetDialog';\nimport { CustomHomepageButtons } from './CustomHomepageButtons';\nimport {\n CustomHomepageGridProps,\n CustomHomepageGridStateV1,\n CustomHomepageGridStateV1Schema,\n GridWidget,\n LayoutConfiguration,\n LayoutConfigurationSchema,\n Widget,\n WidgetSchema,\n} from './types';\nimport { CardConfig } from '@backstage/plugin-home-react';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\n// eslint-disable-next-line new-cap\nconst ResponsiveGrid = WidthProvider(Responsive);\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n responsiveGrid: {\n '& .react-grid-item > .react-resizable-handle:after': {\n position: 'absolute',\n content: '\"\"',\n borderStyle: 'solid',\n borderWidth: '0 0 20px 20px',\n borderColor: `transparent transparent ${theme.palette.primary.light} transparent`,\n },\n },\n contentHeaderBtn: {\n marginLeft: theme.spacing(2),\n },\n widgetWrapper: {\n '& > div[class*=\"MuiCard-root\"]': {\n width: '100%',\n height: '100%',\n },\n '& div[class*=\"MuiCardContent-root\"]': {\n overflow: 'auto',\n },\n '& + .react-grid-placeholder': {\n backgroundColor: theme.palette.primary.light,\n },\n '&.edit > :active': {\n cursor: 'move',\n },\n },\n }),\n);\n\nfunction useHomeStorage(\n defaultWidgets: GridWidget[],\n): [GridWidget[], (value: GridWidget[]) => void] {\n const key = 'home';\n const storageApi = useApi(storageApiRef).forBucket('home.customHomepage');\n // TODO: Support multiple home pages\n const setWidgets = useCallback(\n (value: GridWidget[]) => {\n const grid: CustomHomepageGridStateV1 = {\n version: 1,\n pages: {\n default: value,\n },\n };\n storageApi.set(key, JSON.stringify(grid));\n },\n [key, storageApi],\n );\n const homeSnapshot = useObservable(\n storageApi.observe$<string>(key),\n storageApi.snapshot(key),\n );\n const widgets: GridWidget[] = useMemo(() => {\n if (homeSnapshot.presence === 'absent') {\n return defaultWidgets;\n }\n try {\n const grid: CustomHomepageGridStateV1 = JSON.parse(homeSnapshot.value!);\n return CustomHomepageGridStateV1Schema.parse(grid).pages.default;\n } catch (e) {\n return defaultWidgets;\n }\n }, [homeSnapshot, defaultWidgets]);\n\n return [widgets, setWidgets];\n}\n\nconst convertConfigToDefaultWidgets = (\n config: LayoutConfiguration[],\n availableWidgets: Widget[],\n): GridWidget[] => {\n const ret = config.map((conf, i) => {\n const c = LayoutConfigurationSchema.parse(conf);\n const name = isValidElement(c.component)\n ? getComponentData(c.component, 'core.extensionName')\n : (c.component as unknown as string);\n if (!name) {\n return null;\n }\n const widget = availableWidgets.find(w => w.name === name);\n if (!widget) {\n return null;\n }\n const widgetId = `${widget.name}__${i}${Math.random()\n .toString(36)\n .slice(2)}`;\n return {\n id: widgetId,\n layout: {\n i: widgetId,\n x: c.x,\n y: c.y,\n w: Math.min(widget.maxWidth ?? Number.MAX_VALUE, c.width),\n h: Math.min(widget.maxHeight ?? Number.MAX_VALUE, c.height),\n minW: widget.minWidth,\n maxW: widget.maxWidth,\n minH: widget.minHeight,\n maxH: widget.maxHeight,\n isDraggable: false,\n isResizable: false,\n },\n settings: {},\n movable: conf.movable,\n deletable: conf.deletable,\n resizable: conf.resizable,\n };\n });\n return compact(ret);\n};\n\nconst availableWidgetsFilter = (elements: ElementCollection) => {\n return elements\n .selectByComponentData({\n key: 'core.extensionName',\n })\n .getElements<Widget>()\n .flatMap(elem => {\n const config = getComponentData<CardConfig>(elem, 'home.widget.config');\n return [\n WidgetSchema.parse({\n component: elem,\n name: getComponentData<string>(elem, 'core.extensionName'),\n title: getComponentData<string>(elem, 'title'),\n description: getComponentData<string>(elem, 'description'),\n settingsSchema: config?.settings?.schema,\n uiSchema: config?.settings?.uiSchema,\n width: config?.layout?.width?.defaultColumns,\n minWidth: config?.layout?.width?.minColumns,\n maxWidth: config?.layout?.width?.maxColumns,\n height: config?.layout?.height?.defaultRows,\n minHeight: config?.layout?.height?.minRows,\n maxHeight: config?.layout?.height?.maxRows,\n }),\n ];\n });\n};\n\n/**\n * A component that allows customizing components in home grid layout.\n *\n * @public\n */\nexport const CustomHomepageGrid = (props: CustomHomepageGridProps) => {\n const styles = useStyles();\n const theme = useTheme();\n const availableWidgets = useElementFilter(\n props.children,\n availableWidgetsFilter,\n [props],\n );\n const defaultLayout = useMemo(() => {\n return props.config\n ? convertConfigToDefaultWidgets(props.config, availableWidgets)\n : [];\n }, [props.config, availableWidgets]);\n const [widgets, setWidgets] = useHomeStorage(defaultLayout);\n const [addWidgetDialogOpen, setAddWidgetDialogOpen] = useState(false);\n const editModeOn = widgets.find(w => w.layout.isResizable) !== undefined;\n const [editMode, setEditMode] = useState(editModeOn);\n const getWidgetByName = (name: string) => {\n return availableWidgets.find(widget => widget.name === name);\n };\n\n const getWidgetNameFromKey = (key: string) => {\n return key.split('__')[0];\n };\n const { t } = useTranslationRef(homeTranslationRef);\n\n const handleAdd = (widget: Widget) => {\n const widgetId = `${widget.name}__${widgets.length + 1}${Math.random()\n .toString(36)\n .slice(2)}`;\n\n setWidgets([\n ...widgets,\n {\n id: widgetId,\n layout: {\n i: widgetId,\n x: 0,\n y: Math.max(...widgets.map(w => w.layout.y + w.layout.h)) + 1,\n w: Math.min(widget.maxWidth ?? Number.MAX_VALUE, widget.width ?? 12),\n h: Math.min(widget.maxHeight ?? Number.MAX_VALUE, widget.height ?? 4),\n minW: widget.minWidth,\n maxW: widget.maxWidth,\n minH: widget.minHeight,\n maxH: widget.maxHeight,\n isResizable: editMode,\n isDraggable: editMode,\n },\n settings: {},\n movable: widget.movable,\n deletable: widget.deletable,\n resizable: widget.resizable,\n },\n ]);\n setAddWidgetDialogOpen(false);\n };\n\n const handleRemove = (widgetId: string) => {\n setWidgets(widgets.filter(w => w.id !== widgetId));\n };\n\n const handleSettingsSave = (\n widgetId: string,\n widgetSettings: Record<string, any>,\n ) => {\n const idx = widgets.findIndex(w => w.id === widgetId);\n if (idx >= 0) {\n const widget = widgets[idx];\n widget.settings = widgetSettings;\n widgets[idx] = widget;\n setWidgets(widgets);\n }\n };\n\n const clearLayout = () => {\n setWidgets([]);\n };\n\n const changeEditMode = (mode: boolean) => {\n setEditMode(mode);\n setWidgets(\n widgets.map(w => {\n const resizable = w.resizable === false ? false : mode;\n const movable = w.movable === false ? false : mode;\n return {\n ...w,\n layout: { ...w.layout, isDraggable: movable, isResizable: resizable },\n };\n }),\n );\n };\n\n const handleLayoutChange = (newLayout: Layout[], _: Layouts) => {\n if (editMode) {\n const newWidgets = newLayout.map(l => {\n const widget = widgets.find(w => w.id === l.i);\n return {\n ...widget,\n layout: l,\n } as GridWidget;\n });\n setWidgets(newWidgets);\n }\n };\n\n const handleRestoreDefaultConfig = () => {\n setWidgets(\n defaultLayout.map(w => {\n const resizable = w.resizable === false ? false : editMode;\n const movable = w.movable === false ? false : editMode;\n return {\n ...w,\n layout: {\n ...w.layout,\n isDraggable: movable,\n isResizable: resizable,\n },\n };\n }),\n );\n };\n\n return (\n <>\n <ContentHeader title={props.title}>\n <CustomHomepageButtons\n editMode={editMode}\n numWidgets={widgets.length}\n clearLayout={clearLayout}\n setAddWidgetDialogOpen={setAddWidgetDialogOpen}\n changeEditMode={changeEditMode}\n defaultConfigAvailable={props.config !== undefined}\n restoreDefault={handleRestoreDefaultConfig}\n />\n </ContentHeader>\n <Dialog\n open={addWidgetDialogOpen}\n onClose={() => setAddWidgetDialogOpen(false)}\n >\n <AddWidgetDialog widgets={availableWidgets} handleAdd={handleAdd} />\n </Dialog>\n {!editMode && widgets.length === 0 && (\n <Typography variant=\"h5\" align=\"center\">\n {t('customHomepage.noWidgets')}\n </Typography>\n )}\n <ResponsiveGrid\n className={styles.responsiveGrid}\n measureBeforeMount\n compactType={props.compactType}\n style={props.style}\n allowOverlap={props.allowOverlap}\n preventCollision={props.preventCollision ?? true}\n draggableCancel=\".overlayGridItem,.widgetSettingsDialog,.disabled\"\n containerPadding={props.containerPadding}\n margin={props.containerMargin}\n breakpoints={\n props.breakpoints ? props.breakpoints : theme.breakpoints.values\n }\n cols={\n props.cols\n ? props.cols\n : { xl: 12, lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }\n }\n rowHeight={props.rowHeight ?? 60}\n onLayoutChange={handleLayoutChange}\n layouts={{ xl: widgets.map(w => w.layout) }}\n >\n {widgets.map((w: GridWidget) => {\n const l = w.layout;\n const widgetName = getWidgetNameFromKey(l.i);\n const widget = getWidgetByName(widgetName);\n if (!widget || !widget.component) {\n return null;\n }\n\n const widgetProps = {\n ...widget.component.props,\n ...(w.settings ?? {}),\n };\n\n return (\n <div\n key={l.i}\n className={`${styles.widgetWrapper} ${editMode && 'edit'} ${\n w.movable === false && 'disabled'\n }`}\n >\n <ErrorBoundary>\n <widget.component.type {...widgetProps} />\n </ErrorBoundary>\n {editMode && (\n <WidgetSettingsOverlay\n id={l.i}\n widget={widget}\n handleRemove={handleRemove}\n handleSettingsSave={handleSettingsSave}\n settings={w.settings}\n deletable={w.deletable}\n />\n )}\n </div>\n );\n })}\n </ResponsiveGrid>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAwDA,MAAM,cAAA,GAAiB,cAAc,UAAU,CAAA;AAE/C,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,cAAgB,EAAA;AAAA,MACd,oDAAsD,EAAA;AAAA,QACpD,QAAU,EAAA,UAAA;AAAA,QACV,OAAS,EAAA,IAAA;AAAA,QACT,WAAa,EAAA,OAAA;AAAA,QACb,WAAa,EAAA,eAAA;AAAA,QACb,WAAa,EAAA,CAAA,wBAAA,EAA2B,KAAM,CAAA,OAAA,CAAQ,QAAQ,KAAK,CAAA,YAAA;AAAA;AACrE,KACF;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,KAC7B;AAAA,IACA,aAAe,EAAA;AAAA,MACb,gCAAkC,EAAA;AAAA,QAChC,KAAO,EAAA,MAAA;AAAA,QACP,MAAQ,EAAA;AAAA,OACV;AAAA,MACA,qCAAuC,EAAA;AAAA,QACrC,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,6BAA+B,EAAA;AAAA,QAC7B,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,OAAQ,CAAA;AAAA,OACzC;AAAA,MACA,kBAAoB,EAAA;AAAA,QAClB,MAAQ,EAAA;AAAA;AACV;AACF,GACD;AACH,CAAA;AAEA,SAAS,eACP,cAC+C,EAAA;AAC/C,EAAA,MAAM,GAAM,GAAA,MAAA;AACZ,EAAA,MAAM,UAAa,GAAA,MAAA,CAAO,aAAa,CAAA,CAAE,UAAU,qBAAqB,CAAA;AAExE,EAAA,MAAM,UAAa,GAAA,WAAA;AAAA,IACjB,CAAC,KAAwB,KAAA;AACvB,MAAA,MAAM,IAAkC,GAAA;AAAA,QACtC,OAAS,EAAA,CAAA;AAAA,QACT,KAAO,EAAA;AAAA,UACL,OAAS,EAAA;AAAA;AACX,OACF;AACA,MAAA,UAAA,CAAW,GAAI,CAAA,GAAA,EAAK,IAAK,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,KAC1C;AAAA,IACA,CAAC,KAAK,UAAU;AAAA,GAClB;AACA,EAAA,MAAM,YAAe,GAAA,aAAA;AAAA,IACnB,UAAA,CAAW,SAAiB,GAAG,CAAA;AAAA,IAC/B,UAAA,CAAW,SAAS,GAAG;AAAA,GACzB;AACA,EAAM,MAAA,OAAA,GAAwB,QAAQ,MAAM;AAC1C,IAAI,IAAA,YAAA,CAAa,aAAa,QAAU,EAAA;AACtC,MAAO,OAAA,cAAA;AAAA;AAET,IAAI,IAAA;AACF,MAAA,MAAM,IAAkC,GAAA,IAAA,CAAK,KAAM,CAAA,YAAA,CAAa,KAAM,CAAA;AACtE,MAAA,OAAO,+BAAgC,CAAA,KAAA,CAAM,IAAI,CAAA,CAAE,KAAM,CAAA,OAAA;AAAA,aAClD,CAAG,EAAA;AACV,MAAO,OAAA,cAAA;AAAA;AACT,GACC,EAAA,CAAC,YAAc,EAAA,cAAc,CAAC,CAAA;AAEjC,EAAO,OAAA,CAAC,SAAS,UAAU,CAAA;AAC7B;AAEA,MAAM,6BAAA,GAAgC,CACpC,MAAA,EACA,gBACiB,KAAA;AACjB,EAAA,MAAM,GAAM,GAAA,MAAA,CAAO,GAAI,CAAA,CAAC,MAAM,CAAM,KAAA;AAClC,IAAM,MAAA,CAAA,GAAI,yBAA0B,CAAA,KAAA,CAAM,IAAI,CAAA;AAC9C,IAAM,MAAA,IAAA,GAAO,cAAe,CAAA,CAAA,CAAE,SAAS,CAAA,GACnC,iBAAiB,CAAE,CAAA,SAAA,EAAW,oBAAoB,CAAA,GACjD,CAAE,CAAA,SAAA;AACP,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAO,OAAA,IAAA;AAAA;AAET,IAAA,MAAM,SAAS,gBAAiB,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA;AACzD,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAO,OAAA,IAAA;AAAA;AAET,IAAA,MAAM,QAAW,GAAA,CAAA,EAAG,MAAO,CAAA,IAAI,KAAK,CAAC,CAAA,EAAG,IAAK,CAAA,MAAA,GAC1C,QAAS,CAAA,EAAE,CACX,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACX,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,QAAA;AAAA,MACJ,MAAQ,EAAA;AAAA,QACN,CAAG,EAAA,QAAA;AAAA,QACH,GAAG,CAAE,CAAA,CAAA;AAAA,QACL,GAAG,CAAE,CAAA,CAAA;AAAA,QACL,CAAA,EAAG,KAAK,GAAI,CAAA,MAAA,CAAO,YAAY,MAAO,CAAA,SAAA,EAAW,EAAE,KAAK,CAAA;AAAA,QACxD,CAAA,EAAG,KAAK,GAAI,CAAA,MAAA,CAAO,aAAa,MAAO,CAAA,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA,QAC1D,MAAM,MAAO,CAAA,QAAA;AAAA,QACb,MAAM,MAAO,CAAA,QAAA;AAAA,QACb,MAAM,MAAO,CAAA,SAAA;AAAA,QACb,MAAM,MAAO,CAAA,SAAA;AAAA,QACb,WAAa,EAAA,KAAA;AAAA,QACb,WAAa,EAAA;AAAA,OACf;AAAA,MACA,UAAU,EAAC;AAAA,MACX,SAAS,IAAK,CAAA,OAAA;AAAA,MACd,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,WAAW,IAAK,CAAA;AAAA,KAClB;AAAA,GACD,CAAA;AACD,EAAA,OAAO,QAAQ,GAAG,CAAA;AACpB,CAAA;AAEA,MAAM,sBAAA,GAAyB,CAAC,QAAgC,KAAA;AAC9D,EAAA,OAAO,SACJ,qBAAsB,CAAA;AAAA,IACrB,GAAK,EAAA;AAAA,GACN,CAAA,CACA,WAAoB,EAAA,CACpB,QAAQ,CAAQ,IAAA,KAAA;AACf,IAAM,MAAA,MAAA,GAAS,gBAA6B,CAAA,IAAA,EAAM,oBAAoB,CAAA;AACtE,IAAO,OAAA;AAAA,MACL,aAAa,KAAM,CAAA;AAAA,QACjB,SAAW,EAAA,IAAA;AAAA,QACX,IAAA,EAAM,gBAAyB,CAAA,IAAA,EAAM,oBAAoB,CAAA;AAAA,QACzD,KAAA,EAAO,gBAAyB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,QAC7C,WAAA,EAAa,gBAAyB,CAAA,IAAA,EAAM,aAAa,CAAA;AAAA,QACzD,cAAA,EAAgB,QAAQ,QAAU,EAAA,MAAA;AAAA,QAClC,QAAA,EAAU,QAAQ,QAAU,EAAA,QAAA;AAAA,QAC5B,KAAA,EAAO,MAAQ,EAAA,MAAA,EAAQ,KAAO,EAAA,cAAA;AAAA,QAC9B,QAAA,EAAU,MAAQ,EAAA,MAAA,EAAQ,KAAO,EAAA,UAAA;AAAA,QACjC,QAAA,EAAU,MAAQ,EAAA,MAAA,EAAQ,KAAO,EAAA,UAAA;AAAA,QACjC,MAAA,EAAQ,MAAQ,EAAA,MAAA,EAAQ,MAAQ,EAAA,WAAA;AAAA,QAChC,SAAA,EAAW,MAAQ,EAAA,MAAA,EAAQ,MAAQ,EAAA,OAAA;AAAA,QACnC,SAAA,EAAW,MAAQ,EAAA,MAAA,EAAQ,MAAQ,EAAA;AAAA,OACpC;AAAA,KACH;AAAA,GACD,CAAA;AACL,CAAA;AAOa,MAAA,kBAAA,GAAqB,CAAC,KAAmC,KAAA;AACpE,EAAA,MAAM,SAAS,SAAU,EAAA;AACzB,EAAA,MAAM,QAAQ,QAAS,EAAA;AACvB,EAAA,MAAM,gBAAmB,GAAA,gBAAA;AAAA,IACvB,KAAM,CAAA,QAAA;AAAA,IACN,sBAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AACA,EAAM,MAAA,aAAA,GAAgB,QAAQ,MAAM;AAClC,IAAA,OAAO,MAAM,MACT,GAAA,6BAAA,CAA8B,MAAM,MAAQ,EAAA,gBAAgB,IAC5D,EAAC;AAAA,GACJ,EAAA,CAAC,KAAM,CAAA,MAAA,EAAQ,gBAAgB,CAAC,CAAA;AACnC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,eAAe,aAAa,CAAA;AAC1D,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,KAAK,CAAA;AACpE,EAAA,MAAM,aAAa,OAAQ,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,MAAA,CAAO,WAAW,CAAM,KAAA,KAAA,CAAA;AAC/D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,UAAU,CAAA;AACnD,EAAM,MAAA,eAAA,GAAkB,CAAC,IAAiB,KAAA;AACxC,IAAA,OAAO,gBAAiB,CAAA,IAAA,CAAK,CAAU,MAAA,KAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,GAC7D;AAEA,EAAM,MAAA,oBAAA,GAAuB,CAAC,GAAgB,KAAA;AAC5C,IAAA,OAAO,GAAI,CAAA,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,GAC1B;AACA,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAM,MAAA,SAAA,GAAY,CAAC,MAAmB,KAAA;AACpC,IAAA,MAAM,WAAW,CAAG,EAAA,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,QAAQ,MAAS,GAAA,CAAC,CAAG,EAAA,IAAA,CAAK,QAC3D,CAAA,QAAA,CAAS,EAAE,CACX,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAEX,IAAW,UAAA,CAAA;AAAA,MACT,GAAG,OAAA;AAAA,MACH;AAAA,QACE,EAAI,EAAA,QAAA;AAAA,QACJ,MAAQ,EAAA;AAAA,UACN,CAAG,EAAA,QAAA;AAAA,UACH,CAAG,EAAA,CAAA;AAAA,UACH,CAAG,EAAA,IAAA,CAAK,GAAI,CAAA,GAAG,QAAQ,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,MAAA,CAAO,CAAI,GAAA,CAAA,CAAE,MAAO,CAAA,CAAC,CAAC,CAAI,GAAA,CAAA;AAAA,UAC5D,CAAA,EAAG,KAAK,GAAI,CAAA,MAAA,CAAO,YAAY,MAAO,CAAA,SAAA,EAAW,MAAO,CAAA,KAAA,IAAS,EAAE,CAAA;AAAA,UACnE,CAAA,EAAG,KAAK,GAAI,CAAA,MAAA,CAAO,aAAa,MAAO,CAAA,SAAA,EAAW,MAAO,CAAA,MAAA,IAAU,CAAC,CAAA;AAAA,UACpE,MAAM,MAAO,CAAA,QAAA;AAAA,UACb,MAAM,MAAO,CAAA,QAAA;AAAA,UACb,MAAM,MAAO,CAAA,SAAA;AAAA,UACb,MAAM,MAAO,CAAA,SAAA;AAAA,UACb,WAAa,EAAA,QAAA;AAAA,UACb,WAAa,EAAA;AAAA,SACf;AAAA,QACA,UAAU,EAAC;AAAA,QACX,SAAS,MAAO,CAAA,OAAA;AAAA,QAChB,WAAW,MAAO,CAAA,SAAA;AAAA,QAClB,WAAW,MAAO,CAAA;AAAA;AACpB,KACD,CAAA;AACD,IAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,GAC9B;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,QAAqB,KAAA;AACzC,IAAA,UAAA,CAAW,QAAQ,MAAO,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,EAAA,KAAO,QAAQ,CAAC,CAAA;AAAA,GACnD;AAEA,EAAM,MAAA,kBAAA,GAAqB,CACzB,QAAA,EACA,cACG,KAAA;AACH,IAAA,MAAM,MAAM,OAAQ,CAAA,SAAA,CAAU,CAAK,CAAA,KAAA,CAAA,CAAE,OAAO,QAAQ,CAAA;AACpD,IAAA,IAAI,OAAO,CAAG,EAAA;AACZ,MAAM,MAAA,MAAA,GAAS,QAAQ,GAAG,CAAA;AAC1B,MAAA,MAAA,CAAO,QAAW,GAAA,cAAA;AAClB,MAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,MAAA;AACf,MAAA,UAAA,CAAW,OAAO,CAAA;AAAA;AACpB,GACF;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,UAAA,CAAW,EAAE,CAAA;AAAA,GACf;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,IAAkB,KAAA;AACxC,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,UAAA;AAAA,MACE,OAAA,CAAQ,IAAI,CAAK,CAAA,KAAA;AACf,QAAA,MAAM,SAAY,GAAA,CAAA,CAAE,SAAc,KAAA,KAAA,GAAQ,KAAQ,GAAA,IAAA;AAClD,QAAA,MAAM,OAAU,GAAA,CAAA,CAAE,OAAY,KAAA,KAAA,GAAQ,KAAQ,GAAA,IAAA;AAC9C,QAAO,OAAA;AAAA,UACL,GAAG,CAAA;AAAA,UACH,MAAA,EAAQ,EAAE,GAAG,CAAA,CAAE,QAAQ,WAAa,EAAA,OAAA,EAAS,aAAa,SAAU;AAAA,SACtE;AAAA,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAM,MAAA,kBAAA,GAAqB,CAAC,SAAA,EAAqB,CAAe,KAAA;AAC9D,IAAA,IAAI,QAAU,EAAA;AACZ,MAAM,MAAA,UAAA,GAAa,SAAU,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA;AACpC,QAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,EAAA,KAAO,EAAE,CAAC,CAAA;AAC7C,QAAO,OAAA;AAAA,UACL,GAAG,MAAA;AAAA,UACH,MAAQ,EAAA;AAAA,SACV;AAAA,OACD,CAAA;AACD,MAAA,UAAA,CAAW,UAAU,CAAA;AAAA;AACvB,GACF;AAEA,EAAA,MAAM,6BAA6B,MAAM;AACvC,IAAA,UAAA;AAAA,MACE,aAAA,CAAc,IAAI,CAAK,CAAA,KAAA;AACrB,QAAA,MAAM,SAAY,GAAA,CAAA,CAAE,SAAc,KAAA,KAAA,GAAQ,KAAQ,GAAA,QAAA;AAClD,QAAA,MAAM,OAAU,GAAA,CAAA,CAAE,OAAY,KAAA,KAAA,GAAQ,KAAQ,GAAA,QAAA;AAC9C,QAAO,OAAA;AAAA,UACL,GAAG,CAAA;AAAA,UACH,MAAQ,EAAA;AAAA,YACN,GAAG,CAAE,CAAA,MAAA;AAAA,YACL,WAAa,EAAA,OAAA;AAAA,YACb,WAAa,EAAA;AAAA;AACf,SACF;AAAA,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,aAAA,EAAA,EAAc,KAAO,EAAA,KAAA,CAAM,KAC1B,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,YAAY,OAAQ,CAAA,MAAA;AAAA,QACpB,WAAA;AAAA,QACA,sBAAA;AAAA,QACA,cAAA;AAAA,QACA,sBAAA,EAAwB,MAAM,MAAW,KAAA,KAAA,CAAA;AAAA,QACzC,cAAgB,EAAA;AAAA;AAAA,KAEpB,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAM,EAAA,mBAAA;AAAA,QACN,OAAA,EAAS,MAAM,sBAAA,CAAuB,KAAK,CAAA;AAAA,QAE3C,QAAC,kBAAA,GAAA,CAAA,eAAA,EAAA,EAAgB,OAAS,EAAA,gBAAA,EAAkB,SAAsB,EAAA;AAAA;AAAA,KACpE;AAAA,IACC,CAAC,QAAA,IAAY,OAAQ,CAAA,MAAA,KAAW,CAC/B,oBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,KAAA,EAAM,QAC5B,EAAA,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAC/B,EAAA,CAAA;AAAA,oBAEF,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,WAAW,MAAO,CAAA,cAAA;AAAA,QAClB,kBAAkB,EAAA,IAAA;AAAA,QAClB,aAAa,KAAM,CAAA,WAAA;AAAA,QACnB,OAAO,KAAM,CAAA,KAAA;AAAA,QACb,cAAc,KAAM,CAAA,YAAA;AAAA,QACpB,gBAAA,EAAkB,MAAM,gBAAoB,IAAA,IAAA;AAAA,QAC5C,eAAgB,EAAA,kDAAA;AAAA,QAChB,kBAAkB,KAAM,CAAA,gBAAA;AAAA,QACxB,QAAQ,KAAM,CAAA,eAAA;AAAA,QACd,aACE,KAAM,CAAA,WAAA,GAAc,KAAM,CAAA,WAAA,GAAc,MAAM,WAAY,CAAA,MAAA;AAAA,QAE5D,MACE,KAAM,CAAA,IAAA,GACF,KAAM,CAAA,IAAA,GACN,EAAE,EAAI,EAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,EAAA,EAAI,GAAG,EAAI,EAAA,CAAA,EAAG,KAAK,CAAE,EAAA;AAAA,QAErD,SAAA,EAAW,MAAM,SAAa,IAAA,EAAA;AAAA,QAC9B,cAAgB,EAAA,kBAAA;AAAA,QAChB,OAAA,EAAS,EAAE,EAAI,EAAA,OAAA,CAAQ,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,MAAM,CAAE,EAAA;AAAA,QAEzC,QAAA,EAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,CAAkB,KAAA;AAC9B,UAAA,MAAM,IAAI,CAAE,CAAA,MAAA;AACZ,UAAM,MAAA,UAAA,GAAa,oBAAqB,CAAA,CAAA,CAAE,CAAC,CAAA;AAC3C,UAAM,MAAA,MAAA,GAAS,gBAAgB,UAAU,CAAA;AACzC,UAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,SAAW,EAAA;AAChC,YAAO,OAAA,IAAA;AAAA;AAGT,UAAA,MAAM,WAAc,GAAA;AAAA,YAClB,GAAG,OAAO,SAAU,CAAA,KAAA;AAAA,YACpB,GAAI,CAAE,CAAA,QAAA,IAAY;AAAC,WACrB;AAEA,UACE,uBAAA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAW,CAAG,EAAA,MAAA,CAAO,aAAa,CAAA,CAAA,EAAI,QAAY,IAAA,MAAM,CACtD,CAAA,EAAA,CAAA,CAAE,OAAY,KAAA,KAAA,IAAS,UACzB,CAAA,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAC,GAAA,CAAA,aAAA,EAAA,EACC,8BAAC,MAAO,CAAA,SAAA,CAAU,MAAjB,EAAuB,GAAG,aAAa,CAC1C,EAAA,CAAA;AAAA,gBACC,QACC,oBAAA,GAAA;AAAA,kBAAC,qBAAA;AAAA,kBAAA;AAAA,oBACC,IAAI,CAAE,CAAA,CAAA;AAAA,oBACN,MAAA;AAAA,oBACA,YAAA;AAAA,oBACA,kBAAA;AAAA,oBACA,UAAU,CAAE,CAAA,QAAA;AAAA,oBACZ,WAAW,CAAE,CAAA;AAAA;AAAA;AACf;AAAA,aAAA;AAAA,YAhBG,CAAE,CAAA;AAAA,WAkBT;AAAA,SAEH;AAAA;AAAA;AACH,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -13,6 +13,8 @@ import { useState } from 'react';
|
|
|
13
13
|
import { withTheme } from '@rjsf/core';
|
|
14
14
|
import { Theme } from '@rjsf/material-ui';
|
|
15
15
|
import validator from '@rjsf/validator-ajv8';
|
|
16
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
17
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
16
18
|
|
|
17
19
|
const Form = withTheme(Theme);
|
|
18
20
|
const useStyles = makeStyles(
|
|
@@ -40,6 +42,7 @@ const WidgetSettingsOverlay = (props) => {
|
|
|
40
42
|
const [settingsDialogOpen, setSettingsDialogOpen] = useState(false);
|
|
41
43
|
const styles = useStyles();
|
|
42
44
|
const onClose = () => setSettingsDialogOpen(false);
|
|
45
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
43
46
|
return /* @__PURE__ */ jsxs("div", { className: styles.settingsOverlay, children: [
|
|
44
47
|
widget.settingsSchema && /* @__PURE__ */ jsx(
|
|
45
48
|
Dialog,
|
|
@@ -67,8 +70,8 @@ const WidgetSettingsOverlay = (props) => {
|
|
|
67
70
|
allOf: "populateDefaults"
|
|
68
71
|
},
|
|
69
72
|
children: /* @__PURE__ */ jsxs(DialogActions, { children: [
|
|
70
|
-
/* @__PURE__ */ jsx(Button, { color: "primary", variant: "contained", type: "submit", children: "
|
|
71
|
-
/* @__PURE__ */ jsx(Button, { color: "secondary", onClick: onClose, children: "
|
|
73
|
+
/* @__PURE__ */ jsx(Button, { color: "primary", variant: "contained", type: "submit", children: t("widgetSettingsOverlay.submitButtonTitle") }),
|
|
74
|
+
/* @__PURE__ */ jsx(Button, { color: "secondary", onClick: onClose, children: t("widgetSettingsOverlay.cancelButtonTitle") })
|
|
72
75
|
] })
|
|
73
76
|
}
|
|
74
77
|
) })
|
|
@@ -82,7 +85,7 @@ const WidgetSettingsOverlay = (props) => {
|
|
|
82
85
|
alignItems: "center",
|
|
83
86
|
justifyContent: "center",
|
|
84
87
|
children: [
|
|
85
|
-
widget.settingsSchema && /* @__PURE__ */ jsx(Grid, { item: true, className: "overlayGridItem", children: /* @__PURE__ */ jsx(Tooltip, { title: "
|
|
88
|
+
widget.settingsSchema && /* @__PURE__ */ jsx(Grid, { item: true, className: "overlayGridItem", children: /* @__PURE__ */ jsx(Tooltip, { title: t("widgetSettingsOverlay.editSettingsTooptip"), children: /* @__PURE__ */ jsx(
|
|
86
89
|
IconButton,
|
|
87
90
|
{
|
|
88
91
|
color: "primary",
|
|
@@ -90,7 +93,7 @@ const WidgetSettingsOverlay = (props) => {
|
|
|
90
93
|
children: /* @__PURE__ */ jsx(SettingsIcon, { fontSize: "large" })
|
|
91
94
|
}
|
|
92
95
|
) }) }),
|
|
93
|
-
deletable !== false && /* @__PURE__ */ jsx(Grid, { item: true, className: "overlayGridItem", children: /* @__PURE__ */ jsx(Tooltip, { title: "
|
|
96
|
+
deletable !== false && /* @__PURE__ */ jsx(Grid, { item: true, className: "overlayGridItem", children: /* @__PURE__ */ jsx(Tooltip, { title: t("widgetSettingsOverlay.deleteWidgetTooltip"), children: /* @__PURE__ */ jsx(IconButton, { color: "secondary", onClick: () => handleRemove(id), children: /* @__PURE__ */ jsx(DeleteIcon, { fontSize: "large" }) }) }) })
|
|
94
97
|
]
|
|
95
98
|
}
|
|
96
99
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WidgetSettingsOverlay.esm.js","sources":["../../../src/components/CustomHomepage/WidgetSettingsOverlay.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport Grid from '@material-ui/core/Grid';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { useState } from 'react';\nimport { Widget } from './types';\nimport { withTheme } from '@rjsf/core';\nimport { Theme as MuiTheme } from '@rjsf/material-ui';\nimport validator from '@rjsf/validator-ajv8';\n\nconst Form = withTheme(MuiTheme);\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n iconGrid: {\n height: '100%',\n '& *': {\n padding: 0,\n },\n },\n settingsOverlay: {\n position: 'absolute',\n backgroundColor: 'rgba(40, 40, 40, 0.93)',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n padding: theme.spacing(2),\n color: 'white',\n },\n }),\n);\ninterface WidgetSettingsOverlayProps {\n id: string;\n widget: Widget;\n handleRemove: (id: string) => void;\n handleSettingsSave: (id: string, settings: Record<string, any>) => void;\n settings?: Record<string, any>;\n deletable?: boolean;\n}\n\nexport const WidgetSettingsOverlay = (props: WidgetSettingsOverlayProps) => {\n const { id, widget, settings, handleRemove, handleSettingsSave, deletable } =\n props;\n const [settingsDialogOpen, setSettingsDialogOpen] = useState(false);\n const styles = useStyles();\n\n const onClose = () => setSettingsDialogOpen(false);\n\n return (\n <div className={styles.settingsOverlay}>\n {widget.settingsSchema && (\n <Dialog\n open={settingsDialogOpen}\n className=\"widgetSettingsDialog\"\n onClose={onClose}\n >\n <DialogContent>\n <Form\n validator={validator}\n showErrorList={false}\n schema={widget.settingsSchema}\n uiSchema={widget.uiSchema}\n noHtml5Validate\n formData={settings}\n formContext={{ settings }}\n onSubmit={({ formData, errors }) => {\n if (errors.length === 0) {\n handleSettingsSave(id, formData);\n setSettingsDialogOpen(false);\n }\n }}\n experimental_defaultFormStateBehavior={{\n allOf: 'populateDefaults',\n }}\n >\n <DialogActions>\n <Button color=\"primary\" variant=\"contained\" type=\"submit\">\n
|
|
1
|
+
{"version":3,"file":"WidgetSettingsOverlay.esm.js","sources":["../../../src/components/CustomHomepage/WidgetSettingsOverlay.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport Grid from '@material-ui/core/Grid';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport { useState } from 'react';\nimport { Widget } from './types';\nimport { withTheme } from '@rjsf/core';\nimport { Theme as MuiTheme } from '@rjsf/material-ui';\nimport validator from '@rjsf/validator-ajv8';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\nconst Form = withTheme(MuiTheme);\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n iconGrid: {\n height: '100%',\n '& *': {\n padding: 0,\n },\n },\n settingsOverlay: {\n position: 'absolute',\n backgroundColor: 'rgba(40, 40, 40, 0.93)',\n width: '100%',\n height: '100%',\n top: 0,\n left: 0,\n padding: theme.spacing(2),\n color: 'white',\n },\n }),\n);\ninterface WidgetSettingsOverlayProps {\n id: string;\n widget: Widget;\n handleRemove: (id: string) => void;\n handleSettingsSave: (id: string, settings: Record<string, any>) => void;\n settings?: Record<string, any>;\n deletable?: boolean;\n}\n\nexport const WidgetSettingsOverlay = (props: WidgetSettingsOverlayProps) => {\n const { id, widget, settings, handleRemove, handleSettingsSave, deletable } =\n props;\n const [settingsDialogOpen, setSettingsDialogOpen] = useState(false);\n const styles = useStyles();\n\n const onClose = () => setSettingsDialogOpen(false);\n const { t } = useTranslationRef(homeTranslationRef);\n\n return (\n <div className={styles.settingsOverlay}>\n {widget.settingsSchema && (\n <Dialog\n open={settingsDialogOpen}\n className=\"widgetSettingsDialog\"\n onClose={onClose}\n >\n <DialogContent>\n <Form\n validator={validator}\n showErrorList={false}\n schema={widget.settingsSchema}\n uiSchema={widget.uiSchema}\n noHtml5Validate\n formData={settings}\n formContext={{ settings }}\n onSubmit={({ formData, errors }) => {\n if (errors.length === 0) {\n handleSettingsSave(id, formData);\n setSettingsDialogOpen(false);\n }\n }}\n experimental_defaultFormStateBehavior={{\n allOf: 'populateDefaults',\n }}\n >\n <DialogActions>\n <Button color=\"primary\" variant=\"contained\" type=\"submit\">\n {t('widgetSettingsOverlay.submitButtonTitle')}\n </Button>\n <Button color=\"secondary\" onClick={onClose}>\n {t('widgetSettingsOverlay.cancelButtonTitle')}\n </Button>\n </DialogActions>\n </Form>\n </DialogContent>\n </Dialog>\n )}\n <Grid\n container\n className={styles.iconGrid}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n {widget.settingsSchema && (\n <Grid item className=\"overlayGridItem\">\n <Tooltip title={t('widgetSettingsOverlay.editSettingsTooptip')}>\n <IconButton\n color=\"primary\"\n onClick={() => setSettingsDialogOpen(true)}\n >\n <SettingsIcon fontSize=\"large\" />\n </IconButton>\n </Tooltip>\n </Grid>\n )}\n {deletable !== false && (\n <Grid item className=\"overlayGridItem\">\n <Tooltip title={t('widgetSettingsOverlay.deleteWidgetTooltip')}>\n <IconButton color=\"secondary\" onClick={() => handleRemove(id)}>\n <DeleteIcon fontSize=\"large\" />\n </IconButton>\n </Tooltip>\n </Grid>\n )}\n </Grid>\n </div>\n );\n};\n"],"names":["MuiTheme"],"mappings":"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"}
|
|
@@ -7,6 +7,8 @@ import { Link } from 'react-router-dom';
|
|
|
7
7
|
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
8
8
|
import { FavoriteToggle } from '@backstage/core-components';
|
|
9
9
|
import { makeStyles } from '@material-ui/core/styles';
|
|
10
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
11
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
10
12
|
|
|
11
13
|
const useStyles = makeStyles((theme) => ({
|
|
12
14
|
listItem: {
|
|
@@ -24,6 +26,7 @@ const StarredEntityListItem = ({
|
|
|
24
26
|
}) => {
|
|
25
27
|
const classes = useStyles();
|
|
26
28
|
const catalogEntityRoute = useRouteRef(entityRouteRef);
|
|
29
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
27
30
|
let secondaryText = "";
|
|
28
31
|
if (showKind) {
|
|
29
32
|
secondaryText += entity.kind.toLocaleLowerCase("en-US");
|
|
@@ -55,7 +58,7 @@ const StarredEntityListItem = ({
|
|
|
55
58
|
FavoriteToggle,
|
|
56
59
|
{
|
|
57
60
|
id: `remove-favorite-${entity.metadata.uid}`,
|
|
58
|
-
title: "
|
|
61
|
+
title: t("starredEntityListItem.removeFavoriteEntityTitle"),
|
|
59
62
|
isFavorite: true,
|
|
60
63
|
onToggle: () => onToggleStarredEntity(entity)
|
|
61
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StarredEntityListItem.esm.js","sources":["../../../src/components/StarredEntityListItem/StarredEntityListItem.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Entity } from '@backstage/catalog-model';\nimport {\n EntityDisplayName,\n entityRouteParams,\n} from '@backstage/plugin-catalog-react';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { Link } from 'react-router-dom';\nimport { entityRouteRef } from '@backstage/plugin-catalog-react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { FavoriteToggle } from '@backstage/core-components';\nimport { makeStyles } from '@material-ui/core/styles';\n\ntype EntityListItemProps = {\n entity: Entity;\n onToggleStarredEntity: (entity: Entity) => void;\n showKind?: boolean;\n};\n\nconst useStyles = makeStyles(theme => ({\n listItem: {\n paddingBottom: theme.spacing(0),\n paddingTop: theme.spacing(0),\n },\n secondary: {\n textTransform: 'uppercase',\n },\n}));\n\nexport const StarredEntityListItem = ({\n entity,\n onToggleStarredEntity,\n showKind,\n}: EntityListItemProps) => {\n const classes = useStyles();\n const catalogEntityRoute = useRouteRef(entityRouteRef);\n\n let secondaryText = '';\n if (showKind) {\n secondaryText += entity.kind.toLocaleLowerCase('en-US');\n }\n if (entity.spec && 'type' in entity.spec) {\n if (showKind) {\n secondaryText += ' — ';\n }\n secondaryText += (entity.spec as { type: string }).type.toLocaleLowerCase(\n 'en-US',\n );\n }\n\n return (\n <ListItem\n dense\n className={classes.listItem}\n component={Link}\n button\n to={catalogEntityRoute(entityRouteParams(entity))}\n >\n <ListItemIcon\n // Prevent following the link when clicking on the icon\n onClick={e => {\n e.preventDefault();\n }}\n >\n <FavoriteToggle\n id={`remove-favorite-${entity.metadata.uid}`}\n title
|
|
1
|
+
{"version":3,"file":"StarredEntityListItem.esm.js","sources":["../../../src/components/StarredEntityListItem/StarredEntityListItem.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Entity } from '@backstage/catalog-model';\nimport {\n EntityDisplayName,\n entityRouteParams,\n} from '@backstage/plugin-catalog-react';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport { Link } from 'react-router-dom';\nimport { entityRouteRef } from '@backstage/plugin-catalog-react';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { FavoriteToggle } from '@backstage/core-components';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\ntype EntityListItemProps = {\n entity: Entity;\n onToggleStarredEntity: (entity: Entity) => void;\n showKind?: boolean;\n};\n\nconst useStyles = makeStyles(theme => ({\n listItem: {\n paddingBottom: theme.spacing(0),\n paddingTop: theme.spacing(0),\n },\n secondary: {\n textTransform: 'uppercase',\n },\n}));\n\nexport const StarredEntityListItem = ({\n entity,\n onToggleStarredEntity,\n showKind,\n}: EntityListItemProps) => {\n const classes = useStyles();\n const catalogEntityRoute = useRouteRef(entityRouteRef);\n const { t } = useTranslationRef(homeTranslationRef);\n\n let secondaryText = '';\n if (showKind) {\n secondaryText += entity.kind.toLocaleLowerCase('en-US');\n }\n if (entity.spec && 'type' in entity.spec) {\n if (showKind) {\n secondaryText += ' — ';\n }\n secondaryText += (entity.spec as { type: string }).type.toLocaleLowerCase(\n 'en-US',\n );\n }\n\n return (\n <ListItem\n dense\n className={classes.listItem}\n component={Link}\n button\n to={catalogEntityRoute(entityRouteParams(entity))}\n >\n <ListItemIcon\n // Prevent following the link when clicking on the icon\n onClick={e => {\n e.preventDefault();\n }}\n >\n <FavoriteToggle\n id={`remove-favorite-${entity.metadata.uid}`}\n title={t('starredEntityListItem.removeFavoriteEntityTitle')}\n isFavorite\n onToggle={() => onToggleStarredEntity(entity)}\n />\n </ListItemIcon>\n <ListItemText\n primary={<EntityDisplayName hideIcon entityRef={entity} />}\n secondary={secondaryText}\n />\n </ListItem>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;AAqCA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,QAAU,EAAA;AAAA,IACR,aAAA,EAAe,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC9B,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GAC7B;AAAA,EACA,SAAW,EAAA;AAAA,IACT,aAAe,EAAA;AAAA;AAEnB,CAAE,CAAA,CAAA;AAEK,MAAM,wBAAwB,CAAC;AAAA,EACpC,MAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAA2B,KAAA;AACzB,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,kBAAA,GAAqB,YAAY,cAAc,CAAA;AACrD,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAElD,EAAA,IAAI,aAAgB,GAAA,EAAA;AACpB,EAAA,IAAI,QAAU,EAAA;AACZ,IAAiB,aAAA,IAAA,MAAA,CAAO,IAAK,CAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA;AAExD,EAAA,IAAI,MAAO,CAAA,IAAA,IAAQ,MAAU,IAAA,MAAA,CAAO,IAAM,EAAA;AACxC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAiB,aAAA,IAAA,UAAA;AAAA;AAEnB,IAAkB,aAAA,IAAA,MAAA,CAAO,KAA0B,IAAK,CAAA,iBAAA;AAAA,MACtD;AAAA,KACF;AAAA;AAGF,EACE,uBAAA,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAK,EAAA,IAAA;AAAA,MACL,WAAW,OAAQ,CAAA,QAAA;AAAA,MACnB,SAAW,EAAA,IAAA;AAAA,MACX,MAAM,EAAA,IAAA;AAAA,MACN,EAAI,EAAA,kBAAA,CAAmB,iBAAkB,CAAA,MAAM,CAAC,CAAA;AAAA,MAEhD,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YAEC,SAAS,CAAK,CAAA,KAAA;AACZ,cAAA,CAAA,CAAE,cAAe,EAAA;AAAA,aACnB;AAAA,YAEA,QAAA,kBAAA,GAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBACC,EAAI,EAAA,CAAA,gBAAA,EAAmB,MAAO,CAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AAAA,gBAC1C,KAAA,EAAO,EAAE,iDAAiD,CAAA;AAAA,gBAC1D,UAAU,EAAA,IAAA;AAAA,gBACV,QAAA,EAAU,MAAM,qBAAA,CAAsB,MAAM;AAAA;AAAA;AAC9C;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,yBAAU,GAAA,CAAA,iBAAA,EAAA,EAAkB,QAAQ,EAAA,IAAA,EAAC,WAAW,MAAQ,EAAA,CAAA;AAAA,YACxD,SAAW,EAAA;AAAA;AAAA;AACb;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
2
3
|
import Typography from '@material-ui/core/Typography';
|
|
4
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
3
5
|
|
|
4
|
-
const VisitListEmpty = () =>
|
|
5
|
-
|
|
6
|
-
/* @__PURE__ */
|
|
7
|
-
|
|
6
|
+
const VisitListEmpty = () => {
|
|
7
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
8
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
9
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: t("visitList.empty.title") }),
|
|
10
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: t("visitList.empty.description") })
|
|
11
|
+
] });
|
|
12
|
+
};
|
|
8
13
|
|
|
9
14
|
export { VisitListEmpty };
|
|
10
15
|
//# sourceMappingURL=VisitListEmpty.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisitListEmpty.esm.js","sources":["../../../src/components/VisitList/VisitListEmpty.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Typography from '@material-ui/core/Typography';\n\nexport const VisitListEmpty = () => (\n
|
|
1
|
+
{"version":3,"file":"VisitListEmpty.esm.js","sources":["../../../src/components/VisitList/VisitListEmpty.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport Typography from '@material-ui/core/Typography';\nimport { homeTranslationRef } from '../../translation';\n\nexport const VisitListEmpty = () => {\n const { t } = useTranslationRef(homeTranslationRef);\n return (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {t('visitList.empty.title')}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {t('visitList.empty.description')}\n </Typography>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAoBO,MAAM,iBAAiB,MAAM;AAClC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAW,OAAQ,EAAA,OAAA,EAAQ,OAAM,eAC/B,EAAA,QAAA,EAAA,CAAA,CAAE,uBAAuB,CAC5B,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,cAAW,OAAQ,EAAA,OAAA,EAAQ,OAAM,eAC/B,EAAA,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAClC,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
2
3
|
import Typography from '@material-ui/core/Typography';
|
|
4
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
3
5
|
|
|
4
|
-
const VisitListFew = () =>
|
|
6
|
+
const VisitListFew = () => {
|
|
7
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
8
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "textSecondary", children: t("visitList.few.title") }) });
|
|
9
|
+
};
|
|
5
10
|
|
|
6
11
|
export { VisitListFew };
|
|
7
12
|
//# sourceMappingURL=VisitListFew.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VisitListFew.esm.js","sources":["../../../src/components/VisitList/VisitListFew.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Typography from '@material-ui/core/Typography';\n\nexport const VisitListFew = () => (\n
|
|
1
|
+
{"version":3,"file":"VisitListFew.esm.js","sources":["../../../src/components/VisitList/VisitListFew.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport Typography from '@material-ui/core/Typography';\nimport { homeTranslationRef } from '../../translation';\n\nexport const VisitListFew = () => {\n const { t } = useTranslationRef(homeTranslationRef);\n return (\n <>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {t('visitList.few.title')}\n </Typography>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;AAoBO,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EACE,uBAAA,GAAA,CAAA,QAAA,EAAA,EACE,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAQ,OAAM,eAC/B,EAAA,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAC1B,CACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -6,6 +6,8 @@ import { useApi } from '@backstage/core-plugin-api';
|
|
|
6
6
|
import Typography from '@material-ui/core/Typography';
|
|
7
7
|
import { makeStyles } from '@material-ui/core/styles';
|
|
8
8
|
import { stringifyEntityRef } from '@backstage/catalog-model';
|
|
9
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
10
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
9
11
|
|
|
10
12
|
const useStyles = makeStyles(
|
|
11
13
|
(theme) => ({
|
|
@@ -30,7 +32,8 @@ const useStyles = makeStyles(
|
|
|
30
32
|
);
|
|
31
33
|
const Content = (props) => {
|
|
32
34
|
const { emptyState, filter, linkDestination, responseLimit, subLinkText } = props;
|
|
33
|
-
const
|
|
35
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
36
|
+
const linkText = subLinkText || t("featuredDocsCard.learnMoreTitle");
|
|
34
37
|
const styles = useStyles();
|
|
35
38
|
const catalogApi = useApi(catalogApiRef);
|
|
36
39
|
const {
|
|
@@ -81,14 +84,14 @@ const Content = (props) => {
|
|
|
81
84
|
EmptyState,
|
|
82
85
|
{
|
|
83
86
|
missing: "data",
|
|
84
|
-
title: "
|
|
85
|
-
description: "
|
|
87
|
+
title: t("featuredDocsCard.empty.title"),
|
|
88
|
+
description: t("featuredDocsCard.empty.description"),
|
|
86
89
|
action: /* @__PURE__ */ jsx(
|
|
87
90
|
LinkButton,
|
|
88
91
|
{
|
|
89
92
|
to: "https://backstage.io/docs/features/techdocs/getting-started",
|
|
90
93
|
variant: "contained",
|
|
91
|
-
children: "
|
|
94
|
+
children: t("featuredDocsCard.empty.learnMoreLinkTitle")
|
|
92
95
|
}
|
|
93
96
|
)
|
|
94
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Content.esm.js","sources":["../../../src/homePageComponents/FeaturedDocsCard/Content.tsx"],"sourcesContent":["/*\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 { JSX } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n LinkButton,\n EmptyState,\n Link,\n Progress,\n ErrorPanel,\n} from '@backstage/core-components';\nimport {\n catalogApiRef,\n EntityDisplayName,\n} from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { EntityFilterQuery } from '@backstage/catalog-client';\n\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\n/**\n * Props customizing the <FeaturedDocsCard/> component.\n *\n * @public\n */\nexport type FeaturedDocsCardProps = {\n /** The entity filter used to display only the intended item/s */\n filter: EntityFilterQuery;\n /** An optional ReactNode for empty states */\n emptyState?: JSX.Element;\n /** An optional linkDestination to set for the Featured Doc */\n linkDestination?: string;\n /** An optional limit to set for link destination */\n responseLimit?: number;\n /** An optional string to customize sublink text */\n subLinkText?: string;\n};\n\n/** @public */\nexport type FeaturedDocsCardClassKey =\n | 'docDescription'\n | 'docSubLink'\n | 'docsTitleLink';\n\nconst useStyles = makeStyles(\n theme => ({\n docDescription: {\n fontSize: theme.typography.body1.fontSize,\n fontWeight: theme.typography.body1.fontWeight,\n marginBottom: theme.spacing(2),\n marginTop: theme.spacing(2),\n },\n docSubLink: {\n fontSize: theme.typography.subtitle1.fontSize,\n fontWeight: theme.typography.subtitle1.fontWeight,\n lineHeight: theme.typography.subtitle1.lineHeight,\n },\n docsTitleLink: {\n fontSize: theme.typography.h6.fontSize,\n fontWeight: theme.typography.h6.fontWeight,\n lineHeight: theme.typography.h6.lineHeight,\n },\n }),\n { name: 'HomeFeaturedDocsCard' },\n);\n\n/**\n * A component to display specific Featured Docs.\n *\n * @public\n */\nexport const Content = (props: FeaturedDocsCardProps): JSX.Element => {\n const { emptyState, filter, linkDestination, responseLimit, subLinkText } =\n props;\n const linkText = subLinkText || '
|
|
1
|
+
{"version":3,"file":"Content.esm.js","sources":["../../../src/homePageComponents/FeaturedDocsCard/Content.tsx"],"sourcesContent":["/*\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 { JSX } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n LinkButton,\n EmptyState,\n Link,\n Progress,\n ErrorPanel,\n} from '@backstage/core-components';\nimport {\n catalogApiRef,\n EntityDisplayName,\n} from '@backstage/plugin-catalog-react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { EntityFilterQuery } from '@backstage/catalog-client';\n\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\n/**\n * Props customizing the <FeaturedDocsCard/> component.\n *\n * @public\n */\nexport type FeaturedDocsCardProps = {\n /** The entity filter used to display only the intended item/s */\n filter: EntityFilterQuery;\n /** An optional ReactNode for empty states */\n emptyState?: JSX.Element;\n /** An optional linkDestination to set for the Featured Doc */\n linkDestination?: string;\n /** An optional limit to set for link destination */\n responseLimit?: number;\n /** An optional string to customize sublink text */\n subLinkText?: string;\n};\n\n/** @public */\nexport type FeaturedDocsCardClassKey =\n | 'docDescription'\n | 'docSubLink'\n | 'docsTitleLink';\n\nconst useStyles = makeStyles(\n theme => ({\n docDescription: {\n fontSize: theme.typography.body1.fontSize,\n fontWeight: theme.typography.body1.fontWeight,\n marginBottom: theme.spacing(2),\n marginTop: theme.spacing(2),\n },\n docSubLink: {\n fontSize: theme.typography.subtitle1.fontSize,\n fontWeight: theme.typography.subtitle1.fontWeight,\n lineHeight: theme.typography.subtitle1.lineHeight,\n },\n docsTitleLink: {\n fontSize: theme.typography.h6.fontSize,\n fontWeight: theme.typography.h6.fontWeight,\n lineHeight: theme.typography.h6.lineHeight,\n },\n }),\n { name: 'HomeFeaturedDocsCard' },\n);\n\n/**\n * A component to display specific Featured Docs.\n *\n * @public\n */\nexport const Content = (props: FeaturedDocsCardProps): JSX.Element => {\n const { emptyState, filter, linkDestination, responseLimit, subLinkText } =\n props;\n const { t } = useTranslationRef(homeTranslationRef);\n const linkText = subLinkText || t('featuredDocsCard.learnMoreTitle');\n const styles = useStyles();\n const catalogApi = useApi(catalogApiRef);\n const {\n value: entities,\n loading,\n error,\n } = useAsync(async () => {\n const response = await catalogApi.getEntities({\n filter: filter,\n limit: responseLimit || 10,\n });\n return response.items;\n });\n\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n return entities?.length ? (\n <>\n {entities.map(d => (\n <div\n key={`${d.metadata.name}-${d.kind}-${d.metadata.namespace}`}\n data-testid=\"docs-card-content\"\n >\n <Link\n className={styles.docsTitleLink}\n data-testid=\"docs-card-title\"\n to={\n linkDestination ||\n `/docs/${d.metadata.namespace || 'default'}/${d.kind}/${\n d.metadata.name\n }/`\n }\n >\n <EntityDisplayName entityRef={stringifyEntityRef(d)} />\n </Link>\n {d.metadata.description && (\n <Typography className={styles.docDescription}>\n {d.metadata.description}\n </Typography>\n )}\n <Link\n className={styles.docSubLink}\n data-testid=\"docs-card-sub-link\"\n to={\n linkDestination ||\n `/docs/${d.metadata.namespace || 'default'}/${d.kind}/${\n d.metadata.name\n }/`\n }\n >\n {linkText}\n </Link>\n </div>\n ))}\n </>\n ) : (\n emptyState || (\n <EmptyState\n missing=\"data\"\n title={t('featuredDocsCard.empty.title')}\n description={t('featuredDocsCard.empty.description')}\n action={\n <LinkButton\n to=\"https://backstage.io/docs/features/techdocs/getting-started\"\n variant=\"contained\"\n >\n {t('featuredDocsCard.empty.learnMoreLinkTitle')}\n </LinkButton>\n }\n />\n )\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -4,18 +4,21 @@ import Typography from '@material-ui/core/Typography';
|
|
|
4
4
|
import Grid from '@material-ui/core/Grid';
|
|
5
5
|
import { ContentModal } from '@backstage/plugin-home-react';
|
|
6
6
|
import { useStyles } from './styles.esm.js';
|
|
7
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
8
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
7
9
|
|
|
8
10
|
const Content = (props) => {
|
|
9
11
|
const styles = useStyles();
|
|
12
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
10
13
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
11
14
|
/* @__PURE__ */ jsx(
|
|
12
15
|
ContentModal,
|
|
13
16
|
{
|
|
14
17
|
modalContent: props.image,
|
|
15
|
-
linkContent: props.modalTitle || "
|
|
18
|
+
linkContent: props.modalTitle || t("quickStart.title")
|
|
16
19
|
}
|
|
17
20
|
),
|
|
18
|
-
/* @__PURE__ */ jsx(Typography, { variant: "body1", paragraph: true, children: props.cardDescription || "
|
|
21
|
+
/* @__PURE__ */ jsx(Typography, { variant: "body1", paragraph: true, children: props.cardDescription || t("quickStart.description") }),
|
|
19
22
|
/* @__PURE__ */ jsx(ContentModal, { modalContent: props.image, linkContent: props.image }),
|
|
20
23
|
/* @__PURE__ */ jsxs(
|
|
21
24
|
Grid,
|
|
@@ -33,7 +36,7 @@ const Content = (props) => {
|
|
|
33
36
|
underline: "none",
|
|
34
37
|
variant: "h6",
|
|
35
38
|
className: styles.link,
|
|
36
|
-
children: props.docsLinkTitle || "
|
|
39
|
+
children: props.docsLinkTitle || t("quickStart.learnMoreLinkTitle")
|
|
37
40
|
}
|
|
38
41
|
) })
|
|
39
42
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Content.esm.js","sources":["../../../src/homePageComponents/QuickStart/Content.tsx"],"sourcesContent":["/*\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 { JSX } from 'react';\nimport { Link } from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\nimport Grid from '@material-ui/core/Grid';\nimport { ContentModal } from '@backstage/plugin-home-react';\nimport { useStyles } from './styles';\n\n/**\n * Props customizing the <QuickStartCard/> component.\n *\n * @public\n */\nexport type QuickStartCardProps = {\n /** The modal link title */\n modalTitle?: string | JSX.Element;\n /** The link to docs title */\n docsLinkTitle?: string | JSX.Element;\n /** The link to docs */\n docsLink?: string;\n /** The video to play on the card\n * @deprecated This will be removed in the future, please use `additionalContent` instead\n */\n video?: JSX.Element;\n /** Additional card content */\n additionalContent?: JSX.Element;\n /** A quickstart image to display on the card */\n image: JSX.Element;\n /** The card description*/\n cardDescription?: string;\n /** A component used to download a quickStart image*/\n downloadImage?: JSX.Element;\n};\n\n/**\n * A component to display Quick Start info on the homepage.\n *\n * @public\n */\nexport const Content = (props: QuickStartCardProps): JSX.Element => {\n const styles = useStyles();\n return (\n <>\n <ContentModal\n modalContent={props.image}\n linkContent={props.modalTitle || '
|
|
1
|
+
{"version":3,"file":"Content.esm.js","sources":["../../../src/homePageComponents/QuickStart/Content.tsx"],"sourcesContent":["/*\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 { JSX } from 'react';\nimport { Link } from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\nimport Grid from '@material-ui/core/Grid';\nimport { ContentModal } from '@backstage/plugin-home-react';\nimport { useStyles } from './styles';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\n/**\n * Props customizing the <QuickStartCard/> component.\n *\n * @public\n */\nexport type QuickStartCardProps = {\n /** The modal link title */\n modalTitle?: string | JSX.Element;\n /** The link to docs title */\n docsLinkTitle?: string | JSX.Element;\n /** The link to docs */\n docsLink?: string;\n /** The video to play on the card\n * @deprecated This will be removed in the future, please use `additionalContent` instead\n */\n video?: JSX.Element;\n /** Additional card content */\n additionalContent?: JSX.Element;\n /** A quickstart image to display on the card */\n image: JSX.Element;\n /** The card description*/\n cardDescription?: string;\n /** A component used to download a quickStart image*/\n downloadImage?: JSX.Element;\n};\n\n/**\n * A component to display Quick Start info on the homepage.\n *\n * @public\n */\nexport const Content = (props: QuickStartCardProps): JSX.Element => {\n const styles = useStyles();\n const { t } = useTranslationRef(homeTranslationRef);\n return (\n <>\n <ContentModal\n modalContent={props.image}\n linkContent={props.modalTitle || t('quickStart.title')}\n />\n <Typography variant=\"body1\" paragraph>\n {props.cardDescription || t('quickStart.description')}\n </Typography>\n <ContentModal modalContent={props.image} linkContent={props.image} />\n <Grid\n container\n alignItems=\"center\"\n className={styles.contentActionContainer}\n >\n {props.downloadImage && <Grid item>{props.downloadImage}</Grid>}\n <Grid item>\n <Link\n to={props.docsLink || 'https://backstage.io/docs/getting-started/'}\n data-testid=\"quick-start-link-to-docs\"\n underline=\"none\"\n variant=\"h6\"\n className={styles.link}\n >\n {props.docsLinkTitle || t('quickStart.learnMoreLinkTitle')}\n </Link>\n </Grid>\n </Grid>\n {(props.additionalContent && props.additionalContent) ||\n (props.video && props.video)}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAwDa,MAAA,OAAA,GAAU,CAAC,KAA4C,KAAA;AAClE,EAAA,MAAM,SAAS,SAAU,EAAA;AACzB,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,cAAc,KAAM,CAAA,KAAA;AAAA,QACpB,WAAa,EAAA,KAAA,CAAM,UAAc,IAAA,CAAA,CAAE,kBAAkB;AAAA;AAAA,KACvD;AAAA,oBACA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAQ,EAAA,SAAA,EAAS,MAClC,QAAM,EAAA,KAAA,CAAA,eAAA,IAAmB,CAAE,CAAA,wBAAwB,CACtD,EAAA,CAAA;AAAA,wBACC,YAAa,EAAA,EAAA,YAAA,EAAc,MAAM,KAAO,EAAA,WAAA,EAAa,MAAM,KAAO,EAAA,CAAA;AAAA,oBACnE,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAS,EAAA,IAAA;AAAA,QACT,UAAW,EAAA,QAAA;AAAA,QACX,WAAW,MAAO,CAAA,sBAAA;AAAA,QAEjB,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,iCAAkB,GAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAE,gBAAM,aAAc,EAAA,CAAA;AAAA,0BACxD,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IACR,EAAA,QAAA,kBAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,MAAM,QAAY,IAAA,4CAAA;AAAA,cACtB,aAAY,EAAA,0BAAA;AAAA,cACZ,SAAU,EAAA,MAAA;AAAA,cACV,OAAQ,EAAA,IAAA;AAAA,cACR,WAAW,MAAO,CAAA,IAAA;AAAA,cAEjB,QAAA,EAAA,KAAA,CAAM,aAAiB,IAAA,CAAA,CAAE,+BAA+B;AAAA;AAAA,WAE7D,EAAA;AAAA;AAAA;AAAA,KACF;AAAA,IACE,MAAM,iBAAqB,IAAA,KAAA,CAAM,iBAChC,IAAA,KAAA,CAAM,SAAS,KAAM,CAAA;AAAA,GAC1B,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -11,6 +11,8 @@ import { useState } from 'react';
|
|
|
11
11
|
import useAsync from 'react-use/esm/useAsync';
|
|
12
12
|
import { StarredEntityListItem } from '../../components/StarredEntityListItem/StarredEntityListItem.esm.js';
|
|
13
13
|
import { makeStyles } from '@material-ui/core/styles';
|
|
14
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
15
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
14
16
|
|
|
15
17
|
const useStyles = makeStyles((theme) => ({
|
|
16
18
|
tabs: {
|
|
@@ -29,6 +31,7 @@ const Content = ({
|
|
|
29
31
|
const catalogApi = useApi(catalogApiRef);
|
|
30
32
|
const { starredEntities, toggleStarredEntity } = useStarredEntities();
|
|
31
33
|
const [activeTab, setActiveTab] = useState(0);
|
|
34
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
32
35
|
const entities = useAsync(async () => {
|
|
33
36
|
if (!starredEntities.size) {
|
|
34
37
|
return [];
|
|
@@ -46,7 +49,7 @@ const Content = ({
|
|
|
46
49
|
})).items.filter((e) => !!e);
|
|
47
50
|
}, [catalogApi, starredEntities]);
|
|
48
51
|
if (starredEntities.size === 0)
|
|
49
|
-
return /* @__PURE__ */ jsx(Typography, { variant: "body1", children: noStarredEntitiesMessage || "
|
|
52
|
+
return /* @__PURE__ */ jsx(Typography, { variant: "body1", children: noStarredEntitiesMessage || t("starredEntities.noStarredEntitiesMessage") });
|
|
50
53
|
if (entities.loading) {
|
|
51
54
|
return /* @__PURE__ */ jsx(Progress, {});
|
|
52
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Content.esm.js","sources":["../../../src/homePageComponents/StarredEntities/Content.tsx"],"sourcesContent":["/*\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 {\n catalogApiRef,\n useStarredEntities,\n} from '@backstage/plugin-catalog-react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport List from '@material-ui/core/List';\nimport Typography from '@material-ui/core/Typography';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport { ReactNode, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { StarredEntityListItem } from '../../components/StarredEntityListItem/StarredEntityListItem';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles(theme => ({\n tabs: {\n marginBottom: theme.spacing(1),\n },\n list: {\n paddingTop: 0,\n paddingBottom: 0,\n },\n}));\n\n/**\n * Props for the StarredEntities component\n *\n * @public\n */\nexport type StarredEntitiesProps = {\n noStarredEntitiesMessage?: ReactNode | undefined;\n groupByKind?: boolean;\n};\n\n/**\n * A component to display a list of starred entities for the user.\n *\n * @public\n */\nexport const Content = ({\n noStarredEntitiesMessage,\n groupByKind,\n}: StarredEntitiesProps) => {\n const classes = useStyles();\n const catalogApi = useApi(catalogApiRef);\n const { starredEntities, toggleStarredEntity } = useStarredEntities();\n const [activeTab, setActiveTab] = useState(0);\n\n // Grab starred entities from catalog to ensure they still exist and also retrieve display titles\n const entities = useAsync(async () => {\n if (!starredEntities.size) {\n return [];\n }\n\n return (\n await catalogApi.getEntitiesByRefs({\n entityRefs: [...starredEntities],\n fields: [\n 'kind',\n 'metadata.namespace',\n 'metadata.name',\n 'spec.type',\n 'metadata.title',\n 'spec.profile.displayName',\n ],\n })\n ).items.filter((e): e is Entity => !!e);\n }, [catalogApi, starredEntities]);\n\n if (starredEntities.size === 0)\n return (\n <Typography variant=\"body1\">\n {noStarredEntitiesMessage ||\n '
|
|
1
|
+
{"version":3,"file":"Content.esm.js","sources":["../../../src/homePageComponents/StarredEntities/Content.tsx"],"sourcesContent":["/*\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 {\n catalogApiRef,\n useStarredEntities,\n} from '@backstage/plugin-catalog-react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Progress, ResponseErrorPanel } from '@backstage/core-components';\nimport List from '@material-ui/core/List';\nimport Typography from '@material-ui/core/Typography';\nimport Tabs from '@material-ui/core/Tabs';\nimport Tab from '@material-ui/core/Tab';\nimport { ReactNode, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { StarredEntityListItem } from '../../components/StarredEntityListItem/StarredEntityListItem';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\nconst useStyles = makeStyles(theme => ({\n tabs: {\n marginBottom: theme.spacing(1),\n },\n list: {\n paddingTop: 0,\n paddingBottom: 0,\n },\n}));\n\n/**\n * Props for the StarredEntities component\n *\n * @public\n */\nexport type StarredEntitiesProps = {\n noStarredEntitiesMessage?: ReactNode | undefined;\n groupByKind?: boolean;\n};\n\n/**\n * A component to display a list of starred entities for the user.\n *\n * @public\n */\nexport const Content = ({\n noStarredEntitiesMessage,\n groupByKind,\n}: StarredEntitiesProps) => {\n const classes = useStyles();\n const catalogApi = useApi(catalogApiRef);\n const { starredEntities, toggleStarredEntity } = useStarredEntities();\n const [activeTab, setActiveTab] = useState(0);\n const { t } = useTranslationRef(homeTranslationRef);\n\n // Grab starred entities from catalog to ensure they still exist and also retrieve display titles\n const entities = useAsync(async () => {\n if (!starredEntities.size) {\n return [];\n }\n\n return (\n await catalogApi.getEntitiesByRefs({\n entityRefs: [...starredEntities],\n fields: [\n 'kind',\n 'metadata.namespace',\n 'metadata.name',\n 'spec.type',\n 'metadata.title',\n 'spec.profile.displayName',\n ],\n })\n ).items.filter((e): e is Entity => !!e);\n }, [catalogApi, starredEntities]);\n\n if (starredEntities.size === 0)\n return (\n <Typography variant=\"body1\">\n {noStarredEntitiesMessage ||\n t('starredEntities.noStarredEntitiesMessage')}\n </Typography>\n );\n\n if (entities.loading) {\n return <Progress />;\n }\n\n const groupedEntities: { [kind: string]: Entity[] } = {};\n entities.value?.forEach(entity => {\n const kind = entity.kind;\n if (!groupedEntities[kind]) {\n groupedEntities[kind] = [];\n }\n groupedEntities[kind].push(entity);\n });\n\n const groupByKindEntries = Object.entries(groupedEntities);\n\n return entities.error ? (\n <ResponseErrorPanel error={entities.error} />\n ) : (\n <div>\n {!groupByKind && (\n <List className={classes.list}>\n {entities.value\n ?.sort((a, b) =>\n (a.metadata.title ?? a.metadata.name).localeCompare(\n b.metadata.title ?? b.metadata.name,\n ),\n )\n .map(entity => (\n <StarredEntityListItem\n key={stringifyEntityRef(entity)}\n entity={entity}\n onToggleStarredEntity={toggleStarredEntity}\n showKind\n />\n ))}\n </List>\n )}\n\n {groupByKind && (\n <Tabs\n className={classes.tabs}\n value={activeTab}\n onChange={(_, newValue) => setActiveTab(newValue)}\n variant=\"scrollable\"\n scrollButtons=\"auto\"\n aria-label=\"entity-tabs\"\n >\n {groupByKindEntries.map(([kind]) => (\n <Tab key={kind} label={kind} />\n ))}\n </Tabs>\n )}\n\n {groupByKind &&\n groupByKindEntries.map(([kind, entitiesByKind], index) => (\n <div key={kind} hidden={groupByKind && activeTab !== index}>\n <List className={classes.list}>\n {entitiesByKind\n ?.sort((a, b) =>\n (a.metadata.title ?? a.metadata.name).localeCompare(\n b.metadata.title ?? b.metadata.name,\n ),\n )\n .map(entity => (\n <StarredEntityListItem\n key={stringifyEntityRef(entity)}\n entity={entity}\n onToggleStarredEntity={toggleStarredEntity}\n showKind={false}\n />\n ))}\n </List>\n </div>\n ))}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ import { jsx, Fragment } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useCallback } from 'react';
|
|
3
3
|
import Button from '@material-ui/core/Button';
|
|
4
4
|
import { useContext } from './Context.esm.js';
|
|
5
|
+
import { useTranslationRef } from '@backstage/frontend-plugin-api';
|
|
6
|
+
import { homeTranslationRef } from '../../translation.esm.js';
|
|
5
7
|
|
|
6
8
|
const Actions = () => {
|
|
7
9
|
const { collapsed, setCollapsed, visits, numVisitsOpen, loading } = useContext();
|
|
@@ -9,7 +11,8 @@ const Actions = () => {
|
|
|
9
11
|
() => setCollapsed((prevCollapsed) => !prevCollapsed),
|
|
10
12
|
[setCollapsed]
|
|
11
13
|
);
|
|
12
|
-
const
|
|
14
|
+
const { t } = useTranslationRef(homeTranslationRef);
|
|
15
|
+
const label = collapsed ? t("visitedByType.action.viewMore") : t("visitedByType.action.viewLess");
|
|
13
16
|
if (!loading && visits.length <= numVisitsOpen) return /* @__PURE__ */ jsx(Fragment, {});
|
|
14
17
|
return /* @__PURE__ */ jsx(Button, { variant: "text", onClick, children: label });
|
|
15
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Actions.esm.js","sources":["../../../src/homePageComponents/VisitedByType/Actions.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport Button from '@material-ui/core/Button';\nimport { useContext } from './Context';\n\nexport const Actions = () => {\n const { collapsed, setCollapsed, visits, numVisitsOpen, loading } =\n useContext();\n const onClick = useCallback(\n () => setCollapsed(prevCollapsed => !prevCollapsed),\n [setCollapsed],\n );\n const label = collapsed
|
|
1
|
+
{"version":3,"file":"Actions.esm.js","sources":["../../../src/homePageComponents/VisitedByType/Actions.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport Button from '@material-ui/core/Button';\nimport { useContext } from './Context';\nimport { useTranslationRef } from '@backstage/frontend-plugin-api';\nimport { homeTranslationRef } from '../../translation';\n\nexport const Actions = () => {\n const { collapsed, setCollapsed, visits, numVisitsOpen, loading } =\n useContext();\n const onClick = useCallback(\n () => setCollapsed(prevCollapsed => !prevCollapsed),\n [setCollapsed],\n );\n const { t } = useTranslationRef(homeTranslationRef);\n const label = collapsed\n ? t('visitedByType.action.viewMore')\n : t('visitedByType.action.viewLess');\n\n if (!loading && visits.length <= numVisitsOpen) return <></>;\n\n return (\n <Button variant=\"text\" onClick={onClick}>\n {label}\n </Button>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAsBO,MAAM,UAAU,MAAM;AAC3B,EAAA,MAAM,EAAE,SAAW,EAAA,YAAA,EAAc,QAAQ,aAAe,EAAA,OAAA,KACtD,UAAW,EAAA;AACb,EAAA,MAAM,OAAU,GAAA,WAAA;AAAA,IACd,MAAM,YAAA,CAAa,CAAiB,aAAA,KAAA,CAAC,aAAa,CAAA;AAAA,IAClD,CAAC,YAAY;AAAA,GACf;AACA,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,kBAAkB,CAAA;AAClD,EAAA,MAAM,QAAQ,SACV,GAAA,CAAA,CAAE,+BAA+B,CAAA,GACjC,EAAE,+BAA+B,CAAA;AAErC,EAAA,IAAI,CAAC,OAAW,IAAA,MAAA,CAAO,MAAU,IAAA,aAAA,yBAAwB,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;AAEzD,EAAA,uBACG,GAAA,CAAA,MAAA,EAAA,EAAO,OAAQ,EAAA,MAAA,EAAO,SACpB,QACH,EAAA,KAAA,EAAA,CAAA;AAEJ;;;;"}
|
package/dist/package.json.esm.js
CHANGED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createTranslationRef } from '@backstage/frontend-plugin-api';
|
|
2
|
+
|
|
3
|
+
const homeTranslationRef = createTranslationRef({
|
|
4
|
+
id: "home",
|
|
5
|
+
messages: {
|
|
6
|
+
addWidgetDialog: {
|
|
7
|
+
title: "Add new widget to dashboard"
|
|
8
|
+
},
|
|
9
|
+
customHomepageButtons: {
|
|
10
|
+
edit: "Edit",
|
|
11
|
+
restoreDefaults: "Restore defaults",
|
|
12
|
+
clearAll: "Clear all",
|
|
13
|
+
addWidget: "Add widget",
|
|
14
|
+
save: "Save"
|
|
15
|
+
},
|
|
16
|
+
customHomepage: {
|
|
17
|
+
noWidgets: "No widgets added. Start by clicking the 'Add widget' button."
|
|
18
|
+
},
|
|
19
|
+
widgetSettingsOverlay: {
|
|
20
|
+
editSettingsTooptip: "Edit settings",
|
|
21
|
+
deleteWidgetTooltip: "Delete widget",
|
|
22
|
+
submitButtonTitle: "Submit",
|
|
23
|
+
cancelButtonTitle: "Cancel"
|
|
24
|
+
},
|
|
25
|
+
starredEntityListItem: {
|
|
26
|
+
removeFavoriteEntityTitle: "Remove entity from favorites"
|
|
27
|
+
},
|
|
28
|
+
visitList: {
|
|
29
|
+
empty: {
|
|
30
|
+
title: "There are no visits to show yet.",
|
|
31
|
+
description: "Once you start using Backstage, your visits will appear here as a quick link to carry on where you left off."
|
|
32
|
+
},
|
|
33
|
+
few: {
|
|
34
|
+
title: "The more pages you visit, the more pages will appear here."
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
quickStart: {
|
|
38
|
+
title: "Onboarding",
|
|
39
|
+
description: "Get started with Backstage",
|
|
40
|
+
learnMoreLinkTitle: "Learn more"
|
|
41
|
+
},
|
|
42
|
+
starredEntities: {
|
|
43
|
+
noStarredEntitiesMessage: "Click the star beside an entity name to add it to this list!"
|
|
44
|
+
},
|
|
45
|
+
visitedByType: {
|
|
46
|
+
action: {
|
|
47
|
+
viewMore: "View more",
|
|
48
|
+
viewLess: "View less"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
featuredDocsCard: {
|
|
52
|
+
learnMoreTitle: "LEARN MORE",
|
|
53
|
+
empty: {
|
|
54
|
+
title: "No documents to show",
|
|
55
|
+
description: "Create your own document. Check out our Getting Started Information",
|
|
56
|
+
learnMoreLinkTitle: "DOCS"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
export { homeTranslationRef };
|
|
63
|
+
//# sourceMappingURL=translation.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translation.esm.js","sources":["../src/translation.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { createTranslationRef } from '@backstage/frontend-plugin-api';\n\n/**\n * @alpha\n */\nexport const homeTranslationRef = createTranslationRef({\n id: 'home',\n messages: {\n addWidgetDialog: {\n title: 'Add new widget to dashboard',\n },\n customHomepageButtons: {\n edit: 'Edit',\n restoreDefaults: 'Restore defaults',\n clearAll: 'Clear all',\n addWidget: 'Add widget',\n save: 'Save',\n },\n customHomepage: {\n noWidgets: \"No widgets added. Start by clicking the 'Add widget' button.\",\n },\n widgetSettingsOverlay: {\n editSettingsTooptip: 'Edit settings',\n deleteWidgetTooltip: 'Delete widget',\n submitButtonTitle: 'Submit',\n cancelButtonTitle: 'Cancel',\n },\n starredEntityListItem: {\n removeFavoriteEntityTitle: 'Remove entity from favorites',\n },\n visitList: {\n empty: {\n title: 'There are no visits to show yet.',\n description:\n 'Once you start using Backstage, your visits will appear here as a quick link to carry on where you left off.',\n },\n few: {\n title: 'The more pages you visit, the more pages will appear here.',\n },\n },\n quickStart: {\n title: 'Onboarding',\n description: 'Get started with Backstage',\n learnMoreLinkTitle: 'Learn more',\n },\n starredEntities: {\n noStarredEntitiesMessage:\n 'Click the star beside an entity name to add it to this list!',\n },\n visitedByType: {\n action: {\n viewMore: 'View more',\n viewLess: 'View less',\n },\n },\n featuredDocsCard: {\n learnMoreTitle: 'LEARN MORE',\n empty: {\n title: 'No documents to show',\n description:\n 'Create your own document. Check out our Getting Started Information',\n learnMoreLinkTitle: 'DOCS',\n },\n },\n },\n});\n"],"names":[],"mappings":";;AAoBO,MAAM,qBAAqB,oBAAqB,CAAA;AAAA,EACrD,EAAI,EAAA,MAAA;AAAA,EACJ,QAAU,EAAA;AAAA,IACR,eAAiB,EAAA;AAAA,MACf,KAAO,EAAA;AAAA,KACT;AAAA,IACA,qBAAuB,EAAA;AAAA,MACrB,IAAM,EAAA,MAAA;AAAA,MACN,eAAiB,EAAA,kBAAA;AAAA,MACjB,QAAU,EAAA,WAAA;AAAA,MACV,SAAW,EAAA,YAAA;AAAA,MACX,IAAM,EAAA;AAAA,KACR;AAAA,IACA,cAAgB,EAAA;AAAA,MACd,SAAW,EAAA;AAAA,KACb;AAAA,IACA,qBAAuB,EAAA;AAAA,MACrB,mBAAqB,EAAA,eAAA;AAAA,MACrB,mBAAqB,EAAA,eAAA;AAAA,MACrB,iBAAmB,EAAA,QAAA;AAAA,MACnB,iBAAmB,EAAA;AAAA,KACrB;AAAA,IACA,qBAAuB,EAAA;AAAA,MACrB,yBAA2B,EAAA;AAAA,KAC7B;AAAA,IACA,SAAW,EAAA;AAAA,MACT,KAAO,EAAA;AAAA,QACL,KAAO,EAAA,kCAAA;AAAA,QACP,WACE,EAAA;AAAA,OACJ;AAAA,MACA,GAAK,EAAA;AAAA,QACH,KAAO,EAAA;AAAA;AACT,KACF;AAAA,IACA,UAAY,EAAA;AAAA,MACV,KAAO,EAAA,YAAA;AAAA,MACP,WAAa,EAAA,4BAAA;AAAA,MACb,kBAAoB,EAAA;AAAA,KACtB;AAAA,IACA,eAAiB,EAAA;AAAA,MACf,wBACE,EAAA;AAAA,KACJ;AAAA,IACA,aAAe,EAAA;AAAA,MACb,MAAQ,EAAA;AAAA,QACN,QAAU,EAAA,WAAA;AAAA,QACV,QAAU,EAAA;AAAA;AACZ,KACF;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,cAAgB,EAAA,YAAA;AAAA,MAChB,KAAO,EAAA;AAAA,QACL,KAAO,EAAA,sBAAA;AAAA,QACP,WACE,EAAA,qEAAA;AAAA,QACF,kBAAoB,EAAA;AAAA;AACtB;AACF;AAEJ,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-home",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.10-next.0",
|
|
4
4
|
"description": "A Backstage plugin that helps you build a home page",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
@@ -68,17 +68,17 @@
|
|
|
68
68
|
"test": "backstage-cli package test"
|
|
69
69
|
},
|
|
70
70
|
"dependencies": {
|
|
71
|
-
"@backstage/catalog-client": "1.10.1
|
|
71
|
+
"@backstage/catalog-client": "1.10.1",
|
|
72
72
|
"@backstage/catalog-model": "1.7.4",
|
|
73
73
|
"@backstage/config": "1.3.2",
|
|
74
|
-
"@backstage/core-app-api": "1.17.
|
|
75
|
-
"@backstage/core-compat-api": "0.4.
|
|
76
|
-
"@backstage/core-components": "0.17.
|
|
77
|
-
"@backstage/core-plugin-api": "1.10.
|
|
78
|
-
"@backstage/frontend-plugin-api": "0.10.
|
|
79
|
-
"@backstage/plugin-catalog-react": "1.19.
|
|
80
|
-
"@backstage/plugin-home-react": "0.1.
|
|
81
|
-
"@backstage/theme": "0.6.
|
|
74
|
+
"@backstage/core-app-api": "1.17.1",
|
|
75
|
+
"@backstage/core-compat-api": "0.4.4-next.0",
|
|
76
|
+
"@backstage/core-components": "0.17.4-next.0",
|
|
77
|
+
"@backstage/core-plugin-api": "1.10.8",
|
|
78
|
+
"@backstage/frontend-plugin-api": "0.10.4-next.0",
|
|
79
|
+
"@backstage/plugin-catalog-react": "1.19.1-next.0",
|
|
80
|
+
"@backstage/plugin-home-react": "0.1.28-next.0",
|
|
81
|
+
"@backstage/theme": "0.6.7-next.0",
|
|
82
82
|
"@material-ui/core": "^4.12.2",
|
|
83
83
|
"@material-ui/icons": "^4.9.1",
|
|
84
84
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
@@ -94,9 +94,9 @@
|
|
|
94
94
|
"zod": "^3.22.4"
|
|
95
95
|
},
|
|
96
96
|
"devDependencies": {
|
|
97
|
-
"@backstage/cli": "0.33.
|
|
98
|
-
"@backstage/dev-utils": "1.1.
|
|
99
|
-
"@backstage/test-utils": "1.7.
|
|
97
|
+
"@backstage/cli": "0.33.1-next.0",
|
|
98
|
+
"@backstage/dev-utils": "1.1.12-next.0",
|
|
99
|
+
"@backstage/test-utils": "1.7.10-next.0",
|
|
100
100
|
"@testing-library/dom": "^10.0.0",
|
|
101
101
|
"@testing-library/jest-dom": "^6.0.0",
|
|
102
102
|
"@testing-library/react": "^16.0.0",
|