schedulant 1.0.0-alpha.1 → 1.0.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.
package/README.md CHANGED
@@ -44,3 +44,259 @@ Note: Schedulant is a project based on Typescript React, it is designed specific
44
44
  * Schedulant supports **day**, **month**, **quarter**, and **year** views. This means that users can choose the view that best suits their needs and preferences to view and manage their schedule.
45
45
  * Schedulant supports **exporting images**. This means that users can export their schedule or project timeline in the form of images, which is convenient for sharing and archiving.
46
46
  * Schedulant supports **customizing row height and column width**. This means that users can adjust the row height and column width of the schedule according to their needs and preferences, making the display of the schedule more in line with their visual habits.
47
+
48
+ ## Previews
49
+
50
+ * Day view
51
+ ![Day view](https://github.com/DAIMENGEN/schedulant/blob/master/example/previews/day.png?raw=true)
52
+
53
+ * Week view
54
+ ![Week view](https://github.com/DAIMENGEN/schedulant/blob/master/example/previews/week.png?raw=true)
55
+
56
+ * Month view
57
+ ![Month view](https://github.com/DAIMENGEN/schedulant/blob/master/example/previews/month.png?raw=true)
58
+
59
+ * Quarter view
60
+ ![Month view](https://github.com/DAIMENGEN/schedulant/blob/master/example/previews/quarter.png?raw=true)
61
+
62
+ * Year view
63
+ ![Month view](https://github.com/DAIMENGEN/schedulant/blob/master/example/previews/year.png?raw=true)
64
+
65
+ ## Props
66
+
67
+ * **start:** Start date of the schedule view.
68
+ * **end:** End date of the schedule view.
69
+ * **editable:** Whether editing the schedule is allowed; if the current value is `false`, properties such as `eventMove`, `eventResizeStart`, `eventResizeEnd`, `milestonesMove`, and `checkpointMove` will become ineffective.
70
+ * **lineHeight:** Sets the line height of the schedule.
71
+ * **slotMinWidth:** Determines how wide each of the time-axis slots will be. Specified as a number of pixels. When not specified, a reasonable value will be automatically computed.
72
+ * **schedulantMaxHeight:** Sets the max height of the entire schedule.
73
+ * **schedulantViewType:** Sets the view type of the schedule. Currently, support day, week, month quarter and year view.
74
+ * **events:** An array of event objects that will be displayed on the schedule.
75
+ * **resources:** Tells the schedule to display resources from an array input. The resource's id property is the most important because is allows associating events with resources.
76
+ * **milestones:** An array of milestones objects that will be displayed on the schedule. (**Note:** This property is optional)
77
+ * **checkpoints:** An array of milestones objects that will be displayed on the schedule. (**Note:** This property is optional)
78
+ * **companyHolidays:** An array of company holidays that will be used to mark company holidays on the schedule. (**Note:** This property is optional)
79
+ * **specialWorkdays:** An array of special workdays that will be used to mark special workdays on the schedule. (**Note:** This property is optional)
80
+ * **nationalHolidays:** An array of national holidays that will be used to mark national holidays on the schedule. (**Note:** This property is optional)
81
+ * **resourceAreaWidth:** Determines the width of the area that contains the list of resources. Can be specified as a number of pixels, or a CSS string value, like "25%". default: "30%" (**Note:** This property is optional)
82
+ * **resourceAreaColumns:** Turns the resource area from a plain list of titles into a grid of data. An array of objects can be provided, each with information about a column. (**Note:** This property is optional)
83
+ * **selectAllow:** Exact programmatic control over where the user can select. This callback will be called for every new potential selection as the user is dragging. (**Note:** This property is optional)
84
+ * **enableEventContextMenu:** Whether to enable the right-click menu functionality for event. (**Note:** This property is optional)
85
+ * **eventContextMenuClick:** The event triggered when an option in the event's right-click menu is clicked. (**Note:** This property is optional)
86
+ * **eventContextMenuItems:** Configure options in the event's right-click menu. (**Note:** This property is optional)
87
+ * **eventDidMount:** Called right after the element has been added to the DOM. If the event data changes, this is NOT called again. (**Note:** This property is optional)
88
+ * **eventWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
89
+ * **eventMove:** Triggered when event move begins. (**Note:** This property is optional)
90
+ * **eventResizeStart:** Triggered when resizing stops and the event start date has changed in duration. (**Note:** This property is optional)
91
+ * **eventResizeEnd:** Triggered when resizing stops and the event end date has changed in duration. (**Note:** This property is optional)
92
+ * **enableMilestoneContextMenu:** Whether to enable the right-click menu functionality for milestone. (**Note:** This property is optional)
93
+ * **milestoneContextMenuClick:** The milestone triggered when an option in the milestone's right-click menu is clicked. (**Note:** This property is optional)
94
+ * **milestoneContextMenuItems:** Configure options in the milestone's right-click menu. (**Note:** This property is optional)
95
+ * **milestoneDidMount:** Called right after the element has been added to the DOM. If the milestone data changes, this is NOT called again. (**Note:** This property is optional)
96
+ * **milestoneWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
97
+ * **milestoneMove:** Triggered when milestone move begins. (**Note:** This property is optional)
98
+ * **enableCheckpointContextMenu:** Whether to enable the right-click menu functionality for checkpoint. (**Note:** This property is optional)
99
+ * **checkpointContextMenuClick:** The checkpoint triggered when an option in checkpoint's right-click menu is clicked. (**Note:** This property is optional)
100
+ * **checkpointContextMenuItems:** Configure options in the checkpoint's right-click menu. (**Note:** This property is optional)
101
+ * **checkpointDidMount:** Called right after the element has been added to the DOM. If the checkpoint data changes, this is NOT called again. (**Note:** This property is optional)
102
+ * **checkpointWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
103
+ * **checkpointMove:** Triggered when event move begins. (**Note:** This property is optional)
104
+ * **enableResourceLaneContextMenu:** Whether to enable the right-click menu functionality for resource lane. (**Note:** This property is optional)
105
+ * **resourceLaneContextMenuClick:** The resource lane triggered when an option in resource lane's right-click menu is clicked. (**Note:** This property is optional)
106
+ * **resourceLaneContextMenuItems:** Configure options in the resource lane's right-click menu. (**Note:** This property is optional)
107
+ * **resourceLaneDidMount:** Called right after the element has been added to the DOM. If the resource data changes, this is NOT called again. (**Note:** This property is optional)
108
+ * **resourceLaneWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
109
+ * **enableResourceLabelContextMenu:** Whether to enable the right-click menu functionality for resource label. (**Note:** This property is optional)
110
+ * **resourceLabelContextMenuClick:** The resource label triggered when an option in resource lane's right-click menu is clicked. (**Note:** This property is optional)
111
+ * **resourceLabelContextMenuItems:** Configure options in the resource lane's right-click menu. (**Note:** This property is optional)
112
+ * **resourceLabelDidMount:** Called right after the element has been added to the DOM. If the resource label data changes, this is NOT called again. (**Note:** This property is optional)
113
+ * **resourceLabelWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
114
+ * **timelineSlotLabelDidMount:** Called right after the element has been added to the DOM. (**Note:** This property is optional)
115
+ * **timelineSlotLabelWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
116
+ * **timelineSlotLaneDidMount:** Called right after the element has been added to the DOM. (**Note:** This property is optional)
117
+ * **timelineSlotLaneWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
118
+ * **schedulantDidMount:** Called right after the element has been added to the DOM. (**Note:** This property is optional)
119
+ * **schedulantWillUnmount:** Called right before the element will be removed from the DOM. (**Note:** This property is optional)
120
+
121
+ ## Basic Example
122
+ ```typescript
123
+ import "schedulant/dist/schedulant.css";
124
+ const App = () => {
125
+ const mockResources = [
126
+ {
127
+ id: "8968845952632643583",
128
+ title: "Transfer to ATJ for learning and working",
129
+ parentId: "4575511461886459807",
130
+ extendedProps: {
131
+ order: 1
132
+ }
133
+ },
134
+ {
135
+ id: "8638818878966724025",
136
+ title: "Memory Test Software",
137
+ type: 1,
138
+ extendedProps: {
139
+ order: 2
140
+ }
141
+ },
142
+ {
143
+ id: "8858562325095899135",
144
+ title: "WFB 3D Viewer (Prototype)",
145
+ parentId: "8638818878966724025",
146
+ extendedProps: {
147
+ order: 1
148
+ }
149
+ }
150
+ ];
151
+ const mockEvents: Array<Event> = [
152
+ {
153
+ id: "1",
154
+ title: "Transfer to ATJ for learning and working",
155
+ color: "#000000",
156
+ start: dayjs("2024-04-01"),
157
+ end: dayjs("2024-06-30"),
158
+ resourceId: "8968845952632643583"
159
+ },
160
+ {
161
+ id: "2",
162
+ title: "Memory Test Software",
163
+ color: "rgba(0,0,0,0.57)",
164
+ start: dayjs("2021-01-01"),
165
+ end: dayjs("2024-12-31"),
166
+ resourceId: "8638818878966724025",
167
+ },
168
+ {
169
+ id: "3",
170
+ title: "WFB 3D Viewer (Prototype)",
171
+ color: "#000000",
172
+ start: dayjs("2024-04-01"),
173
+ end: dayjs("2024-06-15"),
174
+ resourceId: "8858562325095899135"
175
+ },
176
+ ];
177
+ const mockCheckpoints: Array<Checkpoint> = [
178
+ {
179
+ id: "1",
180
+ title: "Test Condition Monitor",
181
+ color: "green",
182
+ timestamp: dayjs("2024-04-15"),
183
+ resourceId: "8968845952632643583",
184
+ },
185
+ ];
186
+ const mockMilestones: Array<Milestone> = [
187
+ {
188
+ id: "1",
189
+ title: "milestone1",
190
+ timestamp: dayjs("2024-04-31"),
191
+ status: "Success",
192
+ resourceId: "8858562325095899135",
193
+ }
194
+ ]
195
+ return (
196
+ <div>
197
+ <Schedulant start={dayjs("2024-01-01")}
198
+ end={dayjs("2024-10-01")}
199
+ editable={true}
200
+ lineHeight={40}
201
+ slotMinWidth={50}
202
+ schedulantMaxHeight={600}
203
+ schedulantViewType={"Day"}
204
+ resources={mockResources}
205
+ events={mockEvents}
206
+ checkpoints={mockCheckpoints}
207
+ milestones={mockMilestones}
208
+ enableEventContextMenu={true}
209
+ resourceAreaColumns={[
210
+ {
211
+ field: "title",
212
+ headerContent: "Title"
213
+ },
214
+ {
215
+ field: "order",
216
+ headerContent: "Order"
217
+ },
218
+ {
219
+ field: "parentId",
220
+ headerContent: "ParentId"
221
+ }
222
+ ]}
223
+ eventContextMenuItems={[
224
+ {
225
+ title: "123",
226
+ label: "event lane",
227
+ }
228
+ ]}
229
+ eventContextMenuClick={(arg: EventContextMenuArg) => {
230
+ // alert(arg.eventApi.getTitle());
231
+ }}
232
+ eventDidMount={(arg: EventMountArg) => {
233
+ // console.log(arg);
234
+ }}
235
+ eventMove={(arg: EventMoveMountArg) => {
236
+ console.log("el", arg.el);
237
+ console.log("title", arg.eventApi.getTitle());
238
+ console.log("startDate", arg.startDate.format("YYYY-MM-DD"));
239
+ console.log("endDate", arg.endDate.format("YYYY-MM-DD"));
240
+ console.log("scheduleApi", arg.scheduleApi);
241
+ }}
242
+ eventResizeEnd={(arg: EventResizeMountArg) => {
243
+ console.log("el", arg.el);
244
+ console.log("title", arg.eventApi.getTitle());
245
+ console.log("date", arg.date.format("YYYY-MM-DD"));
246
+ console.log("scheduleApi", arg.scheduleApi);
247
+ }}
248
+ eventResizeStart={(arg: EventResizeMountArg) => {
249
+ console.log("el", arg.el);
250
+ console.log("title", arg.eventApi.getTitle());
251
+ console.log("date", arg.date.format("YYYY-MM-DD"));
252
+ console.log("scheduleApi", arg.scheduleApi);
253
+ }}
254
+ enableResourceLabelContextMenu={true}
255
+ resourceLabelContextMenuItems={[
256
+ {
257
+ title: "123",
258
+ label: "resource label",
259
+ }
260
+ ]}
261
+ resourceLabelContextMenuClick={(arg: ResourceLabelContextMenuArg) => {
262
+ alert(arg.label.headerContent);
263
+ }}
264
+ resourceLabelDidMount={(arg: ResourceLabelMountArg) => {
265
+ // console.log(arg);
266
+ }}
267
+ enableResourceLaneContextMenu={true}
268
+ resourceLaneContextMenuItems={[
269
+ {
270
+ title: "123",
271
+ label: "resource lane",
272
+ }
273
+ ]}
274
+ resourceLaneContextMenuClick={(arg: ResourceLaneContextMenuArg) => {
275
+ // alert(arg.resourceApi.getTitle());
276
+ }}
277
+ resourceLaneDidMount={(arg: ResourceLaneMountArg) => {
278
+ // console.log(arg)
279
+ }}
280
+ milestoneDidMount={(arg: MilestoneMountArg) => {
281
+ const {el, milestoneApi} = arg;
282
+ el.title = milestoneApi.getTitle();
283
+ }}
284
+ milestoneMove={(arg: MilestoneMoveMountArg) => {
285
+ console.log("el", arg.el);
286
+ console.log("title", arg.milestoneApi.getTitle());
287
+ console.log("date", arg.date.format("YYYY-MM-DD"));
288
+ console.log("scheduleApi", arg.scheduleApi);
289
+ console.log("milestoneApi", arg.milestoneApi);
290
+ }}
291
+ checkpointMove={(arg: CheckpointMoveMountArg) => {
292
+ console.log("el", arg.el);
293
+ console.log("title", arg.checkpointApi.getTitle());
294
+ console.log("date", arg.date.format("YYYY-MM-DD"));
295
+ console.log("scheduleApi", arg.scheduleApi);
296
+ console.log("checkpointApi", arg.checkpointApi);
297
+ }}
298
+ />
299
+ </div>
300
+ )
301
+ }
302
+ ```
@@ -1,5 +1,6 @@
1
1
  import { SchedulantApi } from '../../types/schedulant.ts';
2
2
  import { ResourceApi, ResourceAreaColumn } from '../../types/resource.ts';
3
+ import { ResizerMouseDownFunc, ResizerMouseUp } from '../../hooks/use-resource-area-resizer.ts';
3
4
  export declare const BodyCell: (props: {
4
5
  schedulantApi: SchedulantApi;
5
6
  resourceApi: ResourceApi;
@@ -7,4 +8,7 @@ export declare const BodyCell: (props: {
7
8
  showPlusSquare: boolean;
8
9
  showIndentation: boolean;
9
10
  resourceAreaColumn: ResourceAreaColumn;
11
+ isResizable: boolean;
12
+ cellResizerMouseUp: ResizerMouseUp;
13
+ cellResizerMouseDownFunc: ResizerMouseDownFunc;
10
14
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,7 @@
1
1
  import { SchedulantView } from '../../types/schedulant-view.tsx';
2
+ import { ResizerMouseDownFunc, ResizerMouseUp } from '../../hooks/use-resource-area-resizer.ts';
2
3
  export declare const DatagridBody: (props: {
3
4
  schedulantView: SchedulantView;
5
+ cellResizerMouseUp: ResizerMouseUp;
6
+ cellResizerMouseDownFunc: ResizerMouseDownFunc;
4
7
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,7 @@
1
1
  import { SchedulantView } from '../../types/schedulant-view.tsx';
2
+ import { ResizerMouseDownFunc, ResizerMouseUp } from '../../hooks/use-resource-area-resizer.ts';
2
3
  export declare const DatagridHead: (props: {
3
4
  schedulantView: SchedulantView;
5
+ cellResizerMouseUp: ResizerMouseUp;
6
+ cellResizerMouseDownFunc: ResizerMouseDownFunc;
4
7
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1,7 +1,10 @@
1
1
  import { ResourceAreaColumn } from '../../types/resource.ts';
2
2
  import { SchedulantApi } from '../../types/schedulant.ts';
3
+ import { ResizerMouseDownFunc, ResizerMouseUp } from '../../hooks/use-resource-area-resizer.ts';
3
4
  export declare const HeadCell: (props: {
4
5
  schedulantApi: SchedulantApi;
5
6
  resourceAreaColumn: ResourceAreaColumn;
6
7
  isResizable: boolean;
8
+ cellResizerMouseUp: ResizerMouseUp;
9
+ cellResizerMouseDownFunc: ResizerMouseDownFunc;
7
10
  }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { Dispatch, MouseEventHandler, MutableRefObject, RefObject } from 'react';
2
+ import { Action } from '../context/schedulant-state';
3
+ export type ResizerMouseUp = MouseEventHandler<HTMLDivElement>;
4
+ export type ResizerMouseDown = MouseEventHandler<HTMLDivElement>;
5
+ export type ResizerMouseDownFunc = (cellRef: MutableRefObject<HTMLDivElement | null>) => ResizerMouseDown;
6
+ export declare const useResourceAreaResizer: (dispatch: Dispatch<Action>, scheduleElRef: RefObject<HTMLDivElement>, resourceAreaColElRef: RefObject<HTMLTableColElement>) => {
7
+ datagridResizerMouseUp: ResizerMouseUp;
8
+ datagridResizerMouseDown: ResizerMouseDown;
9
+ datagridCellResizerMouseUp: ResizerMouseUp;
10
+ datagridCellResizerMouseDownFunc: ResizerMouseDownFunc;
11
+ };
@@ -1 +1 @@
1
- ::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background-color:#f5f5f5}::-webkit-scrollbar-thumb{background:#848484;border-radius:5px;border:2px solid #fff;box-shadow:inset 0 0 5px #0003}::-webkit-scrollbar-thumb:hover{background-color:#91003c}::-webkit-scrollbar-button{display:none}::-webkit-scrollbar-corner{background-color:#f5f5f5}.schedulant,.schedulant *{box-sizing:border-box}.schedulant{direction:ltr;text-align:left;display:flex;flex-direction:column;font-size:1em;position:relative}.schedulant table{border-collapse:collapse;border-spacing:0;font-size:1em;table-layout:fixed;width:100%}.schedulant table td,.schedulant table th{padding:0;border:1px solid #CED4DA}.schedulant table th{text-align:center}.schedulant .schedulant-view-harness{flex-grow:1;position:relative}.schedulant .schedulant-view-harness .schedulant-view{top:0;right:0;bottom:0;left:0;position:absolute}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-scroller-harness{height:100%;direction:ltr;overflow:hidden;position:relative}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-resource-timeline-divider{cursor:col-resize;width:3px;background-color:#e9ecef}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-datagrid-cell-frame{height:100%;display:flex;justify-content:flex-start;align-items:center;position:relative;cursor:pointer}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-datagrid-cell-frame .schedulant-datagrid-cell-cushion{overflow:hidden;padding-left:8px;white-space:nowrap}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header>td{border-bottom-style:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-left{height:100%;overflow:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-left .schedulant-datagrid-header{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-left .schedulant-datagrid-header td,.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-left .schedulant-datagrid-header th{border-bottom-style:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-left .schedulant-datagrid-header .schedulant-datagrid-cell-resizer{position:absolute;top:0;bottom:0;cursor:col-resize;width:10px;z-index:1;right:-5px}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-right{overflow:hidden scroll}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-right .schedulant-timeline-header table tr:last-child td,.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-header .schedulant-scroller-harness .schedulant-scroller-header-right .schedulant-timeline-header table tr:last-child th{border-bottom-style:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-scroller-harness .schedulant-scroller-body-left{top:0;right:0;bottom:0;left:0;position:absolute;overflow:scroll}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-scroller-harness .schedulant-scroller-body-left::-webkit-scrollbar{width:0}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-scroller-harness .schedulant-scroller-body-right{top:0;right:0;bottom:0;left:0;position:absolute;overflow:scroll}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body{min-height:100%;position:relative;z-index:1}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-slots{position:absolute;top:0;bottom:0;z-index:1}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-slots .schedulant-timeline-slot-frame{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-slots>table{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame{position:relative}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-lane{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events{position:relative;width:0;z-index:3}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events .schedulant-timeline-event-harness{position:absolute;z-index:2}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events .schedulant-timeline-event-harness .schedulant-timeline-event{border-radius:5px;display:flex;justify-content:space-between}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events .schedulant-timeline-event-harness .schedulant-timeline-event .schedulant-event-main{padding-left:5px;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones{position:relative;width:0;z-index:4}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness{position:absolute;z-index:2}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness .schedulant-timeline-milestone{width:100%;text-align:center}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness .schedulant-timeline-milestone .schedulant-milestone-main svg{transition:transform .3s ease}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness .schedulant-timeline-milestone .schedulant-milestone-main svg:hover{transform:scale(1.2);cursor:pointer}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints{position:relative;width:0;z-index:4}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness{position:absolute;z-index:2}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness .schedulant-timeline-checkpoint{width:100%;text-align:center}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness .schedulant-timeline-checkpoint .schedulant-checkpoint-main svg{transition:transform .3s ease}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness .schedulant-timeline-checkpoint .schedulant-checkpoint-main svg:hover{transform:scale(1.2);cursor:pointer}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.schedulant .schedulant-icon{display:inline-block;height:12px;width:12px;margin-right:1px}.schedulant .schedulant-holiday{background-color:#e9ecef}
1
+ ::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background-color:#f5f5f5}::-webkit-scrollbar-thumb{background:#848484;border-radius:5px;border:2px solid #fff;box-shadow:inset 0 0 5px #0003}::-webkit-scrollbar-thumb:hover{background-color:#91003c}::-webkit-scrollbar-button{display:none}::-webkit-scrollbar-corner{background-color:#f5f5f5}.schedulant,.schedulant *{box-sizing:border-box}.schedulant{direction:ltr;text-align:left;display:flex;flex-direction:column;font-size:1em;position:relative}.schedulant table{border-collapse:collapse;border-spacing:0;font-size:1em;table-layout:fixed;width:100%}.schedulant table td,.schedulant table th{padding:0;border:1px solid #CED4DA}.schedulant table th{text-align:center}.schedulant .schedulant-view-harness{flex-grow:1;position:relative}.schedulant .schedulant-view-harness .schedulant-view{top:0;right:0;bottom:0;left:0;position:absolute}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-scroller-harness{height:100%;direction:ltr;overflow:hidden;position:relative}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-resource-timeline-divider{cursor:col-resize;width:3px;background-color:#e9ecef}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-datagrid-cell-frame{height:100%;display:flex;justify-content:flex-start;align-items:center;position:relative;cursor:pointer}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section .schedulant-datagrid-cell-frame .schedulant-datagrid-cell-cushion{overflow:hidden;padding-left:8px;white-space:nowrap}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head>td{border-bottom-style:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-left{height:100%;overflow:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-left .schedulant-datagrid-head{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-left .schedulant-datagrid-head td,.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-left .schedulant-datagrid-head th{border-bottom-style:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-left .schedulant-datagrid-head .schedulant-datagrid-cell-resizer{position:absolute;top:0;bottom:0;cursor:col-resize;width:10px;z-index:1;right:-5px}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-right{overflow:hidden scroll}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-right .schedulant-timeline-head table tr:last-child td,.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-head .schedulant-scroller-harness .schedulant-scroller-head-right .schedulant-timeline-head table tr:last-child th{border-bottom-style:hidden}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-scroller-harness .schedulant-scroller-body-left::-webkit-scrollbar{width:0}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-scroller-harness .schedulant-scroller-body-left{top:0;right:0;bottom:0;left:0;overflow:scroll;position:absolute}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-scroller-harness .schedulant-scroller-body-left .schedulant-datagrid-body .schedulant-datagrid-cell-resizer{position:absolute;top:0;bottom:0;cursor:col-resize;width:10px;z-index:1;right:-5px}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-scroller-harness .schedulant-scroller-body-right{top:0;right:0;bottom:0;left:0;position:absolute;overflow:scroll}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body{min-height:100%;position:relative;z-index:1}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-slots{position:absolute;top:0;bottom:0;z-index:1}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-slots .schedulant-timeline-slot-frame{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-slots>table{height:100%}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame{position:relative}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-lane{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events{position:relative;width:0;z-index:3}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events .schedulant-timeline-event-harness{position:absolute;z-index:2}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events .schedulant-timeline-event-harness .schedulant-timeline-event{border-radius:5px;display:flex;justify-content:space-between}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-events .schedulant-timeline-event-harness .schedulant-timeline-event .schedulant-event-main{padding-left:5px;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones{position:relative;width:0;z-index:4}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness{position:absolute;z-index:2}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness .schedulant-timeline-milestone{width:100%;text-align:center}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness .schedulant-timeline-milestone .schedulant-milestone-main svg{transition:transform .3s ease}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-milestones .schedulant-timeline-milestone-harness .schedulant-timeline-milestone .schedulant-milestone-main svg:hover{transform:scale(1.2);cursor:pointer}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints{position:relative;width:0;z-index:4}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness{position:absolute;z-index:2}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness .schedulant-timeline-checkpoint{width:100%;text-align:center}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness .schedulant-timeline-checkpoint .schedulant-checkpoint-main svg{transition:transform .3s ease}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid .schedulant-scrollgrid-section-body .schedulant-timeline-body .schedulant-timeline-drawing-board .schedulant-timeline-lane-frame .schedulant-timeline-checkpoints .schedulant-timeline-checkpoint-harness .schedulant-timeline-checkpoint .schedulant-checkpoint-main svg:hover{transform:scale(1.2);cursor:pointer}.schedulant .schedulant-view-harness .schedulant-view .schedulant-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.schedulant .schedulant-icon{display:inline-block;height:12px;width:12px;margin-right:1px}.schedulant .schedulant-holiday{background-color:#e9ecef}