@backstage/plugin-home 0.8.7-next.1 → 0.8.7-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +0 -4
  3. package/dist/alpha.d.ts +3 -3
  4. package/dist/alpha.esm.js +2 -2
  5. package/dist/alpha.esm.js.map +1 -1
  6. package/dist/assets/TemplateBackstageLogo.esm.js +11 -11
  7. package/dist/assets/TemplateBackstageLogo.esm.js.map +1 -1
  8. package/dist/assets/TemplateBackstageLogoIcon.esm.js +11 -11
  9. package/dist/assets/TemplateBackstageLogoIcon.esm.js.map +1 -1
  10. package/dist/componentRenderers/ComponentAccordion.esm.js +39 -27
  11. package/dist/componentRenderers/ComponentAccordion.esm.js.map +1 -1
  12. package/dist/componentRenderers/ComponentTabs/ComponentTab.esm.js +2 -2
  13. package/dist/componentRenderers/ComponentTabs/ComponentTab.esm.js.map +1 -1
  14. package/dist/componentRenderers/ComponentTabs/ComponentTabs.esm.js +14 -10
  15. package/dist/componentRenderers/ComponentTabs/ComponentTabs.esm.js.map +1 -1
  16. package/dist/components/CustomHomepage/AddWidgetDialog.esm.js +31 -26
  17. package/dist/components/CustomHomepage/AddWidgetDialog.esm.js.map +1 -1
  18. package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js +53 -48
  19. package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js.map +1 -1
  20. package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js +78 -70
  21. package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js.map +1 -1
  22. package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js +55 -46
  23. package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js.map +1 -1
  24. package/dist/components/CustomHomepage/types.esm.js.map +1 -1
  25. package/dist/components/HomepageCompositionRoot.esm.js +2 -2
  26. package/dist/components/HomepageCompositionRoot.esm.js.map +1 -1
  27. package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js +30 -28
  28. package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js.map +1 -1
  29. package/dist/components/VisitList/ItemCategory.esm.js +2 -2
  30. package/dist/components/VisitList/ItemCategory.esm.js.map +1 -1
  31. package/dist/components/VisitList/ItemDetail.esm.js +11 -7
  32. package/dist/components/VisitList/ItemDetail.esm.js.map +1 -1
  33. package/dist/components/VisitList/ItemName.esm.js +5 -5
  34. package/dist/components/VisitList/ItemName.esm.js.map +1 -1
  35. package/dist/components/VisitList/VisitList.esm.js +23 -14
  36. package/dist/components/VisitList/VisitList.esm.js.map +1 -1
  37. package/dist/components/VisitList/VisitListEmpty.esm.js +5 -2
  38. package/dist/components/VisitList/VisitListEmpty.esm.js.map +1 -1
  39. package/dist/components/VisitList/VisitListFew.esm.js +2 -2
  40. package/dist/components/VisitList/VisitListFew.esm.js.map +1 -1
  41. package/dist/components/VisitList/VisitListItem.esm.js +12 -9
  42. package/dist/components/VisitList/VisitListItem.esm.js.map +1 -1
  43. package/dist/components/VisitList/VisitListSkeleton.esm.js +23 -17
  44. package/dist/components/VisitList/VisitListSkeleton.esm.js.map +1 -1
  45. package/dist/components/VisitListener.esm.js +3 -2
  46. package/dist/components/VisitListener.esm.js.map +1 -1
  47. package/dist/homePageComponents/CompanyLogo/CompanyLogo.esm.js +2 -2
  48. package/dist/homePageComponents/CompanyLogo/CompanyLogo.esm.js.map +1 -1
  49. package/dist/homePageComponents/FeaturedDocsCard/Content.esm.js +32 -30
  50. package/dist/homePageComponents/FeaturedDocsCard/Content.esm.js.map +1 -1
  51. package/dist/homePageComponents/HeaderWorldClock/HeaderWorldClock.esm.js +9 -8
  52. package/dist/homePageComponents/HeaderWorldClock/HeaderWorldClock.esm.js.map +1 -1
  53. package/dist/homePageComponents/QuickStart/Content.esm.js +34 -26
  54. package/dist/homePageComponents/QuickStart/Content.esm.js.map +1 -1
  55. package/dist/homePageComponents/QuickStart/ContentModal.esm.js +25 -21
  56. package/dist/homePageComponents/QuickStart/ContentModal.esm.js.map +1 -1
  57. package/dist/homePageComponents/RandomJoke/Actions.esm.js +2 -2
  58. package/dist/homePageComponents/RandomJoke/Actions.esm.js.map +1 -1
  59. package/dist/homePageComponents/RandomJoke/Content.esm.js +6 -3
  60. package/dist/homePageComponents/RandomJoke/Content.esm.js.map +1 -1
  61. package/dist/homePageComponents/RandomJoke/Context.esm.js +10 -9
  62. package/dist/homePageComponents/RandomJoke/Context.esm.js.map +1 -1
  63. package/dist/homePageComponents/RandomJoke/Settings.esm.js +19 -16
  64. package/dist/homePageComponents/RandomJoke/Settings.esm.js.map +1 -1
  65. package/dist/homePageComponents/StarredEntities/Content.esm.js +45 -40
  66. package/dist/homePageComponents/StarredEntities/Content.esm.js.map +1 -1
  67. package/dist/homePageComponents/Toolkit/Content.esm.js +11 -8
  68. package/dist/homePageComponents/Toolkit/Content.esm.js.map +1 -1
  69. package/dist/homePageComponents/Toolkit/Context.esm.js +5 -4
  70. package/dist/homePageComponents/Toolkit/Context.esm.js.map +1 -1
  71. package/dist/homePageComponents/VisitedByType/Actions.esm.js +4 -3
  72. package/dist/homePageComponents/VisitedByType/Actions.esm.js.map +1 -1
  73. package/dist/homePageComponents/VisitedByType/Content.esm.js +3 -2
  74. package/dist/homePageComponents/VisitedByType/Content.esm.js.map +1 -1
  75. package/dist/homePageComponents/VisitedByType/Context.esm.js +5 -4
  76. package/dist/homePageComponents/VisitedByType/Context.esm.js.map +1 -1
  77. package/dist/homePageComponents/VisitedByType/RecentlyVisited.esm.js +2 -2
  78. package/dist/homePageComponents/VisitedByType/RecentlyVisited.esm.js.map +1 -1
  79. package/dist/homePageComponents/VisitedByType/TopVisited.esm.js +2 -2
  80. package/dist/homePageComponents/VisitedByType/TopVisited.esm.js.map +1 -1
  81. package/dist/homePageComponents/VisitedByType/VisitedByType.esm.js +2 -2
  82. package/dist/homePageComponents/VisitedByType/VisitedByType.esm.js.map +1 -1
  83. package/dist/homePageComponents/WelcomeTitle/WelcomeTitle.esm.js +3 -2
  84. package/dist/homePageComponents/WelcomeTitle/WelcomeTitle.esm.js.map +1 -1
  85. package/dist/index.d.ts +33 -34
  86. package/dist/index.esm.js +1 -1
  87. package/package.json +15 -15
