@feedmepos/mf-hrm-portal 2.2.5 → 2.3.0-dev

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.
Files changed (186) hide show
  1. package/dist/{ApprovalCodeList-Df5_U7Fj.js → ApprovalCodeList-cG0zmQVJ.js} +7 -7
  2. package/dist/{AuditLogList-BT-YM-CP.js → AuditLogList-BTifJhO1.js} +19 -18
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-Df3IHAyZ.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-qr5TwLTK.js} +2 -2
  4. package/dist/{EmployeeList-BfhG5ktC.js → EmployeeList-DzcMtxJ3.js} +31 -30
  5. package/dist/{FormItem.vue_vue_type_script_setup_true_lang-DPT2FoIc.js → FormItem.vue_vue_type_script_setup_true_lang-CUnlKsxk.js} +1 -1
  6. package/dist/{GrantUserList-B_WhIR9L.js → GrantUserList-D5b7tJ8Y.js} +8 -8
  7. package/dist/{Main-CGrtJkUl.js → Main-B2r59IOW.js} +5 -5
  8. package/dist/{Main-DKOPDO1K.js → Main-DFwdAWqn.js} +8 -8
  9. package/dist/{Main-Cxwiaabw.js → Main-DkLBemi7.js} +11 -11
  10. package/dist/{PermissionSetList-CqiLsqaj.js → PermissionSetList-B80hrfMW.js} +7 -7
  11. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DjNcJQM9.js +4167 -0
  12. package/dist/{PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-Z-DH7ouY.js → PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-fe-Rdwn4.js} +1 -1
  13. package/dist/{RoleList-iudKGaCg.js → RoleList-DHO4JRKF.js} +9 -9
  14. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-B-XtB64L.js +452 -0
  15. package/dist/ScheduleGeneralPage-WlBM8bxV.js +629 -0
  16. package/dist/SchedulePage-Nm0krGVU.js +17056 -0
  17. package/dist/SchedulePositionPage-C0hrO11d.js +263 -0
  18. package/dist/ScheduleSelect.vue_vue_type_script_setup_true_lang-DTDXir_7.js +1150 -0
  19. package/dist/SelectFilter-CG13h83-.js +264 -0
  20. package/dist/{TeamMemberList-D_8d24Vw.js → TeamMemberList-CgFWLRBM.js} +38 -37
  21. package/dist/{TimesheetList-VvIiAVLt.js → TimesheetList-Dp40G-0I.js} +54 -53
  22. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-Bmiz85Y3.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-BFjrMhUG.js} +3 -3
  23. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
  24. package/dist/{app-CVqQjVFY.js → app-CmBSTvaI.js} +3024 -2327
  25. package/dist/app.js +1 -1
  26. package/dist/{approval-code-BRClD2HN.js → approval-code-C9DmR4Md.js} +1 -1
  27. package/dist/{dayjs.min-Bhe9FtFt.js → dayjs.min-CfL2DQ3d.js} +1 -1
  28. package/dist/{employee-thZndJWE.js → employee-DQcHjoij.js} +4 -4
  29. package/dist/{grant-user-Dhi3ilC_.js → grant-user-Bv-pJ9Wt.js} +1 -1
  30. package/dist/{iteration-Cd5fl3-x.js → iteration-BlavheWG.js} +1 -1
  31. package/dist/{lodash-DiJ9xZIF.js → lodash-QerqayrJ.js} +1 -1
  32. package/dist/{restaurant-DiYb0pCm.js → restaurant-D7PEQjPY.js} +258 -252
  33. package/dist/{role-DdizOTVB.js → role-RM2YLO7n.js} +2 -2
  34. package/dist/{rule-CYFm43rI.js → rule-DjlvYIuP.js} +36 -36
  35. package/dist/src/api/restaurant/index.d.ts +2 -0
  36. package/dist/src/api/schedule/index.d.ts +51 -0
  37. package/dist/src/components/layout/AppSidebar.vue.d.ts +2 -0
  38. package/dist/src/components/layout/PortalShell.vue.d.ts +12 -0
  39. package/dist/src/components/layout/withShell.d.ts +14 -0
  40. package/dist/src/composables/useMessage.d.ts +8 -2
  41. package/dist/src/router/shared.d.ts +4 -1
  42. package/dist/src/types/schedule.d.ts +24 -0
  43. package/dist/src/views/scheduling/ScheduleGeneralPage.vue.d.ts +3 -0
  44. package/dist/src/views/scheduling/SchedulePage.vue.d.ts +3 -0
  45. package/dist/src/views/scheduling/SchedulePositionPage.vue.d.ts +3 -0
  46. package/dist/src/views/scheduling/components/ScheduleAddEmployeeIdentitySection.vue.d.ts +6 -0
  47. package/dist/src/views/scheduling/components/ScheduleAddEmployeeModal.vue.d.ts +12 -0
  48. package/dist/src/views/scheduling/components/ScheduleAddEmployeeModeStep.vue.d.ts +6 -0
  49. package/dist/src/views/scheduling/components/ScheduleAddEmployeePosAccessSection.vue.d.ts +6 -0
  50. package/dist/src/views/scheduling/components/ScheduleAddEmployeePositionsSection.vue.d.ts +10 -0
  51. package/dist/src/views/scheduling/components/ScheduleAddEmployeeSchedulingSection.vue.d.ts +6 -0
  52. package/dist/src/views/scheduling/components/ScheduleAddPickPopover.vue.d.ts +6 -0
  53. package/dist/src/views/scheduling/components/ScheduleAddPositionModal.vue.d.ts +6 -0
  54. package/dist/src/views/scheduling/components/ScheduleAllShiftsRow.vue.d.ts +22 -0
  55. package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +45 -0
  56. package/dist/src/views/scheduling/components/ScheduleAssignEmployeePopover.vue.d.ts +6 -0
  57. package/dist/src/views/scheduling/components/ScheduleAutoScheduleDetailsModal.vue.d.ts +6 -0
  58. package/dist/src/views/scheduling/components/ScheduleAutoScheduleModal.vue.d.ts +10 -0
  59. package/dist/src/views/scheduling/components/ScheduleButton.vue.d.ts +23 -0
  60. package/dist/src/views/scheduling/components/ScheduleChangeEmployeeModal.vue.d.ts +8 -0
  61. package/dist/src/views/scheduling/components/ScheduleCloneOutletModal.vue.d.ts +6 -0
  62. package/dist/src/views/scheduling/components/ScheduleCoach.vue.d.ts +6 -0
  63. package/dist/src/views/scheduling/components/ScheduleConfirmModal.vue.d.ts +32 -0
  64. package/dist/src/views/scheduling/components/ScheduleCostRail.vue.d.ts +8 -0
  65. package/dist/src/views/scheduling/components/ScheduleCostRailEmptyArt.vue.d.ts +2 -0
  66. package/dist/src/views/scheduling/components/ScheduleDateRangePopover.vue.d.ts +6 -0
  67. package/dist/src/views/scheduling/components/ScheduleDayNotePopover.vue.d.ts +6 -0
  68. package/dist/src/views/scheduling/components/ScheduleDayTimeline.vue.d.ts +12 -0
  69. package/dist/src/views/scheduling/components/ScheduleDemandRow.vue.d.ts +23 -0
  70. package/dist/src/views/scheduling/components/ScheduleDemandSheet.vue.d.ts +10 -0
  71. package/dist/src/views/scheduling/components/ScheduleDotsIcon.vue.d.ts +2 -0
  72. package/dist/src/views/scheduling/components/ScheduleEmployeeDetailPanel.vue.d.ts +12 -0
  73. package/dist/src/views/scheduling/components/ScheduleEmployeeIdentity.vue.d.ts +17 -0
  74. package/dist/src/views/scheduling/components/ScheduleEmployeeMenu.vue.d.ts +6 -0
  75. package/dist/src/views/scheduling/components/ScheduleExportDoneDialog.vue.d.ts +6 -0
  76. package/dist/src/views/scheduling/components/ScheduleFilterBar.vue.d.ts +18 -0
  77. package/dist/src/views/scheduling/components/ScheduleGapPopover.vue.d.ts +6 -0
  78. package/dist/src/views/scheduling/components/ScheduleGridHeader.vue.d.ts +18 -0
  79. package/dist/src/views/scheduling/components/ScheduleGridSkeleton.vue.d.ts +2 -0
  80. package/dist/src/views/scheduling/components/ScheduleLeaveEditModal.vue.d.ts +6 -0
  81. package/dist/src/views/scheduling/components/ScheduleOnboardingComplete.vue.d.ts +10 -0
  82. package/dist/src/views/scheduling/components/ScheduleOnboardingDoneArt.vue.d.ts +2 -0
  83. package/dist/src/views/scheduling/components/ScheduleOnboardingWelcome.vue.d.ts +11 -0
  84. package/dist/src/views/scheduling/components/ScheduleOnboardingWizard.vue.d.ts +9 -0
  85. package/dist/src/views/scheduling/components/ScheduleOpenShiftCardMenu.vue.d.ts +14 -0
  86. package/dist/src/views/scheduling/components/SchedulePdfPreview.vue.d.ts +6 -0
  87. package/dist/src/views/scheduling/components/SchedulePublishModal.vue.d.ts +8 -0
  88. package/dist/src/views/scheduling/components/ScheduleReviewBar.vue.d.ts +12 -0
  89. package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +54 -0
  90. package/dist/src/views/scheduling/components/ScheduleSelectExistingEmployeeModal.vue.d.ts +6 -0
  91. package/dist/src/views/scheduling/components/ScheduleShiftCardMenu.vue.d.ts +12 -0
  92. package/dist/src/views/scheduling/components/ScheduleShiftCell.vue.d.ts +35 -0
  93. package/dist/src/views/scheduling/components/ScheduleShiftHeadcountEditor.vue.d.ts +10 -0
  94. package/dist/src/views/scheduling/components/ScheduleShiftImpact.vue.d.ts +6 -0
  95. package/dist/src/views/scheduling/components/ScheduleShiftMoreOptions.vue.d.ts +8 -0
  96. package/dist/src/views/scheduling/components/ScheduleShiftPopover.vue.d.ts +16 -0
  97. package/dist/src/views/scheduling/components/ScheduleShiftRepeatDaysRow.vue.d.ts +8 -0
  98. package/dist/src/views/scheduling/components/ScheduleShiftSegmentsEditor.vue.d.ts +8 -0
  99. package/dist/src/views/scheduling/components/ScheduleShiftWhoPicker.vue.d.ts +25 -0
  100. package/dist/src/views/scheduling/components/ScheduleStackPopover.vue.d.ts +14 -0
  101. package/dist/src/views/scheduling/components/ScheduleStaffRail.vue.d.ts +16 -0
  102. package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +60 -0
  103. package/dist/src/views/scheduling/components/ScheduleStatsRow.vue.d.ts +12 -0
  104. package/dist/src/views/scheduling/components/ScheduleSwapShiftsModal.vue.d.ts +8 -0
  105. package/dist/src/views/scheduling/components/ScheduleTimePickerPopover.vue.d.ts +6 -0
  106. package/dist/src/views/scheduling/components/ScheduleTopbar.vue.d.ts +20 -0
  107. package/dist/src/views/scheduling/components/ScheduleTourAllSet.vue.d.ts +6 -0
  108. package/dist/src/views/scheduling/composables/auto-schedule-mapping.d.ts +33 -0
  109. package/dist/src/views/scheduling/composables/onboarding-constants.d.ts +5 -0
  110. package/dist/src/views/scheduling/composables/onboarding-hours.d.ts +7 -0
  111. package/dist/src/views/scheduling/composables/onboarding-types.d.ts +50 -0
  112. package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +78 -0
  113. package/dist/src/views/scheduling/composables/schedule-board-helpers.d.ts +59 -0
  114. package/dist/src/views/scheduling/composables/schedule-breaks.d.ts +3 -0
  115. package/dist/src/views/scheduling/composables/schedule-day-meta.d.ts +23 -0
  116. package/dist/src/views/scheduling/composables/schedule-employee-profile.d.ts +7 -0
  117. package/dist/src/views/scheduling/composables/schedule-popover-position.d.ts +16 -0
  118. package/dist/src/views/scheduling/composables/schedule-shift-time.d.ts +26 -0
  119. package/dist/src/views/scheduling/composables/schedule-week-cache.d.ts +10 -0
  120. package/dist/src/views/scheduling/composables/useCollapsedList.d.ts +9 -0
  121. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +101 -0
  122. package/dist/src/views/scheduling/composables/useScheduleAddPick.d.ts +81 -0
  123. package/dist/src/views/scheduling/composables/useScheduleAllShiftsRow.d.ts +77 -0
  124. package/dist/src/views/scheduling/composables/useScheduleAreaBoard.d.ts +63 -0
  125. package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +18 -0
  126. package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +122 -0
  127. package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +289 -0
  128. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +523 -0
  129. package/dist/src/views/scheduling/composables/useScheduleCellState.d.ts +27 -0
  130. package/dist/src/views/scheduling/composables/useScheduleClashDetection.d.ts +28 -0
  131. package/dist/src/views/scheduling/composables/useScheduleCloneOutletModal.d.ts +19 -0
  132. package/dist/src/views/scheduling/composables/useScheduleCoach.d.ts +80 -0
  133. package/dist/src/views/scheduling/composables/useScheduleCopyWeek.d.ts +19 -0
  134. package/dist/src/views/scheduling/composables/useScheduleCostRail.d.ts +43 -0
  135. package/dist/src/views/scheduling/composables/useScheduleDayNote.d.ts +45 -0
  136. package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +100 -0
  137. package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +76 -0
  138. package/dist/src/views/scheduling/composables/useScheduleDemandRow.d.ts +47 -0
  139. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +145 -0
  140. package/dist/src/views/scheduling/composables/useScheduleDragDrop.d.ts +54 -0
  141. package/dist/src/views/scheduling/composables/useScheduleEmployeeIdentity.d.ts +41 -0
  142. package/dist/src/views/scheduling/composables/useScheduleEmployeeMenu.d.ts +35 -0
  143. package/dist/src/views/scheduling/composables/useScheduleEmployeeProfile.d.ts +16 -0
  144. package/dist/src/views/scheduling/composables/useScheduleExport.d.ts +43 -0
  145. package/dist/src/views/scheduling/composables/useScheduleFilterBar.d.ts +14 -0
  146. package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +80 -0
  147. package/dist/src/views/scheduling/composables/useScheduleLeave.d.ts +59 -0
  148. package/dist/src/views/scheduling/composables/useScheduleLegend.d.ts +15 -0
  149. package/dist/src/views/scheduling/composables/useScheduleOnboardingFlow.d.ts +9 -0
  150. package/dist/src/views/scheduling/composables/useScheduleOnboardingPersistence.d.ts +13 -0
  151. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +1568 -0
  152. package/dist/src/views/scheduling/composables/useScheduleOpenShiftCard.d.ts +23 -0
  153. package/dist/src/views/scheduling/composables/useScheduleOutlet.d.ts +22 -0
  154. package/dist/src/views/scheduling/composables/useSchedulePageBootstrap.d.ts +9 -0
  155. package/dist/src/views/scheduling/composables/useSchedulePageClearActions.d.ts +20 -0
  156. package/dist/src/views/scheduling/composables/useSchedulePageOverlays.d.ts +18 -0
  157. package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +52 -0
  158. package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +27 -0
  159. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +118 -0
  160. package/dist/src/views/scheduling/composables/useScheduleRangeCalendar.d.ts +27 -0
  161. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +241 -0
  162. package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +57 -0
  163. package/dist/src/views/scheduling/composables/useScheduleSetupBanner.d.ts +17 -0
  164. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +202 -0
  165. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +209 -0
  166. package/dist/src/views/scheduling/composables/useScheduleStaffRail.d.ts +17 -0
  167. package/dist/src/views/scheduling/composables/useScheduleStatsRow.d.ts +24 -0
  168. package/dist/src/views/scheduling/composables/useScheduleTimePicker.d.ts +49 -0
  169. package/dist/src/views/scheduling/composables/useScheduleTopbar.d.ts +10 -0
  170. package/dist/src/views/scheduling/composables/useScheduleTour.d.ts +93 -0
  171. package/dist/src/views/scheduling/composables/useScheduleViewportFit.d.ts +9 -0
  172. package/dist/src/views/scheduling/data.d.ts +97 -0
  173. package/dist/src/views/scheduling/locales/index.d.ts +608 -0
  174. package/dist/src/views/scheduling/schedule-state.d.ts +679 -0
  175. package/dist/src/views/scheduling/schedule-store.d.ts +107 -0
  176. package/dist/src/views/scheduling/types.d.ts +351 -0
  177. package/dist/src/views/team/components/PortalConditionForm.vue.d.ts +2 -2
  178. package/dist/src/views/team/condition-builders/ConditionBuilderForm.vue.d.ts +2 -2
  179. package/dist/style.css +1 -1
  180. package/dist/tsconfig.app.tsbuildinfo +1 -1
  181. package/dist/{useAppStore-BGhlB1_1.js → useAppStore-d_nHyK5u.js} +1 -1
  182. package/dist/{useLoading-CvgqVDbF.js → useLoading-JFoghhRz.js} +1 -1
  183. package/dist/{useReportPermissions-hVMtRNmj.js → useReportPermissions-Bl6Br79r.js} +3 -3
  184. package/package.json +3 -2
  185. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-CmNTqB0v.js +0 -4167
  186. package/dist/SelectFilter-ATOm0hdn.js +0 -269
