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

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 (134) hide show
  1. package/dist/{ApprovalCodeList-cG0zmQVJ.js → ApprovalCodeList-CJaNPHZC.js} +2 -2
  2. package/dist/{AuditLogList-BTifJhO1.js → AuditLogList-CHA98ZqW.js} +3 -3
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-qr5TwLTK.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-C7rvthEI.js} +2 -2
  4. package/dist/{EmployeeList-DzcMtxJ3.js → EmployeeList-CVmMKt71.js} +4 -4
  5. package/dist/{GrantUserList-D5b7tJ8Y.js → GrantUserList-MYjgt5-F.js} +3 -3
  6. package/dist/{Main-DkLBemi7.js → Main-BgB9lD4K.js} +9 -9
  7. package/dist/{Main-DFwdAWqn.js → Main-C0cnqQ3B.js} +5 -5
  8. package/dist/{Main-B2r59IOW.js → Main-hlcHtrsc.js} +2 -2
  9. package/dist/{PermissionSetList-B80hrfMW.js → PermissionSetList-5f1WIaVa.js} +5 -5
  10. package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DjNcJQM9.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-CFoTAGIX.js} +823 -823
  11. package/dist/{RoleList-DHO4JRKF.js → RoleList-DNR4miXr.js} +7 -7
  12. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-B4VUyKW3.js +470 -0
  13. package/dist/{ScheduleGeneralPage-WlBM8bxV.js → ScheduleGeneralPage-Cd5AlY4z.js} +273 -236
  14. package/dist/ScheduleModal.vue_vue_type_script_setup_true_lang-Cf0l2MRg.js +2188 -0
  15. package/dist/SchedulePage-C8m0-m3l.js +18257 -0
  16. package/dist/{SchedulePositionPage-C0hrO11d.js → SchedulePositionPage-DyRckyUx.js} +67 -66
  17. package/dist/{TeamMemberList-CgFWLRBM.js → TeamMemberList-mw5OveZG.js} +6 -6
  18. package/dist/{TimesheetList-Dp40G-0I.js → TimesheetList-BzXarZbM.js} +5 -5
  19. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-BFjrMhUG.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-Dq5i4poN.js} +2 -2
  20. package/dist/{app-CmBSTvaI.js → app-DSsdRLHg.js} +657 -577
  21. package/dist/app.js +1 -1
  22. package/dist/{dayjs.min-CfL2DQ3d.js → dayjs.min-B6xBXQtU.js} +1 -1
  23. package/dist/{employee-DQcHjoij.js → employee-hMhzuqk1.js} +28 -27
  24. package/dist/{iteration-BlavheWG.js → iteration-B34AvpNC.js} +1 -1
  25. package/dist/{lodash-QerqayrJ.js → lodash-1Vyuy7Mu.js} +1 -1
  26. package/dist/{role-RM2YLO7n.js → role-DKOrgO6f.js} +1 -1
  27. package/dist/{rule-DjlvYIuP.js → rule-CBzQ3GeV.js} +2 -2
  28. package/dist/src/api/schedule/index.d.ts +5 -1
  29. package/dist/src/components/layout/withScheduleShell.d.ts +10 -0
  30. package/dist/src/types/employee.d.ts +1 -0
  31. package/dist/src/types/schedule.d.ts +1 -1
  32. package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +28 -0
  33. package/dist/src/views/scheduling/components/ScheduleBoardEditOverlays.vue.d.ts +19 -0
  34. package/dist/src/views/scheduling/components/ScheduleBoardEmployeeRows.vue.d.ts +38 -0
  35. package/dist/src/views/scheduling/components/ScheduleBoardGridHeader.vue.d.ts +24 -0
  36. package/dist/src/views/scheduling/components/ScheduleBoardInteractionOverlays.vue.d.ts +38 -0
  37. package/dist/src/views/scheduling/components/ScheduleBoardOnboardingOverlays.vue.d.ts +25 -0
  38. package/dist/src/views/scheduling/components/ScheduleBoardRails.vue.d.ts +17 -0
  39. package/dist/src/views/scheduling/components/ScheduleBoardToolbar.vue.d.ts +39 -0
  40. package/dist/src/views/scheduling/components/ScheduleBoardUtilityOverlays.vue.d.ts +22 -0
  41. package/dist/src/views/scheduling/components/{ScheduleOnboardingComplete.vue.d.ts → ScheduleCompletionDialog.vue.d.ts} +8 -3
  42. package/dist/src/views/scheduling/components/{ScheduleOpenShiftCardMenu.vue.d.ts → ScheduleContextMenu.vue.d.ts} +10 -3
  43. package/dist/src/views/scheduling/components/{SchedulePdfPreview.vue.d.ts → ScheduleExportPreview.vue.d.ts} +1 -0
  44. package/dist/src/views/scheduling/components/ScheduleLoadState.vue.d.ts +10 -0
  45. package/dist/src/views/scheduling/components/ScheduleModal.vue.d.ts +26 -0
  46. package/dist/src/views/scheduling/components/{ScheduleTourAllSet.vue.d.ts → ScheduleOnboardingClosedDayConfirm.vue.d.ts} +2 -2
  47. package/dist/src/views/scheduling/components/{ScheduleEmployeeMenu.vue.d.ts → ScheduleOnboardingDemandDays.vue.d.ts} +2 -2
  48. package/dist/src/views/scheduling/components/{ScheduleExportDoneDialog.vue.d.ts → ScheduleOnboardingDemandFooter.vue.d.ts} +2 -2
  49. package/dist/src/views/scheduling/components/ScheduleOnboardingDemandHeader.vue.d.ts +6 -0
  50. package/dist/src/views/scheduling/components/ScheduleOnboardingHoursProfileNotice.vue.d.ts +10 -0
  51. package/dist/src/views/scheduling/components/ScheduleOnboardingPositions.vue.d.ts +6 -0
  52. package/dist/src/views/scheduling/components/ScheduleOnboardingReview.vue.d.ts +6 -0
  53. package/dist/src/views/scheduling/components/ScheduleOnboardingWizardFooter.vue.d.ts +6 -0
  54. package/dist/src/views/scheduling/components/ScheduleOnboardingWizardHeader.vue.d.ts +11 -0
  55. package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +7 -1
  56. package/dist/src/views/scheduling/components/ScheduleSetupBanner.vue.d.ts +12 -0
  57. package/dist/src/views/scheduling/components/ScheduleShiftPopover.vue.d.ts +2 -2
  58. package/dist/src/views/scheduling/components/ScheduleStaffRail.vue.d.ts +4 -4
  59. package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +2 -2
  60. package/dist/src/views/scheduling/components/ScheduleTopbar.vue.d.ts +3 -3
  61. package/dist/src/views/scheduling/composables/onboarding-types.d.ts +1 -1
  62. package/dist/src/views/scheduling/composables/remyPrompt.d.ts +13 -0
  63. package/dist/src/views/scheduling/composables/schedule-board-helpers.d.ts +1 -1
  64. package/dist/src/views/scheduling/composables/schedule-breaks.d.ts +7 -1
  65. package/dist/src/views/scheduling/composables/schedule-calendar.d.ts +7 -0
  66. package/dist/src/views/scheduling/composables/schedule-cost.d.ts +19 -0
  67. package/dist/src/views/scheduling/composables/schedule-demand-domain.d.ts +11 -0
  68. package/dist/src/views/scheduling/composables/schedule-export-matrix.d.ts +14 -0
  69. package/dist/src/views/scheduling/composables/schedule-time.d.ts +8 -0
  70. package/dist/src/views/scheduling/composables/schedule-week-cache.d.ts +1 -4
  71. package/dist/src/views/scheduling/composables/useRemyAppStore.d.ts +10 -0
  72. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +14 -13
  73. package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +3 -1
  74. package/dist/src/views/scheduling/composables/useScheduleAssignmentMutations.d.ts +13 -0
  75. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +18 -2
  76. package/dist/src/views/scheduling/composables/useScheduleCloneOutletModal.d.ts +3 -1
  77. package/dist/src/views/scheduling/composables/useScheduleCostRail.d.ts +6 -1
  78. package/dist/src/views/scheduling/composables/useScheduleDayNote.d.ts +1 -1
  79. package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +4 -19
  80. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +13 -2
  81. package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +11 -0
  82. package/dist/src/views/scheduling/composables/useScheduleEmployeeAvailability.d.ts +13 -0
  83. package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +26 -0
  84. package/dist/src/views/scheduling/composables/useScheduleEmployeeCompensation.d.ts +7 -0
  85. package/dist/src/views/scheduling/composables/useScheduleEmployeeForm.d.ts +22 -0
  86. package/dist/src/views/scheduling/composables/useScheduleEmployeeIdentity.d.ts +9 -0
  87. package/dist/src/views/scheduling/composables/useScheduleEmployeeMenu.d.ts +6 -3
  88. package/dist/src/views/scheduling/composables/useScheduleEmployeePersistence.d.ts +25 -0
  89. package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +18 -0
  90. package/dist/src/views/scheduling/composables/useScheduleExport.d.ts +19 -11
  91. package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +3 -6
  92. package/dist/src/views/scheduling/composables/useScheduleOnboardingAvailability.d.ts +58 -0
  93. package/dist/src/views/scheduling/composables/useScheduleOnboardingDemand.d.ts +45 -0
  94. package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +187 -0
  95. package/dist/src/views/scheduling/composables/useScheduleOnboardingHours.d.ts +15 -0
  96. package/dist/src/views/scheduling/composables/useScheduleOnboardingNavigation.d.ts +11 -0
  97. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +64 -487
  98. package/dist/src/views/scheduling/composables/useSchedulePageActions.d.ts +18 -0
  99. package/dist/src/views/scheduling/composables/useSchedulePageCellActions.d.ts +21 -0
  100. package/dist/src/views/scheduling/composables/useSchedulePageCellDrop.d.ts +18 -0
  101. package/dist/src/views/scheduling/composables/useSchedulePageEmployeeActions.d.ts +22 -0
  102. package/dist/src/views/scheduling/composables/useSchedulePageOverlays.d.ts +10 -3
  103. package/dist/src/views/scheduling/composables/useSchedulePdfExport.d.ts +19 -0
  104. package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +3 -1
  105. package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +3 -1
  106. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +7 -1
  107. package/dist/src/views/scheduling/composables/useSchedulePublishPersistence.d.ts +11 -0
  108. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +6 -0
  109. package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +2 -24
  110. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +6 -1
  111. package/dist/src/views/scheduling/composables/useScheduleShiftDraft.d.ts +62 -0
  112. package/dist/src/views/scheduling/composables/useScheduleShiftPersistence.d.ts +17 -0
  113. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +10 -5
  114. package/dist/src/views/scheduling/composables/useScheduleStatsRow.d.ts +4 -1
  115. package/dist/src/views/scheduling/composables/useScheduleTour.d.ts +6 -4
  116. package/dist/src/views/scheduling/country-rules/index.d.ts +24 -0
  117. package/dist/src/views/scheduling/data.d.ts +11 -6
  118. package/dist/src/views/scheduling/locales/index.d.ts +80 -0
  119. package/dist/src/views/scheduling/schedule-constants.d.ts +7 -0
  120. package/dist/src/views/scheduling/schedule-state.d.ts +32 -8
  121. package/dist/src/views/scheduling/schedule-store.d.ts +4 -1
  122. package/dist/src/views/scheduling/types.d.ts +5 -0
  123. package/dist/style.css +1 -1
  124. package/dist/tsconfig.app.tsbuildinfo +1 -1
  125. package/dist/{useReportPermissions-Bl6Br79r.js → useReportPermissions-B2ev0j4w.js} +3 -3
  126. package/package.json +2 -1
  127. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-B-XtB64L.js +0 -452
  128. package/dist/SchedulePage-Nm0krGVU.js +0 -17056
  129. package/dist/ScheduleSelect.vue_vue_type_script_setup_true_lang-DTDXir_7.js +0 -1150
  130. package/dist/src/components/layout/AppSidebar.vue.d.ts +0 -2
  131. package/dist/src/components/layout/withShell.d.ts +0 -14
  132. package/dist/src/views/scheduling/components/ScheduleShiftCardMenu.vue.d.ts +0 -12
  133. package/dist/src/views/scheduling/composables/useScheduleStaffRail.d.ts +0 -17
  134. package/dist/src/views/scheduling/composables/useScheduleTopbar.d.ts +0 -10