@@ -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 React from 'react';\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>Add new widget to dashboard</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":";;;;;;;;;;AAgCA,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,uBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,IAAA,EAAA,6BAA2B,CACxC,kBAAA,KAAA,CAAA,aAAA,CAAC,aACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAK,IACR,EAAA,EAAA,OAAA,CAAQ,IAAI,CAAU,MAAA,KAAA;AACrB,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,KAAK,MAAO,CAAA,IAAA;AAAA,QACZ,MAAM,EAAA,IAAA;AAAA,QACN,OAAA,EAAS,MAAM,SAAA,CAAU,MAAM;AAAA,OAAA;AAAA,sBAE9B,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAQ,CACX,CAAA;AAAA,sBACA,KAAA,CAAA,aAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,SAAA,EACE,OAAO,WACL,oBAAA,KAAA,CAAA,aAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAU,EAAA,MAAA;AAAA,cACV,OAAQ,EAAA,SAAA;AAAA,cACR,KAAM,EAAA;AAAA,aAAA;AAAA,YAEL,MAAO,CAAA;AAAA,WACV;AAAA,UAGJ,OAAA,sCACG,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAQ,KAAM,EAAA,aAAA,EAAA,EAC/B,QAAS,CAAA,MAAM,CAClB;AAAA;AAAA;AAEJ,KACF;AAAA,GAEH,CACH,CACF,CACF,CAAA;AAEJ;;;;"}
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>Add new widget to dashboard</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":";;;;;;;;;;AA+BA,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,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,eAAY,QAA2B,EAAA,6BAAA,EAAA,CAAA;AAAA,oBACxC,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;;;;"}
@@ -1,5 +1,5 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
1
2
  import Button from '@material-ui/core/Button';
