@feedmepos/mf-hrm-portal 2.3.0-dev.9 → 2.3.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.
Files changed (115) hide show
  1. package/dist/{ApprovalCodeList-BDpxEJpC.js → ApprovalCodeList-DwubNElp.js} +7 -7
  2. package/dist/{AuditLogList-Dgwj1gz8.js → AuditLogList-CTeMbyHL.js} +18 -19
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-BBK2gl7r.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-CmLLNcB4.js} +2 -2
  4. package/dist/{EmployeeList-C8cbVcmY.js → EmployeeList-DEAJPx9F.js} +255 -266
  5. package/dist/{FormItem.vue_vue_type_script_setup_true_lang-CUnlKsxk.js → FormItem.vue_vue_type_script_setup_true_lang-OAvd6eHM.js} +6 -6
  6. package/dist/{GrantUserList-zul0_Dlm.js → GrantUserList-Dx4jF2qJ.js} +8 -8
  7. package/dist/{Main-Cjo4FMZZ.js → Main-BirWXk7o.js} +5 -5
  8. package/dist/{Main-DSr9KbjT.js → Main-C2PBSCte.js} +11 -11
  9. package/dist/{Main-5TsFTFpc.js → Main-CL5JYCPg.js} +8 -8
  10. package/dist/{PermissionSetList-CDhiiu37.js → PermissionSetList-BtYcqPiO.js} +19 -18
  11. package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DoK944l0.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-BXw4aX39.js} +1127 -1127
  12. package/dist/{PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-BVz6q3HE.js → PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-DaAx79pC.js} +1 -1
  13. package/dist/ResponsiveContextMenu.vue_vue_type_script_setup_true_lang-mSJFKo7r.js +132 -0
  14. package/dist/{RoleList-DEbOPQD_.js → RoleList-YS_LBfoJ.js} +21 -20
  15. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-BorKuXxL.js +530 -0
  16. package/dist/{ScheduleGeneralPage-B8PWNsc2.js → ScheduleGeneralPage-C1p2mivt.js} +252 -248
  17. package/dist/ScheduleModal.vue_vue_type_script_setup_true_lang-CnKzVz3I.js +2457 -0
  18. package/dist/SchedulePage-BP7x7JAl.js +19485 -0
  19. package/dist/{SchedulePositionPage-Cuv4ydOK.js → SchedulePositionPage-BogOQZVW.js} +78 -80
  20. package/dist/{SelectFilter-CG13h83-.js → SelectFilter-Dh3eY1hV.js} +1 -1
  21. package/dist/{TeamMemberList-DpCGqHCk.js → TeamMemberList-Bv6_2bzs.js} +27 -27
  22. package/dist/{TimesheetList-B7HAC5zS.js → TimesheetList-B3BmpH0I.js} +52 -53
  23. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-BGD6m5M-.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-C4rbnZh1.js} +3 -3
  24. package/dist/{app-Lh0cqgHy.js → app-CyS8c8dx.js} +2879 -2462
  25. package/dist/app.js +1 -1
  26. package/dist/{approval-code-DHsUgc4K.js → approval-code-BIpLingm.js} +1 -1
  27. package/dist/{dayjs.min-joq4stsa.js → dayjs.min-BRlEc3-d.js} +1 -1
  28. package/dist/{employee-BPmp9c6i.js → employee-CcdjLOLQ.js} +51 -47
  29. package/dist/{grant-user-qzKHFTro.js → grant-user-uZmvD_bw.js} +1 -1
  30. package/dist/{iteration-jvdTHQUx.js → iteration-CL1RDmws.js} +1 -1
  31. package/dist/{lodash-CIAEpr9s.js → lodash-C00ieagp.js} +1 -1
  32. package/dist/object-Dwyg2LgX.js +16 -0
  33. package/dist/{restaurant-BbYRA_IT.js → restaurant-CHpkjUPy.js} +46 -47
  34. package/dist/{role-Dd1TUMhn.js → role-DtatkKp9.js} +2 -2
  35. package/dist/{rule-DmxI7qEY.js → rule-DJJMpkoG.js} +3 -3
  36. package/dist/src/api/employee/index.d.ts +2 -2
  37. package/dist/src/api/schedule/index.d.ts +11 -1
  38. package/dist/src/components/layout/SchedulePromoBanner.vue.d.ts +2 -0
  39. package/dist/src/composables/useDiscardConfirm.d.ts +3 -1
  40. package/dist/src/stores/employee.d.ts +12 -12
  41. package/dist/src/types/schedule.d.ts +1 -1
  42. package/dist/src/views/audit-log/locales/index.d.ts +252 -0
  43. package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +6 -2
  44. package/dist/src/views/scheduling/components/ScheduleAutoScheduleDoneArt.vue.d.ts +2 -0
  45. package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +2 -0
  46. package/dist/src/views/scheduling/components/ScheduleBoardGridHeader.vue.d.ts +5 -0
  47. package/dist/src/views/scheduling/components/ScheduleBoardInteractionOverlays.vue.d.ts +2 -0
  48. package/dist/src/views/scheduling/components/ScheduleBoardOnboardingOverlays.vue.d.ts +1 -0
  49. package/dist/src/views/scheduling/components/ScheduleBoardToolbar.vue.d.ts +0 -1
  50. package/dist/src/views/scheduling/components/ScheduleCompletionDialog.vue.d.ts +1 -1
  51. package/dist/src/views/scheduling/components/ScheduleConfirmModal.vue.d.ts +4 -1
  52. package/dist/src/views/scheduling/components/ScheduleDayTimeline.vue.d.ts +5 -0
  53. package/dist/src/views/scheduling/components/ScheduleLoadState.vue.d.ts +0 -1
  54. package/dist/src/views/scheduling/components/ScheduleOnboardingSettings.vue.d.ts +6 -0
  55. package/dist/src/views/scheduling/components/ScheduleShiftPopover.vue.d.ts +1 -1
  56. package/dist/src/views/scheduling/composables/auto-schedule-mapping.d.ts +3 -3
  57. package/dist/src/views/scheduling/composables/onboarding-types.d.ts +2 -1
  58. package/dist/src/views/scheduling/composables/remyPrompt.d.ts +4 -2
  59. package/dist/src/views/scheduling/composables/schedule-board-helpers.d.ts +4 -0
  60. package/dist/src/views/scheduling/composables/schedule-day-meta.d.ts +1 -3
  61. package/dist/src/views/scheduling/composables/schedule-demand-domain.d.ts +13 -1
  62. package/dist/src/views/scheduling/composables/schedule-error.d.ts +1 -0
  63. package/dist/src/views/scheduling/composables/schedule-leave-split.d.ts +5 -0
  64. package/dist/src/views/scheduling/composables/schedule-quick-pick.d.ts +22 -0
  65. package/dist/src/views/scheduling/composables/schedule-shift-time.d.ts +3 -0
  66. package/dist/src/views/scheduling/composables/schedule-week-cache.d.ts +3 -1
  67. package/dist/src/views/scheduling/composables/useRemyAppStore.d.ts +1 -0
  68. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +25 -2
  69. package/dist/src/views/scheduling/composables/useScheduleAddPick.d.ts +3 -11
  70. package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +0 -1
  71. package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +22 -13
  72. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +58 -7
  73. package/dist/src/views/scheduling/composables/useScheduleCopyWeek.d.ts +3 -10
  74. package/dist/src/views/scheduling/composables/useScheduleCostRail.d.ts +13 -1
  75. package/dist/src/views/scheduling/composables/useScheduleDayNote.d.ts +0 -1
  76. package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +16 -2
  77. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +7 -0
  78. package/dist/src/views/scheduling/composables/useScheduleDragDrop.d.ts +1 -0
  79. package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +14 -6
  80. package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +26 -4
  81. package/dist/src/views/scheduling/composables/useScheduleEmployeePersistence.d.ts +3 -0
  82. package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +0 -2
  83. package/dist/src/views/scheduling/composables/useScheduleExport.d.ts +1 -0
  84. package/dist/src/views/scheduling/composables/useScheduleLeave.d.ts +5 -1
  85. package/dist/src/views/scheduling/composables/useScheduleOnboardingDemand.d.ts +1 -1
  86. package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +28 -2
  87. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +203 -8
  88. package/dist/src/views/scheduling/composables/useScheduleOutlet.d.ts +11 -8
  89. package/dist/src/views/scheduling/composables/useSchedulePageActions.d.ts +1 -1
  90. package/dist/src/views/scheduling/composables/useSchedulePageCellDrop.d.ts +3 -1
  91. package/dist/src/views/scheduling/composables/useSchedulePageClearActions.d.ts +1 -0
  92. package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +6 -0
  93. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +2 -1
  94. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +46 -0
  95. package/dist/src/views/scheduling/composables/useScheduleSetupBanner.d.ts +2 -2
  96. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +29 -1
  97. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +32 -3
  98. package/dist/src/views/scheduling/country-rules/index.d.ts +8 -3
  99. package/dist/src/views/scheduling/data.d.ts +17 -0
  100. package/dist/src/views/scheduling/locales/index.d.ts +28 -0
  101. package/dist/src/views/scheduling/schedule-state.d.ts +236 -236
  102. package/dist/src/views/scheduling/schedule-store.d.ts +26 -7
  103. package/dist/src/views/scheduling/types.d.ts +8 -0
  104. package/dist/style.css +1 -1
  105. package/dist/tsconfig.app.tsbuildinfo +1 -1
  106. package/dist/{useAppStore-BoLkvkE2.js → useAppStore-Bp0PwbAN.js} +1 -1
  107. package/dist/useDiscardConfirm-CzZSPyvh.js +28 -0
  108. package/dist/{useLoading-Ch1AUYT1.js → useLoading-sgL8DRUz.js} +1 -1
  109. package/dist/{useReportPermissions-DM3GOFCC.js → useReportPermissions-DI-xg3OX.js} +3 -3
  110. package/package.json +2 -2
  111. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-Cx9jFgBS.js +0 -492
  112. package/dist/ScheduleModal.vue_vue_type_script_setup_true_lang-V1sZ_xhO.js +0 -2253
  113. package/dist/SchedulePage-ndLByVBl.js +0 -17785
  114. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +0 -9
  115. package/dist/useDiscardConfirm-DPhEV6v0.js +0 -157
