Skip to content

Commit 41d0b73

Browse files
committed
refactor rendering of moments
1 parent a54ec82 commit 41d0b73

File tree

6 files changed

+132
-219
lines changed

6 files changed

+132
-219
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,5 @@
102102
"component",
103103
"react"
104104
],
105-
"packageManager": "[email protected]"
105+
"packageManager": "[email protected]+sha512.38dc6fba8dba35b39340b9700112c2fe1e12f10b17134715a4aa98ccf7bb035e76fd981cf0bb384dfa98f8d6af5481c2bef2f4266a24bfa20c34eb7147ce0b5e"
106106
}

src/Scheduler/Scheduler.stories.tsx

+8-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import dayjs from "dayjs";
44

55
import {
66
DefaultMomentLabel,
7+
DetermineSubMomentCountsFn,
78
MomentLabelProps,
89
type MomentStyleFn,
910
OnSelectFn,
@@ -60,6 +61,8 @@ const onSelect: OnSelectFn<
6061
);
6162
};
6263

64+
const determineSubMomentCounts: DetermineSubMomentCountsFn = () => 2;
65+
6366
function GermanMomentLabel(
6467
props: MomentLabelProps<(typeof data)[number], (typeof resources)[number]>,
6568
) {
@@ -93,7 +96,10 @@ const momentStyle: MomentStyleFn<
9396
};
9497