2
- import React from 'react';
3
3
  import { makeStyles, createStyles } from '@material-ui/core/styles';
4
4
  import SaveIcon from '@material-ui/icons/Save';
5
5
  import DeleteIcon from '@material-ui/icons/Delete';
@@ -31,59 +31,64 @@ const CustomHomepageButtons = (props) => {
31
31
  restoreDefault
32
32
  } = props;
33
33
  const styles = useStyles();
34
- return /* @__PURE__ */ React.createElement(React.Fragment, null, !editMode && numWidgets > 0 ? /* @__PURE__ */ React.createElement(
34
+ return /* @__PURE__ */ jsx(Fragment, { children: !editMode && numWidgets > 0 ? /* @__PURE__ */ jsx(
35
35
  Button,
36
36
  {
37
37
  variant: "contained",
38
38
  color: "primary",
39
39
  onClick: () => changeEditMode(true),
40
40
  size: "small",
41
- startIcon: /* @__PURE__ */ React.createElement(EditIcon, null)
42
- },
43
- "Edit"
44
- ) : /* @__PURE__ */ React.createElement(React.Fragment, null, defaultConfigAvailable && /* @__PURE__ */ React.createElement(
45
- Button,
46
- {
47
- variant: "contained",
48
- className: styles.contentHeaderBtn,
49
- onClick: restoreDefault,
50
- size: "small",
51
- startIcon: /* @__PURE__ */ React.createElement(CancelIcon, null)
52
- },
53
- "Restore defaults"
54
- ), numWidgets > 0 && /* @__PURE__ */ React.createElement(
55
- Button,
56
- {
57
- variant: "contained",
58
- color: "secondary",
59
- className: styles.contentHeaderBtn,
60
- onClick: clearLayout,
61
- size: "small",
62
- startIcon: /* @__PURE__ */ React.createElement(DeleteIcon, null)
63
- },
64
- "Clear all"
65
- ), /* @__PURE__ */ React.createElement(
66
- Button,
67
- {
68
- variant: "contained",
69
- className: styles.contentHeaderBtn,
70
- onClick: () => setAddWidgetDialogOpen(true),
71
- size: "small",
72
- startIcon: /* @__PURE__ */ React.createElement(AddIcon, null)
73
- },
74
- "Add widget"
75
- ), numWidgets > 0 && /* @__PURE__ */ React.createElement(
76
- Button,
77
- {
78
- className: styles.contentHeaderBtn,
79
- variant: "contained",
80
- color: "primary",
81
- onClick: () => changeEditMode(false),
82
- size: "small",
83
- startIcon: /* @__PURE__ */ React.createElement(SaveIcon, null)
84
- },
85
- "Save"
86
- )));
41
+ startIcon: /* @__PURE__ */ jsx(EditIcon, {}),
42
+ children: "Edit"
43
+ }
44
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
45
+ defaultConfigAvailable && /* @__PURE__ */ jsx(
46
+ Button,
47
+ {
48
+ variant: "contained",
49
+ className: styles.contentHeaderBtn,
50
+ onClick: restoreDefault,
51
+ size: "small",
52
+ startIcon: /* @__PURE__ */ jsx(CancelIcon, {}),
53
+ children: "Restore defaults"
54
+ }
55
+ ),
56
+ numWidgets > 0 && /* @__PURE__ */ jsx(
57
+ Button,
58
+ {
59
+ variant: "contained",
60
+ color: "secondary",
61
+ className: styles.contentHeaderBtn,
62
+ onClick: clearLayout,
63
+ size: "small",
64
+ startIcon: /* @__PURE__ */ jsx(DeleteIcon, {}),
65
+ children: "Clear all"
66
+ }
67
+ ),
68
+ /* @__PURE__ */ jsx(
69
+ Button,
70
+ {
71
+ variant: "contained",
72
+ className: styles.contentHeaderBtn,
73
+ onClick: () => setAddWidgetDialogOpen(true),
74
+ size: "small",
75
+ startIcon: /* @__PURE__ */ jsx(AddIcon, {}),
76
+ children: "Add widget"
77
+ }
78
+ ),
79
+ numWidgets > 0 && /* @__PURE__ */ jsx(
80
+ Button,
81
+ {
82
+ className: styles.contentHeaderBtn,
83
+ variant: "contained",
84
+ color: "primary",
85
+ onClick: () => changeEditMode(false),
86
+ size: "small",
87
+ startIcon: /* @__PURE__ */ jsx(SaveIcon, {}),
88
+ children: "Save"
89
+ }
90
+ )
91
+ ] }) });
87
92
  };
