@@ -2,7 +2,8 @@ import * as React from "react";
2
2
import {
3
3
ProviderConsumer as FluentUIThemeConsumer ,
4
4
Box ,
5
- teamsTheme
5
+ teamsTheme ,
6
+ ThemePrepared ,
6
7
} from "@fluentui/react-northstar" ;
7
8
import {
8
9
Widget ,
@@ -22,7 +23,7 @@ import { useTelemetry } from "../../common/telemetry";
22
23
*/
23
24
export interface IDashboardProps {
24
25
/**
25
- * Widgtets collection
26
+ * Widgets collection
26
27
*/
27
28
widgets : IWidget [ ] ;
28
29
/**
@@ -37,16 +38,25 @@ export interface IDashboardProps {
37
38
* Dashboard toolbar props
38
39
*/
39
40
toolbarProps ?: IToolbarProps ;
41
+ /**
42
+ * Optional component which wraps every Widget component. Useful for a custom error handling.
43
+ */
44
+ WidgetContentWrapper ?: React . ComponentType < React . PropsWithChildren < any > > ;
40
45
}
41
46
42
47
export function Dashboard ( {
43
48
widgets,
44
49
allowHidingWidget,
45
50
onWidgetHiding,
46
- toolbarProps } : IDashboardProps ) {
51
+ toolbarProps,
52
+ WidgetContentWrapper : WidgetWrapperComponent ,
53
+ } : IDashboardProps ) {
47
54
const [ stateWidgets , setWidgets ] = React . useState ( widgets ) ;
55
+ const widgetRenderer = WidgetWrapperComponent
56
+ ? renderWidgetWithWrappedContent
57
+ : renderWidget ;
48
58
49
- useTelemetry ( ' ReactDashboard' , { } ) ;
59
+ useTelemetry ( " ReactDashboard" , { } ) ;
50
60
51
61
React . useEffect ( ( ) => {
52
62
setWidgets ( widgets ) ;
@@ -57,42 +67,53 @@ export function Dashboard({
57
67
if ( ! globalTheme || globalTheme . fontFaces . length == 0 ) {
58
68
globalTheme = teamsTheme ;
59
69
}
60
- return < DashboardTheme globalTheme = { globalTheme } >
61
- { toolbarProps && < Toolbar { ...toolbarProps } /> }
62
- < Box className = { styles . dashboardBox } >
63
- { stateWidgets &&
64
- stateWidgets . map (
65
- (
66
- widget : IWidget ,
67
- key : number
68
- ) => (
69
- < Widget key = { key } widget = { widget } >
70
- < WidgetTitle
71
- widget = { widget }
72
- allowHidingWidget = { allowHidingWidget }
73
- onWidgetHiding = { ( hidingWidget : IWidget ) => {
74
- if ( onWidgetHiding ) {
75
- onWidgetHiding ( hidingWidget ) ;
76
- }
77
- if ( ! hidingWidget . controlOptions ) {
78
- hidingWidget . controlOptions = { } ;
79
- }
80
- hidingWidget . controlOptions . isHidden = true ;
81
- setWidgets ( [ ...widgets ] ) ;
82
- } }
83
- globalTheme = { globalTheme }
84
- />
85
- < WidgetBody
86
- widget = { widget }
87
- siteVariables = { globalTheme . siteVariables }
88
- />
89
- { widget . link && < WidgetFooter widget = { widget } /> }
90
- </ Widget >
91
- )
92
- ) }
93
- </ Box >
94
- </ DashboardTheme > ;
70
+ return (
71
+ < DashboardTheme globalTheme = { globalTheme } >
72
+ { toolbarProps && < Toolbar { ...toolbarProps } /> }
73
+ < Box className = { styles . dashboardBox } >
74
+ { stateWidgets && stateWidgets . map ( widgetRenderer ( globalTheme ) ) }
75
+ </ Box >
76
+ </ DashboardTheme >
77
+ ) ;
95
78
} }
96
79
/>
97
80
) ;
81
+
82
+ function renderWidgetWithWrappedContent (
83
+ globalTheme : ThemePrepared < any >
84
+ ) : ( value ?: IWidget , index ?: number ) => JSX . Element {
85
+ return ( widget : IWidget , key : number ) => {
86
+ return (
87
+ < WidgetWrapperComponent >
88
+ { renderWidget ( globalTheme ) ( widget , key ) }
89
+ </ WidgetWrapperComponent >
90
+ ) ;
91
+ } ;
92
+ }
93
+
94
+ function renderWidget (
95
+ globalTheme : ThemePrepared < any >
96
+ ) : ( value ?: IWidget , index ?: number ) => JSX . Element {
97
+ return ( widget : IWidget , key : number ) => (
98
+ < Widget key = { key } widget = { widget } >
99
+ < WidgetTitle
100
+ widget = { widget }
101
+ allowHidingWidget = { allowHidingWidget }
102
+ onWidgetHiding = { ( hidingWidget : IWidget ) => {
103
+ if ( onWidgetHiding ) {
104
+ onWidgetHiding ( hidingWidget ) ;
105
+ }
106
+ if ( ! hidingWidget . controlOptions ) {
107
+ hidingWidget . controlOptions = { } ;
108
+ }
109
+ hidingWidget . controlOptions . isHidden = true ;
110
+ setWidgets ( [ ...widgets ] ) ;
111
+ } }
112
+ globalTheme = { globalTheme }
113
+ />
114
+ < WidgetBody widget = { widget } siteVariables = { globalTheme . siteVariables } />
115
+ { widget . link && < WidgetFooter widget = { widget } /> }
116
+ </ Widget >
117
+ ) ;
118
+ }
98
119
}
0 commit comments