9598
export function AdvancedScheduler() {
96-
const controller = useSchedulerController({ onSelect, enableGestures: true });
99+
const controller = useSchedulerController({
100+
onSelect,
101+
enableGestures: false,
102+
});
97103

98104
return (
99105
<Stack>
@@ -132,6 +138,7 @@ export function AdvancedScheduler() {
132138
headerOnClick={headerOnClick}
133139
momentLabelComponent={GermanMomentLabel}
134140
momentStyle={momentStyle}
141+
determineSubMomentCounts={determineSubMomentCounts}
135142
/>
136143
</Stack>
137144
);

src/SchedulerBody/SchedulerBody.tsx

+25-89
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Dayjs } from "dayjs";
44
import React, { useMemo, useRef } from "react";
55
import {
66
SchedulerController,
7-
UnknownSchedulerController,
7+
SchedulerDisplayUnit,
88
useControllerContext,
99
} from "../controller/controller";
1010
import {
@@ -27,9 +27,11 @@ import {
2727
SchedulerEntryRenderer,
2828
} from "./SchedulerEntry/SchedulerEntry";
2929
import { MomentStyleFn } from "./SchedulerMoment/momentStyling";
30-
import { SchedulerMoment } from "./SchedulerMoment/SchedulerMoment";
31-
import { determineSchedulerSubMomentsCount } from "./SchedulerMoment/util";
30+
import { SchedulerMoments } from "./SchedulerMoment/SchedulerMoment";
3231

32+
export type DetermineSubMomentCountsFn = (
33+
displayUnit: SchedulerDisplayUnit,
34+
) => number;
3335
export interface SchedulerBodyProps<TData, TResource> {
3436
startDate?: Date;
3537
endDate?: Date;
@@ -44,9 +46,7 @@ export interface SchedulerBodyProps<TData, TResource> {
4446
resourceLabelComponent?: React.FC<ResourceLabelProps<TResource>>;
4547
entryComponent?: React.FC<SchedulerEntryProps<TData, TResource>>;
4648
nowMarkerComponent?: React.FC<NowMarkerProps>;
47-
customDetermineSchedulerSubMomentsCount?: (
48-
controller: UnknownSchedulerController,
49-
) => number;
49+
determineSubMomentCounts?: DetermineSubMomentCountsFn;
5050
momentStyle?: MomentStyleFn<TData, TResource>;
5151
}
5252

@@ -58,17 +58,14 @@ function SchedulerBodyRow<TData, TResource>({
5858
resourceId,
5959
getEndDate,
6060
getStartDate,
61-
62-
firstMomentLoss,
63-
lastMomentLoss,
61+
resourcesCount,
6462
rowHeight,
65-
resources,
6663
rowIndex,
67-
customDetermineSchedulerSubMomentsCount,
6864
momentStyle,
65+
subMomentCount,
6966
}: {
7067
data: TData[];
71-
resources: TResource[];
68+
resourcesCount: number;
7269
customNowMarker: NonNullable<
7370
SchedulerBodyProps<TData, TResource>["nowMarkerComponent"]
7471
>;
@@ -82,16 +79,9 @@ function SchedulerBodyRow<TData, TResource>({
8279
>;
8380

8481
rowHeight: SchedulerBodyProps<TData, TResource>["rowHeight"];
85-
firstMomentLoss: number;
86-
lastMomentLoss: number;
8782

8883
rowIndex: number;
89-
customDetermineSchedulerSubMomentsCount: NonNullable<
90-
SchedulerBodyProps<
91-
TData,
92-
TResource
93-
>["customDetermineSchedulerSubMomentsCount"]
94-
>;
84+
subMomentCount: number;
9585
momentStyle?: MomentStyleFn<TData, TResource>;
9686
}) {
9787
const rowRef = useRef<HTMLDivElement | null>(null);
@@ -141,10 +131,6 @@ function SchedulerBodyRow<TData, TResource>({
141131
{ target: rowRef, wheel: { eventOptions: { passive: false } } },
142132
);
143133

144-
const subMomentsCount = useMemo(
145-
() => customDetermineSchedulerSubMomentsCount(controller),
146-
[controller, customDetermineSchedulerSubMomentsCount],
147-
);
148134
const filteredData = useMemo(
149135
() => data.filter((item) => getDataResourceId(item).includes(resourceId)),
150136
[data, getDataResourceId, resourceId],
@@ -188,42 +174,14 @@ function SchedulerBodyRow<TData, TResource>({
188174
);
189175
})}
190176

191-
{controller.moments
192-
.map((moment, index): [Dayjs, number] => [
193-
moment,
194-
controller.momentWidths[index],
195-
])
196-
.map(([moment, distance], momentIndex) => {
197-
return (
198-
<SchedulerMoment
199-
key={`scheduler_moment_top_${resourceId}_${momentIndex}`}
200-
displayUnit={controller.displayUnit}
201-
height={rowHeight}
202-
moment={moment}
203-
resourceId={resourceId}
204-
width={`${distance}%`}
205-
isTop={rowIndex === 0}
206-
isBottom={rowIndex === resources.length - 1}
207-
isLeft={momentIndex === 0}
208-
isRight={momentIndex === controller.moments.length - 1}
209-
subMomentCount={subMomentsCount}
210-
onDragEnd={controller.momentDragEnd}
211-
onDragStartOverFactory={controller.momentDragStartOver}
212-
firstSelectedMoment={controller.firstSelectedMoment}
213-
lastSelectedMoment={controller.lastSelectedMoment}
214-
selectedResource={controller.selectedResource}
215-
momentIndex={momentIndex}
216-
loss={
217-
momentIndex === 0
218-
? firstMomentLoss
219-
: momentIndex === controller.moments.length - 1
220-
? lastMomentLoss
221-
: 1
222-
}
223-
momentStyle={momentStyle}
224-
/>
225-
);
226-
})}
177+
<SchedulerMoments
178+
resourceId={resourceId}
179+
resourcesCount={resourcesCount}
180+
rowHeight={rowHeight}
181+
rowIndex={rowIndex}
182+
momentStyle={momentStyle}
183+
subMomentCount={subMomentCount}
184+
/>
227185
</Flex>
228186
);
229187
}
@@ -238,14 +196,11 @@ export function SchedulerBody<TData, TResource>({
238196
resourceLabelComponent,
239197
entryComponent,
240198
nowMarkerComponent,
241-
242-
customDetermineSchedulerSubMomentsCount:
243-
customDetermineSchedulerSubMomentsCountParam,
199+
determineSubMomentCounts,
244200
rowHeight,
245201
momentStyle,
246202
}: SchedulerBodyProps<TData, TResource>) {
247-
const controller: SchedulerController<TData, TResource> =
248-
useControllerContext();
203+
const controller = useControllerContext();
249204
const getResourceId = useStringAccessor(resourceIdField);
250205
const getDataResourceId = useStringArrayAccessor(dataResourceIdField);
251206
const getStartDate = useDateAccessor(startDateField);
@@ -263,24 +218,9 @@ export function SchedulerBody<TData, TResource>({
263218
[nowMarkerComponent],
264219
);
265220

266-
const customDetermineSchedulerSubMomentsCount = useMemo(
267-
() =>
268-
customDetermineSchedulerSubMomentsCountParam ??
269-
determineSchedulerSubMomentsCount,
270-
[customDetermineSchedulerSubMomentsCountParam],
271-
);
272-
273-
const firstMomentLoss = useMemo(
274-
() =>
275-
(controller.momentWidths[0] / 100) * (controller.momentWidths.length - 1),
276-
[controller.momentWidths],
277-
);
278-
279-
const lastMomentLoss = useMemo(
280-
() =>
281-
(controller.momentWidths[controller.momentWidths.length - 1] / 100) *
282-
(controller.momentWidths.length - 1),
283-
[controller.momentWidths],
221+
const subMomentCount = useMemo(
222+
() => determineSubMomentCounts?.(controller.displayUnit) ?? 0,
223+
[controller.displayUnit, determineSubMomentCounts],
284224
);
285225

286226
return (
@@ -310,21 +250,17 @@ export function SchedulerBody<TData, TResource>({
310250
<SchedulerBodyRow
311251
key={rowIndex}
312252
rowIndex={rowIndex}
313-
customDetermineSchedulerSubMomentsCount={
314-
customDetermineSchedulerSubMomentsCount
315-
}
316253
customNowMarker={customNowMarker}
317254
data={data}
318255
entryComponent={customSchedulerEntry}
319-
firstMomentLoss={firstMomentLoss}
320-
lastMomentLoss={lastMomentLoss}
321256
getDataResourceId={getDataResourceId}
322257
getEndDate={getEndDate}
323258
getStartDate={getStartDate}
324259
resourceId={resourceId}
325-
resources={resources}
326260
rowHeight={rowHeight}
327261
momentStyle={momentStyle}
262+
resourcesCount={resources.length}
263+
subMomentCount={subMomentCount}
328264
/>
329265
</Grid.Col>
330266
</resourceContext.Provider>

0 commit comments

Comments
 (0)