88
93
 
89
94
  export { CustomHomepageButtons };
@@ -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 React from 'react';\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 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 Restore defaults\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 Clear all\n </Button>\n )}\n <Button\n variant=\"contained\"\n className={styles.contentHeaderBtn}\n onClick={() => setAddWidgetDialogOpen(true)}\n size=\"small\"\n startIcon={<AddIcon />}\n >\n Add widget\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 Save\n </Button>\n )}\n </>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAwBA,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;AAEzB,EAAA,uBAEK,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,CAAC,QAAY,IAAA,UAAA,GAAa,CACzB,mBAAA,KAAA,CAAA,aAAA;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,sCAAY,QAAS,EAAA,IAAA;AAAA,KAAA;AAAA,IACtB;AAAA,GAED,6DAGG,sBACC,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,WAAW,MAAO,CAAA,gBAAA;AAAA,MAClB,OAAS,EAAA,cAAA;AAAA,MACT,IAAK,EAAA,OAAA;AAAA,MACL,SAAA,sCAAY,UAAW,EAAA,IAAA;AAAA,KAAA;AAAA,IACxB;AAAA,GAED,EAED,aAAa,CACZ,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,KAAM,EAAA,WAAA;AAAA,MACN,WAAW,MAAO,CAAA,gBAAA;AAAA,MAClB,OAAS,EAAA,WAAA;AAAA,MACT,IAAK,EAAA,OAAA;AAAA,MACL,SAAA,sCAAY,UAAW,EAAA,IAAA;AAAA,KAAA;AAAA,IACxB;AAAA,GAIH,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,WAAW,MAAO,CAAA,gBAAA;AAAA,MAClB,OAAA,EAAS,MAAM,sBAAA,CAAuB,IAAI,CAAA;AAAA,MAC1C,IAAK,EAAA,OAAA;AAAA,MACL,SAAA,sCAAY,OAAQ,EAAA,IAAA;AAAA,KAAA;AAAA,IACrB;AAAA,GAED,EACC,aAAa,CACZ,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,WAAW,MAAO,CAAA,gBAAA;AAAA,MAClB,OAAQ,EAAA,WAAA;AAAA,MACR,KAAM,EAAA,SAAA;AAAA,MACN,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,MACnC,IAAK,EAAA,OAAA;AAAA,MACL,SAAA,sCAAY,QAAS,EAAA,IAAA;AAAA,KAAA;AAAA,IACtB;AAAA,GAIL,CAEJ,CAAA;AAEJ;;;;"}
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 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 Restore defaults\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 Clear all\n </Button>\n )}\n <Button\n variant=\"contained\"\n className={styles.contentHeaderBtn}\n onClick={() => setAddWidgetDialogOpen(true)}\n size=\"small\"\n startIcon={<AddIcon />}\n >\n Add widget\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 Save\n </Button>\n )}\n </>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAuBA,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;AAEzB,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,MACtB,QAAA,EAAA;AAAA;AAAA,sBAKE,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,QACxB,QAAA,EAAA;AAAA;AAAA,KAED;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,QACxB,QAAA,EAAA;AAAA;AAAA,KAED;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,QACrB,QAAA,EAAA;AAAA;AAAA,KAED;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,QACtB,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EAEJ,CAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -1,4 +1,5 @@
1
- import React, { useMemo, useCallback } from 'react';
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useMemo, useState, useCallback, isValidElement } from 'react';
2
3
  import { WidthProvider, Responsive } from 'react-grid-layout';
