@backstage/plugin-home 0.7.3-next.1 → 0.7.4-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.
Files changed (142) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/alpha/package.json +1 -1
  3. package/dist/alpha.esm.js +1 -1
  4. package/dist/alpha.esm.js.map +1 -1
  5. package/dist/api/VisitsApi.esm.js +11 -0
  6. package/dist/api/VisitsApi.esm.js.map +1 -0
  7. package/dist/api/VisitsStorageApi.esm.js +118 -0
  8. package/dist/api/VisitsStorageApi.esm.js.map +1 -0
  9. package/dist/api/VisitsWebStorageApi.esm.js +15 -0
  10. package/dist/api/VisitsWebStorageApi.esm.js.map +1 -0
  11. package/dist/api/config.esm.js +37 -0
  12. package/dist/api/config.esm.js.map +1 -0
  13. package/dist/assets/TemplateBackstageLogo.esm.js +22 -0
  14. package/dist/assets/TemplateBackstageLogo.esm.js.map +1 -0
  15. package/dist/assets/TemplateBackstageLogoIcon.esm.js +33 -0
  16. package/dist/assets/TemplateBackstageLogoIcon.esm.js.map +1 -0
  17. package/dist/{esm/index-BNfZuEhy.esm.js → componentRenderers/ComponentAccordion.esm.js} +2 -26
  18. package/dist/componentRenderers/ComponentAccordion.esm.js.map +1 -0
  19. package/dist/componentRenderers/ComponentTabs/ComponentTab.esm.js +9 -0
  20. package/dist/componentRenderers/ComponentTabs/ComponentTab.esm.js.map +1 -0
  21. package/dist/componentRenderers/ComponentTabs/ComponentTabs.esm.js +23 -0
  22. package/dist/componentRenderers/ComponentTabs/ComponentTabs.esm.js.map +1 -0
  23. package/dist/componentRenderers/index.esm.js +4 -0
  24. package/dist/componentRenderers/index.esm.js.map +1 -0
  25. package/dist/components/CustomHomepage/AddWidgetDialog.esm.js +45 -0
  26. package/dist/components/CustomHomepage/AddWidgetDialog.esm.js.map +1 -0
  27. package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js +90 -0
  28. package/dist/components/CustomHomepage/CustomHomepageButtons.esm.js.map +1 -0
  29. package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js +319 -0
  30. package/dist/components/CustomHomepage/CustomHomepageGrid.esm.js.map +1 -0
  31. package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js +88 -0
  32. package/dist/components/CustomHomepage/WidgetSettingsOverlay.esm.js.map +1 -0
  33. package/dist/components/CustomHomepage/types.esm.js +48 -0
  34. package/dist/components/CustomHomepage/types.esm.js.map +1 -0
  35. package/dist/components/HomepageCompositionRoot.esm.js +12 -0
  36. package/dist/components/HomepageCompositionRoot.esm.js.map +1 -0
  37. package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js +31 -0
  38. package/dist/components/StarredEntityListItem/StarredEntityListItem.esm.js.map +1 -0
  39. package/dist/components/VisitList/ItemCategory.esm.js +63 -0
  40. package/dist/components/VisitList/ItemCategory.esm.js.map +1 -0
  41. package/dist/components/VisitList/ItemDetail.esm.js +26 -0
  42. package/dist/components/VisitList/ItemDetail.esm.js.map +1 -0
  43. package/dist/components/VisitList/ItemName.esm.js +27 -0
  44. package/dist/components/VisitList/ItemName.esm.js.map +1 -0
  45. package/dist/components/VisitList/VisitList.esm.js +46 -0
  46. package/dist/components/VisitList/VisitList.esm.js.map +1 -0
  47. package/dist/components/VisitList/VisitListEmpty.esm.js +7 -0
  48. package/dist/components/VisitList/VisitListEmpty.esm.js.map +1 -0
  49. package/dist/components/VisitList/VisitListFew.esm.js +7 -0
  50. package/dist/components/VisitList/VisitListFew.esm.js.map +1 -0
  51. package/dist/components/VisitList/VisitListItem.esm.js +31 -0
  52. package/dist/components/VisitList/VisitListItem.esm.js.map +1 -0
  53. package/dist/components/VisitList/VisitListSkeleton.esm.js +39 -0
  54. package/dist/components/VisitList/VisitListSkeleton.esm.js.map +1 -0
  55. package/dist/components/VisitListener.esm.js +62 -0
  56. package/dist/components/VisitListener.esm.js.map +1 -0
  57. package/dist/components/index.esm.js +4 -0
  58. package/dist/components/index.esm.js.map +1 -0
  59. package/dist/deprecated.esm.js +7 -0
  60. package/dist/deprecated.esm.js.map +1 -0
  61. package/dist/{esm/index-FqRX6ImF.esm.js → homePageComponents/CompanyLogo/CompanyLogo.esm.js} +1 -1
  62. package/dist/{esm/index-FqRX6ImF.esm.js.map → homePageComponents/CompanyLogo/CompanyLogo.esm.js.map} +1 -1
  63. package/dist/homePageComponents/CompanyLogo/index.esm.js +2 -0
  64. package/dist/homePageComponents/CompanyLogo/index.esm.js.map +1 -0
  65. package/dist/{esm/index-D7JTE1IL.esm.js → homePageComponents/FeaturedDocsCard/Content.esm.js} +1 -1
  66. package/dist/homePageComponents/FeaturedDocsCard/Content.esm.js.map +1 -0
  67. package/dist/homePageComponents/FeaturedDocsCard/index.esm.js +2 -0
  68. package/dist/homePageComponents/FeaturedDocsCard/index.esm.js.map +1 -0
  69. package/dist/{esm/index-BvvJGS3L.esm.js → homePageComponents/HeaderWorldClock/HeaderWorldClock.esm.js} +1 -1
  70. package/dist/homePageComponents/HeaderWorldClock/HeaderWorldClock.esm.js.map +1 -0
  71. package/dist/homePageComponents/HeaderWorldClock/index.esm.js +2 -0
  72. package/dist/homePageComponents/HeaderWorldClock/index.esm.js.map +1 -0
  73. package/dist/homePageComponents/RandomJoke/Actions.esm.js +11 -0
  74. package/dist/homePageComponents/RandomJoke/Actions.esm.js.map +1 -0
  75. package/dist/homePageComponents/RandomJoke/Content.esm.js +13 -0
  76. package/dist/homePageComponents/RandomJoke/Content.esm.js.map +1 -0
  77. package/dist/homePageComponents/RandomJoke/Context.esm.js +48 -0
  78. package/dist/homePageComponents/RandomJoke/Context.esm.js.map +1 -0
  79. package/dist/homePageComponents/RandomJoke/Settings.esm.js +33 -0
  80. package/dist/homePageComponents/RandomJoke/Settings.esm.js.map +1 -0
  81. package/dist/homePageComponents/RandomJoke/index.esm.js +5 -0
  82. package/dist/homePageComponents/RandomJoke/index.esm.js.map +1 -0
  83. package/dist/{esm/index-SfHoDIi1.esm.js → homePageComponents/StarredEntities/Content.esm.js} +4 -27
  84. package/dist/homePageComponents/StarredEntities/Content.esm.js.map +1 -0
  85. package/dist/homePageComponents/StarredEntities/index.esm.js +2 -0
  86. package/dist/homePageComponents/StarredEntities/index.esm.js.map +1 -0
  87. package/dist/{esm/index-CeXFfTX2.esm.js → homePageComponents/Toolkit/Content.esm.js} +4 -17
  88. package/dist/homePageComponents/Toolkit/Content.esm.js.map +1 -0
  89. package/dist/homePageComponents/Toolkit/Context.esm.js +18 -0
  90. package/dist/homePageComponents/Toolkit/Context.esm.js.map +1 -0
  91. package/dist/homePageComponents/Toolkit/index.esm.js +3 -0
  92. package/dist/homePageComponents/Toolkit/index.esm.js.map +1 -0
  93. package/dist/homePageComponents/VisitedByType/Actions.esm.js +18 -0
  94. package/dist/homePageComponents/VisitedByType/Actions.esm.js.map +1 -0
  95. package/dist/homePageComponents/VisitedByType/Content.esm.js +68 -0
  96. package/dist/homePageComponents/VisitedByType/Content.esm.js.map +1 -0
  97. package/dist/homePageComponents/VisitedByType/Context.esm.js +77 -0
  98. package/dist/homePageComponents/VisitedByType/Context.esm.js.map +1 -0
  99. package/dist/homePageComponents/VisitedByType/RecentlyVisited.esm.js +9 -0
  100. package/dist/homePageComponents/VisitedByType/RecentlyVisited.esm.js.map +1 -0
  101. package/dist/homePageComponents/VisitedByType/TopVisited.esm.js +9 -0
  102. package/dist/homePageComponents/VisitedByType/TopVisited.esm.js.map +1 -0
  103. package/dist/homePageComponents/VisitedByType/VisitedByType.esm.js +21 -0
  104. package/dist/homePageComponents/VisitedByType/VisitedByType.esm.js.map +1 -0
  105. package/dist/homePageComponents/WelcomeTitle/WelcomeTitle.esm.js +27 -0
  106. package/dist/homePageComponents/WelcomeTitle/WelcomeTitle.esm.js.map +1 -0
  107. package/dist/homePageComponents/WelcomeTitle/index.esm.js +2 -0
  108. package/dist/homePageComponents/WelcomeTitle/index.esm.js.map +1 -0
  109. package/dist/homePageComponents/WelcomeTitle/locales/goodAfternoon.locales.json.esm.js +256 -0
  110. package/dist/homePageComponents/WelcomeTitle/locales/goodAfternoon.locales.json.esm.js.map +1 -0
  111. package/dist/homePageComponents/WelcomeTitle/locales/goodEvening.locales.json.esm.js +196 -0
  112. package/dist/homePageComponents/WelcomeTitle/locales/goodEvening.locales.json.esm.js.map +1 -0
  113. package/dist/homePageComponents/WelcomeTitle/locales/goodMorning.locales.json.esm.js +131 -0
  114. package/dist/homePageComponents/WelcomeTitle/locales/goodMorning.locales.json.esm.js.map +1 -0
  115. package/dist/homePageComponents/WelcomeTitle/timeUtil.esm.js +41 -0
  116. package/dist/homePageComponents/WelcomeTitle/timeUtil.esm.js.map +1 -0
  117. package/dist/index.esm.js +10 -352
  118. package/dist/index.esm.js.map +1 -1
  119. package/dist/plugin.esm.js +144 -0
  120. package/dist/plugin.esm.js.map +1 -0
  121. package/dist/routes.esm.js +8 -0
  122. package/dist/routes.esm.js.map +1 -0
  123. package/package.json +20 -20
  124. package/dist/esm/Content-Quo42yad.esm.js +0 -396
  125. package/dist/esm/Content-Quo42yad.esm.js.map +0 -1
  126. package/dist/esm/RecentlyVisited-qOUgoCVu.esm.js +0 -48
  127. package/dist/esm/RecentlyVisited-qOUgoCVu.esm.js.map +0 -1
  128. package/dist/esm/TopVisited-B_KhSJit.esm.js +0 -48
  129. package/dist/esm/TopVisited-B_KhSJit.esm.js.map +0 -1
  130. package/dist/esm/VisitListener-dDLtFiIW.esm.js +0 -627
  131. package/dist/esm/VisitListener-dDLtFiIW.esm.js.map +0 -1
  132. package/dist/esm/index-BMySa_Iw.esm.js +0 -638
  133. package/dist/esm/index-BMySa_Iw.esm.js.map +0 -1
  134. package/dist/esm/index-BNfZuEhy.esm.js.map +0 -1
  135. package/dist/esm/index-BvvJGS3L.esm.js.map +0 -1
  136. package/dist/esm/index-Bzg5mDMo.esm.js +0 -45
  137. package/dist/esm/index-Bzg5mDMo.esm.js.map +0 -1
  138. package/dist/esm/index-CeXFfTX2.esm.js.map +0 -1
  139. package/dist/esm/index-D7JTE1IL.esm.js.map +0 -1
  140. package/dist/esm/index-Dg9lslkf.esm.js +0 -90
  141. package/dist/esm/index-Dg9lslkf.esm.js.map +0 -1
  142. package/dist/esm/index-SfHoDIi1.esm.js.map +0 -1
