A simple but customizable resource scheduler/timeline component built with mantine.
This library uses subgrids, which is a rather new browser feature.
@mantine/hooks
for @mantine/core@mantine/core
for stylingdayjs
for handling of dates@tanstack/react-virtual
for virtualization of bigger timelinesvaltio
for more granular render control@use-gesture/react
for panning and zoom gestures when holding CTRL
import { type Dayjs } from "dayjs";
import { useSchedulerController, Scheduler } from "mantine-resource-timeline";
interface MyDataType {
id: string | number;
resourceId: string | number | number[] | string[];
startDate: Date;
endDate: Date;
}
interface MyResourceType {
id: string | number;
name: string;
}
const data: MyDataType[] = [
{
id: "appointment-1",
title: "Bob & Alice Meet",
resourceId: [1, 2],
startDate: Dayjs,
endDate: Dayjs,
},
];
const resources: MyResourceType[] = [
{
id: 1,
name: "Bob",
},
{
id: 2,
name: "Alice",
},
];
function MyTimeline() {
const controller = useSchedulerController<MyDataType, MyResourceType>({});
return (
<Scheduler
controller={controller}
data={data}
resources={resources}
width="100%"
height="95vh"
dataResourceIdAccessor="resourceId"
endDateAccessor="endDate"
startDateAccessor="startDate"
dataIdAccessor="id"
resourceIdAccessor="id"
tz="Europe/Berlin"
/>
);
}
For how to activate other features of this library and adapting the timeline component to your needs take a look at the Advanced Example.
The controller object allows us to control multiple components state, such as the time to be displayed, from the outside. It's a valtio proxy object which allows us to pass it around in our app without having to fear unnecessary re-renders. Take a look at valtio's documentation to find out how a valtio proxy object is handled correctly.
I have mostly achieved what I initially wanted to achieve with this component library. This means I most likely won't re-iterate on it because I have lost my interest in this project. I'm still eager to answer questions via issues or review Pull Requests to this project though. Feel free to contribute anything you'd like as long as it's within the scope of this project. Especially if it includes documentation/tests.
To develop code for this project you need pnpm. If you don't use pnpm already, you can follow their installation guide to install it. I personally recommend installation via corepack.
After that you can install dependencies via:
pnpm install
Next you should be able to start the storybook server via:
pnpm storybook
Then you can open the storybook via http://127.0.0.1:6006.
Before committing and pushing you should format and lint the project via the following commands:
pnpm format
pnpm lint