3
4
  import { useElementFilter, useApi, storageApiRef, getComponentData } from '@backstage/core-plugin-api';
4
5
  import 'react-grid-layout/css/styles.css';
@@ -81,7 +82,7 @@ function useHomeStorage(defaultWidgets) {
81
82
  const convertConfigToDefaultWidgets = (config, availableWidgets) => {
82
83
  const ret = config.map((conf, i) => {
83
84
  const c = LayoutConfigurationSchema.parse(conf);
84
- const name = React.isValidElement(c.component) ? getComponentData(c.component, "core.extensionName") : c.component;
85
+ const name = isValidElement(c.component) ? getComponentData(c.component, "core.extensionName") : c.component;
85
86
  if (!name) {
86
87
  return null;
87
88
  }
@@ -148,9 +149,9 @@ const CustomHomepageGrid = (props) => {
148
149
  return props.config ? convertConfigToDefaultWidgets(props.config, availableWidgets) : [];
149
150
  }, [props.config, availableWidgets]);
150
151
  const [widgets, setWidgets] = useHomeStorage(defaultLayout);
151
- const [addWidgetDialogOpen, setAddWidgetDialogOpen] = React.useState(false);
152
+ const [addWidgetDialogOpen, setAddWidgetDialogOpen] = useState(false);
152
153
  const editModeOn = widgets.find((w) => w.layout.isResizable) !== void 0;
153
- const [editMode, setEditMode] = React.useState(editModeOn);
154
+ const [editMode, setEditMode] = useState(editModeOn);
154
155
  const getWidgetByName = (name) => {
155
156
  return availableWidgets.find((widget) => widget.name === name);
156
157
  };
@@ -240,74 +241,81 @@ const CustomHomepageGrid = (props) => {
240
241
  })
241
242
  );
242
243
  };
