@easyteam/auto-scheduler-modal-ui 0.1.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.
@@ -0,0 +1,432 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ThemeOverride } from '@chakra-ui/react';
3
+
4
+ declare class RequestError extends Error {
5
+ status: number;
6
+ payload?: unknown;
7
+ constructor(message: string, status: number, payload?: unknown);
8
+ }
9
+ type ScheduleSolutionEmployee = {
10
+ id: string;
11
+ name?: string;
12
+ position?: string;
13
+ properties?: Record<string, unknown>;
14
+ locationIds?: string[];
15
+ };
16
+ type ScheduleSolutionLocation = {
17
+ id: string;
18
+ timezone?: string;
19
+ jurisdiction?: string;
20
+ tags?: string[];
21
+ properties?: Record<string, unknown>;
22
+ };
23
+ type ScheduleSolutionShift = {
24
+ id: string;
25
+ startDateTime?: string;
26
+ endDateTime?: string;
27
+ startTime?: string;
28
+ endTime?: string;
29
+ requiredHours?: number;
30
+ requiredPosition?: string | null;
31
+ requiredCount?: number;
32
+ location?: ScheduleSolutionLocation;
33
+ employeePreferences?: Array<{
34
+ employeeId: string;
35
+ level: string;
36
+ }>;
37
+ };
38
+ type ShiftAssignmentJustification = {
39
+ status: string;
40
+ constraintName?: string;
41
+ ruleId?: string | null;
42
+ archetype?: string | null;
43
+ jurisdiction?: string | null;
44
+ type: string;
45
+ impact?: string;
46
+ description?: string;
47
+ };
48
+ type ScheduleSolutionShiftAssignment = {
49
+ id: number;
50
+ shift?: ScheduleSolutionShift;
51
+ slotIndex?: number;
52
+ employee?: ScheduleSolutionEmployee | null;
53
+ pinned: boolean;
54
+ justifications?: ShiftAssignmentJustification[];
55
+ };
56
+ type ScheduleSolutionAvailability = {
57
+ employeeId: string;
58
+ type?: string;
59
+ daysOfWeek?: string[];
60
+ specificDates?: string[];
61
+ startTime?: string;
62
+ endTime?: string;
63
+ };
64
+ type ScheduleSolutionTimeOff = {
65
+ employeeId: string;
66
+ startDateTime: string;
67
+ endDateTime: string;
68
+ };
69
+ type ScheduleSolutionWaiver = {
70
+ employeeId: string;
71
+ ruleId: string;
72
+ expiry?: string;
73
+ };
74
+ type ScheduleSolutionRuleMetadata = Record<string, unknown>;
75
+ type ScheduleSolutionRuleOverride = {
76
+ ruleId: string;
77
+ parameters?: Record<string, unknown>;
78
+ };
79
+ type ScheduleSolution = {
80
+ employees?: ScheduleSolutionEmployee[];
81
+ shifts?: ScheduleSolutionShift[];
82
+ shiftAssignments?: ScheduleSolutionShiftAssignment[];
83
+ locations?: ScheduleSolutionLocation[];
84
+ availabilities?: ScheduleSolutionAvailability[];
85
+ timeOffs?: ScheduleSolutionTimeOff[];
86
+ waivers?: ScheduleSolutionWaiver[];
87
+ ruleMetadata?: ScheduleSolutionRuleMetadata[];
88
+ ruleOverrides?: ScheduleSolutionRuleOverride[];
89
+ ruleIds?: string[] | null;
90
+ demandCurve?: unknown | null;
91
+ mode?: "FIXED_TEMPLATE" | "FLEXIBLE_DEMAND" | "MIXED";
92
+ score?: string;
93
+ };
94
+
95
+ type LocationOption = {
96
+ id: string;
97
+ name: string;
98
+ timezone: string;
99
+ jurisdiction: string;
100
+ properties?: Record<string, unknown>;
101
+ };
102
+ type JurisdictionGroup = {
103
+ id: string;
104
+ title: string;
105
+ locations: LocationOption[];
106
+ };
107
+ type TimeOff = {
108
+ employeeId: string;
109
+ startDateTime: string;
110
+ endDateTime: string;
111
+ };
112
+ type OpenShift = {
113
+ id: string;
114
+ startTime: string;
115
+ endTime: string;
116
+ location: {
117
+ id: string;
118
+ };
119
+ requiredPosition: string;
120
+ requiredCount: number;
121
+ employeePreferences: Array<{
122
+ employeeId: string;
123
+ level: "PREFERRED" | "AVAILABLE" | "UNAVAILABLE" | string;
124
+ }>;
125
+ employeeId?: string;
126
+ };
127
+ type EmployeeProperties = {
128
+ employer_type: string;
129
+ worker_type: string;
130
+ costToRevenueRatio?: number;
131
+ avgSalesAmount?: number;
132
+ [key: string]: object | string | number | boolean | undefined;
133
+ };
134
+ type Employee = {
135
+ id: string;
136
+ name: string;
137
+ position: string;
138
+ locationIds: Array<string>;
139
+ properties: EmployeeProperties;
140
+ };
141
+ type EasyTeamThemeOverrides = {
142
+ tokens?: Record<string, unknown>;
143
+ [key: string]: unknown;
144
+ };
145
+ type AutoSchedulerModalStyleOverrides = {
146
+ overlay?: Record<string, unknown>;
147
+ content?: Record<string, unknown>;
148
+ header?: Record<string, unknown>;
149
+ title?: Record<string, unknown>;
150
+ closeButton?: Record<string, unknown>;
151
+ body?: Record<string, unknown>;
152
+ banner?: Record<string, unknown>;
153
+ bannerIcon?: Record<string, unknown>;
154
+ bannerTitle?: Record<string, unknown>;
155
+ bannerText?: Record<string, unknown>;
156
+ locationSection?: Record<string, unknown>;
157
+ locationLabelRow?: Record<string, unknown>;
158
+ locationLabel?: Record<string, unknown>;
159
+ locationBadge?: Record<string, unknown>;
160
+ locationSubtitle?: Record<string, unknown>;
161
+ locationTrigger?: Record<string, unknown>;
162
+ locationTriggerText?: Record<string, unknown>;
163
+ popoverContent?: Record<string, unknown>;
164
+ groupHeader?: Record<string, unknown>;
165
+ optionRow?: Record<string, unknown>;
166
+ optionLabel?: Record<string, unknown>;
167
+ selectedBanner?: Record<string, unknown>;
168
+ selectedBannerIcon?: Record<string, unknown>;
169
+ selectedBannerText?: Record<string, unknown>;
170
+ hardConstraintsSection?: Record<string, unknown>;
171
+ hardConstraintsLabelRow?: Record<string, unknown>;
172
+ hardConstraintsLabel?: Record<string, unknown>;
173
+ hardConstraintsBadge?: Record<string, unknown>;
174
+ hardConstraintsSubtitle?: Record<string, unknown>;
175
+ hardConstraintsTrigger?: Record<string, unknown>;
176
+ hardConstraintsTriggerText?: Record<string, unknown>;
177
+ hardConstraintsPopoverContent?: Record<string, unknown>;
178
+ hardConstraintsOptionRow?: Record<string, unknown>;
179
+ hardConstraintsOptionLabel?: Record<string, unknown>;
180
+ hardConstraintsInputsContainer?: Record<string, unknown>;
181
+ hardConstraintsInputItem?: Record<string, unknown>;
182
+ hardConstraintsInputLabel?: Record<string, unknown>;
183
+ hardConstraintsInputField?: Record<string, unknown>;
184
+ optimizationSection?: Record<string, unknown>;
185
+ optimizationLabelRow?: Record<string, unknown>;
186
+ optimizationLabel?: Record<string, unknown>;
187
+ optimizationBadge?: Record<string, unknown>;
188
+ optimizationSubtitle?: Record<string, unknown>;
189
+ optimizationTrigger?: Record<string, unknown>;
190
+ optimizationTriggerText?: Record<string, unknown>;
191
+ optimizationPopoverContent?: Record<string, unknown>;
192
+ optimizationGroupHeader?: Record<string, unknown>;
193
+ optimizationOptionRow?: Record<string, unknown>;
194
+ optimizationOptionLabel?: Record<string, unknown>;
195
+ optimizationOptionHelp?: Record<string, unknown>;
196
+ optimizationInputsContainer?: Record<string, unknown>;
197
+ optimizationInputItem?: Record<string, unknown>;
198
+ optimizationInputLabel?: Record<string, unknown>;
199
+ optimizationInputField?: Record<string, unknown>;
200
+ optimizationSuffix?: Record<string, unknown>;
201
+ optimizationDivider?: Record<string, unknown>;
202
+ optimizationSummary?: Record<string, unknown>;
203
+ creatingBody?: Record<string, unknown>;
204
+ stepsContainer?: Record<string, unknown>;
205
+ stepsList?: Record<string, unknown>;
206
+ stepRow?: Record<string, unknown>;
207
+ stepIcon?: Record<string, unknown>;
208
+ stepIconActive?: Record<string, unknown>;
209
+ stepIconDone?: Record<string, unknown>;
210
+ stepIconPending?: Record<string, unknown>;
211
+ stepIconFailed?: Record<string, unknown>;
212
+ stepTitle?: Record<string, unknown>;
213
+ stepTitleActive?: Record<string, unknown>;
214
+ stepTitleDone?: Record<string, unknown>;
215
+ stepTitlePending?: Record<string, unknown>;
216
+ stepTitleFailed?: Record<string, unknown>;
217
+ stepSubtitle?: Record<string, unknown>;
218
+ violationPanel?: Record<string, unknown>;
219
+ violationHeaderRow?: Record<string, unknown>;
220
+ violationHeader?: Record<string, unknown>;
221
+ violationIcon?: Record<string, unknown>;
222
+ violationTitle?: Record<string, unknown>;
223
+ violationSubtitle?: Record<string, unknown>;
224
+ violationToggleButton?: Record<string, unknown>;
225
+ violationToggleIcon?: Record<string, unknown>;
226
+ violationContent?: Record<string, unknown>;
227
+ violationItem?: Record<string, unknown>;
228
+ violationItemTitle?: Record<string, unknown>;
229
+ violationItemDetailRow?: Record<string, unknown>;
230
+ violationItemDetail?: Record<string, unknown>;
231
+ violationBullet?: Record<string, unknown>;
232
+ recommendationsBox?: Record<string, unknown>;
233
+ recommendationsTitle?: Record<string, unknown>;
234
+ recommendationsList?: Record<string, unknown>;
235
+ recommendationsItem?: Record<string, unknown>;
236
+ recommendationsBullet?: Record<string, unknown>;
237
+ recommendationsToggle?: Record<string, unknown>;
238
+ failedFooter?: Record<string, unknown>;
239
+ failedPrimaryButton?: Record<string, unknown>;
240
+ failedSecondaryButton?: Record<string, unknown>;
241
+ footer?: Record<string, unknown>;
242
+ cancelButton?: Record<string, unknown>;
243
+ primaryButton?: Record<string, unknown>;
244
+ violatedConstraintsSecondaryButton?: Record<string, unknown>;
245
+ };
246
+ type AutoSchedulerModalTheme = (ThemeOverride & {
247
+ autoSchedulerModal?: AutoSchedulerModalStyleOverrides;
248
+ }) | (EasyTeamThemeOverrides & {
249
+ autoSchedulerModal?: AutoSchedulerModalStyleOverrides;
250
+ });
251
+ type AutoSchedulerModalProps = {
252
+ baseURL: string;
253
+ isOpen: boolean;
254
+ title?: string;
255
+ bannerText?: string;
256
+ jurisdictions: JurisdictionGroup[];
257
+ employees: Employee[];
258
+ openShifts: OpenShift[];
259
+ timeOffs?: TimeOff[];
260
+ locationPlaceholder?: string;
261
+ onClose: () => void;
262
+ cancelLabel?: string;
263
+ primaryActionLabel?: string;
264
+ onPrimaryAction?: () => void;
265
+ onFixManually?: (failure: ViolatedConstraintsResult, config: AutoSchedulerModalConfig) => void;
266
+ initialConfig?: AutoSchedulerModalConfig & {
267
+ failure?: ViolatedConstraintsResult;
268
+ };
269
+ theme?: AutoSchedulerModalTheme;
270
+ cssVarsRoot?: string;
271
+ generateRecommendationsURLAndHeaders: {
272
+ url: string;
273
+ headers?: Record<string, string>;
274
+ };
275
+ onSolution: (solution: ScheduleSolution) => Promise<void>;
276
+ };
277
+ type Screen = "configure" | "creating" | "failed";
278
+ type StepStatus = "pending" | "active" | "done";
279
+ type RuleOverrideEntry = {
280
+ ruleId: string;
281
+ parameters?: Record<string, unknown>;
282
+ weightPoints?: number;
283
+ };
284
+ type SchedulePayload = {
285
+ employees: Array<{
286
+ id: string;
287
+ name?: string;
288
+ position?: string;
289
+ locationIds?: string[];
290
+ properties?: Record<string, unknown>;
291
+ }>;
292
+ shifts: Array<{
293
+ id: string;
294
+ startDateTime: string;
295
+ endDateTime: string;
296
+ employeeId?: string;
297
+ requiredHours?: number;
298
+ requiredPosition?: string | null;
299
+ requiredCount?: number;
300
+ location?: {
301
+ id: string;
302
+ timezone?: string;
303
+ tags?: string[];
304
+ };
305
+ employeePreferences?: Array<{
306
+ employeeId: string;
307
+ level: string;
308
+ }>;
309
+ }>;
310
+ locations: Array<{
311
+ id: string;
312
+ timezone?: string;
313
+ jurisdiction?: string;
314
+ tags?: string[];
315
+ }>;
316
+ timeOffs?: TimeOff[];
317
+ ruleIds?: string[];
318
+ ruleOverrides?: RuleOverrideEntry[];
319
+ };
320
+ type AutoSchedulerModalConfig = {
321
+ selectedLocationIds: string[];
322
+ selectedConstraintIds: string[];
323
+ constraintValues: Record<string, string>;
324
+ selectedOptimizationIds: string[];
325
+ optimizationValues: Record<string, string>;
326
+ };
327
+ type SolveApiExplanation = SolveApiResponse["explanation"];
328
+ /** Full POST body for the getRecommendationURL API (context, locations, employees, shifts, etc.) */
329
+ type RecommendationPayload = {
330
+ context: {
331
+ selectedLocationIds: string[];
332
+ selectedConstraintIds: string[];
333
+ constraintValues: Record<string, string>;
334
+ selectedOptimizationIds: string[];
335
+ optimizationValues: Record<string, string>;
336
+ timezone?: string;
337
+ };
338
+ locations: LocationOption[];
339
+ employees: Employee[];
340
+ openShifts: OpenShift[];
341
+ assignedShifts: OpenShift[];
342
+ timeOffs: TimeOff[];
343
+ explanation: SolveApiExplanation;
344
+ };
345
+ type ViolatedConstraintsResult = {
346
+ violatedConstraints: Array<{
347
+ title: string;
348
+ detail: string;
349
+ }>;
350
+ recommendedFixes: string[];
351
+ /** Full context for fetching recommendations; built once in the modal and passed through */
352
+ recommendationPayload?: RecommendationPayload;
353
+ };
354
+ type ViolatedConstraintsPanelStyleOverrides = Pick<AutoSchedulerModalStyleOverrides, "violationPanel" | "violationHeaderRow" | "violationHeader" | "violationIcon" | "violationTitle" | "violationSubtitle" | "violationToggleButton" | "violationToggleIcon" | "violationContent" | "violationItem" | "violationItemTitle" | "violationItemDetailRow" | "violationItemDetail" | "violationBullet" | "recommendationsBox" | "recommendationsTitle" | "recommendationsList" | "recommendationsItem" | "recommendationsBullet" | "recommendationsToggle" | "failedSecondaryButton">;
355
+ type ViolatedConstraintsPanelProps = {
356
+ violatedConstraints: ViolatedConstraintsResult;
357
+ title?: string;
358
+ subtitle?: string;
359
+ showSecondaryButton?: boolean;
360
+ secondaryButtonTitle?: string;
361
+ onSecondaryButtonClick?: () => void;
362
+ /** When provided with violatedConstraints.recommendationPayload, enables "Show recommendations" and fetch */
363
+ generateRecommendationsURLAndHeaders?: {
364
+ url: string;
365
+ headers?: Record<string, string>;
366
+ };
367
+ styles?: Record<string, Record<string, unknown>>;
368
+ styleOverrides?: ViolatedConstraintsPanelStyleOverrides;
369
+ };
370
+ type SolveApiResponse = {
371
+ problemId: string;
372
+ solution: ScheduleSolution;
373
+ explanation: {
374
+ isFeasible: boolean;
375
+ violations: Array<{
376
+ constraintName?: string;
377
+ description?: string;
378
+ affectedEntities?: string[];
379
+ ruleId?: string;
380
+ archetype?: string;
381
+ jurisdiction?: string | null;
382
+ penalty?: string;
383
+ isHardViolation?: boolean;
384
+ }>;
385
+ summary?: string;
386
+ };
387
+ complianceReport?: unknown;
388
+ };
389
+ type ScheduleRecommendation = {
390
+ hard_violation_identified: string;
391
+ root_cause: string;
392
+ recommendation: string;
393
+ why_this_resolves_it: string;
394
+ };
395
+
396
+ declare function AutoSchedulerModal({ baseURL, isOpen, title, bannerText, jurisdictions, openShifts, employees, timeOffs, locationPlaceholder, onClose, cancelLabel, primaryActionLabel, onPrimaryAction: _onPrimaryAction, onFixManually, initialConfig, theme, cssVarsRoot, generateRecommendationsURLAndHeaders, onSolution, }: AutoSchedulerModalProps): react_jsx_runtime.JSX.Element;
397
+
398
+ /**
399
+ * Self-contained AutoSchedulerModal that wraps itself in ChakraProvider.
400
+ * Use this when the host app may have multiple React instances (e.g. local packages in Next.js),
401
+ * which can cause "Cannot read properties of null (reading 'useContext')" when using Chakra's useTheme.
402
+ */
403
+ declare function AutoSchedulerModalWithProvider(props: AutoSchedulerModalProps): react_jsx_runtime.JSX.Element;
404
+
405
+ declare function ViolatedConstraintsPanel({ violatedConstraints, title, subtitle, showSecondaryButton, secondaryButtonTitle, onSecondaryButtonClick, generateRecommendationsURLAndHeaders, styles: stylesProp, styleOverrides, }: ViolatedConstraintsPanelProps): react_jsx_runtime.JSX.Element;
406
+
407
+ declare function ViolatedConstraintsPanelWithProvider(props: ViolatedConstraintsPanelProps): react_jsx_runtime.JSX.Element;
408
+
409
+ declare function buildRulesPayload(selectedConstraintIds: string[], constraintValues: Record<string, string>, selectedOptimizationIds: string[], optimizationValues: Record<string, string>): {
410
+ ruleIds?: string[];
411
+ ruleOverrides?: RuleOverrideEntry[];
412
+ };
413
+ type BuildSchedulePayloadInput = {
414
+ employees: Employee[];
415
+ openShifts: OpenShift[];
416
+ timeOffs?: TimeOff[];
417
+ selectedLocationIds: string[];
418
+ jurisdictions: JurisdictionGroup[];
419
+ selectedConstraintIds: string[];
420
+ constraintValues: Record<string, string>;
421
+ selectedOptimizationIds: string[];
422
+ optimizationValues: Record<string, string>;
423
+ };
424
+ declare function buildSchedulePayload(input: BuildSchedulePayloadInput): SchedulePayload;
425
+
426
+ /**
427
+ * Returns a user-friendly display name for a ruleId or constraintName.
428
+ * Falls back to humanizing the raw string (replace - with spaces, capitalize) for unknown values.
429
+ */
430
+ declare function getFriendlyRuleName(ruleIdOrConstraintName: string): string;
431
+
432
+ export { AutoSchedulerModal, type AutoSchedulerModalConfig, type AutoSchedulerModalProps, type AutoSchedulerModalStyleOverrides, type AutoSchedulerModalTheme, AutoSchedulerModalWithProvider, type BuildSchedulePayloadInput, type EasyTeamThemeOverrides, type Employee, type EmployeeProperties, type JurisdictionGroup, type LocationOption, type OpenShift, type RecommendationPayload, RequestError, type RuleOverrideEntry, type SchedulePayload, type ScheduleRecommendation, type ScheduleSolution, type ScheduleSolutionAvailability, type ScheduleSolutionEmployee, type ScheduleSolutionLocation, type ScheduleSolutionRuleMetadata, type ScheduleSolutionRuleOverride, type ScheduleSolutionShift, type ScheduleSolutionShiftAssignment, type ScheduleSolutionTimeOff, type ScheduleSolutionWaiver, type Screen, type ShiftAssignmentJustification, type SolveApiExplanation, type SolveApiResponse, type StepStatus, type TimeOff, ViolatedConstraintsPanel, type ViolatedConstraintsPanelProps, type ViolatedConstraintsPanelStyleOverrides, ViolatedConstraintsPanelWithProvider, type ViolatedConstraintsResult, buildRulesPayload, buildSchedulePayload, getFriendlyRuleName };