Skip to content

Commit ee010bf

Browse files
Copilotflaviendelanglerita-codes
authored
[scheduler] Add visibleResources / defaultVisibleResources / onVisibleResourcesChange props (#20615)
Signed-off-by: Flavien DELANGLE <[email protected]> Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: flaviendelangle <[email protected]> Co-authored-by: delangle <[email protected]> Co-authored-by: Rita <[email protected]>
1 parent 2178800 commit ee010bf

File tree

22 files changed

+357
-45
lines changed

22 files changed

+357
-45
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import * as React from 'react';
2+
import { EventCalendar } from '@mui/x-scheduler/event-calendar';
3+
import {
4+
initialEvents,
5+
resources,
6+
defaultVisibleDate,
7+
} from '../datasets/personal-agenda';
8+
9+
export default function DefaultVisibleResources() {
10+
const [events, setEvents] = React.useState(initialEvents);
11+
12+
return (
13+
<div style={{ height: '600px', width: '100%' }}>
14+
<EventCalendar
15+
events={events}
16+
onEventsChange={setEvents}
17+
defaultVisibleDate={defaultVisibleDate}
18+
resources={resources}
19+
defaultVisibleResources={{
20+
holidays: false,
21+
medical: false,
22+
}}
23+
defaultPreferences={{ isSidePanelOpen: false }}
24+
/>
25+
</div>
26+
);
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import * as React from 'react';
2+
import { EventCalendar } from '@mui/x-scheduler/event-calendar';
3+
import {
4+
initialEvents,
5+
resources,
6+
defaultVisibleDate,
7+
} from '../datasets/personal-agenda';
8+
9+
export default function DefaultVisibleResources() {
10+
const [events, setEvents] = React.useState(initialEvents);
11+
12+
return (
13+
<div style={{ height: '600px', width: '100%' }}>
14+
<EventCalendar
15+
events={events}
16+
onEventsChange={setEvents}
17+
defaultVisibleDate={defaultVisibleDate}
18+
resources={resources}
19+
defaultVisibleResources={{
20+
holidays: false,
21+
medical: false,
22+
}}
23+
defaultPreferences={{ isSidePanelOpen: false }}
24+
/>
25+
</div>
26+
);
27+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<EventCalendar
2+
events={events}
3+
onEventsChange={setEvents}
4+
defaultVisibleDate={defaultVisibleDate}
5+
resources={resources}
6+
defaultVisibleResources={{
7+
holidays: false,
8+
medical: false,
9+
}}
10+
defaultPreferences={{ isSidePanelOpen: false }}
11+
/>
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import * as React from 'react';
2+
import { EventCalendar } from '@mui/x-scheduler/event-calendar';
3+
import {
4+
initialEvents,
5+
resources,
6+
defaultVisibleDate,
7+
} from '../datasets/personal-agenda';
8+
9+
export default function VisibleResources() {
10+
const [events, setEvents] = React.useState(initialEvents);
11+
const [visibleResources, setVisibleResources] = React.useState(() => ({
12+
holidays: false,
13+
medical: false,
14+
}));
15+
16+
const handleVisibleResourcesChange = React.useCallback((newVisibleResources) => {
17+
setVisibleResources(newVisibleResources);
18+
}, []);
19+
20+
return (
21+
<div style={{ height: '600px', width: '100%' }}>
22+
<EventCalendar
23+
events={events}
24+
onEventsChange={setEvents}
25+
defaultVisibleDate={defaultVisibleDate}
26+
resources={resources}
27+
visibleResources={visibleResources}
28+
onVisibleResourcesChange={handleVisibleResourcesChange}
29+
defaultPreferences={{ isSidePanelOpen: false }}
30+
/>
31+
</div>
32+
);
33+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import * as React from 'react';
2+
import { EventCalendar } from '@mui/x-scheduler/event-calendar';
3+
import {
4+
initialEvents,
5+
resources,
6+
defaultVisibleDate,
7+
} from '../datasets/personal-agenda';
8+
9+
export default function VisibleResources() {
10+
const [events, setEvents] = React.useState(initialEvents);
11+
const [visibleResources, setVisibleResources] = React.useState<
12+
Record<string, boolean>
13+
>(() => ({
14+
holidays: false,
15+
medical: false,
16+
}));
17+
18+
const handleVisibleResourcesChange = React.useCallback(
19+
(newVisibleResources: Record<string, boolean>) => {
20+
setVisibleResources(newVisibleResources);
21+
},
22+
[],
23+
);
24+
25+
return (
26+
<div style={{ height: '600px', width: '100%' }}>
27+
<EventCalendar
28+
events={events}
29+
onEventsChange={setEvents}
30+
defaultVisibleDate={defaultVisibleDate}
31+
resources={resources}
32+
visibleResources={visibleResources}
33+
onVisibleResourcesChange={handleVisibleResourcesChange}
34+
defaultPreferences={{ isSidePanelOpen: false }}
35+
/>
36+
</div>
37+
);
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<EventCalendar
2+
events={events}
3+
onEventsChange={setEvents}
4+
defaultVisibleDate={defaultVisibleDate}
5+
resources={resources}
6+
visibleResources={visibleResources}
7+
onVisibleResourcesChange={handleVisibleResourcesChange}
8+
defaultPreferences={{ isSidePanelOpen: false }}
9+
/>

docs/data/scheduler/resource-properties/resource-properties.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,17 @@ function Calendar() {
3737
```
3838

3939
{{"demo": "TitleProperty.js", "bg": "inline", "defaultCodeOpen": false}}
40+
41+
## Visible resources
42+
43+
### Initialize the visible resources
44+
45+
Use the `defaultVisibleResources` prop to set the initial visibility state of resources. A resource is visible if it is not in the object or if it has a `true` value.
46+
47+
{{"demo": "DefaultVisibleResources.js", "bg": "inline", "defaultCodeOpen": false}}
48+
49+
### Control the visible resources
50+
51+
Use the `visibleResources` and `onVisibleResourcesChange` props to control the visibility state of resources.
52+
53+
{{"demo": "VisibleResources.js", "bg": "inline", "defaultCodeOpen": false}}

packages/x-scheduler-headless/src/scheduler-selectors/schedulerOccurrenceSelectors.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ describe('schedulerOccurrenceSelectors', () => {
210210

211211
const state = getTimelineStateFromParameters({ events: [event], resources: [R1] });
212212
// TODO: Use props.defaultVisibleResources when available
213-
state.visibleResources = new Map([[R1.id, false]]);
213+
state.visibleResources = { [R1.id]: false };
214214
const response = schedulerOccurrenceSelectors.groupedByResourceList(state, start, end);
215215

216216
expect(response[0].occurrences).to.have.length(0);

packages/x-scheduler-headless/src/scheduler-selectors/schedulerResourceSelectors.test.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,10 @@ storeClasses.forEach((storeClass) => {
385385
{ id: 'resource-2', title: 'Resource 2' },
386386
{ id: 'resource-3', title: 'Resource 3' },
387387
];
388-
const state = new storeClass.Value({ events: [], resources }, adapter).state;
389-
state.visibleResources = new Map([['resource-2', false]]);
388+
const state = new storeClass.Value(
389+
{ events: [], resources, defaultVisibleResources: { 'resource-2': false } },
390+
adapter,
391+
).state;
390392
const result = schedulerResourceSelectors.visibleIdList(state);
391393
expect(result).to.deep.equal(['resource-1', 'resource-3']);
392394
});
@@ -396,8 +398,10 @@ storeClasses.forEach((storeClass) => {
396398
{ id: 'resource-1', title: 'Resource 1' },
397399
{ id: 'resource-2', title: 'Resource 2' },
398400
];
399-
const state = new storeClass.Value({ events: [], resources }, adapter).state;
400-
state.visibleResources = new Map([['resource-1', true]]);
401+
const state = new storeClass.Value(
402+
{ events: [], resources, defaultVisibleResources: { 'resource-1': true } },
403+
adapter,
404+
).state;
401405
const result = schedulerResourceSelectors.visibleIdList(state);
402406
expect(result).to.deep.equal(['resource-1', 'resource-2']);
403407
});

packages/x-scheduler-headless/src/scheduler-selectors/schedulerResourceSelectors.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,7 @@ export const schedulerResourceSelectors = {
8484
(state: State) => state.visibleResources,
8585
(resources, visibleResources) =>
8686
resources
87-
.filter(
88-
(resourceId) =>
89-
!visibleResources.has(resourceId) || visibleResources.get(resourceId) === true,
90-
)
87+
.filter((resourceId) => visibleResources[resourceId] !== false)
9188
.map((resourceId) => resourceId),
9289
),
9390
/**

0 commit comments

Comments
 (0)