243
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: "" }, /* @__PURE__ */ React.createElement(
244
- CustomHomepageButtons,
245
- {
246
- editMode,
247
- numWidgets: widgets.length,
248
- clearLayout,
249
- setAddWidgetDialogOpen,
250
- changeEditMode,
251
- defaultConfigAvailable: props.config !== void 0,
252
- restoreDefault: handleRestoreDefaultConfig
253
- }
254
- )), /* @__PURE__ */ React.createElement(
255
- Dialog,
256
- {
257
- open: addWidgetDialogOpen,
258
- onClose: () => setAddWidgetDialogOpen(false)
259
- },
260
- /* @__PURE__ */ React.createElement(AddWidgetDialog, { widgets: availableWidgets, handleAdd })
261
- ), !editMode && widgets.length === 0 && /* @__PURE__ */ React.createElement(Typography, { variant: "h5", align: "center" }, "No widgets added. Start by clicking the 'Add widget' button."), /* @__PURE__ */ React.createElement(
262
- ResponsiveGrid,
263
- {
264
- className: styles.responsiveGrid,
265
- measureBeforeMount: true,
266
- compactType: props.compactType,
267
- style: props.style,
268
- allowOverlap: props.allowOverlap,
269
- preventCollision: props.preventCollision ?? true,
270
- draggableCancel: ".overlayGridItem,.widgetSettingsDialog,.disabled",
271
- containerPadding: props.containerPadding,
272
- margin: props.containerMargin,
273
- breakpoints: props.breakpoints ? props.breakpoints : theme.breakpoints.values,
274
- cols: props.cols ? props.cols : { xl: 12, lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 },
275
- rowHeight: props.rowHeight ?? 60,
276
- onLayoutChange: handleLayoutChange,
277
- layouts: { xl: widgets.map((w) => w.layout) }
278
- },
279
- widgets.map((w) => {
280
- const l = w.layout;
281
- const widgetName = getWidgetNameFromKey(l.i);
282
- const widget = getWidgetByName(widgetName);
283
- if (!widget || !widget.component) {
284
- return null;
244
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
245
+ /* @__PURE__ */ jsx(ContentHeader, { title: "", children: /* @__PURE__ */ jsx(
246
+ CustomHomepageButtons,
247
+ {
248
+ editMode,
249
+ numWidgets: widgets.length,
250
+ clearLayout,
251
+ setAddWidgetDialogOpen,
252
+ changeEditMode,
253
+ defaultConfigAvailable: props.config !== void 0,
254
+ restoreDefault: handleRestoreDefaultConfig
285
255
  }
286
- const widgetProps = {
287
- ...widget.component.props,
288
- ...w.settings ?? {}
289
- };
290
- return /* @__PURE__ */ React.createElement(
291
- "div",
292
- {
293
- key: l.i,
294
- className: `${styles.widgetWrapper} ${editMode && "edit"} ${w.movable === false && "disabled"}`
295
- },
296
- /* @__PURE__ */ React.createElement(ErrorBoundary, null, /* @__PURE__ */ React.createElement(widget.component.type, { ...widgetProps })),
297
- editMode && /* @__PURE__ */ React.createElement(
298
- WidgetSettingsOverlay,
299
- {
300
- id: l.i,
301
- widget,
302
- handleRemove,
303
- handleSettingsSave,
304
- settings: w.settings,
305
- deletable: w.deletable
256
+ ) }),
257
+ /* @__PURE__ */ jsx(
258
+ Dialog,
259
+ {
260
+ open: addWidgetDialogOpen,
261
+ onClose: () => setAddWidgetDialogOpen(false),
262
+ children: /* @__PURE__ */ jsx(AddWidgetDialog, { widgets: availableWidgets, handleAdd })
263
+ }
264
+ ),
265
+ !editMode && widgets.length === 0 && /* @__PURE__ */ jsx(Typography, { variant: "h5", align: "center", children: "No widgets added. Start by clicking the 'Add widget' button." }),
266
+ /* @__PURE__ */ jsx(
267
+ ResponsiveGrid,
268
+ {
269
+ className: styles.responsiveGrid,
270
+ measureBeforeMount: true,
271
+ compactType: props.compactType,
272
+ style: props.style,
273
+ allowOverlap: props.allowOverlap,
274
+ preventCollision: props.preventCollision ?? true,
275
+ draggableCancel: ".overlayGridItem,.widgetSettingsDialog,.disabled",
276
+ containerPadding: props.containerPadding,
277
+ margin: props.containerMargin,
278
+ breakpoints: props.breakpoints ? props.breakpoints : theme.breakpoints.values,
279
+ cols: props.cols ? props.cols : { xl: 12, lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 },
280
+ rowHeight: props.rowHeight ?? 60,
281
+ onLayoutChange: handleLayoutChange,
282
+ layouts: { xl: widgets.map((w) => w.layout) },
283
+ children: widgets.map((w) => {
284
+ const l = w.layout;
285
+ const widgetName = getWidgetNameFromKey(l.i);
286
+ const widget = getWidgetByName(widgetName);
287
+ if (!widget || !widget.component) {
288
+ return null;
306
289
  }
307
- )
308
- );
309
- })
310
- ));
290
+ const widgetProps = {
291
+ ...widget.component.props,
292
+ ...w.settings ?? {}
293
+ };
294
+ return /* @__PURE__ */ jsxs(
295
+ "div",
296
+ {
297
+ className: `${styles.widgetWrapper} ${editMode && "edit"} ${w.movable === false && "disabled"}`,
298
+ children: [
299
+ /* @__PURE__ */ jsx(ErrorBoundary, { children: /* @__PURE__ */ jsx(widget.component.type, { ...widgetProps }) }),
300
+ editMode && /* @__PURE__ */ jsx(
301
+ WidgetSettingsOverlay,
302
+ {
303
+ id: l.i,
304
+ widget,
305
+ handleRemove,
306
+ handleSettingsSave,
307
+ settings: w.settings,
308
+ deletable: w.deletable
309
+ }
310
+ )
311
+ ]
312
+ },
313
+ l.i
314
+ );
315
+ })
316
+ }
317
+ )
318
+ ] });
311
319
  };
