@feedmepos/mf-hrm-portal 2.3.0-dev.2 → 2.3.0-dev.21

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 (127) hide show
  1. package/dist/{ApprovalCodeList-CJaNPHZC.js → ApprovalCodeList-DuPmMQ8Z.js} +7 -7
  2. package/dist/{AuditLogList-CHA98ZqW.js → AuditLogList-BeRA_284.js} +18 -19
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-C7rvthEI.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-StnBAQOk.js} +2 -2
  4. package/dist/{EmployeeList-CVmMKt71.js → EmployeeList-qmjsbCjj.js} +255 -266
  5. package/dist/{FormItem.vue_vue_type_script_setup_true_lang-CUnlKsxk.js → FormItem.vue_vue_type_script_setup_true_lang-oQJgMciC.js} +6 -6
  6. package/dist/{GrantUserList-MYjgt5-F.js → GrantUserList--WUK7zrV.js} +8 -8
  7. package/dist/{Main-hlcHtrsc.js → Main-9X2iCXoX.js} +5 -5
  8. package/dist/{Main-C0cnqQ3B.js → Main-BIAeEQV9.js} +8 -8
  9. package/dist/{Main-BgB9lD4K.js → Main-tPL_YTwT.js} +11 -11
  10. package/dist/{PermissionSetList-5f1WIaVa.js → PermissionSetList-ByTyQe0s.js} +19 -18
  11. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Bp9WwlnI.js +4167 -0
  12. package/dist/{PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-fe-Rdwn4.js → PortalUserSearcher.vue_vue_type_style_index_0_scoped_827dfd60_lang-DQcgZ0nF.js} +1 -1
  13. package/dist/ResponsiveContextMenu.vue_vue_type_script_setup_true_lang-mSJFKo7r.js +132 -0
  14. package/dist/{RoleList-DNR4miXr.js → RoleList-INlydQmP.js} +21 -20
  15. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-d8KDvgNu.js +530 -0
  16. package/dist/ScheduleGeneralPage-DbOoP9Ez.js +776 -0
  17. package/dist/ScheduleModal.vue_vue_type_script_setup_true_lang-UowMybGr.js +2439 -0
  18. package/dist/SchedulePage-CjOZtRlK.js +19291 -0
  19. package/dist/{SchedulePositionPage-DyRckyUx.js → SchedulePositionPage-CnDqkvL9.js} +78 -80
  20. package/dist/{SelectFilter-CG13h83-.js → SelectFilter-BWw4B9tM.js} +1 -1
  21. package/dist/{TeamMemberList-mw5OveZG.js → TeamMemberList-BgYtoXht.js} +27 -27
  22. package/dist/{TimesheetList-BzXarZbM.js → TimesheetList-Dg0QYsWO.js} +52 -53
  23. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-Dq5i4poN.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-eTd4J1CB.js} +3 -3
  24. package/dist/{app-DSsdRLHg.js → app-CDo04LrB.js} +2891 -2474
  25. package/dist/app.js +1 -1
  26. package/dist/{approval-code-C9DmR4Md.js → approval-code-BXUiojPH.js} +1 -1
  27. package/dist/{dayjs.min-B6xBXQtU.js → dayjs.min-KFBmxZF3.js} +1 -1
  28. package/dist/{employee-hMhzuqk1.js → employee-BRaYoaOY.js} +4 -4
  29. package/dist/{grant-user-Bv-pJ9Wt.js → grant-user-CBJ3gEgW.js} +1 -1
  30. package/dist/{iteration-B34AvpNC.js → iteration-p-TjO05t.js} +1 -1
  31. package/dist/{lodash-1Vyuy7Mu.js → lodash-D72lpJgs.js} +1 -1
  32. package/dist/object-Dwyg2LgX.js +16 -0
  33. package/dist/{restaurant-D7PEQjPY.js → restaurant-D2mfKHaH.js} +48 -48
  34. package/dist/{role-DKOrgO6f.js → role-a35Vc8gC.js} +2 -2
  35. package/dist/{rule-CBzQ3GeV.js → rule-BRRw0K7p.js} +3 -3
  36. package/dist/src/api/schedule/index.d.ts +9 -1
  37. package/dist/src/components/layout/SchedulePromoBanner.vue.d.ts +2 -0
  38. package/dist/src/composables/useDiscardConfirm.d.ts +3 -1
  39. package/dist/src/types/schedule.d.ts +3 -4
  40. package/dist/src/views/audit-log/locales/index.d.ts +252 -0
  41. package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +4 -8
  42. package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +1 -4
  43. package/dist/src/views/scheduling/components/ScheduleBoardEditOverlays.vue.d.ts +0 -2
  44. package/dist/src/views/scheduling/components/ScheduleBoardEmployeeRows.vue.d.ts +0 -7
  45. package/dist/src/views/scheduling/components/ScheduleBoardGridHeader.vue.d.ts +5 -0
  46. package/dist/src/views/scheduling/components/ScheduleBoardInteractionOverlays.vue.d.ts +0 -6
  47. package/dist/src/views/scheduling/components/ScheduleBoardOnboardingOverlays.vue.d.ts +1 -0
  48. package/dist/src/views/scheduling/components/ScheduleBoardToolbar.vue.d.ts +0 -1
  49. package/dist/src/views/scheduling/components/ScheduleConfirmModal.vue.d.ts +4 -1
  50. package/dist/src/views/scheduling/components/ScheduleContextMenu.vue.d.ts +1 -5
  51. package/dist/src/views/scheduling/components/ScheduleDayTimeline.vue.d.ts +5 -0
  52. package/dist/src/views/scheduling/components/ScheduleLoadState.vue.d.ts +0 -1
  53. package/dist/src/views/scheduling/components/{ScheduleAssignEmployeePopover.vue.d.ts → ScheduleOnboardingAssignPositionModal.vue.d.ts} +2 -2
  54. package/dist/src/views/scheduling/components/ScheduleOnboardingSettings.vue.d.ts +6 -0
  55. package/dist/src/views/scheduling/components/SchedulePublishShareArt.vue.d.ts +2 -0
  56. package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +10 -0
  57. package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +0 -10
  58. package/dist/src/views/scheduling/composables/onboarding-types.d.ts +2 -1
  59. package/dist/src/views/scheduling/composables/remyPrompt.d.ts +4 -2
  60. package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +12 -8
  61. package/dist/src/views/scheduling/composables/schedule-board-helpers.d.ts +4 -0
  62. package/dist/src/views/scheduling/composables/schedule-day-meta.d.ts +1 -3
  63. package/dist/src/views/scheduling/composables/schedule-demand-domain.d.ts +13 -1
  64. package/dist/src/views/scheduling/composables/schedule-error.d.ts +1 -0
  65. package/dist/src/views/scheduling/composables/schedule-quick-pick.d.ts +22 -0
  66. package/dist/src/views/scheduling/composables/schedule-shift-time.d.ts +3 -0
  67. package/dist/src/views/scheduling/composables/useRemyAppStore.d.ts +6 -0
  68. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +29 -11
  69. package/dist/src/views/scheduling/composables/useScheduleAddPick.d.ts +3 -11
  70. package/dist/src/views/scheduling/composables/useScheduleAreaBoard.d.ts +0 -13
  71. package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +2 -9
  72. package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +11 -3
  73. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +86 -11
  74. package/dist/src/views/scheduling/composables/useScheduleCopyWeek.d.ts +3 -10
  75. package/dist/src/views/scheduling/composables/useScheduleCostRail.d.ts +13 -1
  76. package/dist/src/views/scheduling/composables/useScheduleDayNote.d.ts +0 -1
  77. package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +16 -5
  78. package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +3 -5
  79. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +13 -3
  80. package/dist/src/views/scheduling/composables/useScheduleDragDrop.d.ts +1 -0
  81. package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +20 -7
  82. package/dist/src/views/scheduling/composables/useScheduleEmployeeAvailability.d.ts +1 -1
  83. package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +5 -1
  84. package/dist/src/views/scheduling/composables/useScheduleEmployeePersistence.d.ts +5 -0
  85. package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +2 -2
  86. package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +2 -0
  87. package/dist/src/views/scheduling/composables/useScheduleOnboardingDemand.d.ts +1 -1
  88. package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +47 -3
  89. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +408 -29
  90. package/dist/src/views/scheduling/composables/useScheduleOutlet.d.ts +11 -8
  91. package/dist/src/views/scheduling/composables/useSchedulePageCellDrop.d.ts +3 -1
  92. package/dist/src/views/scheduling/composables/useSchedulePageClearActions.d.ts +1 -0
  93. package/dist/src/views/scheduling/composables/useSchedulePageOverlays.d.ts +0 -4
  94. package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +1 -0
  95. package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +7 -1
  96. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +2 -0
  97. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +70 -4
  98. package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +7 -2
  99. package/dist/src/views/scheduling/composables/useScheduleSetupBanner.d.ts +2 -2
  100. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +41 -3
  101. package/dist/src/views/scheduling/composables/useScheduleShiftDraft.d.ts +1 -0
  102. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +47 -6
  103. package/dist/src/views/scheduling/country-rules/index.d.ts +9 -4
  104. package/dist/src/views/scheduling/data.d.ts +22 -1
  105. package/dist/src/views/scheduling/locales/index.d.ts +28 -0
  106. package/dist/src/views/scheduling/schedule-state.d.ts +272 -208
  107. package/dist/src/views/scheduling/schedule-store.d.ts +36 -11
  108. package/dist/src/views/scheduling/types.d.ts +30 -5
  109. package/dist/style.css +1 -1
  110. package/dist/tsconfig.app.tsbuildinfo +1 -1
  111. package/dist/{useAppStore-d_nHyK5u.js → useAppStore-DZCdxlCd.js} +1 -1
  112. package/dist/useDiscardConfirm-CzZSPyvh.js +28 -0
  113. package/dist/{useLoading-JFoghhRz.js → useLoading-Nygx2zn8.js} +1 -1
  114. package/dist/{useReportPermissions-B2ev0j4w.js → useReportPermissions-Ca-9DEOI.js} +3 -3
  115. package/package.json +1 -1
  116. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-CFoTAGIX.js +0 -4167
  117. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-B4VUyKW3.js +0 -470
  118. package/dist/ScheduleGeneralPage-Cd5AlY4z.js +0 -666
  119. package/dist/ScheduleModal.vue_vue_type_script_setup_true_lang-Cf0l2MRg.js +0 -2188
  120. package/dist/SchedulePage-C8m0-m3l.js +0 -18257
  121. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +0 -9
  122. package/dist/src/views/scheduling/components/ScheduleAllShiftsRow.vue.d.ts +0 -22
  123. package/dist/src/views/scheduling/components/ScheduleStackPopover.vue.d.ts +0 -14
  124. package/dist/src/views/scheduling/composables/useScheduleAllShiftsRow.d.ts +0 -77
  125. package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +0 -124
  126. package/dist/src/views/scheduling/composables/useScheduleOpenShiftCard.d.ts +0 -23
  127. package/dist/useDiscardConfirm-DPhEV6v0.js +0 -157