@@ -0,0 +1 @@
1
+ export declare function errorMessage(error: unknown, fallback: string): string;
@@ -0,0 +1,5 @@
1
+ import type { FdtoScheduleCreateTimeOffReq, FdtoScheduleTimeOff } from '@/types/schedule';
2
+ /** The create requests that keep the rest of a multi-day record alive once `date` is carved out
3
+ * of it. Single-day records leave nothing behind. The contract requires a same-day request to
4
+ * have matching parts, so a one-day remainder takes the part from its outer edge. */
5
+ export declare function remainderRequests(record: FdtoScheduleTimeOff, date: string): FdtoScheduleCreateTimeOffReq[];
@@ -0,0 +1,22 @@
1
+ import type { CoverageSegment, Employee } from '../types';
2
+ import type { ScheduleCoverageAxis } from './schedule-demand-domain';
3
+ export interface QuickPickRules {
4
+ minHoursPerDay: number | null;
5
+ maxHoursPerDay: number | null;
6
+ }
7
+ export interface QuickPickCandidate {
8
+ start: string;
9
+ end: string;
10
+ /** Position name, or '' for any position. */
11
+ role: string;
12
+ /** Max short among the runs this shift covers. */
13
+ short: number;
14
+ label: string;
15
+ covers: string;
16
+ title: string;
17
+ }
18
+ /** Up to 3 shifts for one employee on one day, built the way the auto-schedule planner builds
19
+ * them: one per (short run, position the person can fill), padded to their daily minimum,
20
+ * capped at their maximum, kept inside their availability window and clear of their existing
21
+ * shifts. Rest-gap and weekly-cap checks are left to the shift editor's own warnings. */
22
+ export declare function buildQuickPicks(emp: Employee, dayIdx: number, segments: CoverageSegment[], axis: ScheduleCoverageAxis, rules: QuickPickRules, qualifiedFor: (emp: Employee, position: string) => boolean): QuickPickCandidate[];
@@ -12,6 +12,9 @@ export declare function timeRangeBreakOf(sl: WorkSlot): {
12
12
  startTime: string;
13
13
  endTime: string;
14
14
  } | null;