@@ -0,0 +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,CAAA;AAChC,CAAA,CAAA;AAEa,MAAA,eAAA,GAAkB,CAAC,KAAgC,KAAA;AAC9D,EAAM,MAAA,EAAE,OAAS,EAAA,SAAA,EAAc,GAAA,KAAA,CAAA;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,CAAA;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;AAAA,YAEL,MAAO,CAAA,WAAA;AAAA,WACV;AAAA,UAGJ,OAAA,sCACG,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAQ,KAAM,EAAA,aAAA,EAAA,EAC/B,QAAS,CAAA,MAAM,CAClB,CAAA;AAAA,SAAA;AAAA,OAEJ;AAAA,KACF,CAAA;AAAA,GAEH,CACH,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,90 @@
1
+ import Button from '@material-ui/core/Button';
2
+ import React from 'react';
3
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
4
+ import SaveIcon from '@material-ui/icons/Save';
5
+ import DeleteIcon from '@material-ui/icons/Delete';
6
+ import AddIcon from '@material-ui/icons/Add';
7
+ import EditIcon from '@material-ui/icons/Edit';
8
+ import CancelIcon from '@material-ui/icons/Cancel';
9
+
10
+ const useStyles = makeStyles(
11
+ (theme) => createStyles({
12
+ contentHeaderBtn: {
13
+ marginLeft: theme.spacing(2)
14
+ },
15
+ widgetWrapper: {
16
+ "& > *:first-child": {
17
+ width: "100%",
18
+ height: "100%"
19
+ }
20
+ }
21
+ })
22
+ );
23
+ const CustomHomepageButtons = (props) => {
24
+ const {
25
+ editMode,
26
+ numWidgets,
27
+ clearLayout,
28
+ setAddWidgetDialogOpen,
29
+ changeEditMode,
30
+ defaultConfigAvailable,
31
+ restoreDefault
32
+ } = props;
33
+ const styles = useStyles();
34
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, !editMode && numWidgets > 0 ? /* @__PURE__ */ React.createElement(
35
+ Button,
36
+ {
37
+ variant: "contained",
38
+ color: "primary",
39
+ onClick: () => changeEditMode(true),
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
+ )));
87
+ };
88
+
89
+ export { CustomHomepageButtons };
90
+ //# sourceMappingURL=CustomHomepageButtons.esm.js.map
@@ -0,0 +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,CAAA;AAAA,KAC7B;AAAA,IACA,aAAe,EAAA;AAAA,MACb,mBAAqB,EAAA;AAAA,QACnB,KAAO,EAAA,MAAA;AAAA,QACP,MAAQ,EAAA,MAAA;AAAA,OACV;AAAA,KACF;AAAA,GACD,CAAA;AACH,CAAA,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,cAAA;AAAA,GACE,GAAA,KAAA,CAAA;AACJ,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;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,CAAA;AAAA,KAAA;AAAA,IACtB,MAAA;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,CAAA;AAAA,KAAA;AAAA,IACxB,kBAAA;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,CAAA;AAAA,KAAA;AAAA,IACxB,WAAA;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,CAAA;AAAA,KAAA;AAAA,IACrB,YAAA;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,CAAA;AAAA,KAAA;AAAA,IACtB,MAAA;AAAA,GAIL,CAEJ,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,319 @@
1
+ import React, { useMemo, useCallback } from 'react';
2
+ import { WidthProvider, Responsive } from 'react-grid-layout';
3
+ import { useElementFilter, useApi, storageApiRef, getComponentData } from '@backstage/core-plugin-api';
4
+ import 'react-grid-layout/css/styles.css';
5
+ import 'react-resizable/css/styles.css';
6
+ import Dialog from '@material-ui/core/Dialog';
7
+ import { makeStyles, createStyles, useTheme } from '@material-ui/core/styles';
8
+ import { compact } from 'lodash';
9
+ import useObservable from 'react-use/esm/useObservable';
10
+ import { ContentHeader, ErrorBoundary } from '@backstage/core-components';
11
+ import Typography from '@material-ui/core/Typography';
12
+ import { WidgetSettingsOverlay } from './WidgetSettingsOverlay.esm.js';
13
+ import { AddWidgetDialog } from './AddWidgetDialog.esm.js';
14
+ import { CustomHomepageButtons } from './CustomHomepageButtons.esm.js';
15
+ import { CustomHomepageGridStateV1Schema, LayoutConfigurationSchema, WidgetSchema } from './types.esm.js';
16
+
17
+ const ResponsiveGrid = WidthProvider(Responsive);
18
+ const useStyles = makeStyles(
19
+ (theme) => createStyles({
20
+ responsiveGrid: {
21
+ "& .react-grid-item > .react-resizable-handle:after": {
22
+ position: "absolute",
23
+ content: '""',
24
+ borderStyle: "solid",
25
+ borderWidth: "0 0 20px 20px",
26
+ borderColor: `transparent transparent ${theme.palette.primary.light} transparent`
27
+ }
28
+ },
29
+ contentHeaderBtn: {
30
+ marginLeft: theme.spacing(2)
31
+ },
32
+ widgetWrapper: {
33
+ '& > div[class*="MuiCard-root"]': {
34
+ width: "100%",
35
+ height: "100%"
36
+ },
37
+ '& div[class*="MuiCardContent-root"]': {
38
+ overflow: "auto"
39
+ },
40
+ "& + .react-grid-placeholder": {
41
+ backgroundColor: theme.palette.primary.light
42
+ },
43
+ "&.edit > :active": {
44
+ cursor: "move"
45
+ }
46
+ }
47
+ })
48
+ );
49
+ function useHomeStorage(defaultWidgets) {
50
+ const key = "home";
51
+ const storageApi = useApi(storageApiRef).forBucket("home.customHomepage");
52
+ const setWidgets = useCallback(
53
+ (value) => {
54
+ const grid = {
55
+ version: 1,
56
+ pages: {
57
+ default: value
58
+ }
59
+ };
60
+ storageApi.set(key, JSON.stringify(grid));
61
+ },
62
+ [key, storageApi]
63
+ );
64
+ const homeSnapshot = useObservable(
65
+ storageApi.observe$(key),
66
+ storageApi.snapshot(key)
67
+ );
68
+ const widgets = useMemo(() => {
69
+ if (homeSnapshot.presence === "absent") {
70
+ return defaultWidgets;
71
+ }
72
+ try {
73
+ const grid = JSON.parse(homeSnapshot.value);
74
+ return CustomHomepageGridStateV1Schema.parse(grid).pages.default;
75
+ } catch (e) {
76
+ return defaultWidgets;
77
+ }
78
+ }, [homeSnapshot, defaultWidgets]);
79
+ return [widgets, setWidgets];
80
+ }
81
+ const convertConfigToDefaultWidgets = (config, availableWidgets) => {
82
+ const ret = config.map((conf, i) => {
83
+ var _a, _b;
84
+ const c = LayoutConfigurationSchema.parse(conf);
85
+ const name = React.isValidElement(c.component) ? getComponentData(c.component, "core.extensionName") : c.component;
86
+ if (!name) {
87
+ return null;
88
+ }
89
+ const widget = availableWidgets.find((w) => w.name === name);
90
+ if (!widget) {
91
+ return null;
92
+ }
93
+ const widgetId = `${widget.name}__${i}${Math.random().toString(36).slice(2)}`;
94
+ return {
95
+ id: widgetId,
96
+ layout: {
97
+ i: widgetId,
98
+ x: c.x,
99
+ y: c.y,
100
+ w: Math.min((_a = widget.maxWidth) != null ? _a : Number.MAX_VALUE, c.width),
101
+ h: Math.min((_b = widget.maxHeight) != null ? _b : Number.MAX_VALUE, c.height),
102
+ minW: widget.minWidth,
103
+ maxW: widget.maxWidth,
104
+ minH: widget.minHeight,
105
+ maxH: widget.maxHeight,
106
+ isDraggable: false,
107
+ isResizable: false
108
+ },
109
+ settings: {},
110
+ movable: conf.movable,
111
+ deletable: conf.deletable,
112
+ resizable: conf.resizable
113
+ };
114
+ });
115
+ return compact(ret);
116
+ };
117
+ const availableWidgetsFilter = (elements) => {
118
+ return elements.selectByComponentData({
119
+ key: "core.extensionName"
120
+ }).getElements().flatMap((elem) => {
121
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
122
+ const config = getComponentData(elem, "home.widget.config");
123
+ return [
124
+ WidgetSchema.parse({
125
+ component: elem,
126
+ name: getComponentData(elem, "core.extensionName"),
127
+ title: getComponentData(elem, "title"),
128
+ description: getComponentData(elem, "description"),
129
+ settingsSchema: (_a = config == null ? void 0 : config.settings) == null ? void 0 : _a.schema,
130
+ uiSchema: (_b = config == null ? void 0 : config.settings) == null ? void 0 : _b.uiSchema,
131
+ width: (_d = (_c = config == null ? void 0 : config.layout) == null ? void 0 : _c.width) == null ? void 0 : _d.defaultColumns,
132
+ minWidth: (_f = (_e = config == null ? void 0 : config.layout) == null ? void 0 : _e.width) == null ? void 0 : _f.minColumns,
133
+ maxWidth: (_h = (_g = config == null ? void 0 : config.layout) == null ? void 0 : _g.width) == null ? void 0 : _h.maxColumns,
134
+ height: (_j = (_i = config == null ? void 0 : config.layout) == null ? void 0 : _i.height) == null ? void 0 : _j.defaultRows,
135
+ minHeight: (_l = (_k = config == null ? void 0 : config.layout) == null ? void 0 : _k.height) == null ? void 0 : _l.minRows,
136
+ maxHeight: (_n = (_m = config == null ? void 0 : config.layout) == null ? void 0 : _m.height) == null ? void 0 : _n.maxRows
137
+ })
138
+ ];
139
+ });
140
+ };
141
+ const CustomHomepageGrid = (props) => {
142
+ var _a;
143
+ const styles = useStyles();
144
+ const theme = useTheme();
145
+ const availableWidgets = useElementFilter(
146
+ props.children,
147
+ availableWidgetsFilter,
148
+ [props]
149
+ );
150
+ const defaultLayout = useMemo(() => {
151
+ return props.config ? convertConfigToDefaultWidgets(props.config, availableWidgets) : [];
152
+ }, [props.config, availableWidgets]);
153
+ const [widgets, setWidgets] = useHomeStorage(defaultLayout);
154
+ const [addWidgetDialogOpen, setAddWidgetDialogOpen] = React.useState(false);
155
+ const editModeOn = widgets.find((w) => w.layout.isResizable) !== void 0;
156
+ const [editMode, setEditMode] = React.useState(editModeOn);
157
+ const getWidgetByName = (name) => {
158
+ return availableWidgets.find((widget) => widget.name === name);
159
+ };
160
+ const getWidgetNameFromKey = (key) => {
161
+ return key.split("__")[0];
162
+ };
163
+ const handleAdd = (widget) => {
164
+ var _a2, _b, _c, _d;
165
+ const widgetId = `${widget.name}__${widgets.length + 1}${Math.random().toString(36).slice(2)}`;
166
+ setWidgets([
167
+ ...widgets,
168
+ {
169
+ id: widgetId,
170
+ layout: {
171
+ i: widgetId,
172
+ x: 0,
173
+ y: Math.max(...widgets.map((w) => w.layout.y + w.layout.h)) + 1,
174
+ w: Math.min((_a2 = widget.maxWidth) != null ? _a2 : Number.MAX_VALUE, (_b = widget.width) != null ? _b : 12),
175
+ h: Math.min((_c = widget.maxHeight) != null ? _c : Number.MAX_VALUE, (_d = widget.height) != null ? _d : 4),
176
+ minW: widget.minWidth,
177
+ maxW: widget.maxWidth,
178
+ minH: widget.minHeight,
179
+ maxH: widget.maxHeight,
180
+ isResizable: editMode,
181
+ isDraggable: editMode
182
+ },
183
+ settings: {},
184
+ movable: widget.movable,
185
+ deletable: widget.deletable,
186
+ resizable: widget.resizable
187
+ }
188
+ ]);
189
+ setAddWidgetDialogOpen(false);
190
+ };
191
+ const handleRemove = (widgetId) => {
192
+ setWidgets(widgets.filter((w) => w.id !== widgetId));
193
+ };
194
+ const handleSettingsSave = (widgetId, widgetSettings) => {
195
+ const idx = widgets.findIndex((w) => w.id === widgetId);
196
+ if (idx >= 0) {
197
+ const widget = widgets[idx];
198
+ widget.settings = widgetSettings;
199
+ widgets[idx] = widget;
200
+ setWidgets(widgets);
201
+ }
202
+ };
203
+ const clearLayout = () => {
204
+ setWidgets([]);
205
+ };
206
+ const changeEditMode = (mode) => {
207
+ setEditMode(mode);
208
+ setWidgets(
209
+ widgets.map((w) => {
210
+ const resizable = w.resizable === false ? false : mode;
211
+ const movable = w.movable === false ? false : mode;
212
+ return {
213
+ ...w,
214
+ layout: { ...w.layout, isDraggable: movable, isResizable: resizable }
215
+ };
216
+ })
217
+ );
218
+ };
219
+ const handleLayoutChange = (newLayout, _) => {
220
+ if (editMode) {
221
+ const newWidgets = newLayout.map((l) => {
222
+ const widget = widgets.find((w) => w.id === l.i);
223
+ return {
224
+ ...widget,
225
+ layout: l
226
+ };
227
+ });
228
+ setWidgets(newWidgets);
229
+ }
230
+ };
231
+ const handleRestoreDefaultConfig = () => {
232
+ setWidgets(
233
+ defaultLayout.map((w) => {
234
+ const resizable = w.resizable === false ? false : editMode;
235
+ const movable = w.movable === false ? false : editMode;
236
+ return {
237
+ ...w,
238
+ layout: {
239
+ ...w.layout,
240
+ isDraggable: movable,
241
+ isResizable: resizable
242
+ }
243
+ };
244
+ })
245
+ );
246
+ };
247
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: "" }, /* @__PURE__ */ React.createElement(
248
+ CustomHomepageButtons,
249
+ {
250
+ editMode,
251
+ numWidgets: widgets.length,
252
+ clearLayout,
253
+ setAddWidgetDialogOpen,
254
+ changeEditMode,
255
+ defaultConfigAvailable: props.config !== void 0,
256
+ restoreDefault: handleRestoreDefaultConfig
257
+ }
258
+ )), /* @__PURE__ */ React.createElement(
259
+ Dialog,
260
+ {
261
+ open: addWidgetDialogOpen,
262
+ onClose: () => setAddWidgetDialogOpen(false)
263
+ },
264
+ /* @__PURE__ */ React.createElement(AddWidgetDialog, { widgets: availableWidgets, handleAdd })
265
+ ), !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(
266
+ ResponsiveGrid,
267
+ {
268
+ className: styles.responsiveGrid,
269
+ measureBeforeMount: true,
270
+ compactType: props.compactType,
271
+ style: props.style,
272
+ allowOverlap: props.allowOverlap,
273
+ preventCollision: props.preventCollision,
274
+ draggableCancel: ".overlayGridItem,.widgetSettingsDialog,.disabled",
275
+ containerPadding: props.containerPadding,
276
+ margin: props.containerMargin,
277
+ breakpoints: props.breakpoints ? props.breakpoints : theme.breakpoints.values,
278
+ cols: props.cols ? props.cols : { xl: 12, lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 },
279
+ rowHeight: (_a = props.rowHeight) != null ? _a : 60,
280
+ onLayoutChange: handleLayoutChange,
281
+ layouts: { xl: widgets.map((w) => w.layout) }
282
+ },
283
+ widgets.map((w) => {
284
+ var _a2;
285
+ const l = w.layout;
286
+ const widgetName = getWidgetNameFromKey(l.i);
287
+ const widget = getWidgetByName(widgetName);
288
+ if (!widget || !widget.component) {
289
+ return null;
290
+ }
291
+ const widgetProps = {
292
+ ...widget.component.props,
293
+ ...(_a2 = w.settings) != null ? _a2 : {}
294
+ };
295
+ return /* @__PURE__ */ React.createElement(
296
+ "div",
297
+ {
298
+ key: l.i,
299
+ className: `${styles.widgetWrapper} ${editMode && "edit"} ${w.movable === false && "disabled"}`
300
+ },
301
+ /* @__PURE__ */ React.createElement(ErrorBoundary, null, /* @__PURE__ */ React.createElement(widget.component.type, { ...widgetProps })),
302
+ editMode && /* @__PURE__ */ React.createElement(
303
+ WidgetSettingsOverlay,
304
+ {
305
+ id: l.i,
306
+ widget,
307
+ handleRemove,
308
+ handleSettingsSave,
309
+ settings: w.settings,
310
+ deletable: w.deletable
311
+ }
312
+ )
313
+ );
314
+ })
315
+ ));
316
+ };
317
+
318
+ export { CustomHomepageGrid };
319
+ //# sourceMappingURL=CustomHomepageGrid.esm.js.map
@@ -0,0 +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}\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":["_a"],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import Dialog from '@material-ui/core/Dialog';
2
+ import DialogContent from '@material-ui/core/DialogContent';
3
+ import Grid from '@material-ui/core/Grid';
4
+ import Tooltip from '@material-ui/core/Tooltip';
5
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
6
+ import IconButton from '@material-ui/core/IconButton';
7
+ import SettingsIcon from '@material-ui/icons/Settings';
8
+ import DeleteIcon from '@material-ui/icons/Delete';
9
+ import React from 'react';
10
+ import { withTheme } from '@rjsf/core';
11
+ import { Theme } from '@rjsf/material-ui';
12
+ import validator from '@rjsf/validator-ajv8';
13
+
14
+ const Form = withTheme(Theme);
15
+ const useStyles = makeStyles(
16
+ (theme) => createStyles({
17
+ iconGrid: {
18
+ height: "100%",
19
+ "& *": {
20
+ padding: 0
21
+ }
22
+ },
23
+ settingsOverlay: {
24
+ position: "absolute",
25
+ backgroundColor: "rgba(40, 40, 40, 0.93)",
26
+ width: "100%",
27
+ height: "100%",
28
+ top: 0,
29
+ left: 0,
30
+ padding: theme.spacing(2),
31
+ color: "white"
32
+ }
33
+ })
34
+ );
35
+ const WidgetSettingsOverlay = (props) => {
36
+ const { id, widget, settings, handleRemove, handleSettingsSave, deletable } = props;
37
+ const [settingsDialogOpen, setSettingsDialogOpen] = React.useState(false);
38
+ const styles = useStyles();
39
+ return /* @__PURE__ */ React.createElement("div", { className: styles.settingsOverlay }, widget.settingsSchema && /* @__PURE__ */ React.createElement(
40
+ Dialog,
41
+ {
42
+ open: settingsDialogOpen,
43
+ className: "widgetSettingsDialog",
44
+ onClose: () => setSettingsDialogOpen(false)
45
+ },
46
+ /* @__PURE__ */ React.createElement(DialogContent, null, /* @__PURE__ */ React.createElement(
47
+ Form,
48
+ {
49
+ validator,
50
+ showErrorList: false,
51
+ schema: widget.settingsSchema,
52
+ uiSchema: widget.uiSchema,
53
+ noHtml5Validate: true,
54
+ formData: settings,
55
+ formContext: { settings },
56
+ onSubmit: ({ formData, errors }) => {
57
+ if (errors.length === 0) {
58
+ handleSettingsSave(id, formData);
59
+ setSettingsDialogOpen(false);
60
+ }
61
+ },
62
+ experimental_defaultFormStateBehavior: {
63
+ allOf: "populateDefaults"
64
+ }
65
+ }
66
+ ))
67
+ ), /* @__PURE__ */ React.createElement(
68
+ Grid,
69
+ {
70
+ container: true,
71
+ className: styles.iconGrid,
72
+ alignItems: "center",
73
+ justifyContent: "center"
74
+ },
75
+ widget.settingsSchema && /* @__PURE__ */ React.createElement(Grid, { item: true, className: "overlayGridItem" }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Edit settings" }, /* @__PURE__ */ React.createElement(
76
+ IconButton,
77
+ {
78
+ color: "primary",
79
+ onClick: () => setSettingsDialogOpen(true)
80
+ },
81
+ /* @__PURE__ */ React.createElement(SettingsIcon, { fontSize: "large" })
82
+ ))),
83
+ 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" }))))
84
+ ));
85
+ };
86
+
87
+ export { WidgetSettingsOverlay };
88
+ //# sourceMappingURL=WidgetSettingsOverlay.esm.js.map
@@ -0,0 +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 */\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport Grid from '@material-ui/core/Grid';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport IconButton from '@material-ui/core/IconButton';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport React 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] = React.useState(false);\n const styles = useStyles();\n\n return (\n <div className={styles.settingsOverlay}>\n {widget.settingsSchema && (\n <Dialog\n open={settingsDialogOpen}\n className=\"widgetSettingsDialog\"\n onClose={() => setSettingsDialogOpen(false)}\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 </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=\"Edit settings\">\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=\"Delete widget\">\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":";;;;;;;;;;;;;AA6BA,MAAM,IAAA,GAAO,UAAUA,KAAQ,CAAA,CAAA;AAE/B,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,QAAU,EAAA;AAAA,MACR,MAAQ,EAAA,MAAA;AAAA,MACR,KAAO,EAAA;AAAA,QACL,OAAS,EAAA,CAAA;AAAA,OACX;AAAA,KACF;AAAA,IACA,eAAiB,EAAA;AAAA,MACf,QAAU,EAAA,UAAA;AAAA,MACV,eAAiB,EAAA,wBAAA;AAAA,MACjB,KAAO,EAAA,MAAA;AAAA,MACP,MAAQ,EAAA,MAAA;AAAA,MACR,GAAK,EAAA,CAAA;AAAA,MACL,IAAM,EAAA,CAAA;AAAA,MACN,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,KAAO,EAAA,OAAA;AAAA,KACT;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAUa,MAAA,qBAAA,GAAwB,CAAC,KAAsC,KAAA;AAC1E,EAAA,MAAM,EAAE,EAAI,EAAA,MAAA,EAAQ,UAAU,YAAc,EAAA,kBAAA,EAAoB,WAC9D,GAAA,KAAA,CAAA;AACF,EAAA,MAAM,CAAC,kBAAoB,EAAA,qBAAqB,CAAI,GAAA,KAAA,CAAM,SAAS,KAAK,CAAA,CAAA;AACxE,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AAEzB,EAAA,2CACG,KAAI,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,eAAA,EAAA,EACpB,OAAO,cACN,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAM,EAAA,kBAAA;AAAA,MACN,SAAU,EAAA,sBAAA;AAAA,MACV,OAAA,EAAS,MAAM,qBAAA,CAAsB,KAAK,CAAA;AAAA,KAAA;AAAA,wCAEzC,aACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,aAAe,EAAA,KAAA;AAAA,QACf,QAAQ,MAAO,CAAA,cAAA;AAAA,QACf,UAAU,MAAO,CAAA,QAAA;AAAA,QACjB,eAAe,EAAA,IAAA;AAAA,QACf,QAAU,EAAA,QAAA;AAAA,QACV,WAAA,EAAa,EAAE,QAAS,EAAA;AAAA,QACxB,QAAU,EAAA,CAAC,EAAE,QAAA,EAAU,QAAa,KAAA;AAClC,UAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,YAAA,kBAAA,CAAmB,IAAI,QAAQ,CAAA,CAAA;AAC/B,YAAA,qBAAA,CAAsB,KAAK,CAAA,CAAA;AAAA,WAC7B;AAAA,SACF;AAAA,QACA,qCAAuC,EAAA;AAAA,UACrC,KAAO,EAAA,kBAAA;AAAA,SACT;AAAA,OAAA;AAAA,KAEJ,CAAA;AAAA,GAGJ,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,WAAW,MAAO,CAAA,QAAA;AAAA,MAClB,UAAW,EAAA,QAAA;AAAA,MACX,cAAe,EAAA,QAAA;AAAA,KAAA;AAAA,IAEd,MAAA,CAAO,cACN,oBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,SAAA,EAAU,iBACnB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAM,eACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,SAAA;AAAA,QACN,OAAA,EAAS,MAAM,qBAAA,CAAsB,IAAI,CAAA;AAAA,OAAA;AAAA,sBAEzC,KAAA,CAAA,aAAA,CAAC,YAAa,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA;AAAA,KAEnC,CACF,CAAA;AAAA,IAED,SAAA,KAAc,KACb,oBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,SAAA,EAAU,iBACnB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,KAAA,EAAM,eACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,WAAY,EAAA,OAAA,EAAS,MAAM,YAAA,CAAa,EAAE,CAAA,EAAA,kBACzD,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,QAAS,EAAA,OAAA,EAAQ,CAC/B,CACF,CACF,CAAA;AAAA,GAGN,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+
3
+ const RSJFTypeSchema = z.any();
4
+ const RSJFTypeUiSchema = z.any();
5
+ const ReactElementSchema = z.any();
6
+ const LayoutSchema = z.any();
7
+ const LayoutConfigurationSchema = z.object({
8
+ component: ReactElementSchema,
9
+ x: z.number().nonnegative("x must be positive number"),
10
+ y: z.number().nonnegative("y must be positive number"),
11
+ width: z.number().positive("width must be positive number"),
12
+ height: z.number().positive("height must be positive number"),
13
+ movable: z.boolean().optional(),
14
+ deletable: z.boolean().optional(),
15
+ resizable: z.boolean().optional()
16
+ });
17
+ const WidgetSchema = z.object({
18
+ name: z.string(),
19
+ title: z.string().optional(),
20
+ description: z.string().optional(),
21
+ component: ReactElementSchema,
22
+ width: z.number().positive("width must be positive number").optional(),
23
+ height: z.number().positive("height must be positive number").optional(),
24
+ minWidth: z.number().positive("minWidth must be positive number").optional(),
25
+ maxWidth: z.number().positive("maxWidth must be positive number").optional(),
26
+ minHeight: z.number().positive("minHeight must be positive number").optional(),
27
+ maxHeight: z.number().positive("maxHeight must be positive number").optional(),
28
+ settingsSchema: RSJFTypeSchema.optional(),
29
+ uiSchema: RSJFTypeUiSchema.optional(),
30
+ movable: z.boolean().optional(),
31
+ deletable: z.boolean().optional(),
32
+ resizable: z.boolean().optional()
33
+ });
34
+ const GridWidgetSchema = z.object({
35
+ id: z.string(),
36
+ layout: LayoutSchema,
37
+ settings: z.record(z.string(), z.any()),
38
+ movable: z.boolean().optional(),
39
+ deletable: z.boolean().optional(),
40
+ resizable: z.boolean().optional()
41
+ });
42
+ const CustomHomepageGridStateV1Schema = z.object({
43
+ version: z.literal(1),
44
+ pages: z.record(z.string(), z.array(GridWidgetSchema))
45
+ });
46
+
47
+ export { CustomHomepageGridStateV1Schema, LayoutConfigurationSchema, WidgetSchema };
48
+ //# sourceMappingURL=types.esm.js.map