@@ -0,0 +1,202 @@
1
+ import type { Employee } from '../types';
2
+ import type { ScheduleBoardApi } from './useScheduleBoard';
3
+ export interface ScheduleCardMenuState {
4
+ open: boolean;
5
+ empId: number | null;
6
+ dayIdx: number | null;
7
+ /** Which period on that day the menu was opened from — the card's own slot index. */
8
+ slotIndex: number;
9
+ left: number;
10
+ top: number;
11
+ }
12
+ export interface ScheduleChangeState {
13
+ open: boolean;
14
+ empId: number | null;
15
+ dayIdx: number | null;
16
+ slotIndex: number;
17
+ }
18
+ export interface ScheduleSwapState {
19
+ open: boolean;
20
+ empId: number | null;
21
+ dayIdx: number | null;
22
+ /** Which period of `dayIdx` is actually being traded — a sibling shift on that same day
23
+ * stays with its owner untouched. */
24
+ slotIndex: number;
25
+ /** How many periods starting at `slotIndex` go together — a genuine split's own period
26
+ * count, so dragging its one merged card trades the whole shift; 1 for anything else. */
27
+ slotCount: number;
28
+ /** Set when the swap came from dropping one shift on another: that shift is the only choice. */
29
+ preset: {
30
+ empId: number;
31
+ dayIdx: number;
32
+ } | null;
33
+ }
34
+ /** The shift card's "⋯" menu (Change employee / Swap shifts / Edit / Remove), plus the two
35
+ * dialogs it opens that the rest of Phase 1 didn't need: handing a shift to somebody else,
36
+ * and trading two people's shifts on the same day. Both skip the mockup's OT/pay-band cost
37
+ * preview and hard/soft override tiers — this board has no per-person pay bands to price
38
+ * against, so a candidate is either qualified-and-free or it isn't offered at all. */
39
+ export declare function useScheduleShiftActions(board: ScheduleBoardApi): {
40
+ menu: {
41
+ open: boolean;
42
+ empId: number | null;
43
+ dayIdx: number | null;
44
+ slotIndex: number;
45
+ left: number;
46
+ top: number;
47
+ };
48
+ openMenu: (empId: number, dayIdx: number, anchor: HTMLElement, slotIndex?: number) => void;
49
+ closeMenu: () => void;
50
+ change: {
51
+ open: boolean;
52
+ empId: number | null;
53
+ dayIdx: number | null;
54
+ slotIndex: number;
55
+ };
56
+ changeSlot: import("vue").ComputedRef<import("../types").WorkSlot[]>;
57
+ changeCandidates: import("vue").ComputedRef<{
58
+ id: number;
59
+ name: string;
60
+ employmentType: "FULLTIME" | "PARTTIME";
61
+ role: string;
62
+ initials: string;
63
+ color: string;
64
+ weekHours: number;
65
+ pct: number;
66
+ contractHours?: number | undefined;
67
+ rate: number;
68
+ positions: string[];
69
+ shifts: ({
70
+ start: string;
71
+ end: string;
72
+ role: string;
73
+ status: import("../types").ShiftStatus;
74
+ clock?: {
75
+ in: string | null;
76
+ out: string | null;
77
+ status: "on-time" | "late" | "early-out" | "absent";
78
+ } | undefined;
79
+ conflict?: boolean | undefined;
80
+ conflictReason?: string | undefined;
81
+ openId?: number | undefined;
82
+ breakMins?: number | undefined;
83
+ breaks?: ({
84
+ type: "DURATION";
85
+ minutes: number;
86
+ breakPayType: "PAID" | "UNPAID";
87
+ } | {
88
+ type: "TIME_RANGE";
89
+ startTime: string;
90
+ endTime: string;
91
+ breakPayType: "PAID" | "UNPAID";
92
+ })[] | undefined;
93
+ assignmentId?: string | undefined;
94
+ splitGroupId?: string | undefined;
95
+ } | {
96
+ timeOff: "approved" | "pending";
97
+ requestId?: string | undefined;
98
+ type?: "OFF_DAY" | "LEAVE" | undefined;
99
+ leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
100
+ reason: string;
101
+ half?: boolean | undefined;
102
+ halfPart?: "AM" | "PM" | undefined;
103
+ from?: string | undefined;
104
+ to?: string | undefined;
105
+ appliedOn?: string | undefined;
106
+ note?: string | undefined;
107
+ cert?: {
108
+ name: string;
109
+ size: string;
110
+ } | null | undefined;
111
+ bal?: {
112
+ type: string;
113
+ entitled: number;
114
+ used: number;
115
+ } | undefined;
116
+ } | {
117
+ start: string;
118
+ end: string;
119
+ role: string;
120
+ status: import("../types").ShiftStatus;
121
+ clock?: {
122
+ in: string | null;
123
+ out: string | null;
124
+ status: "on-time" | "late" | "early-out" | "absent";
125
+ } | undefined;
126
+ conflict?: boolean | undefined;
127
+ conflictReason?: string | undefined;
128
+ openId?: number | undefined;
129
+ breakMins?: number | undefined;
130
+ breaks?: ({
131
+ type: "DURATION";
132
+ minutes: number;
133
+ breakPayType: "PAID" | "UNPAID";
134
+ } | {
135
+ type: "TIME_RANGE";
136
+ startTime: string;
137
+ endTime: string;
138
+ breakPayType: "PAID" | "UNPAID";
139
+ })[] | undefined;
140
+ assignmentId?: string | undefined;
141
+ splitGroupId?: string | undefined;
142
+ }[] | null)[];
143
+ remarks: {
144
+ author: string;
145
+ date: string;
146
+ type: "note" | "warning" | "praise";
147
+ text: string;
148
+ }[];
149
+ section: string;
150
+ compGroup?: string | undefined;
151
+ mobile?: string | undefined;
152
+ dial?: string | undefined;
153
+ locations?: string[] | undefined;
154
+ payBasis?: "hourly" | "monthly" | undefined;
155
+ payAmount?: number | undefined;
156
+ maxHours?: number | undefined;
157
+ maxOtHours?: number | undefined;
158
+ minHours?: number | undefined;
159
+ otAfterDaily?: number | undefined;
160
+ preferences?: string[] | undefined;
161
+ seniority?: "senior" | "junior" | "" | undefined;
162
+ availDays?: boolean[] | undefined;
163
+ availHours?: {
164
+ from: string;
165
+ to: string;
166
+ }[] | undefined;
167
+ passcode?: string | undefined;
168
+ masterUser?: boolean | undefined;
169
+ }[]>;
170
+ openChange: (empId: number, dayIdx: number, slotIndex?: number) => void;
171
+ closeChange: () => void;
172
+ confirmChange: (toId: number) => void;
173
+ swap: {
174
+ open: boolean;
175
+ empId: number | null;
176
+ dayIdx: number | null;
177
+ slotIndex: number;
178
+ slotCount: number;
179
+ preset: {
180
+ empId: number;
181
+ dayIdx: number;
182
+ } | null;
183
+ };
184
+ swapSlot: import("vue").ComputedRef<import("../types").WorkSlot[]>;
185
+ swapCandidates: import("vue").ComputedRef<{
186
+ emp: Employee;
187
+ dayIdx: number;
188
+ slot: import("../types").WorkSlot[];
189
+ soft: string | null;
190
+ }[]>;
191
+ swapPreset: import("vue").ComputedRef<{
192
+ emp: Employee;
193
+ dayIdx: number;
194
+ slot: import("../types").WorkSlot[];
195
+ soft: string | null;
196
+ } | null>;
197
+ openSwap: (empId: number, dayIdx: number, preset?: ScheduleSwapState["preset"], slotIndex?: number, slotCount?: number) => void;
198
+ closeSwap: () => void;
199
+ confirmSwap: (toEmpId: number, toDayIdx: number) => void;
200
+ removeShift: (empId: number, dayIdx: number, slotIndex?: number) => void;
201
+ };
202
+ export type ScheduleShiftActionsApi = ReturnType<typeof useScheduleShiftActions>;
@@ -0,0 +1,209 @@
1
+ import type { ScheduleBoardApi } from './useScheduleBoard';
2
+ import type { ScheduleDemandApi } from './useScheduleDemand';
3
+ import { type ScheduleBreakChoice, type ScheduleShiftSegment } from './schedule-shift-time';
4
+ export type { ScheduleBreakChoice, ScheduleShiftSegment } from './schedule-shift-time';
5
+ export interface ScheduleHeadcountRole {
6
+ position: string;
7
+ count: number;
8
+ sen: '' | 'senior' | 'junior';
9
+ }
10
+ /** The unified shift popover — ported from the mockup's single `.shift-pop`, which answers
11
+ * both "who is on this shift" and "what does this shift need" from one form. Picking a real
12
+ * person in the `who` select turns it into an assignment; leaving it on "Empty shift" turns
13
+ * it into open demand. Opened three ways: for an employee's cell (assign/edit), for a brand
14
+ * new open shift (multi-position headcount authoring), or to edit one existing open-shift
15
+ * record (single position, like an assigned shift's "Position needed" row). */
16
+ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand: ScheduleDemandApi): {
17
+ open: import("vue").Ref<boolean, boolean>;
18
+ dayIdx: import("vue").Ref<number | null, number | null>;
19
+ empId: import("vue").Ref<number | null, number | null>;
20
+ originalEmpId: import("vue").Ref<number | null, number | null>;
21
+ editingOpenShiftId: import("vue").Ref<number | null, number | null>;
22
+ isNew: import("vue").Ref<boolean, boolean>;
23
+ name: import("vue").Ref<string, string>;
24
+ segments: import("vue").Ref<{
25
+ start: string;
26
+ end: string;
27
+ }[], ScheduleShiftSegment[] | {
28
+ start: string;
29
+ end: string;
30
+ }[]>;
31
+ role: import("vue").Ref<string, string>;
32
+ required: import("vue").Ref<number, number>;
33
+ sen: import("vue").Ref<"" | "senior" | "junior", "" | "senior" | "junior">;
34
+ empType: import("vue").Ref<"" | "full" | "part", "" | "full" | "part">;
35
+ roles: import("vue").Ref<{
36
+ position: string;
37
+ count: number;
38
+ sen: "" | "senior" | "junior";
39
+ }[], ScheduleHeadcountRole[] | {
40
+ position: string;
41
+ count: number;
42
+ sen: "" | "senior" | "junior";
43
+ }[]>;
44
+ impact: import("vue").ComputedRef<{
45
+ when: string;
46
+ pctBefore: number;
47
+ pctAfter: number;
48
+ stillShort: number;
49
+ before: {
50
+ required: number;
51
+ scheduled: number;
52
+ };
53
+ after: {
54
+ required: number;
55
+ scheduled: number;
56
+ };
57
+ beforeSegs: import("../types").CoverageSegment[];
58
+ afterSegs: import("../types").CoverageSegment[];
59
+ axis: import("./useScheduleDemand").ScheduleCoverageAxis;
60
+ } | null>;
61
+ requiresAssignment: import("vue").ComputedRef<boolean>;
62
+ saveDisabled: import("vue").ComputedRef<boolean>;
63
+ saveTitle: import("vue").ComputedRef<"" | "Choose who covers it — this shift is answering a staffing gap, and a shift with nobody on it leaves that gap exactly as it is">;
64
+ saveLabel: import("vue").ComputedRef<"Create & assign" | "Save">;
65
+ breakChoice: import("vue").Ref<ScheduleBreakChoice, ScheduleBreakChoice>;
66
+ breakCustomMins: import("vue").Ref<number, number>;
67
+ breakCustomUnit: import("vue").Ref<"mins" | "hrs", "mins" | "hrs">;
68
+ breakMode: import("vue").Ref<"time" | "duration", "time" | "duration">;
69
+ breakStartTime: import("vue").Ref<string, string>;
70
+ breakEndTime: import("vue").Ref<string, string>;
71
+ repeatDays: import("vue").Ref<boolean[], boolean[]>;
72
+ gapNote: import("vue").Ref<string | null, string | null>;
73
+ conflictNote: import("vue").Ref<string | null, string | null>;
74
+ grantSkill: import("vue").Ref<boolean, boolean>;
75
+ showGrantSkill: import("vue").ComputedRef<boolean>;
76
+ unassignMode: import("vue").Ref<boolean, boolean>;
77
+ positionOptions: import("vue").ComputedRef<string[]>;
78
+ whoOptions: import("vue").ComputedRef<{
79
+ id: number;
80
+ name: string;
81
+ employmentType: "FULLTIME" | "PARTTIME";
82
+ role: string;
83
+ initials: string;
84
+ color: string;
85
+ weekHours: number;
86
+ pct: number;
87
+ contractHours?: number | undefined;
88
+ rate: number;
89
+ positions: string[];
90
+ shifts: ({
91
+ start: string;
92
+ end: string;
93
+ role: string;
94
+ status: import("../types").ShiftStatus;
95
+ clock?: {
96
+ in: string | null;
97
+ out: string | null;
98
+ status: "on-time" | "late" | "early-out" | "absent";
99
+ } | undefined;
100
+ conflict?: boolean | undefined;
101
+ conflictReason?: string | undefined;
102
+ openId?: number | undefined;
103
+ breakMins?: number | undefined;
104
+ breaks?: ({
105
+ type: "DURATION";
106
+ minutes: number;
107
+ breakPayType: "PAID" | "UNPAID";
108
+ } | {
109
+ type: "TIME_RANGE";
110
+ startTime: string;
111
+ endTime: string;
112
+ breakPayType: "PAID" | "UNPAID";
113
+ })[] | undefined;
114
+ assignmentId?: string | undefined;
115
+ splitGroupId?: string | undefined;
116
+ } | {
117
+ timeOff: "approved" | "pending";
118
+ requestId?: string | undefined;
119
+ type?: "OFF_DAY" | "LEAVE" | undefined;
120
+ leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
121
+ reason: string;
122
+ half?: boolean | undefined;
123
+ halfPart?: "AM" | "PM" | undefined;
124
+ from?: string | undefined;
125
+ to?: string | undefined;
126
+ appliedOn?: string | undefined;
127
+ note?: string | undefined;
128
+ cert?: {
129
+ name: string;
130
+ size: string;
131
+ } | null | undefined;
132
+ bal?: {
133
+ type: string;
134
+ entitled: number;
135
+ used: number;
136
+ } | undefined;
137
+ } | {
138
+ start: string;
139
+ end: string;
140
+ role: string;
141
+ status: import("../types").ShiftStatus;
142
+ clock?: {
143
+ in: string | null;
144
+ out: string | null;
145
+ status: "on-time" | "late" | "early-out" | "absent";
146
+ } | undefined;
147
+ conflict?: boolean | undefined;
148
+ conflictReason?: string | undefined;
149
+ openId?: number | undefined;
150
+ breakMins?: number | undefined;
151
+ breaks?: ({
152
+ type: "DURATION";
153
+ minutes: number;
154
+ breakPayType: "PAID" | "UNPAID";
155
+ } | {
156
+ type: "TIME_RANGE";
157
+ startTime: string;
158
+ endTime: string;
159
+ breakPayType: "PAID" | "UNPAID";
160
+ })[] | undefined;
161
+ assignmentId?: string | undefined;
162
+ splitGroupId?: string | undefined;
163
+ }[] | null)[];
164
+ remarks: {
165
+ author: string;
166
+ date: string;
167
+ type: "note" | "warning" | "praise";
168
+ text: string;
169
+ }[];
170
+ section: string;
171
+ compGroup?: string | undefined;
172
+ mobile?: string | undefined;
173
+ dial?: string | undefined;
174
+ locations?: string[] | undefined;
175
+ payBasis?: "hourly" | "monthly" | undefined;
176
+ payAmount?: number | undefined;
177
+ maxHours?: number | undefined;
178
+ maxOtHours?: number | undefined;
179
+ minHours?: number | undefined;
180
+ otAfterDaily?: number | undefined;
181
+ preferences?: string[] | undefined;
182
+ seniority?: "senior" | "junior" | "" | undefined;
183
+ availDays?: boolean[] | undefined;
184
+ availHours?: {
185
+ from: string;
186
+ to: string;
187
+ }[] | undefined;
188
+ passcode?: string | undefined;
189
+ masterUser?: boolean | undefined;
190
+ }[]>;
191
+ isAssigned: import("vue").ComputedRef<boolean>;
192
+ isReleasingToOpen: import("vue").ComputedRef<boolean>;
193
+ isEditingOpenShift: import("vue").ComputedRef<boolean>;
194
+ isNewOpenShift: import("vue").ComputedRef<boolean>;
195
+ isSingleOpenRecord: import("vue").ComputedRef<boolean>;
196
+ totalHours: import("vue").ComputedRef<number>;
197
+ totalLabel: import("vue").ComputedRef<string>;
198
+ warnings: import("vue").ComputedRef<string[]>;
199
+ openForEmployee: (forEmpId: number, day: number, roleHint?: string, hours?: ScheduleShiftSegment, slotIndex?: number) => void;
200
+ openForNewOpenShift: (day: number, roleHint?: string, hours?: ScheduleShiftSegment) => void;
201
+ openForEditOpenShift: (openShiftId: number) => void;
202
+ close: () => void;
203
+ removeSegment: (i: number) => void;
204
+ addRole: () => void;
205
+ removeRole: (i: number) => void;
206
+ save: () => void;
207
+ remove: () => void;
208
+ };
209
+ export type ScheduleShiftPopoverApi = ReturnType<typeof useScheduleShiftPopover>;
@@ -0,0 +1,17 @@
1
+ import type { Proposal } from '../types';
2
+ import type { ScheduleBoardApi } from './useScheduleBoard';
3
+ import type { ScheduleEmployeeLoad } from './useScheduleEmployeeIdentity';
4
+ /** The rail's rows ARE the shared identity block's data — one derivation, so the rail and the
5
+ * employee grid's name column can't disagree about somebody's load. */
6
+ export type ScheduleRailRow = ScheduleEmployeeLoad;
7
+ /** The area view's staff rail — least-loaded first over the same roster the employee view's
8
+ * name column shows, plus each person's load bar. Search and the sort picker both live in the
9
+ * filter bar / name column now, not here. Ported from the mockup's
10
+ * renderStaffRail()/orderedRoster()/staffLoad(), scoped to a single week (no day/area
11
+ * combination — Daily view stays employee-only for now). */
12
+ export declare function useScheduleStaffRail(board: ScheduleBoardApi,
13
+ /** Lazy: the auto-scheduler is built after the rail, and only read when rows are computed. */
14
+ proposalAt?: () => ((empId: number, dayIdx: number) => Proposal | undefined) | undefined): {
15
+ rows: import("vue").ComputedRef<ScheduleEmployeeLoad[]>;
16
+ };
17
+ export type ScheduleStaffRailApi = ReturnType<typeof useScheduleStaffRail>;
@@ -0,0 +1,24 @@
1
+ import type { ScheduleBoardApi } from './useScheduleBoard';
2
+ import type { ScheduleCostRailApi } from './useScheduleCostRail';
3
+ import type { useScheduleLegend } from './useScheduleLegend';
4
+ /** The collapsible weekly-summary band under the day header: totals when collapsed,
5
+ * a per-day cost/hours/forecast breakdown when open. Ported from the mockup's
6
+ * buildStatsRow() — the band always mirrors whatever days the grid currently shows
7
+ * (board.visibleDayIndices), collapsing to one day's figures in Daily view exactly like
8
+ * the reference's renderedDays()-scoped totals. The 7-day RULES.salesForecast/SALES_CURVE
9
+ * baseline underneath it stays weekly regardless — only the on-screen total and the
10
+ * redistribution on edit are span-scoped. */
11
+ export declare function useScheduleStatsRow(board: ScheduleBoardApi, costRail: ScheduleCostRailApi, legend: ReturnType<typeof useScheduleLegend>): {
12
+ open: import("vue").Ref<boolean, boolean>;
13
+ toggle: () => void;
14
+ forecast: import("vue").Ref<number, number>;
15
+ visibleForecast: import("vue").ComputedRef<number>;
16
+ visibleCost: import("vue").ComputedRef<number>;
17
+ visibleHours: import("vue").ComputedRef<number>;
18
+ salesFor: (dayIdx: number) => number;
19
+ isDayOverridden: (dayIdx: number) => boolean;
20
+ setDayForecast: (dayIdx: number, value: string) => void;
21
+ labourPct: (dayIdx: number) => number | null;
22
+ isShort: (dayIdx: number) => boolean;
23
+ };
24
+ export type ScheduleStatsRowApi = ReturnType<typeof useScheduleStatsRow>;
@@ -0,0 +1,49 @@
1
+ export interface ScheduleTimePickerOption {
2
+ value: string;
3
+ label: string;
4
+ am: boolean;
5
+ sel: boolean;
6
+ typed: boolean;
7
+ /** An existing value that doesn't land on the half hour — kept in the list rather than
8
+ * snapped, because silently moving somebody's 11:20 start is a change to their shift, not
9
+ * a rounding. */
10
+ odd: boolean;
11
+ }
12
+ export interface ScheduleTimePickerState {
13
+ open: boolean;
14
+ /** The field's own value when the popover opened — what `.sel` marks, and what an off-grid
15
+ * value gets read from to appear in the list at all. */
16
+ value: string;
17
+ query: string;
18
+ /** Which trigger button opened it, so only that one wears the open state. */
19
+ key: string;
20
+ left: number;
21
+ top: number;
22
+ }
23
+ /** "8:00 AM", "10:15 PM" — the picker's own display face, and the trigger button's label. */
24
+ export declare function formatTime12(hhmm: string): string;
25
+ /** The time-of-day combobox behind every `sp2-time.tp-btn` field on the board (demand periods,
26
+ * shift segments) — one popover instance shared across all of them, the same way the add-pick
27
+ * and gap popovers are. Half-hour options grouped AM/PM, plus a type-in field for anything the
28
+ * grid doesn't land on and a search over the same list. */
29
+ export declare function useScheduleTimePicker(): {
30
+ state: {
31
+ open: boolean;
32
+ value: string;
33
+ query: string;
34
+ key: string;
35
+ left: number;
36
+ top: number;
37
+ };
38
+ options: import("vue").ComputedRef<ScheduleTimePickerOption[]>;
39
+ amOptions: import("vue").ComputedRef<ScheduleTimePickerOption[]>;
40
+ pmOptions: import("vue").ComputedRef<ScheduleTimePickerOption[]>;
41
+ typedValue: import("vue").ComputedRef<string | null>;
42
+ openFor: (anchor: HTMLElement, value: string, pick: (hhmm: string) => void, key?: string) => void;
43
+ anchorRect: () => DOMRect | null;
44
+ isOpenFor: (key: string) => boolean;
45
+ close: () => void;
46
+ pick: (value: string) => void;
47
+ submitQuery: () => void;
48
+ };
49
+ export type ScheduleTimePickerApi = ReturnType<typeof useScheduleTimePicker>;
@@ -0,0 +1,10 @@
1
+ export type ScheduleTopbarMenu = 'actions' | 'export';
2
+ /** Open/close state for the topbar's two dropdowns (Actions, Share) — only one is ever open at a
3
+ * time, matching the mockup's toggleMenu()/closeMenus() behavior of closing the others whenever
4
+ * one opens. */
5
+ export declare function useScheduleTopbar(): {
6
+ openMenu: import("vue").Ref<ScheduleTopbarMenu | null, ScheduleTopbarMenu | null>;
7
+ toggleMenu: (id: ScheduleTopbarMenu) => void;
8
+ closeMenus: () => void;
9
+ };
10
+ export type ScheduleTopbarApi = ReturnType<typeof useScheduleTopbar>;
@@ -0,0 +1,93 @@
1
+ import type { ScheduleBoardApi } from './useScheduleBoard';
2
+ import type { ScheduleDemandRowApi } from './useScheduleDemandRow';
3
+ import type { ScheduleDemandSheetApi } from './useScheduleDemandSheet';
4
+ import type { ScheduleGapPopoverApi } from './useScheduleGapPopover';
5
+ import type { ScheduleAutoScheduleApi } from './useScheduleAutoSchedule';
6
+ import type { SchedulePublishApi } from './useSchedulePublish';
7
+ import type { ScheduleExportApi } from './useScheduleExport';
8
+ import type { IntroRecapRow } from './onboarding-types';
9
+ interface TourDeps {
10
+ board: ScheduleBoardApi;
11
+ demandRow: ScheduleDemandRowApi;
12
+ demandSheet: ScheduleDemandSheetApi;
13
+ gap: ScheduleGapPopoverApi;
14
+ autoSchedule: ScheduleAutoScheduleApi;
15
+ publish: SchedulePublishApi;
16
+ exportApi: ScheduleExportApi;
17
+ onToast: (message: string) => void;
18
+ }
19
+ /** The guided tour: one coachmark at a time, walking from where demand is set through to
20
+ * sharing the published week. Ported from V6.2's `OBA_TOUR` / `obaTourGo` — same six stops,
21
+ * same "open the real surface, then point at it" steps for the demand sheet and the gap
22
+ * popover. No Back button, matching the source: the only way on is Next or Skip. */
23
+ export declare function useScheduleTour(deps: TourDeps): {
24
+ coach: {
25
+ open: import("vue").Ref<boolean, boolean>;
26
+ placing: import("vue").Ref<boolean, boolean>;
27
+ tip: import("vue").Ref<{
28
+ title: string;
29
+ body: string;
30
+ count?: string | undefined;
31
+ nextLabel?: string | undefined;
32
+ skipLabel?: string | undefined;
33
+ next?: (() => void) | undefined;
34
+ skip?: (() => void) | undefined;
35
+ } | null, import("./useScheduleCoach").CoachTipData | {
36
+ title: string;
37
+ body: string;
38
+ count?: string | undefined;
39
+ nextLabel?: string | undefined;
40
+ skipLabel?: string | undefined;
41
+ next?: (() => void) | undefined;
42
+ skip?: (() => void) | undefined;
43
+ } | null>;
44
+ maskT: {
45
+ left: number;
46
+ top: number;
47
+ width: number;
48
+ height: number;
49
+ };
50
+ maskB: {
51
+ left: number;
52
+ top: number;
53
+ width: number;
54
+ height: number;
55
+ };
56
+ maskL: {
57
+ left: number;
58
+ top: number;
59
+ width: number;
60
+ height: number;
61
+ };
62
+ maskR: {
63
+ left: number;
64
+ top: number;
65
+ width: number;
66
+ height: number;
67
+ };
68
+ spot: {
69
+ left: number;
70
+ top: number;
71
+ width: number;
72
+ height: number;
73
+ };
74
+ tipPos: {
75
+ left: number;
76
+ top: number;
77
+ };
78
+ arrow: {
79
+ side: "top" | "bottom" | "left" | "right";
80
+ offset: number;
81
+ };
82
+ start: (el: HTMLElement, data: import("./useScheduleCoach").CoachTipData, onMiss?: () => void) => void;
83
+ end: () => void;
84
+ next: () => void;
85
+ skip: () => void;
86
+ };
87
+ start: () => void;
88
+ allSetOpen: import("vue").Ref<boolean, boolean>;
89
+ allSetRecap: import("vue").ComputedRef<IntroRecapRow[]>;
90
+ closeAllSet: () => void;
91
+ };
92
+ export type ScheduleTourApi = ReturnType<typeof useScheduleTour>;
93
+ export {};
@@ -0,0 +1,9 @@
1
+ import { type Ref } from 'vue';
2
+ /** Pins the scheduling screen to the viewport so only the grid scrolls.
3
+ *
4
+ * `PortalShell` wraps every route in two unstyled divs, and the height chain above them is the
5
+ * host app's, not ours: with no definite height anywhere up there, `.sch { height: 100% }` has
6
+ * nothing to resolve against, the whole page grows to its content and the browser scrolls it —
7
+ * header rows included. Measuring where the shell starts and giving it the rest of the viewport
8
+ * is the one thing that does not depend on how the host lays itself out. */
9
+ export declare function useScheduleViewportFit(rootEl: Ref<HTMLElement | null | undefined>): void;