15
+ /** The two visible paid periods around a custom clock-window break. Shared by Weekly cards and
16
+ * Daily timeline bars so the split wording cannot drift between views. */
17
+ export declare function splitTimeLabels(sl: WorkSlot): [string, string] | null;
15
18
  /** Same face as `t12`, but never drops the minutes — two ranges stacked on a split card need
16
19
  * to line up at a glance, and "10am" next to "10:30am" reads as two different units. */
17
20
  export declare function t12Full(hhmm: string): string;
@@ -4,4 +4,6 @@ export interface WeekBucket {
4
4
  employees: Employee[];
5
5
  openShifts: OpenShift[];
6
6
  }
7
- export declare function weekData(offset: number): WeekBucket;
7
+ /** `from` is the date the offset is relative to (the board passes the Monday it anchored on, so a
8
+ * tab left open past midnight keeps building the week it is showing). */
9
+ export declare function weekData(offset: number, from?: Date): WeekBucket;
@@ -2,6 +2,7 @@ import { useAppStore } from '@feedmepos/mf-remy-panel';
2
2
  export interface RemyActivateOptions {
3
3
  prompt?: string;
4
4
  forceNewConversation?: boolean;
5
+ fullscreen?: boolean;
5
6
  }
6
7
  /** HRM never bundles or mounts a Remy panel of its own — `@feedmepos/mf-remy-panel` is externalised
7
8
  * by the shared vite preset, so inside the host portal this import resolves to the ONE panel
@@ -65,7 +65,6 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
65
65
  passcodeOk: import("vue").ComputedRef<boolean>;
66
66
  currentLocationLabel: import("vue").ComputedRef<string>;
67
67
  locationOptions: import("vue").Reactive<string[]>;
68
- masterCodeError: import("vue").ComputedRef<boolean>;
69
68
  isNewUser: import("vue").ComputedRef<boolean>;
70
69
  footerHint: import("vue").ComputedRef<"Pick who — this outlet's own pay, position and hours are still set here." | "One short form. Rest days are set on their profile afterwards.">;
71
70
  primaryRoleLabel: import("vue").ComputedRef<string>;
@@ -77,10 +76,30 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
77
76
  availabilityError: import("vue").ComputedRef<boolean>;
78
77
  saving: import("vue").Ref<boolean, boolean>;
79
78
  saveError: import("vue").Ref<string | null, string | null>;
79
+ deferScheduleWrites: import("vue").Ref<boolean, boolean>;
80
80
  candidatesLoading: import("vue").Ref<boolean, boolean>;
81
81
  candidatesError: import("vue").Ref<string | null, string | null>;
82
+ selectingExisting: import("vue").Ref<boolean, boolean>;
83
+ candidates: import("vue").Ref<{
84
+ employeeId: string;
85
+ name: string;
86
+ otherOutlets: string[];
87
+ locations: string[];
88
+ }[], import("../types").ExistingStaffCandidate[] | {
89
+ employeeId: string;
90
+ name: string;
91
+ otherOutlets: string[];
92
+ locations: string[];
93
+ }[]>;
94
+ candidatesTotal: import("vue").Ref<number, number>;
95
+ candidatesPage: import("vue").Ref<number, number>;
96
+ candidatesPageItemCount: import("vue").Ref<number, number>;
97
+ candidatesPageSize: number;
98
+ searchExisting: (search: string) => void;
99
+ goToExistingPage: (page: number, search: string) => void;
82
100
  openWizard: (section: string) => void;
83
101
  openEditFor: (emp: Employee) => void;
102
+ confirmClose: () => void;
84
103
  close: () => void;
85
104
  setMode: (m: ScheduleAddEmployeeMode) => void;
86
105
  openSelectExisting: () => void;
@@ -100,7 +119,8 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
100
119
  setAvailHour: (index: number, field: "from" | "to", value: string) => void;
101
120
  copyAvailHourDown: (index: number) => void;
102
121
  setPasscodeDigit: (index: number, value: string) => void;
103
- generatePasscode: () => void;
122
+ generatePasscode: () => Promise<void>;
123
+ isGeneratingPasscode: import("vue").Ref<boolean, boolean>;
104
124
  togglePosAccess: () => void;
105
125
  addPosRoleRow: () => void;
106
126
  removePosRoleRow: (index: number) => void;
@@ -108,6 +128,9 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
108
128
  setPosRoleOutlet: (index: number, outlet: string) => void;
109
129
  setPosRoleId: (index: number, roleId: string) => void;
110
130
  posRoleOptionsFor: (outlet: string) => import("../../../types/role").Role[];
131
+ isPosRoleUsable: (role: import("../../../types/role").Role) => boolean;
132
+ setMasterUserRoleAccess: (roleIds: string[] | null | undefined) => void;
133
+ isPosOutletUsable: (outlet: string) => boolean;
111
134
  posRolesHint: import("vue").ComputedRef<"" | "No outlet assigned, so their passcode will not open a till yet." | "The same outlet is listed twice — only the last role on it will apply.">;
112
135
  create: () => Promise<boolean>;
113
136
  };
@@ -1,5 +1,6 @@
1
1
  import type { ScheduleBoardApi } from './useScheduleBoard';
2
2
  import type { ScheduleDemandApi } from './useScheduleDemand';
3
+ import { type QuickPickCandidate } from './schedule-quick-pick';
3
4
  import { type ScheduleAnchorRect } from './schedule-popover-position';
4
5
  export interface ScheduleAddPickState {
5
6
  open: boolean;
@@ -15,15 +16,6 @@ export interface ScheduleAddPickLeaveOption {
15
16
  reason: string;
16
17
  swatch: string;
17
18
  }
18
- export interface ScheduleAddPickSuggestion {
19
- start: string;
20
- end: string;
21
- short: number;
22
- label: string;
23
- /** "Covers 16:00–22:00 demand" — the demand this offer answers, shown under the label. */
24
- covers: string;
25
- title: string;
26
- }
27
19
  /** The "+ Add" quick-pick popover on an employee's empty cell — ported from the mockup's
28
20
  * openAddShiftPicker()/renderAddPickList(), scoped to what this board actually has: our one
29
21
  * active shift pattern, a fixed leave-reason list, and a demand-gap suggestion, all committed
@@ -57,7 +49,7 @@ export declare function useScheduleAddPick(board: ScheduleBoardApi, demand: Sche
57
49
  start: string;
58
50
  end: string;
59
51
  } | null>;
60
- suggested: import("vue").ComputedRef<ScheduleAddPickSuggestion | null>;
52
+ suggestions: import("vue").ComputedRef<QuickPickCandidate[]>;
61
53
  filteredPatterns: import("vue").ComputedRef<{
62
54
  key: string;
63
55
  label: string;
@@ -71,7 +63,7 @@ export declare function useScheduleAddPick(board: ScheduleBoardApi, demand: Sche
71
63
  hasResults: import("vue").ComputedRef<boolean>;
72
64
  openFor: (empId: number, dayIdx: number, anchor: HTMLElement) => void;
73
65
  close: () => void;
74
- pickSuggested: () => void;
66
+ pickSuggested: (index: number) => void;
75
67
  pickPattern: (key: string) => void;
76
68
  pickTypedRange: (start: string, end: string) => void;
77
69
  pickLeave: (reason: string) => void;
@@ -2,7 +2,6 @@ import type { ScheduleBoardApi } from './useScheduleBoard';
2
2
  /** Dragging a person from the staff rail onto a position/day cell opens a normal assigned shift. */