312
320
 
313
321
  export { CustomHomepageGrid };
@@ -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 React, { 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 = React.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] = React.useState(false);\n const editModeOn = widgets.find(w => w.layout.isResizable) !== undefined;\n const [editMode, setEditMode] = React.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=\"\">\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';\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=\"\">\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,3 +1,4 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
1
2
  import Button from '@material-ui/core/Button';
2
3
  import Dialog from '@material-ui/core/Dialog';
3
4
  import DialogActions from '@material-ui/core/DialogActions';
@@ -8,10 +9,10 @@ import Tooltip from '@material-ui/core/Tooltip';
8
9
  import { makeStyles, createStyles } from '@material-ui/core/styles';
9
10
  import DeleteIcon from '@material-ui/icons/Delete';
10
11
  import SettingsIcon from '@material-ui/icons/Settings';
12
+ import { useState } from 'react';
11
13
  import { withTheme } from '@rjsf/core';
12
14
  import { Theme } from '@rjsf/material-ui';
13
15
  import validator from '@rjsf/validator-ajv8';
14
- import React from 'react';
15
16
 
16
17
  const Form = withTheme(Theme);
17
18
  const useStyles = makeStyles(
@@ -36,56 +37,64 @@ const useStyles = makeStyles(
36
37
  );
37
38
  const WidgetSettingsOverlay = (props) => {
38
39
  const { id, widget, settings, handleRemove, handleSettingsSave, deletable } = props;
39
- const [settingsDialogOpen, setSettingsDialogOpen] = React.useState(false);
40
+ const [settingsDialogOpen, setSettingsDialogOpen] = useState(false);
40
41
  const styles = useStyles();
41
42
  const onClose = () => setSettingsDialogOpen(false);
42
- return /* @__PURE__ */ React.createElement("div", { className: styles.settingsOverlay }, widget.settingsSchema && /* @__PURE__ */ React.createElement(
43
- Dialog,
44
- {
45
- open: settingsDialogOpen,
46
- className: "widgetSettingsDialog",
47
- onClose
48
- },
49
- /* @__PURE__ */ React.createElement(DialogContent, null, /* @__PURE__ */ React.createElement(
50
- Form,
43
+ return /* @__PURE__ */ jsxs("div", { className: styles.settingsOverlay, children: [
44
+ widget.settingsSchema && /* @__PURE__ */ jsx(
45
+ Dialog,
51
46
  {
52
- validator,
53
- showErrorList: false,
54
- schema: widget.settingsSchema,
55
- uiSchema: widget.uiSchema,
56
- noHtml5Validate: true,
57
- formData: settings,
58
- formContext: { settings },
59
- onSubmit: ({ formData, errors }) => {
60
- if (errors.length === 0) {
61
- handleSettingsSave(id, formData);
62
- setSettingsDialogOpen(false);
47
+ open: settingsDialogOpen,
48
+ className: "widgetSettingsDialog",
49
+ onClose,
50
+ children: /* @__PURE__ */ jsx(DialogContent, { children: /* @__PURE__ */ jsx(
51
+ Form,
52
+ {
53
+ validator,
54
+ showErrorList: false,
55
+ schema: widget.settingsSchema,
56
+ uiSchema: widget.uiSchema,
57
+ noHtml5Validate: true,
58
+ formData: settings,
59
+ formContext: { settings },
60
+ onSubmit: ({ formData, errors }) => {
61
+ if (errors.length === 0) {
62
+ handleSettingsSave(id, formData);
63
+ setSettingsDialogOpen(false);
64
+ }
65
+ },
66
+ experimental_defaultFormStateBehavior: {
67
+ allOf: "populateDefaults"
68
+ },
69
+ children: /* @__PURE__ */ jsxs(DialogActions, { children: [
70
+ /* @__PURE__ */ jsx(Button, { color: "primary", variant: "contained", type: "submit", children: "Submit" }),
71
+ /* @__PURE__ */ jsx(Button, { color: "secondary", onClick: onClose, children: "Cancel" })
72
+ ] })
63
73
  }
64
- },
65
- experimental_defaultFormStateBehavior: {
66
- allOf: "populateDefaults"
67
- }
68
- },
69
- /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(Button, { color: "primary", variant: "contained", type: "submit" }, "Submit"), /* @__PURE__ */ React.createElement(Button, { color: "secondary", onClick: onClose }, "Cancel"))
70
- ))
71
- ), /* @__PURE__ */ React.createElement(
72
- Grid,
73
- {
74
- container: true,
75
- className: styles.iconGrid,
76
- alignItems: "center",
77
- justifyContent: "center"
78
- },
79
- widget.settingsSchema && /* @__PURE__ */ React.createElement(Grid, { item: true, className: "overlayGridItem" }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Edit settings" }, /* @__PURE__ */ React.createElement(
80
- IconButton,
74
+ ) })
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsxs(
78
+ Grid,
81
79
  {
82
- color: "primary",
83
- onClick: () => setSettingsDialogOpen(true)
84
- },
85
- /* @__PURE__ */ React.createElement(SettingsIcon, { fontSize: "large" })
86
- ))),
87
- deletable !== false && /* @__PURE__ */ React.createElement(Grid, { item: true, className: "overlayGridItem" }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Delete widget" }, /* @__PURE__ */ React.createElement(IconButton, { color: "secondary", onClick: () => handleRemove(id) }, /* @__PURE__ */ React.createElement(DeleteIcon, { fontSize: "large" }))))
88
- ));
80
+ container: true,
81
+ className: styles.iconGrid,
82
+ alignItems: "center",
83
+ justifyContent: "center",
84
+ children: [
85
+ widget.settingsSchema && /* @__PURE__ */ jsx(Grid, { item: true, className: "overlayGridItem", children: /* @__PURE__ */ jsx(Tooltip, { title: "Edit settings", children: /* @__PURE__ */ jsx(
86
+ IconButton,
87
+ {
88
+ color: "primary",
89
+ onClick: () => setSettingsDialogOpen(true),
90
+ children: /* @__PURE__ */ jsx(SettingsIcon, { fontSize: "large" })
91
+ }
92
+ ) }) }),
93
+ deletable !== false && /* @__PURE__ */ jsx(Grid, { item: true, className: "overlayGridItem", children: /* @__PURE__ */ jsx(Tooltip, { title: "Delete widget", children: /* @__PURE__ */ jsx(IconButton, { color: "secondary", onClick: () => handleRemove(id), children: /* @__PURE__ */ jsx(DeleteIcon, { fontSize: "large" }) }) }) })
94
+ ]
95
+ }
96
+ )
97
+ ] });
89
98
  };
90
99
 
91
100
  export { WidgetSettingsOverlay };