@@ -11,12 +11,12 @@ export interface ScheduleAddEmployeeForm {
11
11
  payBasis: 'hourly' | 'monthly';
12
12
  payAmount: string;
13
13
  maxHours: string;
14
+ maxHoursPerDay: string;
14
15
  minHours: string;
15
- /** Overtime is opt-in: off is "no rule", not "zero overtime" — a 0 sitting in the fields
16
- * below by default would read as "every hour is overtime", the opposite of unset. */
17
- otEnabled: boolean;
18
- otAfterDaily: string;
19
- maxOtHours: string;
16
+ workingHoursEnabled: boolean;
17
+ overtimeEnabled: boolean;
18
+ /** Blank means no employee override; the outlet overtime setting is inherited. */
19
+ maxHoursPerMonth: string;
20
20
  /** For a part-timer: days they CAN work. For a full-timer: days they're OFF — the
21
21
  * mockup inverts the same array's meaning by employment type. */
22
22
  availDays: boolean[];
@@ -31,9 +31,13 @@ export interface ScheduleAddEmployeeForm {
31
31
  masterCode: string;
32
32
  /** Gates the fields below it — someone can be fully scheduled with this off. */
33
33
  posAccessEnabled: boolean;
34
- /** WHAT the passcode opens the till as, at this outlet — the one this person is being added
35
- * to. The outlet itself isn't a choice here: this wizard is already scoped to it. */
36
- posRoleId: string;
34
+ /** WHAT the passcode opens the till as, and WHERE — a row per outlet. Not restricted to the
35
+ * outlets picked in Work locations above: a floating manager can be rostered at one outlet
36
+ * and hold POS admin at several others. */
37
+ posRoles: {
38
+ outlet: string;
39
+ roleId: string;
40
+ }[];
37
41
  }
38
42
  /** A salaried month, for converting a monthly figure into the hourly one the cost rail
39
43
  * actually reads. Ported verbatim from the mockup's MONTH_HOURS. */
@@ -6,6 +6,10 @@ export { isoDateKey } from './schedule-calendar';
6
6
  export declare function isWorkSlot(slot: DaySlot): slot is WorkSlot;
7
7
  export declare function isLeaveSlot(slot: DaySlot): slot is LeaveSlot;
8
8
  export declare function workSlotsOf(day: DaySlot): WorkSlot[];
9
+ /** Whether two periods occupy any of the same working time. Endpoints that touch are
10
+ * back-to-back, not a conflict. Overnight ranges use the shared clock rules. */
11
+ export declare function shiftsOverlap(a: Pick<WorkSlot, 'start' | 'end'>, b: Pick<WorkSlot, 'start' | 'end'>): boolean;
12
+ export declare function overlapsAnotherSlot(slots: WorkSlot[], target: WorkSlot): boolean;
9
13
  /** The inverse of `workSlotsOf` — bare slot for one, the array for two or more, so a day
10
14
  * that's back down to its last period reads as a normal single shift again rather than a
11
15
  * one-element array everything else has to unwrap. */
@@ -8,14 +8,12 @@ export declare function useScheduleDayMeta(dateKey: (dayIdx: number) => string |
8
8
  onPersistError?: (message: string) => void;
9
9
  }): {
10
10
  dayNote: (dayIdx: number) => 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;
@@ -1,4 +1,4 @@
1
- import type { DemandPeriod } from '../types';
1
+ import type { DemandPeriod, Employee } from '../types';
2
2
  import { format12h as t12, formatShortMinutes as minToShort, fromMinutes as minToHHMM, spanMinutes as spanOf, toMinutes as toMin } from './schedule-time';
3
3
  export { minToHHMM, minToShort, spanOf, t12, toMin };
4
4
  export declare function rangeText(from: number, to: number): string;
@@ -9,3 +9,15 @@ export interface ScheduleCoverageAxis {
9
9
  from: number;
10
10
  to: number;
11
11
  }
12
+ /** Fills named position rows from the people on, as a maximum matching (Kuhn's augmenting
13
+ * paths) so a flexible person is moved off one row when another row has nobody else. Rows are
14
+ * tried in the order given (scarcest first); within a row, main-position holders are offered
15
+ * first, then secondary holders, then people with no positions. Returns heads filled per row
16
+ * (same order as `rows`) and the ids spent. */
17
+ export declare function matchSlots(rows: Array<{
18
+ position: string;
19
+ required: number;
20
+ }>, on: Employee[], qualified: (e: Employee, position: string) => boolean): {
21
+ got: number[];
22
+ spent: Set<number>;
23
+ };
@@ -0,0 +1 @@
1
+ export declare function errorMessage(error: unknown, fallback: string): string;
@@ -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;
@@ -2,7 +2,13 @@ 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
  }