3
3
  export declare function useScheduleAreaDragDrop(board: ScheduleBoardApi, handlers: {
4
4
  onCreateShift: (empId: number, dayIdx: number, position: string) => void;
5
- onNotQualified: (empName: string, position: string) => void;
6
5
  }): {
7
6
  draggingEmpId: import("vue").Ref<number | null, number | null>;
8
7
  startRailDrag: (empId: number) => void;
@@ -1,4 +1,4 @@
1
- import type { FdtoScheduleAutoScheduleObjective, FdtoScheduleAutoSchedulePlanner } from '@/types/schedule';
1
+ import type { FdtoScheduleAutoScheduleObjective } from '@/types/schedule';
2
2
  import type { Proposal } from '../types';
3
3
  import type { ScheduleBoardApi } from './useScheduleBoard';
4
4
  import type { ScheduleDemandApi } from './useScheduleDemand';
@@ -6,7 +6,6 @@ export type ScheduleAutoScheduleStep = 'options' | 'summary';
6
6
  export interface ScheduleAutoScheduleOptions {
7
7
  fillGaps: boolean;
8
8
  objective: FdtoScheduleAutoScheduleObjective;
9
- planner: FdtoScheduleAutoSchedulePlanner;
10
9
  allowOvertime: boolean;
11
10
  /** Shown as preferences in the dialog but not sent: the generator takes no input for them yet
12
11
  * (availability and time off are always respected; patterns and cost ride on the objective). */
@@ -23,25 +22,24 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
23
22
  options: {
24
23
  fillGaps: boolean;
25
24
  objective: FdtoScheduleAutoScheduleObjective;
26
- planner: FdtoScheduleAutoSchedulePlanner;
27
25
  allowOvertime: boolean;
28
26
  respectAvailability: boolean;
29
27
  followPatterns: boolean;
30
28
  costEfficient: boolean;
31
29
  };
32
- planners: import("vue").Ref<("GREEDY" | "LLM")[], ("GREEDY" | "LLM")[]>;
33
- plannerChoice: import("vue").ComputedRef<boolean>;
34
30
  generating: import("vue").Ref<boolean, boolean>;
35
31
  generateError: import("vue").Ref<string | null, string | null>;
36
32
  result: import("vue").Ref<{
37
33
  objective: "BALANCED" | "SERVICE" | "LOWER_COST" | "STABLE_HOURS";
38
34
  allowOvertime: boolean;
35
+ model: string | null;
39
36
  proposals: {
37
+ rejectReason?: string | null | undefined | undefined;
40
38
  date: string;
41
39
  startTime: string;
42
40
  endTime: string;
43
- positionId: string | null;
44
41
  employeeId: string;
42
+ positionId: string | null;
45
43
  employeeName: string;
46
44
  position: string;
47
45
  reason: string;
@@ -60,7 +58,6 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
60
58
  dailyCap: number;
61
59
  rest: number;
62
60
  dayOff: number;
63
- dayCap: number;
64
61
  };
65
62
  }[];
66
63
  metrics: {
@@ -101,12 +98,14 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
101
98
  } | null, {
102
99
  objective: "BALANCED" | "SERVICE" | "LOWER_COST" | "STABLE_HOURS";
103
100
  allowOvertime: boolean;
101
+ model: string | null;
104
102
  proposals: {
103
+ rejectReason?: string | null | undefined;
105
104
  date: string;
106
105
  startTime: string;
107
106
  endTime: string;
108
- positionId: string | null;
109
107
  employeeId: string;
108
+ positionId: string | null;
110
109
  employeeName: string;
111
110
  position: string;
112
111
  reason: string;
@@ -125,7 +124,6 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
125
124
  dailyCap: number;
126
125
  rest: number;
127
126
  dayOff: number;
128
- dayCap: number;
129
127
  };
130
128
  }[];
131
129
  metrics: {
@@ -166,12 +164,14 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
166
164
  } | {
167
165
  objective: "BALANCED" | "SERVICE" | "LOWER_COST" | "STABLE_HOURS";
168
166
  allowOvertime: boolean;
167
+ model: string | null;
169
168
  proposals: {
169
+ rejectReason?: string | null | undefined | undefined;
170
170
  date: string;
171
171
  startTime: string;
172
172
  endTime: string;
173
- positionId: string | null;
174
173
  employeeId: string;
174
+ positionId: string | null;
175
175
  employeeName: string;
176
176
  position: string;
177
177
  reason: string;
@@ -190,7 +190,6 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
190
190
  dailyCap: number;
191
191
  rest: number;
192
192
  dayOff: number;
193
- dayCap: number;
194
193
  };
195
194
  }[];
196
195
  metrics: {
@@ -233,12 +232,13 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
233
232
  hasDemand: import("vue").ComputedRef<boolean>;
234
233
  noDemandOpen: import("vue").Ref<boolean, boolean>;
235
234
  rangeLabel: import("vue").ComputedRef<string>;
236
- openWizard: () => void;
235
+ openWizard: (fromSetup?: boolean) => void;
237
236
  closeWizard: () => void;
238
237
  next: () => void;
239
238
  back: () => void;
240
239
  generate: () => Promise<void>;
241
240
  reviewMode: import("vue").ComputedRef<boolean>;
241
+ hasPendingChanges: import("vue").ComputedRef<boolean>;
242
242
  proposals: import("vue").ComputedRef<{
243
243
  id: number;
244
244
  empId: number;
@@ -251,6 +251,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
251
251
  status: "pending" | "rejected";
252
252
  weekKey?: string | undefined;
253
253
  reason?: string | undefined;
254
+ rejectReason?: string | undefined;
254
255
  }[]>;
255
256
  weekHasProposals: import("vue").ComputedRef<boolean>;
256
257
  unmetCount: import("vue").Ref<number, number>;
@@ -267,7 +268,15 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
267
268
  toggleReject: (id: number) => void;
268
269
  rejectAll: () => void;
269
270
  exitReview: () => void;
270
- apply: () => Promise<number | null>;
271
+ completionOpen: import("vue").Ref<boolean, boolean>;
272
+ completionCount: import("vue").Ref<number, number>;
273
+ completionPublished: import("vue").Ref<boolean, boolean>;
274
+ completionFromSetup: import("vue").Ref<boolean, boolean>;
275
+ closeCompletion: () => void;
276
+ leaveReviewOpen: import("vue").Ref<boolean, boolean>;
277
+ confirmLeaveReview: () => void;
278
+ cancelLeaveReview: () => void;
279
+ apply: (showCompletion?: boolean, status?: "DRAFT" | "PUBLISHED") => Promise<number | null>;
271
280
  applying: import("vue").Ref<boolean, boolean>;
272
281
  applyRejections: import("vue").Ref<{
273
282
  employeeName: string;
@@ -1,21 +1,19 @@
1
1
  import type { Employee, OpenShift, PendingChange, ScheduleStatusInfo, ScheduleVersion, ScheduleVersionSnapshot, Section, WorkSlot } from '../types';
2
2
  import { RANGE_LEN } from './schedule-week-cache';
3
- import { contractCapFor, isGenuineSplitGroup, isLeaveSlot, isPartTime, isoDateKey, isWorkSlot, overContract, positionKeyOf, workSlotsOf } from './schedule-board-helpers';
4
- export { contractCapFor, isGenuineSplitGroup, isLeaveSlot, isPartTime, isoDateKey, isWorkSlot, overContract, positionKeyOf, workSlotsOf, };
3
+ import { contractCapFor, isGenuineSplitGroup, isLeaveSlot, isPartTime, isoDateKey, isWorkSlot, overContract, overlapsAnotherSlot, positionKeyOf, workSlotsOf } from './schedule-board-helpers';
4
+ export { contractCapFor, isGenuineSplitGroup, isLeaveSlot, isPartTime, isoDateKey, isWorkSlot, overContract, overlapsAnotherSlot, positionKeyOf, workSlotsOf, };
5
5
  export { RANGE_LEN };
6
6
  export type ScheduleGranularity = 'day' | 'week';
7
7
  export declare function useScheduleBoard(handlers?: {
8
8
  onPersistError?: (message: string) => void;
9
9
  }): {
10
10
  dayNote: (dayIdx: number) => import("../types").ScheduleDayNote | null;
11
- setDayNote: (dayIdx: number, title: string, desc: string) => void;
11
+ setDayNote: (dayIdx: number, title: string, desc: string, isPublicHoliday?: boolean) => void;
12
12
  clearDayNote: (dayIdx: number) => void;
13
13
  isStandingClosedWeekday: (dayIdx: number) => boolean;
14
14
  holidayName: (dayIdx: number) => string | null;
15
- holidayIsAuto: (dayIdx: number) => boolean;
16
15
  isPublicHoliday: (dayIdx: number) => boolean;
17
16
  holidayRateApplies: (dayIdx: number) => boolean;
18
- setHolidayNormal: (dayIdx: number, toNormal: boolean) => void;
19
17
  setPublicHoliday: (dayIdx: number, on: boolean) => void;
20
18
  otRateOn: (dayIdx: number) => number;
21
19
  regularRateOn: (dayIdx: number) => number;
@@ -112,6 +110,28 @@ export declare function useScheduleBoard(handlers?: {
112
110
  updatedAt?: string | undefined;
113
111
  splitGroupId?: string | undefined;
114
112
  }[] | null)[];
113
+ timeOff?: ({
114
+ timeOff: "approved" | "pending";
115
+ requestId?: string | undefined;
116
+ type?: "OFF_DAY" | "LEAVE" | undefined;
117
+ leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
118
+ reason: string;
119
+ half?: boolean | undefined;
120
+ halfPart?: "AM" | "PM" | undefined;
121
+ from?: string | undefined;
122
+ to?: string | undefined;
123
+ appliedOn?: string | undefined;
124
+ note?: string | undefined;
125
+ cert?: {
126
+ name: string;
127
+ size: string;
128
+ } | null | undefined;
129
+ bal?: {
130
+ type: string;
131
+ entitled: number;
132
+ used: number;
133
+ } | undefined;
134
+ } | null)[] | undefined;
115
135
  remarks: {
116
136
  author: string;
117
137
  date: string;
@@ -144,6 +164,7 @@ export declare function useScheduleBoard(handlers?: {
144
164
  to: string;
145
165
  }[] | undefined;
146
166
  passcode?: string | undefined;
167
+ code?: string | undefined;
147
168
  masterUser?: boolean | undefined;
148
169
  }[], Employee[] | {
149
170
  id: number;
@@ -237,6 +258,28 @@ export declare function useScheduleBoard(handlers?: {
237
258
  updatedAt?: string | undefined;
238
259
  splitGroupId?: string | undefined;
239
260
  }[] | null)[];
261
+ timeOff?: ({
262
+ timeOff: "approved" | "pending";
263
+ requestId?: string | undefined;
264
+ type?: "OFF_DAY" | "LEAVE" | undefined;
265
+ leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
266
+ reason: string;
267
+ half?: boolean | undefined;
268
+ halfPart?: "AM" | "PM" | undefined;
269
+ from?: string | undefined;
270
+ to?: string | undefined;
271
+ appliedOn?: string | undefined;
272
+ note?: string | undefined;
273
+ cert?: {
274
+ name: string;
275
+ size: string;
276
+ } | null | undefined;
277
+ bal?: {
278
+ type: string;
279
+ entitled: number;
280
+ used: number;
281
+ } | undefined;
282
+ } | null)[] | undefined;
240
283
  remarks: {
241
284
  author: string;
242
285
  date: string;
@@ -269,6 +312,7 @@ export declare function useScheduleBoard(handlers?: {
269
312
  to: string;
270
313
  }[] | undefined;
271
314
  passcode?: string | undefined;
315
+ code?: string | undefined;
272
316
  masterUser?: boolean | undefined;
273
317
  }[]>;
274
318
  sections: import("vue").Ref<{
@@ -319,12 +363,14 @@ export declare function useScheduleBoard(handlers?: {
319
363
  dayIdx: number;
320
364
  kind: "add" | "change" | "remove";
321
365
  label: string;
366
+ conflict?: boolean | undefined;
322
367
  }[], PendingChange[] | {
323
368
  empId: number;
324
369
  employeeKey: string;
325
370
  dayIdx: number;
326
371
  kind: "add" | "change" | "remove";
327
372
  label: string;
373
+ conflict?: boolean | undefined;
328
374
  }[]>;
329
375
  unpublishedChanges: import("vue").ComputedRef<PendingChange[]>;
330
376
  persistPublish: (items: Array<{
@@ -549,12 +595,17 @@ export declare function useScheduleBoard(handlers?: {
549
595
  clearEmployeeShifts: (empId: number) => {
550
596
  shifts: number;
551
597
  };
552
- moveShift: (fromEmpId: number, fromDayIdx: number, toEmpId: number, toDayIdx: number, fromSlotIndex?: number, fromSlotCount?: number) => boolean;
598
+ moveShift: (fromEmpId: number, fromDayIdx: number, toEmpId: number, toDayIdx: number, fromSlotIndex?: number, fromSlotCount?: number, targetPosition?: string, allowLocked?: boolean) => boolean;
553
599
  swapShifts: (empIdA: number, empIdB: number, dayA: number, dayB?: number, slotIndexA?: number, slotIndexB?: number, slotCountA?: number) => boolean;
554
- clearShiftsInRange: () => {
600
+ swapPositions: (empIdA: number, empIdB: number, dayA: number, dayB?: number, slotIndexA?: number, slotIndexB?: number, slotCountA?: number) => boolean;
601
+ clearShiftsInRange: (options?: {
602
+ persist?: boolean;
603
+ mutate?: boolean;
604
+ }) => {
555
605
  shifts: number;
556
606
  open: number;
557
607
  leave: number;
608
+ assignmentIds: string[];
558
609
  };
559
610
  requiredFor: (dayIdx: number, position: string) => number;
560
611
  scheduledFor: (dayIdx: number, position: string) => number;
@@ -1,19 +1,12 @@
1
1
  import type { ScheduleBoardApi } from './useScheduleBoard';
2
- export interface ScheduleCopySkipReport {
3
- leave: number;
4
- already: number;
5
- hours: number;
6
- full: number;
7
- closed: number;
8
- }
9
2
  /** The mockup's Copy schedule feature (copyLastWeek/copyThisWeekForward), ported against this
10
- * board's per-week-offset bucket cache instead of the mockup's absolute 91-day horizon. Split
11
- * shifts (copyUnitsOf in the mockup) aren't ported — WorkSlot has no splitId concept in this
12
- * data model, so each slot is copied as its own unit. */
3
+ * board's per-week-offset bucket cache instead of the mockup's absolute 91-day horizon. */
13
4
  export declare function useScheduleCopyWeek(board: ScheduleBoardApi, handlers?: {
14
5
  onDemandChanged?: () => void;
6
+ onConfirmOverwrite?: (message: string, onConfirm: () => void) => void;
15
7
  }): {
16
8
  copyLastWeek: (mode: "staffed" | "open") => Promise<void>;
17
9
  copyThisWeekForward: (mode: "staffed" | "open") => Promise<void>;
10
+ isCopying: import("vue").Ref<boolean, boolean>;
18
11
  };
19
12
  export type ScheduleCopyWeekApi = ReturnType<typeof useScheduleCopyWeek>;
@@ -27,8 +27,17 @@ export interface ScheduleOtRisk {
27
27
  empId: number;
28
28
  name: string;
29
29
  hours: number;
30
+ otHours: number;
30
31
  contract: number;
31
32
  }
33
+ export interface ScheduleMonthlyOtSummary {
34
+ key: string;
35
+ label: string;
36
+ used: number;
37
+ cap: number | null;
38
+ progress: number;
39
+ high: boolean;
40
+ }
32
41
  /** The staff rail consumes the same employee identity/load derivation as the area view. */
33
42
  export type ScheduleRailRow = ScheduleEmployeeLoad;
34
43
  /** Weekly labour cost + monthly OT gauge for the collapsible cost rail, built off one
@@ -41,7 +50,10 @@ export declare function useScheduleCostRail(board: ScheduleBoardApi, proposalAt?
41
50
  weeklyCost: import("vue").ComputedRef<number>;
42
51
  otHours: import("vue").ComputedRef<number>;
43
52
  monthlyOtUsed: import("vue").ComputedRef<number>;
44
- monthlyOtCapHours: number;
53
+ monthlyOtSummaries: import("vue").ComputedRef<ScheduleMonthlyOtSummary[]>;
54
+ monthlyOtCapHours: import("vue").ComputedRef<number | null>;
55
+ monthlyOtProgress: import("vue").ComputedRef<number>;
56
+ monthlyOtHigh: import("vue").ComputedRef<boolean>;
45
57
  bySection: import("vue").ComputedRef<ScheduleSectionCost[]>;
46
58
  otRisk: import("vue").ComputedRef<ScheduleOtRisk[]>;
47
59
  };
@@ -33,7 +33,6 @@ export declare function useScheduleDayNote(board: ScheduleBoardApi, opts?: Sched
33
33
  savedNote: import("vue").ComputedRef<import("../types").ScheduleDayNote | null>;
34
34
  hasSaved: import("vue").ComputedRef<boolean>;
35
35
  whenLabel: import("vue").ComputedRef<string>;
36
- isAuto: import("vue").ComputedRef<boolean>;
37
36
  rateApplies: import("vue").ComputedRef<boolean>;
38
37
  holidayHint: import("vue").ComputedRef<string>;
39
38
  openFor: (dayIdx: number, anchor: HTMLElement) => void;
@@ -2,14 +2,19 @@ import type { ScheduleBoardApi } from './useScheduleBoard';
2
2
  import type { ScheduleRosterApi } from './useScheduleRoster';
3
3
  import type { ScheduleAreaBoardApi } from './useScheduleAreaBoard';
4
4
  import type { ScheduleDemandApi } from './useScheduleDemand';
5
+ import { type ScheduleEmployeeLoad } from './useScheduleEmployeeIdentity';
5
6
  declare function minToHHMM(m: number): string;
6
7
  export interface ScheduleTimelineBar {
7
8
  key: string;
9
+ start: number;
10
+ end: number;
8
11
  left: number;
9
12
  width: number;
10
13
  cls: string;
11
14
  label: string;
15
+ labels?: string[];
12
16
  sub?: string;
17
+ conflict?: boolean;
13
18
  title: string;
14
19
  brk?: {
15
20
  left: number;
@@ -17,6 +22,8 @@ export interface ScheduleTimelineBar {
17
22
  };
18
23
  laneTop?: number;
19
24
  laneHeight?: number;
25
+ employeeId?: number;
26
+ slotIndex?: number;
20
27
  onClick?: () => void;
21
28
  }
22
29
  export interface ScheduleTimelineRow {
@@ -27,6 +34,7 @@ export interface ScheduleTimelineRow {
27
34
  avatarInitials?: string;
28
35
  avatarColor?: string;
29
36
  employeeId?: number;
37
+ employeeLoad?: ScheduleEmployeeLoad;
30
38
  roleLabel?: string;
31
39
  hoursLabel?: string;
32
40
  hoursPct?: number;
@@ -34,9 +42,14 @@ export interface ScheduleTimelineRow {
34
42
  name: string;
35
43
  sub: string;
36
44
  bars: ScheduleTimelineBar[];
45
+ pastDay?: boolean;
46
+ lockedDay?: boolean;
47
+ closedDay?: boolean;
48
+ availabilityDay?: boolean;
49
+ availabilityLabel?: string;
37
50
  minHeight?: number;
38
51
  emptyText?: string;
39
- onTrackClick?: () => void;
52
+ onTrackClick?: (anchor: HTMLElement) => void;
40
53
  }
41
54
  export interface ScheduleHourCell {
42
55
  m: number;
@@ -48,7 +61,8 @@ export interface ScheduleHourCell {
48
61
  n: number;
49
62
  }
50
63
  export declare function useScheduleDayTimeline(board: ScheduleBoardApi, roster: ScheduleRosterApi, areaBoard: ScheduleAreaBoardApi, demand: ScheduleDemandApi, handlers: {
51
- onAddShift: (empId: number, dayIdx: number) => void;
64
+ onAddShift: (empId: number, dayIdx: number, anchor: HTMLElement) => void;
65
+ onAddPositionShift: (dayIdx: number, position: string, anchor: HTMLElement) => void;
52
66
  onEditShift: (empId: number, dayIdx: number) => void;
53
67
  onEditLeave: (empId: number, dayIdx: number) => void;
54
68
  onOpenDemand: (dayIdx: number) => void;
@@ -66,6 +66,13 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
66
66
  }[]>;
67
67
  toggleCustomDay: (i: number) => void;
68
68
  applyNote: import("vue").ComputedRef<string>;
69
+ replaceConfirmOpen: import("vue").ComputedRef<boolean>;
70
+ replaceConfirmTitle: import("vue").ComputedRef<"Replace existing demand?" | "Clear existing demand?">;
71
+ replaceConfirmActionLabel: import("vue").ComputedRef<"Confirm" | "Clear demand">;
72
+ replaceConfirmMessage: import("vue").ComputedRef<"Demand already exists on the dates below. Applying this demand will replace it on all selected dates." | "Demand exists on the dates below. Saving an empty time range will clear it on all selected dates.">;
73
+ replaceConfirmDates: import("vue").ComputedRef<string[]>;
74
+ confirmReplace: () => Promise<void>;
75
+ cancelReplace: () => void;
69
76
  overlapWarning: import("vue").ComputedRef<string>;
70
77
  whenLabel: import("vue").ComputedRef<string>;
71
78
  openFor: (idx: number) => void;
@@ -50,5 +50,6 @@ export declare function useScheduleDragDrop(board: ScheduleBoardApi): {
50
50
  setDragHover: (empId: number, dayIdx: number, onCard: boolean, slotIndex: number | null) => void;
51
51
  clearDragHover: (empId: number, dayIdx: number) => void;
52
52
  dropOnCell: (targetEmpId: number, targetDayIdx: number) => void;
53
+ dropOnPosition: (targetDayIdx: number, targetPosition: string, allowLocked?: boolean) => void;
53
54
  };
54
55
  export type ScheduleDragDropApi = ReturnType<typeof useScheduleDragDrop>;
@@ -1,10 +1,14 @@
1
+ import { type ComputedRef } from 'vue';
1
2
  import type { Role } from '@/types/role';
2
- import { type ScheduleAddEmployeeForm } from './schedule-add-employee-form';
3
- export declare function useScheduleEmployeeAccess(form: ScheduleAddEmployeeForm): {
4
- passcodeValue: import("vue").ComputedRef<string>;
5
- passcodeOk: import("vue").ComputedRef<boolean>;
3
+ import type { ScheduleAddEmployeeForm } from './schedule-add-employee-form';
4
+ export declare function useScheduleEmployeeAccess(form: ScheduleAddEmployeeForm, options?: {
5
+ excludePosUserId?: ComputedRef<string | undefined>;
6
+ }): {
7
+ passcodeValue: ComputedRef<string>;
8
+ passcodeOk: ComputedRef<boolean>;
6
9
  setPasscodeDigit: (index: number, value: string) => void;
7
- generatePasscode: () => void;
10
+ generatePasscode: () => Promise<void>;
11
+ isGeneratingPasscode: import("vue").Ref<boolean, boolean>;
8
12
  togglePosAccess: () => void;
9
13
  addPosRoleRow: () => void;
10
14
  removePosRoleRow: (index: number) => void;
@@ -12,5 +16,9 @@ export declare function useScheduleEmployeeAccess(form: ScheduleAddEmployeeForm)
12
16
  setPosRoleOutlet: (index: number, outlet: string) => void;
13
17
  setPosRoleId: (index: number, roleId: string) => void;
14
18
  posRoleOptionsFor: (outlet: string) => Role[];
15
- posRolesHint: import("vue").ComputedRef<"" | "No outlet assigned, so their passcode will not open a till yet." | "The same outlet is listed twice — only the last role on it will apply.">;
19
+ isPosRoleUsable: (role: Role) => boolean;
20
+ setMasterUserRoleAccess: (roleIds: string[] | null | undefined) => void;
21
+ isPosOutletUsable: (outlet: string) => boolean;
22
+ setMasterUserRestaurantAccess: (restaurantIds: string[] | null | undefined) => void;
23
+ posRolesHint: ComputedRef<"" | "No outlet assigned, so their passcode will not open a till yet." | "The same outlet is listed twice — only the last role on it will apply.">;
16
24
  };