@@ -6,7 +6,7 @@ export interface ScheduleDemandSuggestion {
6
6
  periods: DemandPeriod[];
7
7
  }
8
8
  export interface ScheduleDemandSheetOptions {
9
- onToast?: (message: string) => void;
9
+ onToast?: (message: string, type?: 'info' | 'success' | 'error') => void;
10
10
  /** Positions the breakdown can name — the same list the shift editor offers. */
11
11
  positionOptions: () => string[];
12
12
  /** Called instead of a toast when "+ Position breakdown" is pressed and there is no position
@@ -68,7 +68,17 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
68
68
  overlapWarning: import("vue").ComputedRef<string>;
69
69
  whenLabel: import("vue").ComputedRef<string>;
70
70
  openFor: (idx: number) => void;
71
- close: () => void;
71
+ close: (preserveDraft?: boolean) => void;
72
+ hasUnsavedChanges: import("vue").ComputedRef<boolean>;
73
+ diffSummary: import("vue").ComputedRef<{
74
+ changed: number;
75
+ added: number;
76
+ removed: number;
77
+ modified: number;
78
+ }>;
79
+ isPeriodChanged: (index: number) => boolean;
80
+ isPeriodFieldChanged: (index: number, field: "from" | "to" | "n") => boolean;
81
+ revert: () => void;
72
82
  addPeriod: () => void;
73
83
  removePeriod: (i: number) => void;
74
84
  setHeads: (i: number, value: number | string) => void;
@@ -126,6 +136,7 @@ export declare function useScheduleDemandSheet(board: ScheduleBoardApi, demand:
126
136
  word: string;
127
137
  }[]>;
128
138
  suggest: () => void;
139
+ askRemy: () => Promise<void>;
129
140
  acceptSuggestion: () => void;
130
141
  dismissSuggestion: () => void;
131
142
  canCopy: import("vue").ComputedRef<boolean>;
@@ -0,0 +1,11 @@
1
+ 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>;
6
+ setPasscodeDigit: (index: number, value: string) => void;
7
+ generatePasscode: () => void;
8
+ togglePosAccess: () => void;
9
+ setPosRole: (roleId: string) => void;
10
+ posRoleOptions: import("vue").ComputedRef<Role[]>;
11
+ };
@@ -0,0 +1,13 @@
1
+ import { type ComputedRef } from 'vue';
2
+ import type { ScheduleAddEmployeeForm } from './schedule-add-employee-form';
3
+ export declare function useScheduleEmployeeAvailability(form: ScheduleAddEmployeeForm, isPart: ComputedRef<boolean>): {
4
+ dayLit: (index: number) => boolean;
5
+ avLabel: ComputedRef<"Weekly availability" | "Time off days">;
6
+ avAllLabel: ComputedRef<"Clear all" | "Select all" | "No days off" | "Every day off">;
7
+ maxHoursPlaceholder: ComputedRef<"Hours per week" | "No cap">;
8
+ ensureAvailHours: (index: number) => void;
9
+ toggleAvailDay: (index: number) => void;
10
+ availAll: () => void;
11
+ setAvailHour: (index: number, field: "from" | "to", value: string) => void;
12
+ copyAvailHourDown: (index: number) => void;
13
+ };
@@ -0,0 +1,26 @@
1
+ import { type ComputedRef } from 'vue';
2
+ import type { ScheduleAddEmployeeForm, ScheduleAddEmployeeStep } from './schedule-add-employee-form';
3
+ import type { ScheduleBoardApi } from './useScheduleBoard';
4
+ interface UseScheduleEmployeeCandidatesOptions {
5
+ board: ScheduleBoardApi;
6
+ form: ScheduleAddEmployeeForm;
7
+ currentLocationLabel: ComputedRef<string>;
8
+ step: {
9
+ value: ScheduleAddEmployeeStep;
10
+ };
11
+ open: {
12
+ value: boolean;
13
+ };
14
+ onPicked: (employeeId: string) => void;
15
+ onPrefillPasscode: (employeeId: string) => void;
16
+ }
17
+ /** Directory lookup and profile prefill for the existing-employee path of the add wizard. */
18
+ export declare function useScheduleEmployeeCandidates(options: UseScheduleEmployeeCandidatesOptions): {
19
+ selectExistingOpen: import("vue").Ref<boolean, boolean>;
20
+ candidatesLoading: import("vue").Ref<boolean, boolean>;
21
+ candidatesError: import("vue").Ref<string | null, string | null>;
22
+ openSelectExisting: () => void;
23
+ closeSelectExisting: () => void;
24
+ pickExisting: (employeeId: string) => Promise<void>;
25
+ };
26
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { ScheduleAddEmployeeForm } from './schedule-add-employee-form';
2
+ export declare function useScheduleEmployeeCompensation(form: ScheduleAddEmployeeForm): {
3
+ setPayBasis: (basis: "hourly" | "monthly") => void;
4
+ payUnit: import("vue").ComputedRef<"/month" | "/hour">;
5
+ payAmountNumber: import("vue").ComputedRef<number>;
6
+ effectiveRate: import("vue").ComputedRef<number>;
7
+ };
@@ -0,0 +1,22 @@
1
+ import { type Ref } from 'vue';
2
+ import type { ScheduleAddEmployeeForm } from './schedule-add-employee-form';
3
+ interface UseScheduleEmployeeFormOptions {
4
+ form: ScheduleAddEmployeeForm;
5
+ currentLocationLabel: {
6
+ value: string;
7
+ };
8
+ positions: readonly string[];
9
+ locOpen: Ref<boolean>;
10
+ secOpen: Ref<boolean>;
11
+ }
12
+ /** Field editing for locations and positions in the employee wizard. */
13
+ export declare function useScheduleEmployeeForm(options: UseScheduleEmployeeFormOptions): {
14
+ secondaryOptions: import("vue").ComputedRef<string[]>;
15
+ toggleMulti: (which: "loc" | "sec") => void;
16
+ toggleLocation: (location: string) => void;
17
+ removeLocation: (location: string) => void;
18
+ toggleSecondary: (position: string) => void;
19
+ removeSecondary: (position: string) => void;
20
+ setPrimaryPosition: (position: string) => void;
21
+ };
22
+ export {};
@@ -28,6 +28,15 @@ export interface ScheduleEmployeeLoad {
28
28
  /** The suggested part's width on the bar, as a fraction of contract. With no contract to measure
29
29
  * against it fills the track, so suggested hours still show. */
30
30
  proposedPct: number;
31
+ /** Of `boardPct`, how much is still DRAFT (unpublished) rather than confirmed — drawn as a
32
+ * hatch over the tail of the bar rather than a different colour, same as the grid's own
33
+ * closed-day treatment: the colour still says over/under contract, the hatch just adds
34
+ * "and part of this hasn't gone out to the employee yet" on top of it. */
35
+ draftPct: number;
36
+ /** Of `hours`, how many are on the board but still DRAFT (unpublished) — kept as its own
37
+ * number rather than folded into `hours` so the label can say "published + draft" instead
38
+ * of one merged total that can't tell the employee has actually seen only part of it. */
39
+ draftHours: number;
31
40
  }
32
41
  /** This person's live (not rejected) suggestions in the week on screen. */
33
42
  export declare function proposedSlotsOf(emp: Employee, proposalAt?: (empId: number, dayIdx: number) => Proposal | undefined): Pick<Proposal, 'start' | 'end'>[];
@@ -1,6 +1,6 @@
1
1
  import type { ScheduleBoardApi } from './useScheduleBoard';
2
2
  import type { ScheduleAnchorRect } from './schedule-popover-position';
3
- export type ScheduleEmployeeMenuAction = 'profile' | 'edit' | 'hl' | 'remove';
3
+ export type ScheduleEmployeeMenuAction = 'profile' | 'edit' | 'freeall' | 'remove';
4
4
  export interface ScheduleEmployeeMenuState {
5
5
  open: boolean;
6
6
  empId: number | null;
@@ -8,11 +8,13 @@ export interface ScheduleEmployeeMenuState {
8
8
  left: number;
9
9
  top: number;
10
10
  }
11
- /** The ⋯ menu on a team member's row — V6.2's #empMenu: profile, update, highlight, remove. The actions that need a page-level surface (profile panel,
12
- * edit wizard, confirm dialog) come in as handlers; highlight lives here. */
11
+ /** The ⋯ menu on a team member's row — V6.2's #empMenu: profile, update, clear shifts, remove.
12
+ * The actions that need a page-level surface (profile panel, edit wizard, confirm dialog) come in
13
+ * as handlers. */
13
14
  export declare function useScheduleEmployeeMenu(board: ScheduleBoardApi, handlers: {
14
15
  onProfile: (empId: number) => void;
15
16
  onEdit: (empId: number) => void;
17
+ onClearAllShifts: (empId: number) => void;
16
18
  onRemove: (empId: number) => void;
17
19
  }): {
18
20
  state: {
@@ -28,6 +30,7 @@ export declare function useScheduleEmployeeMenu(board: ScheduleBoardApi, handler
28
30
  top: number;
29
31
  };
30
32
  employee: import("vue").ComputedRef<import("../types").Employee | undefined>;
33
+ hasShifts: import("vue").ComputedRef<boolean>;
31
34
  openFor: (empId: number, anchor: HTMLElement) => void;
32
35
  close: () => void;
33
36
  go: (action: ScheduleEmployeeMenuAction) => void;
@@ -0,0 +1,25 @@
1
+ import type { ComputedRef, Ref } from 'vue';
2
+ import { type ScheduleAddEmployeeForm } from './schedule-add-employee-form';
3
+ import type { ScheduleBoardApi } from './useScheduleBoard';
4
+ interface UseScheduleEmployeePersistenceOptions {
5
+ form: ScheduleAddEmployeeForm;
6
+ pickedEmployeeId: Ref<string | null>;
7
+ payAmountNumber: ComputedRef<number>;
8
+ saving: Ref<boolean>;
9
+ saveError: Ref<string | null>;
10
+ close: () => void;
11
+ restaurantIdOfLabel: (label: string) => string | undefined;
12
+ board: ScheduleBoardApi;
13
+ editingEmployeeId: Ref<number | null>;
14
+ originalLocations: Ref<string[]>;
15
+ effectiveRate: ComputedRef<number>;
16
+ passcodeValue: ComputedRef<string>;
17
+ notify?: (message: string, type?: 'success' | 'error' | 'info') => void;
18
+ }
19
+ /** Persistence for an existing business employee being added to this schedule. */
20
+ export declare function useScheduleEmployeePersistence(options: UseScheduleEmployeePersistenceOptions): {
21
+ createExisting: (name: string) => Promise<boolean>;
22
+ createNew: (name: string) => Promise<boolean>;
23
+ updateExisting: (name: string) => Promise<boolean>;
24
+ };
25
+ export {};
@@ -0,0 +1,18 @@
1
+ import { type ComputedRef, type Ref } from 'vue';
2
+ import { type ScheduleAddEmployeeForm } from './schedule-add-employee-form';
3
+ interface UseScheduleEmployeeValidationOptions {
4
+ form: ScheduleAddEmployeeForm;
5
+ submitAttempted: Ref<boolean>;
6
+ passcodeOk: ComputedRef<boolean>;
7
+ isNewUser: ComputedRef<boolean>;
8
+ }
9
+ /** Validation guards for the add/edit employee form. Keeping them together makes create and
10
+ * the field-level error indicators consume the same rules. */
11
+ export declare function useScheduleEmployeeValidation(options: UseScheduleEmployeeValidationOptions): {
12
+ nameError: ComputedRef<boolean>;
13
+ passError: ComputedRef<boolean>;
14
+ availabilityOk: ComputedRef<boolean>;
15
+ availabilityError: ComputedRef<boolean>;
16
+ masterCodeError: ComputedRef<boolean>;
17
+ };
18
+ export {};
@@ -1,11 +1,5 @@
1
1
  import type { ScheduleBoardApi } from './useScheduleBoard';
2
- export interface ExportShiftCell {
3
- note: string;
4
- shifts: {
5
- when: string;
6
- pos: string;
7
- }[];
8
- }
2
+ import type { ExportShiftCell } from './schedule-export-matrix';
9
3
  export interface ExportMatrix {
10
4
  head: string[];
11
5
  body: (string | ExportShiftCell)[][];
@@ -15,19 +9,33 @@ export interface ExportMatrix {
15
9
  * and a fully-staffed week with nobody over contract totals 0.0 there. */
16
10
  shiftTotal: number;
17
11
  }
12
+ export { cellText, dayCellLines, dayHeaderLabel, esc } from './schedule-export-matrix';
13
+ export type { ExportShiftCell } from './schedule-export-matrix';
18
14
  /** The mockup's Share/export feature (buildExportMatrix/exportPDF/exportJPG) — no external
19
- * PDF/canvas library anywhere in the mockup; PDF is an HTML preview handed to window.print(),
20
- * JPG is a hand-drawn Canvas 2D table converted with toBlob. */
15
+ * PDF/canvas library here; both PDF and JPG are the same hand-drawn Canvas 2D table
16
+ * (`buildJpgCanvas`). PDF used to be a separate HTML/`<table>` rendering handed to
17
+ * window.print(), but printing the live page and CSS-hiding everything around the sheet proved
18
+ * unreliable (see printNow's own comment) — "Save as PDF" now wraps that same canvas image into a
19
+ * standalone print window instead, so PDF and JPG are guaranteed to look identical. */
21
20
  export declare function useScheduleExport(board: ScheduleBoardApi): {
22
21
  buildExportMatrix: () => ExportMatrix;
23
22
  pdfPreviewOpen: import("vue").Ref<boolean, boolean>;
24
- pdfHtml: import("vue").ComputedRef<string>;
25
23
  pdfBarMeta: import("vue").ComputedRef<string>;
26
24
  openPdfPreview: () => void;
27
25
  closePdfPreview: () => void;
28
26
  printNow: () => void;
29
- exportJpg: () => void;
27
+ jpgPreviewOpen: import("vue").Ref<boolean, boolean>;
28
+ jpgPreviewUrl: import("vue").Ref<string | null, string | null>;
29
+ jpgPreviewWidth: import("vue").Ref<number, number>;
30
+ jpgPreviewHeight: import("vue").Ref<number, number>;
31
+ jpgFilename: import("vue").Ref<string, string>;
32
+ jpgBarMeta: import("vue").ComputedRef<string>;
33
+ openJpgPreview: () => void;
34
+ closeJpgPreview: () => void;
35
+ saveJpgPreview: () => void;
30
36
  exportDoneOpen: import("vue").Ref<boolean, boolean>;
37
+ exportDoneTitle: import("vue").Ref<string, string>;
38
+ exportDoneDescription: import("vue").Ref<string, string>;
31
39
  exportDoneRecap: import("vue").Ref<{
32
40
  label: string;
33
41
  value: string;
@@ -1,11 +1,9 @@
1
1
  import type { CoverageSegment } from '../types';
2
2
  import type { ScheduleBoardApi } from './useScheduleBoard';
3
3
  import type { ScheduleDemandApi } from './useScheduleDemand';
4
- export interface ScheduleGapActions {
5
- /** Open the shift editor on a brand new shift for this day and these hours. */
6
- addShift: (dayIdx: number, position: string, start: string, end: string) => void;
7
- }
8
- export declare function useScheduleGapPopover(board: ScheduleBoardApi, demand: ScheduleDemandApi, actions: ScheduleGapActions): {
4
+ /** The gap popover: what a striped stretch of the coverage bar means. Read-only — it states the
5
+ * shortfall and which positions are missing; nothing here writes. */
6
+ export declare function useScheduleGapPopover(board: ScheduleBoardApi, demand: ScheduleDemandApi): {
9
7
  state: {
10
8
  open: boolean;
11
9
  pinned: boolean;
@@ -74,7 +72,6 @@ export declare function useScheduleGapPopover(board: ScheduleBoardApi, demand: S
74
72
  hold: () => void;
75
73
  segClick: (dayIdx: number, from: number, to: number, anchor: HTMLElement) => void;
76
74
  segFocus: (dayIdx: number, from: number, to: number, anchor: HTMLElement) => void;
77
- addShift: () => void;
78
75
  close: () => void;
79
76
  };
80
77
  export type ScheduleGapPopoverApi = ReturnType<typeof useScheduleGapPopover>;
@@ -0,0 +1,58 @@
1
+ import { type ComputedRef } from 'vue';
2
+ import type { Employee } from '../types';
3
+ import type { AvailRow, ScheduleOnboardingDayHours, TeamRow } from './onboarding-types';
4
+ import type { ScheduleBoardApi } from './useScheduleBoard';
5
+ type EmployeeRow = {
6
+ emp: Employee;
7
+ row: TeamRow;
8
+ };
9
+ type BulkMark = '' | 'y' | 'n';
10
+ export interface ScheduleOnboardingAvailabilityOptions {
11
+ board: ScheduleBoardApi;
12
+ hours: ScheduleOnboardingDayHours[];
13
+ openDays: ComputedRef<number[]>;
14
+ employeeRows: ComputedRef<EmployeeRow[]>;
15
+ isShut: (dayIdx: number) => boolean;
16
+ pendingAvail: Map<number, Array<{
17
+ dayOfWeek: number;
18
+ start: string;
19
+ end: string;
20
+ }>>;
21
+ }
22
+ export declare function useScheduleOnboardingAvailability(options: ScheduleOnboardingAvailabilityOptions): {
23
+ avail: Record<number, AvailRow>;
24
+ avTab: import("vue").Ref<"full" | "part", "full" | "part">;
25
+ avPicked: Record<number, boolean>;
26
+ avVary: Record<number, boolean>;
27
+ avBulkOpen: import("vue").Ref<boolean, boolean>;
28
+ avBulk: {
29
+ off: BulkMark[];
30
+ on: BulkMark[];
31
+ from: string;
32
+ to: string;
33
+ };
34
+ seedAvailability: (missingOnly?: boolean) => void;
35
+ avFulls: ComputedRef<EmployeeRow[]>;
36
+ avParts: ComputedRef<EmployeeRow[]>;
37
+ avGroup: ComputedRef<EmployeeRow[]>;
38
+ avSelected: ComputedRef<EmployeeRow[]>;
39
+ restDays: (empId: number) => number[];
40
+ avFullDone: ComputedRef<number>;
41
+ avPartDone: ComputedRef<number>;
42
+ avOffCount: (dayIdx: number) => number | null;
43
+ avFullSub: (empId: number) => string;
44
+ avPartSummary: (empId: number) => string;
45
+ avShowsByDay: (empId: number) => boolean;
46
+ canDays: (empId: number) => number[];
47
+ avPickAll: (checked: boolean) => void;
48
+ toggleOff: (empId: number, dayIdx: number) => void;
49
+ toggleCan: (empId: number, dayIdx: number) => void;
50
+ setAvailTime: (empId: number, dayIdx: number | null, field: "from" | "to", value: string) => void;
51
+ toggleVary: (empId: number) => void;
52
+ bulkDay: (which: "off" | "on", dayIdx: number) => void;
53
+ avBulkReady: ComputedRef<boolean>;
54
+ applyAvBulk: () => void;
55
+ saveAvailability: () => void;
56
+ };
57
+ export type ScheduleOnboardingAvailabilityApi = ReturnType<typeof useScheduleOnboardingAvailability>;
58
+ export {};
@@ -0,0 +1,45 @@
1
+ import { type Ref } from 'vue';
2
+ import type { ScheduleOnboardingDayHours, ScheduleOnboardingRange } from './onboarding-types';
3
+ import type { SchedulePositionsApi } from './useSchedulePositions';
4
+ export declare function useScheduleOnboardingDemand(hours: ScheduleOnboardingDayHours[], positions: SchedulePositionsApi, note: Ref<string>): {
5
+ demand: import("vue").Reactive<ScheduleOnboardingRange[][]>;
6
+ dmDay: Ref<number, number>;
7
+ staffingSaving: Ref<boolean, boolean>;
8
+ note: Ref<string, string>;
9
+ isShut: (dayIdx: number) => boolean;
10
+ dayClosedConfirm: {
11
+ state: {
12
+ open: boolean;
13
+ message: string;
14
+ title: string | null;
15
+ confirmLabel: string | null;
16
+ onConfirm: (() => void) | null;
17
+ };
18
+ ask: (message: string, onConfirm: () => void, opts?: {
19
+ title?: string;
20
+ confirmLabel?: string;
21
+ }) => void;
22
+ confirm: () => void;
23
+ close: () => void;
24
+ };
25
+ shutAcknowledged: Record<number, boolean>;
26
+ dmPeak: (dayIdx: number) => number;
27
+ namedPositions: import("vue").ComputedRef<string[]>;
28
+ remainingCommon: import("vue").ComputedRef<string[]>;
29
+ suggestedPositions: import("vue").ComputedRef<string[]>;
30
+ openDays: import("vue").ComputedRef<number[]>;
31
+ daysSet: import("vue").ComputedRef<number>;
32
+ daySpan: (dayIdx: number) => string;
33
+ seedDemand: () => void;
34
+ selectDay: (dayIdx: number) => void;
35
+ setRangeTime: (index: number, field: "from" | "to", value: string) => void;
36
+ setRangeCount: (index: number, value: string) => void;
37
+ addRange: () => void;
38
+ removeRange: (index: number) => void;
39
+ addRole: (index: number) => void;
40
+ setRole: (index: number, roleIndex: number, field: "position" | "n", value: string) => void;
41
+ removeRole: (index: number, roleIndex: number) => void;
42
+ namedTotal: (range: ScheduleOnboardingRange) => number;
43
+ copyDay: (mode: "all" | "wk" | "we") => void;
44
+ };
45
+ export type ScheduleOnboardingDemandApi = ReturnType<typeof useScheduleOnboardingDemand>;
@@ -0,0 +1,187 @@
1
+ import type { ScheduleBoardApi } from './useScheduleBoard';
2
+ import type { TeamBasis, TeamEmployment, TeamRow } from './onboarding-types';
3
+ export interface ScheduleOnboardingEmployeesOptions {
4
+ board: ScheduleBoardApi;
5
+ note: {
6
+ value: string;
7
+ };
8
+ }
9
+ export declare function useScheduleOnboardingEmployees(options: ScheduleOnboardingEmployeesOptions): {
10
+ team: Record<number, TeamRow>;
11
+ employeeRows: import("vue").ComputedRef<{
12
+ emp: {
13
+ id: number;
14
+ sourceId: string;
15
+ name: string;
16
+ employmentType: "FULLTIME" | "PARTTIME";
17
+ role: string;
18
+ initials: string;
19
+ color: string;
20
+ weekHours: number;
21
+ pct: number;
22
+ contractHours?: number | undefined;
23
+ rate: number;
24
+ positions: string[];
25
+ shifts: ({
26
+ start: string;
27
+ end: string;
28
+ role: string;
29
+ status: import("../types").ShiftStatus;
30
+ clock?: {
31
+ in: string | null;
32
+ out: string | null;
33
+ status: "on-time" | "late" | "early-out" | "absent";
34
+ } | undefined;
35
+ conflict?: boolean | undefined;
36
+ conflictReason?: string | undefined;
37
+ openId?: number | undefined;
38
+ breakMins?: number | undefined;
39
+ breaks?: ({
40
+ type: "DURATION";
41
+ minutes: number;
42
+ breakPayType: "PAID" | "UNPAID";
43
+ } | {
44
+ type: "TIME_RANGE";
45
+ startTime: string;
46
+ endTime: string;
47
+ breakPayType: "PAID" | "UNPAID";
48
+ })[] | undefined;
49
+ assignmentId?: string | undefined;
50
+ updatedAt?: string | undefined;
51
+ splitGroupId?: string | undefined;
52
+ } | {
53
+ timeOff: "approved" | "pending";
54
+ requestId?: string | undefined;
55
+ type?: "OFF_DAY" | "LEAVE" | undefined;
56
+ leaveType?: "ANNUAL" | "MEDICAL" | "EMERGENCY" | "UNPAID" | undefined;
57
+ reason: string;
58
+ half?: boolean | undefined;
59
+ halfPart?: "AM" | "PM" | undefined;
60
+ from?: string | undefined;
61
+ to?: string | undefined;
62
+ appliedOn?: string | undefined;
63
+ note?: string | undefined;
64
+ cert?: {
65
+ name: string;
66
+ size: string;
67
+ } | null | undefined;
68
+ bal?: {
69
+ type: string;
70
+ entitled: number;
71
+ used: number;
72
+ } | undefined;
73
+ } | {
74
+ start: string;
75
+ end: string;
76
+ role: string;
77
+ status: import("../types").ShiftStatus;
78
+ clock?: {
79
+ in: string | null;
80
+ out: string | null;
81
+ status: "on-time" | "late" | "early-out" | "absent";
82
+ } | undefined;
83
+ conflict?: boolean | undefined;
84
+ conflictReason?: string | undefined;
85
+ openId?: number | undefined;
86
+ breakMins?: number | undefined;
87
+ breaks?: ({
88
+ type: "DURATION";
89
+ minutes: number;
90
+ breakPayType: "PAID" | "UNPAID";
91
+ } | {
92
+ type: "TIME_RANGE";
93
+ startTime: string;
94
+ endTime: string;
95
+ breakPayType: "PAID" | "UNPAID";
96
+ })[] | undefined;
97
+ assignmentId?: string | undefined;
98
+ updatedAt?: string | undefined;
99
+ splitGroupId?: string | undefined;
100
+ }[] | null)[];
101
+ remarks: {
102
+ author: string;
103
+ date: string;
104
+ type: "note" | "warning" | "praise";
105
+ text: string;
106
+ }[];
107
+ section: string;
108
+ compGroup?: string | undefined;
109
+ mobile?: string | undefined;
110
+ dial?: string | undefined;
111
+ locations?: string[] | undefined;
112
+ payBasis?: "hourly" | "monthly" | undefined;
113
+ payAmount?: number | undefined;
114
+ maxHours?: number | undefined;
115
+ maxOtHours?: number | undefined;
116
+ minHours?: number | undefined;
117
+ otAfterDaily?: number | undefined;
118
+ preferences?: string[] | undefined;
119
+ seniority?: "senior" | "junior" | "" | undefined;
120
+ availDays?: boolean[] | undefined;
121
+ availHours?: {
122
+ from: string;
123
+ to: string;
124
+ }[] | undefined;
125
+ passcode?: string | undefined;
126
+ masterUser?: boolean | undefined;
127
+ };
128
+ row: TeamRow;
129
+ }[]>;
130
+ employeePicked: import("vue").ComputedRef<number>;
131
+ employeeAllPicked: import("vue").ComputedRef<boolean>;
132
+ employeeSomePicked: import("vue").ComputedRef<boolean>;
133
+ pendingTeam: Set<number>;
134
+ pendingAvail: Map<number, {
135
+ dayOfWeek: number;
136
+ start: string;
137
+ end: string;
138
+ }[]>;
139
+ rawEmployee: (empId: number) => {
140
+ name: string;
141
+ employeeId: string;
142
+ employmentType: "FULLTIME" | "PARTTIME";
143
+ workingHour: number;
144
+ wage: {
145
+ type: "HOURLY" | "MONTHLY";
146
+ amount: number;
147
+ };
148
+ primaryPosition: {
149
+ positionId: string;
150
+ positionName: string;
151
+ } | null;
152
+ secondaryPositions: {
153
+ positionId: string;
154
+ positionName: string;
155
+ }[];
156
+ availability: {
157
+ dayOfWeek: number;
158
+ start: string;
159
+ end: string;
160
+ }[];
161
+ } | undefined;
162
+ seedEmployees: (missingOnly?: boolean) => void;
163
+ pickAll: (checked: boolean) => void;
164
+ setPosition: (empId: number, value: string) => void;
165
+ setEmployment: (empId: number, kind: TeamEmployment) => void;
166
+ setHours: (empId: number, value: string) => void;
167
+ setRate: (empId: number, value: string) => void;
168
+ bulkOpen: import("vue").Ref<boolean, boolean>;
169
+ bulk: {
170
+ scope: "all" | "full" | "part" | "nopos" | "nopay";
171
+ position: string;
172
+ second: string;
173
+ employment: "" | TeamEmployment;
174
+ maxHours: string;
175
+ rate: string;
176
+ basis: "" | TeamBasis;
177
+ };
178
+ bulkCount: import("vue").ComputedRef<number>;
179
+ applyBulk: () => void;
180
+ BULK_NONE: string;
181
+ validateEmployees: () => string | null;
182
+ saveEmployees: () => void;
183
+ note: {
184
+ value: string;
185
+ };
186
+ };
187
+ export type ScheduleOnboardingEmployeesApi = ReturnType<typeof useScheduleOnboardingEmployees>;
@@ -0,0 +1,15 @@
1
+ import type { ScheduleOnboardingDayHours } from './onboarding-types';
2
+ export declare const MAX_OPERATIONAL_SESSIONS = 2;
3
+ export declare function useScheduleOnboardingHours(): {
4
+ hours: import("vue").Reactive<ScheduleOnboardingDayHours[]>;
5
+ profileSnapshot: import("vue").Ref<string, string>;
6
+ hoursSnapshot: () => string;
7
+ hoursMatchProfile: import("vue").ComputedRef<boolean>;
8
+ openDayCount: import("vue").ComputedRef<number>;
9
+ resetHours: () => void;
10
+ toggleDay: (dayIdx: number) => void;
11
+ addSession: (dayIdx: number) => void;
12
+ removeSession: (dayIdx: number, sessionIdx: number) => void;
13
+ setSessionTime: (dayIdx: number, sessionIdx: number, field: "from" | "to", value: string) => void;
14
+ };
15
+ export type ScheduleOnboardingHoursApi = ReturnType<typeof useScheduleOnboardingHours>;
@@ -0,0 +1,11 @@
1
+ import type { ScheduleOnboardingStep } from './onboarding-types';
2
+ export declare function useScheduleOnboardingNavigation(): {
3
+ step: import("vue").Ref<ScheduleOnboardingStep, ScheduleOnboardingStep>;
4
+ stepIndex: import("vue").ComputedRef<number>;
5
+ isFirstStep: import("vue").ComputedRef<boolean>;
6
+ isLastStep: import("vue").ComputedRef<boolean>;
7
+ totalSteps: number;
8
+ steps: ScheduleOnboardingStep[];
9
+ isSkippable: import("vue").ComputedRef<boolean>;
10
+ };
11
+ export type ScheduleOnboardingNavigationApi = ReturnType<typeof useScheduleOnboardingNavigation>;