7
+ /** HRM never bundles or mounts a Remy panel of its own — `@feedmepos/mf-remy-panel` is externalised
8
+ * by the shared vite preset, so inside the host portal this import resolves to the ONE panel
9
+ * instance the host already created. The host portal owns initialisation (with env-specific
10
+ * backend/license URLs) before any HRM view mounts. HRM must never call `initializeRemyChat`:
11
+ * it re-initialises the shared panel instance and, without arguments, points it at production. */
6
12
  export interface RemyAppStoreApi {
7
13
  store: ReturnType<typeof useAppStore>;
8
14
  activate: (options: RemyActivateOptions) => Promise<void>;
@@ -21,10 +21,11 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
21
21
  payBasis: "hourly" | "monthly";
22
22
  payAmount: string;
23
23
  maxHours: string;
24
+ maxHoursPerDay: string;
24
25
  minHours: string;
25
- otEnabled: boolean;
26
- otAfterDaily: string;
27
- maxOtHours: string;
26
+ workingHoursEnabled: boolean;
27
+ overtimeEnabled: boolean;
28
+ maxHoursPerMonth: string;
28
29
  availDays: boolean[];
29
30
  availHours: {
30
31
  from: string;
@@ -38,7 +39,10 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
38
39
  masterUser: boolean;
39
40
  masterCode: string;
40
41
  posAccessEnabled: boolean;
41
- posRoleId: string;
42
+ posRoles: {
43
+ outlet: string;
44
+ roleId: string;
45
+ }[];
42
46
  };
43
47
  sectionId: import("vue").Ref<string, string>;
44
48
  isEditing: import("vue").ComputedRef<boolean>;
@@ -50,16 +54,17 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
50
54
  dayLit: (index: number) => boolean;
51
55
  avLabel: import("vue").ComputedRef<"Weekly availability" | "Time off days">;
52
56
  avAllLabel: import("vue").ComputedRef<"Clear all" | "Select all" | "No days off" | "Every day off">;
53
- maxHoursPlaceholder: import("vue").ComputedRef<"Hours per week" | "No cap">;
54
- otAfterDailyPlaceholder: import("vue").ComputedRef<string>;
55
- toggleOt: () => void;
57
+ maxHoursPlaceholder: import("vue").ComputedRef<string>;
58
+ minHoursPlaceholder: import("vue").ComputedRef<string>;
59
+ maxHoursPerDayPlaceholder: import("vue").ComputedRef<string>;
60
+ maxHoursPerMonthPlaceholder: import("vue").ComputedRef<string>;
61
+ toggleOvertime: () => void;
56
62
  payUnit: import("vue").ComputedRef<"/month" | "/hour">;
57
63
  effectiveRate: import("vue").ComputedRef<number>;
58
64
  passcodeValue: import("vue").ComputedRef<string>;
59
65
  passcodeOk: import("vue").ComputedRef<boolean>;
60
66
  currentLocationLabel: import("vue").ComputedRef<string>;
61
67
  locationOptions: import("vue").Reactive<string[]>;
62
- masterCodeError: import("vue").ComputedRef<boolean>;
63
68
  isNewUser: import("vue").ComputedRef<boolean>;
64
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.">;
65
70
  primaryRoleLabel: import("vue").ComputedRef<string>;
@@ -67,13 +72,17 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
67
72
  payLine: import("vue").ComputedRef<string>;
68
73
  nameError: import("vue").ComputedRef<boolean>;
69
74
  passError: import("vue").ComputedRef<boolean>;
75
+ posRolesError: import("vue").ComputedRef<boolean>;
70
76
  availabilityError: import("vue").ComputedRef<boolean>;
71
77
  saving: import("vue").Ref<boolean, boolean>;
72
78
  saveError: import("vue").Ref<string | null, string | null>;
79
+ deferScheduleWrites: import("vue").Ref<boolean, boolean>;
73
80
  candidatesLoading: import("vue").Ref<boolean, boolean>;
74
81
  candidatesError: import("vue").Ref<string | null, string | null>;
82
+ selectingExisting: import("vue").Ref<boolean, boolean>;
75
83
  openWizard: (section: string) => void;
76
84
  openEditFor: (emp: Employee) => void;
85
+ confirmClose: () => void;
77
86
  close: () => void;
78
87
  setMode: (m: ScheduleAddEmployeeMode) => void;
79
88
  openSelectExisting: () => void;
@@ -93,10 +102,19 @@ export declare function useScheduleAddEmployee(board: ScheduleBoardApi, options?
93
102
  setAvailHour: (index: number, field: "from" | "to", value: string) => void;
94
103
  copyAvailHourDown: (index: number) => void;
95
104
  setPasscodeDigit: (index: number, value: string) => void;
96
- generatePasscode: () => void;
105
+ generatePasscode: () => Promise<void>;
106
+ isGeneratingPasscode: import("vue").Ref<boolean, boolean>;
97
107
  togglePosAccess: () => void;
98
- setPosRole: (roleId: string) => void;
99
- posRoleOptions: import("vue").ComputedRef<import("../../../types/role").Role[]>;
108
+ addPosRoleRow: () => void;
109
+ removePosRoleRow: (index: number) => void;
110
+ isCurrentOutletRow: (index: number) => boolean;
111
+ setPosRoleOutlet: (index: number, outlet: string) => void;
112
+ setPosRoleId: (index: number, roleId: string) => void;
113
+ posRoleOptionsFor: (outlet: string) => import("../../../types/role").Role[];
114
+ isPosRoleUsable: (role: import("../../../types/role").Role) => boolean;
115
+ setMasterUserRoleAccess: (roleIds: string[] | null | undefined) => void;
116
+ isPosOutletUsable: (outlet: string) => boolean;
117
+ 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.">;
100
118
  create: () => Promise<boolean>;
101
119
  };
102
120
  export type ScheduleAddEmployeeApi = ReturnType<typeof useScheduleAddEmployee>;
@@ -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;
@@ -37,19 +37,6 @@ export declare function qualifiedFor(emp: Employee, position: string): boolean;
37
37
  export declare function useScheduleAreaBoard(board: ScheduleBoardApi): {
38
38
  positionRows: import("vue").ComputedRef<string[]>;
39
39
  assignedOn: (dayIdx: number, position: string) => ScheduleAssignedSlot[];
40
- unfilledOpenShiftsOn: (dayIdx: number, position: string) => {
41
- id: number;
42
- dayIdx: number;
43
- position: string;
44
- required: number;
45
- filledBy: number | null;
46
- sen?: "junior" | "senior" | undefined;
47
- empType?: "full" | "part" | undefined;
48
- name?: string | undefined;
49
- start: string;
50
- end: string;
51
- breakMins?: number | undefined;
52
- }[];
53
40
  poolFor: (position: string) => Employee[];
54
41
  cellMeta: (dayIdx: number, position: string) => SchedulePositionCellMeta;
55
42
  positionWeekMeta: (position: string) => {
@@ -1,14 +1,7 @@
1
1
  import type { ScheduleBoardApi } from './useScheduleBoard';
2
- import type { ScheduleAreaBoardApi } from './useScheduleAreaBoard';
3
- /** Dragging a person from the staff rail onto a position/day cell — ported from the mockup's
4
- * dropStaffOnCell(), scoped to this board's model (no "unspecialised, so ask what they can
5
- * do" grant flow, no split shifts): dropping fills an existing open shift for that position/day
6
- * if there is one, otherwise opens the shift editor pre-filled with this person, day and
7
- * position so the manager sets the hours. */
8
- export declare function useScheduleAreaDragDrop(board: ScheduleBoardApi, areaBoard: ScheduleAreaBoardApi, handlers: {
9
- onFillOpenShift: (openId: number, empId: number) => void;
2
+ /** Dragging a person from the staff rail onto a position/day cell opens a normal assigned shift. */
3
+ export declare function useScheduleAreaDragDrop(board: ScheduleBoardApi, handlers: {
10
4
  onCreateShift: (empId: number, dayIdx: number, position: string) => void;
11
- onNotQualified: (empName: string, position: string) => void;
12
5
  }): {
13
6
  draggingEmpId: import("vue").Ref<number | null, number | null>;
14
7
  startRailDrag: (empId: number) => void;
@@ -37,6 +37,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
37
37
  objective: "BALANCED" | "SERVICE" | "LOWER_COST" | "STABLE_HOURS";
38
38
  allowOvertime: boolean;
39
39
  proposals: {
40
+ rejectReason?: string | null | undefined | undefined;
40
41
  date: string;
41
42
  startTime: string;
42
43
  endTime: string;
@@ -57,9 +58,9 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
57
58
  occupied: number;
58
59
  notQualified: number;
59
60
  weeklyCap: number;
61
+ dailyCap: number;
60
62
  rest: number;
61
63
  dayOff: number;
62
- dayCap: number;
63
64
  };
64
65
  }[];
65
66
  metrics: {
@@ -101,6 +102,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
101
102
  objective: "BALANCED" | "SERVICE" | "LOWER_COST" | "STABLE_HOURS";
102
103
  allowOvertime: boolean;
103
104
  proposals: {
105
+ rejectReason?: string | null | undefined;
104
106
  date: string;
105
107
  startTime: string;
106
108
  endTime: string;
@@ -121,9 +123,9 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
121
123
  occupied: number;
122
124
  notQualified: number;
123
125
  weeklyCap: number;
126
+ dailyCap: number;
124
127
  rest: number;
125
128
  dayOff: number;
126
- dayCap: number;
127
129
  };
128
130
  }[];
129
131
  metrics: {
@@ -165,6 +167,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
165
167
  objective: "BALANCED" | "SERVICE" | "LOWER_COST" | "STABLE_HOURS";
166
168
  allowOvertime: boolean;
167
169
  proposals: {
170
+ rejectReason?: string | null | undefined | undefined;
168
171
  date: string;
169
172
  startTime: string;
170
173
  endTime: string;
@@ -185,9 +188,9 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
185
188
  occupied: number;
186
189
  notQualified: number;
187
190
  weeklyCap: number;
191
+ dailyCap: number;
188
192
  rest: number;
189
193
  dayOff: number;
190
- dayCap: number;
191
194
  };
192
195
  }[];
193
196
  metrics: {
@@ -236,6 +239,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
236
239
  back: () => void;
237
240
  generate: () => Promise<void>;
238
241
  reviewMode: import("vue").ComputedRef<boolean>;
242
+ hasPendingChanges: import("vue").ComputedRef<boolean>;
239
243
  proposals: import("vue").ComputedRef<{
240
244
  id: number;
241
245
  empId: number;
@@ -248,6 +252,7 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
248
252
  status: "pending" | "rejected";
249
253
  weekKey?: string | undefined;
250
254
  reason?: string | undefined;
255
+ rejectReason?: string | undefined;
251
256
  }[]>;
252
257
  weekHasProposals: import("vue").ComputedRef<boolean>;
253
258
  unmetCount: import("vue").Ref<number, number>;
@@ -264,6 +269,9 @@ export declare function useScheduleAutoSchedule(board: ScheduleBoardApi, demand:
264
269
  toggleReject: (id: number) => void;
265
270
  rejectAll: () => void;
266
271
  exitReview: () => void;
272
+ leaveReviewOpen: import("vue").Ref<boolean, boolean>;
273
+ confirmLeaveReview: () => void;
274
+ cancelLeaveReview: () => void;
267
275
  apply: () => Promise<number | null>;
268
276
  applying: import("vue").Ref<boolean, boolean>;
269
277
  applyRejections: import("vue").Ref<{
@@ -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;
@@ -33,10 +31,12 @@ export declare function useScheduleBoard(handlers?: {
33
31
  contractHours?: number | undefined;
34
32
  rate: number;
35
33
  positions: string[];
34
+ archivedPositions?: string[] | undefined;
36
35
  shifts: ({
37
36
  start: string;
38
37
  end: string;
39
38
  role: string;
39
+ positionId?: string | undefined;
40
40
  status: import("../types").ShiftStatus;
41
41
  clock?: {
42
42
  in: string | null;
@@ -85,6 +85,7 @@ export declare function useScheduleBoard(handlers?: {
85
85
  start: string;
86
86
  end: string;
87
87
  role: string;
88
+ positionId?: string | undefined;
88
89
  status: import("../types").ShiftStatus;
89
90
  clock?: {
90
91
  in: string | null;
@@ -109,6 +110,28 @@ export declare function useScheduleBoard(handlers?: {
109
110
  updatedAt?: string | undefined;
110
111
  splitGroupId?: string | undefined;
111
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;
112
135
  remarks: {
113
136
  author: string;
114
137
  date: string;
@@ -123,9 +146,16 @@ export declare function useScheduleBoard(handlers?: {
123
146
  payBasis?: "hourly" | "monthly" | undefined;
124
147
  payAmount?: number | undefined;
125
148
  maxHours?: number | undefined;
126
- maxOtHours?: number | undefined;
127
149
  minHours?: number | undefined;
128
- otAfterDaily?: number | undefined;
150
+ minHoursPerDay?: number | undefined;
151
+ workingHours?: {
152
+ minHoursPerDay: number | null;
153
+ maxHoursPerDay: number | null;
154
+ maxHoursPerWeek: number | null;
155
+ } | undefined;
156
+ overtime?: {
157
+ maxHoursPerMonth: number | null;
158
+ } | undefined;
129
159
  preferences?: string[] | undefined;
130
160
  seniority?: "senior" | "junior" | "" | undefined;
131
161
  availDays?: boolean[] | undefined;
@@ -134,6 +164,7 @@ export declare function useScheduleBoard(handlers?: {
134
164
  to: string;
135
165
  }[] | undefined;
136
166
  passcode?: string | undefined;
167
+ code?: string | undefined;
137
168
  masterUser?: boolean | undefined;
138
169
  }[], Employee[] | {
139
170
  id: number;
@@ -148,10 +179,12 @@ export declare function useScheduleBoard(handlers?: {
148
179
  contractHours?: number | undefined;
149
180
  rate: number;
150
181
  positions: string[];
182
+ archivedPositions?: string[] | undefined;
151
183
  shifts: ({
152
184
  start: string;
153
185
  end: string;
154
186
  role: string;
187
+ positionId?: string | undefined;
155
188
  status: import("../types").ShiftStatus;
156
189
  clock?: {
157
190
  in: string | null;
@@ -200,6 +233,7 @@ export declare function useScheduleBoard(handlers?: {
200
233
  start: string;
201
234
  end: string;
202
235
  role: string;
236
+ positionId?: string | undefined;
203
237
  status: import("../types").ShiftStatus;
204
238
  clock?: {
205
239
  in: string | null;
@@ -224,6 +258,28 @@ export declare function useScheduleBoard(handlers?: {
224
258
  updatedAt?: string | undefined;
225
259
  splitGroupId?: string | undefined;
226
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;
227
283
  remarks: {
228
284
  author: string;
229
285
  date: string;
@@ -238,9 +294,16 @@ export declare function useScheduleBoard(handlers?: {
238
294
  payBasis?: "hourly" | "monthly" | undefined;
239
295
  payAmount?: number | undefined;
240
296
  maxHours?: number | undefined;
241
- maxOtHours?: number | undefined;
242
297
  minHours?: number | undefined;
243
- otAfterDaily?: number | undefined;
298
+ minHoursPerDay?: number | undefined;
299
+ workingHours?: {
300
+ minHoursPerDay: number | null;
301
+ maxHoursPerDay: number | null;
302
+ maxHoursPerWeek: number | null;
303
+ } | undefined;
304
+ overtime?: {
305
+ maxHoursPerMonth: number | null;
306
+ } | undefined;
244
307
  preferences?: string[] | undefined;
245
308
  seniority?: "senior" | "junior" | "" | undefined;
246
309
  availDays?: boolean[] | undefined;
@@ -249,6 +312,7 @@ export declare function useScheduleBoard(handlers?: {
249
312
  to: string;
250
313
  }[] | undefined;
251
314
  passcode?: string | undefined;
315
+ code?: string | undefined;
252
316
  masterUser?: boolean | undefined;
253
317
  }[]>;
254
318
  sections: import("vue").Ref<{
@@ -299,12 +363,14 @@ export declare function useScheduleBoard(handlers?: {
299
363
  dayIdx: number;
300
364
  kind: "add" | "change" | "remove";
301
365
  label: string;
366
+ conflict?: boolean | undefined;
302
367
  }[], PendingChange[] | {
303
368
  empId: number;
304
369
  employeeKey: string;
305
370
  dayIdx: number;
306
371
  kind: "add" | "change" | "remove";
307
372
  label: string;
373
+ conflict?: boolean | undefined;
308
374
  }[]>;
309
375
  unpublishedChanges: import("vue").ComputedRef<PendingChange[]>;
310
376
  persistPublish: (items: Array<{
@@ -329,6 +395,7 @@ export declare function useScheduleBoard(handlers?: {
329
395
  start: string;
330
396
  end: string;
331
397
  role: string;
398
+ positionId?: string | undefined;
332
399
  status: import("../types").ShiftStatus;
333
400
  clock?: {
334
401
  in: string | null;
@@ -377,6 +444,7 @@ export declare function useScheduleBoard(handlers?: {
377
444
  start: string;
378
445
  end: string;
379
446
  role: string;
447
+ positionId?: string | undefined;
380
448
  status: import("../types").ShiftStatus;
381
449
  clock?: {
382
450
  in: string | null;
@@ -417,6 +485,7 @@ export declare function useScheduleBoard(handlers?: {
417
485
  start: string;
418
486
  end: string;
419
487
  role: string;
488
+ positionId?: string | undefined;
420
489
  status: import("../types").ShiftStatus;
421
490
  clock?: {
422
491
  in: string | null;
@@ -465,6 +534,7 @@ export declare function useScheduleBoard(handlers?: {
465
534
  start: string;
466
535
  end: string;
467
536
  role: string;
537
+ positionId?: string | undefined;
468
538
  status: import("../types").ShiftStatus;
469
539
  clock?: {
470
540
  in: string | null;
@@ -510,6 +580,7 @@ export declare function useScheduleBoard(handlers?: {
510
580
  rangeLabel: import("vue").ComputedRef<string>;
511
581
  isToday: (dayIdx: number) => boolean;
512
582
  dateKey: (dayIdx: number) => string | null;
583
+ dateKeyAt: (offset: number, dayIdx: number) => string | null;
513
584
  navigate: (delta: number) => void;
514
585
  goToday: () => void;
515
586
  membersOf: (sectionId: string) => Employee[];
@@ -524,12 +595,16 @@ export declare function useScheduleBoard(handlers?: {
524
595
  clearEmployeeShifts: (empId: number) => {
525
596
  shifts: number;
526
597
  };
527
- 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;
528
599
  swapShifts: (empIdA: number, empIdB: number, dayA: number, dayB?: number, slotIndexA?: number, slotIndexB?: number, slotCountA?: number) => boolean;
529
- 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
+ }) => {
530
604
  shifts: number;
531
605
  open: number;
532
606
  leave: number;
607
+ assignmentIds: string[];
533
608
  };
534
609
  requiredFor: (dayIdx: number, position: string) => number;
535
610
  scheduledFor: (dayIdx: number, position: string) => number;