@feedmepos/mf-hrm-portal 2.2.5-dev.7 → 2.2.5-dev.8

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 (83) hide show
  1. package/dist/{ApprovalCodeList-dn-WwNAd.js → ApprovalCodeList-BzL73nqc.js} +2 -2
  2. package/dist/{AuditLogList-BqVp9fxD.js → AuditLogList-BEZoHLsX.js} +3 -3
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-DnAet2oc.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-DDrP7ywR.js} +2 -2
  4. package/dist/{EmployeeList-BwTJre5k.js → EmployeeList-s4FYw1ZF.js} +5 -5
  5. package/dist/{GrantUserList-CZek1r4F.js → GrantUserList-Ci_ElhHZ.js} +3 -3
  6. package/dist/{Main-MjSYZdOq.js → Main-BojQuzZI.js} +5 -5
  7. package/dist/{Main-DVA51sj2.js → Main-CKr3RGvf.js} +2 -2
  8. package/dist/{Main-CbmA-SYo.js → Main-N1CNGDAy.js} +9 -9
  9. package/dist/{PermissionSetList-lkHmXhNm.js → PermissionSetList-DLknSOzA.js} +5 -5
  10. package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-cFQDQCal.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DK2Bx8Aw.js} +772 -772
  11. package/dist/{RoleList-BSs0SmFo.js → RoleList-Cm7_q5l9.js} +7 -7
  12. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-DrJ1vA88.js +426 -0
  13. package/dist/ScheduleButton.vue_vue_type_script_setup_true_lang-DX5JR7bi.js +600 -0
  14. package/dist/ScheduleGeneralPage-CmR4BZAp.js +323 -0
  15. package/dist/SchedulePage-CN3ZsQ9E.js +13905 -0
  16. package/dist/SchedulePositionPage-Bv3zraaF.js +293 -0
  17. package/dist/ScheduleSelect.vue_vue_type_script_setup_true_lang-Buu8NEQf.js +221 -0
  18. package/dist/{TeamMemberList-Dit_nV6d.js → TeamMemberList-D2OfkfJP.js} +6 -6
  19. package/dist/{TimesheetList-B-FlRO7E.js → TimesheetList-DEdLpYuM.js} +4 -4
  20. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-DZUJR8K_.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-BfMkNvCz.js} +1 -1
  21. package/dist/{app-BpnOPodL.js → app-Dmmpy4k-.js} +8 -8
  22. package/dist/app.js +1 -1
  23. package/dist/{dayjs.min-4GLfSOGZ.js → dayjs.min-DcfKURXN.js} +1 -1
  24. package/dist/{employee-ChdVnSmd.js → employee-D3ZpYH4j.js} +3 -3
  25. package/dist/{index-DYoVJQTd.js → index-BxkisKEs.js} +1 -1
  26. package/dist/{index-CilJxsY7.js → index-D-VlxJu9.js} +1 -1
  27. package/dist/{lodash-CcFIMCiJ.js → lodash-p40sRkqQ.js} +1 -1
  28. package/dist/{role-OXCiWTVq.js → role-CM1urkJZ.js} +1 -1
  29. package/dist/{rule-8iyCO_LZ.js → rule-BPApyMJY.js} +2 -2
  30. package/dist/src/api/schedule/index.d.ts +0 -3
  31. package/dist/src/views/scheduling/ScheduleGeneralPage.vue.d.ts +1 -2
  32. package/dist/src/views/scheduling/SchedulePage.vue.d.ts +1 -2
  33. package/dist/src/views/scheduling/SchedulePositionPage.vue.d.ts +1 -2
  34. package/dist/src/views/scheduling/components/ScheduleAddEmployeeModal.vue.d.ts +5 -1
  35. package/dist/src/views/scheduling/components/ScheduleAddEmployeePositionsSection.vue.d.ts +5 -1
  36. package/dist/src/views/scheduling/components/ScheduleAddPositionModal.vue.d.ts +6 -0
  37. package/dist/src/views/scheduling/components/ScheduleButton.vue.d.ts +23 -0
  38. package/dist/src/views/scheduling/components/ScheduleConfirmModal.vue.d.ts +1 -1
  39. package/dist/src/views/scheduling/components/ScheduleEmployeeMenu.vue.d.ts +6 -0
  40. package/dist/src/views/scheduling/components/ScheduleLeaveEditModal.vue.d.ts +4 -2
  41. package/dist/src/views/scheduling/components/ScheduleOnboardingWizard.vue.d.ts +3 -0
  42. package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +14 -0
  43. package/dist/src/views/scheduling/components/ScheduleShiftHeadcountEditor.vue.d.ts +5 -1
  44. package/dist/src/views/scheduling/components/ScheduleShiftPopover.vue.d.ts +2 -0
  45. package/dist/src/views/scheduling/components/ScheduleStaffRail.vue.d.ts +4 -2
  46. package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +4 -2
  47. package/dist/src/views/scheduling/components/ScheduleTopbar.vue.d.ts +2 -4
  48. package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +1 -0
  49. package/dist/src/views/scheduling/composables/schedule-popover-position.d.ts +16 -0
  50. package/dist/src/views/scheduling/composables/useCollapsedList.d.ts +9 -0
  51. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +1 -0
  52. package/dist/src/views/scheduling/composables/useScheduleAddPick.d.ts +14 -7
  53. package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +11 -2
  54. package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +8 -0
  55. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +11 -0
  56. package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +0 -5
  57. package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +5 -3
  58. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +7 -1
  59. package/dist/src/views/scheduling/composables/useScheduleEmployeeMenu.d.ts +35 -0
  60. package/dist/src/views/scheduling/composables/useScheduleLeave.d.ts +53 -3
  61. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +1181 -55
  62. package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +50 -0
  63. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +2 -0
  64. package/dist/src/views/scheduling/composables/useScheduleRangeCalendar.d.ts +10 -1
  65. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +6 -0
  66. package/dist/src/views/scheduling/composables/useScheduleSetupBanner.d.ts +5 -5
  67. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +6 -0
  68. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +7 -0
  69. package/dist/src/views/scheduling/composables/useScheduleTimePicker.d.ts +6 -1
  70. package/dist/src/views/scheduling/composables/useScheduleViewportFit.d.ts +9 -0
  71. package/dist/src/views/scheduling/data.d.ts +6 -1
  72. package/dist/src/views/scheduling/schedule-store.d.ts +11 -1
  73. package/dist/src/views/scheduling/types.d.ts +9 -1
  74. package/dist/style.css +1 -1
  75. package/dist/tsconfig.app.tsbuildinfo +1 -1
  76. package/dist/{useReportPermissions-C3fuFTUC.js → useReportPermissions-5EhPvVT9.js} +3 -3
  77. package/package.json +1 -1
  78. package/dist/ScheduleGeneralPage-DD9n2TUe.js +0 -242
  79. package/dist/SchedulePage-B0X97zVC.js +0 -10761
  80. package/dist/SchedulePositionPage-BXz1USn3.js +0 -220
  81. package/dist/ScheduleSelect.vue_vue_type_script_setup_true_lang-DAHke2rH.js +0 -201
  82. package/dist/useScheduleOutlet-TPZJHgSY.js +0 -546
  83. package/dist/useSchedulePositions-DCkaKHQm.js +0 -103
@@ -0,0 +1,50 @@
1
+ export interface PositionModalPerson {
2
+ employeeId: string;
3
+ name: string;
4
+ initials: string;
5
+ /** Positions they already hold, main first — the row's second line. */
6
+ held: string[];
7
+ }
8
+ export interface PositionModalDone {
9
+ name: string;
10
+ assigned: number;
11
+ failed: number;
12
+ }
13
+ /** The "Add position" popup: a name, plus who on this outlet's roster can work it.
14
+ *
15
+ * Saving creates the (business-wide) position, then adds it to each ticked person's profile —
16
+ * as their main position when they have none yet, otherwise as one more they are trained in.
17
+ * The profile write replaces `secondaryPositions` wholesale, so a person's existing ones are
18
+ * sent back with the new one rather than being dropped. */
19
+ export declare function useSchedulePositionModal(onCreated?: (positionName: string) => void): {
20
+ open: import("vue").Ref<boolean, boolean>;
21
+ name: import("vue").Ref<string, string>;
22
+ search: import("vue").Ref<string, string>;
23
+ picks: Record<string, boolean>;
24
+ saving: import("vue").Ref<boolean, boolean>;
25
+ error: import("vue").Ref<string | null, string | null>;
26
+ done: import("vue").Ref<{
27
+ name: string;
28
+ assigned: number;
29
+ failed: number;
30
+ } | null, PositionModalDone | {
31
+ name: string;
32
+ assigned: number;
33
+ failed: number;
34
+ } | null>;
35
+ nameError: import("vue").Ref<boolean, boolean>;
36
+ people: import("vue").ComputedRef<PositionModalPerson[]>;
37
+ visible: import("vue").ComputedRef<PositionModalPerson[]>;
38
+ pickedIds: import("vue").ComputedRef<string[]>;
39
+ allPicked: import("vue").ComputedRef<boolean>;
40
+ nameTaken: import("vue").ComputedRef<boolean>;
41
+ canSave: import("vue").ComputedRef<boolean>;
42
+ openNew: () => void;
43
+ close: () => void;
44
+ toggle: (employeeId: string) => void;
45
+ toggleAll: () => void;
46
+ save: () => Promise<boolean>;
47
+ saveAndAnother: () => Promise<void>;
48
+ another: () => void;
49
+ };
50
+ export type SchedulePositionModalApi = ReturnType<typeof useSchedulePositionModal>;
@@ -53,6 +53,8 @@ export declare function useSchedulePublish(board: ScheduleBoardApi): {
53
53
  reason: string;
54
54
  half?: boolean | undefined;
55
55
  halfPart?: "AM" | "PM" | undefined;
56
+ from?: string | undefined;
57
+ to?: string | undefined;
56
58
  appliedOn?: string | undefined;
57
59
  note?: string | undefined;
58
60
  cert?: {
@@ -3,7 +3,11 @@ import type { ScheduleBoardApi } from './useScheduleBoard';
3
3
  * week/Next week presets, matching the mockup's range calendar. */
4
4
  export declare function useScheduleRangeCalendar(board: ScheduleBoardApi): {
5
5
  open: import("vue").Ref<boolean, boolean>;
6
- toggle: () => void;
6
+ pos: {
7
+ left: number;
8
+ top: number;
9
+ };
10
+ toggle: (anchor?: HTMLElement) => void;
7
11
  close: () => void;
8
12
  cursorMonth: import("vue").Ref<Date, Date>;
9
13
  shiftMonth: (delta: number) => void;
@@ -12,6 +16,11 @@ export declare function useScheduleRangeCalendar(board: ScheduleBoardApi): {
12
16
  date: Date | null;
13
17
  }[]>;
14
18
  isInRange: (date: Date) => boolean;
19
+ isStart: (date: Date) => boolean;
20
+ isEnd: (date: Date) => boolean;
21
+ isToday: (date: Date) => boolean;
22
+ rangeLabel: import("vue").ComputedRef<string>;
23
+ rangeDays: import("vue").ComputedRef<number>;
15
24
  pickDate: (date: Date) => void;
16
25
  presetToday: () => void;
17
26
  presetNextWeek: () => void;
@@ -40,6 +40,8 @@ export declare function useScheduleRoster(board: ScheduleBoardApi): {
40
40
  reason: string;
41
41
  half?: boolean | undefined;
42
42
  halfPart?: "AM" | "PM" | undefined;
43
+ from?: string | undefined;
44
+ to?: string | undefined;
43
45
  appliedOn?: string | undefined;
44
46
  note?: string | undefined;
45
47
  cert?: {
@@ -82,6 +84,7 @@ export declare function useScheduleRoster(board: ScheduleBoardApi): {
82
84
  payAmount?: number | undefined;
83
85
  maxHours?: number | undefined;
84
86
  maxOtHours?: number | undefined;
87
+ minHours?: number | undefined;
85
88
  otAfterDaily?: number | undefined;
86
89
  preferences?: string[] | undefined;
87
90
  seniority?: "senior" | "junior" | "" | undefined;
@@ -124,6 +127,8 @@ export declare function useScheduleRoster(board: ScheduleBoardApi): {
124
127
  reason: string;
125
128
  half?: boolean | undefined;
126
129
  halfPart?: "AM" | "PM" | undefined;
130
+ from?: string | undefined;
131
+ to?: string | undefined;
127
132
  appliedOn?: string | undefined;
128
133
  note?: string | undefined;
129
134
  cert?: {
@@ -166,6 +171,7 @@ export declare function useScheduleRoster(board: ScheduleBoardApi): {
166
171
  payAmount?: number | undefined;
167
172
  maxHours?: number | undefined;
168
173
  maxOtHours?: number | undefined;
174
+ minHours?: number | undefined;
169
175
  otAfterDaily?: number | undefined;
170
176
  preferences?: string[] | undefined;
171
177
  seniority?: "senior" | "junior" | "" | undefined;
@@ -1,11 +1,11 @@
1
- /** "Set it up" banner — no positions means no roles to hang a pay rate or a shift pattern off,
2
- * so an empty catalogue is the one signal this checks. Dismissing is a session choice: the
3
- * banner is cheap enough to see again on the next visit while the outlet really is
4
- * unconfigured.
1
+ /** "Set it up" banner — shown while the outlet has not finished scheduling setup, i.e. while
2
+ * `scheduleSetupCompleted` (schedule-store) is false. That flag is a placeholder until the
3
+ * backend settings carry it. Dismissing is a session choice: the banner is cheap enough to see
4
+ * again on the next visit while the outlet really is unconfigured.
5
5
  *
6
6
  * The welcome dialog answers a different question — "has this outlet's owner seen the
7
7
  * onboarding greeting" — and is deliberately NOT tied to whether positions currently exist:
8
- * the board's positions land from an async fetch, so gating the dialog on `POSITIONS.length`
8
+ * the board's data lands from an async fetch, so gating the dialog on it
9
9
  * meant a fast response for an outlet that already had positions saved could yank the dialog
10
10
  * shut within the same tick it opened, before anyone could read it. `localStorage`, keyed per
11
11
  * outlet, is what makes "seen" durable and independent of that fetch. */
@@ -68,6 +68,8 @@ export declare function useScheduleShiftActions(board: ScheduleBoardApi): {
68
68
  reason: string;
69
69
  half?: boolean | undefined;
70
70
  halfPart?: "AM" | "PM" | undefined;
71
+ from?: string | undefined;
72
+ to?: string | undefined;
71
73
  appliedOn?: string | undefined;
72
74
  note?: string | undefined;
73
75
  cert?: {
@@ -110,6 +112,7 @@ export declare function useScheduleShiftActions(board: ScheduleBoardApi): {
110
112
  payAmount?: number | undefined;
111
113
  maxHours?: number | undefined;
112
114
  maxOtHours?: number | undefined;
115
+ minHours?: number | undefined;
113
116
  otAfterDaily?: number | undefined;
114
117
  preferences?: string[] | undefined;
115
118
  seniority?: "senior" | "junior" | "" | undefined;
@@ -162,6 +165,8 @@ export declare function useScheduleShiftActions(board: ScheduleBoardApi): {
162
165
  reason: string;
163
166
  half?: boolean | undefined;
164
167
  halfPart?: "AM" | "PM" | undefined;
168
+ from?: string | undefined;
169
+ to?: string | undefined;
165
170
  appliedOn?: string | undefined;
166
171
  note?: string | undefined;
167
172
  cert?: {
@@ -204,6 +209,7 @@ export declare function useScheduleShiftActions(board: ScheduleBoardApi): {
204
209
  payAmount?: number | undefined;
205
210
  maxHours?: number | undefined;
206
211
  maxOtHours?: number | undefined;
212
+ minHours?: number | undefined;
207
213
  otAfterDaily?: number | undefined;
208
214
  preferences?: string[] | undefined;
209
215
  seniority?: "senior" | "junior" | "" | undefined;
@@ -43,6 +43,9 @@ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand:
43
43
  }[]>;
44
44
  impact: import("vue").ComputedRef<{
45
45
  when: string;
46
+ pctBefore: number;
47
+ pctAfter: number;
48
+ stillShort: number;
46
49
  before: {
47
50
  required: number;
48
51
  scheduled: number;
@@ -100,6 +103,8 @@ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand:
100
103
  reason: string;
101
104
  half?: boolean | undefined;
102
105
  halfPart?: "AM" | "PM" | undefined;
106
+ from?: string | undefined;
107
+ to?: string | undefined;
103
108
  appliedOn?: string | undefined;
104
109
  note?: string | undefined;
105
110
  cert?: {
@@ -142,6 +147,7 @@ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand:
142
147
  payAmount?: number | undefined;
143
148
  maxHours?: number | undefined;
144
149
  maxOtHours?: number | undefined;
150
+ minHours?: number | undefined;
145
151
  otAfterDaily?: number | undefined;
146
152
  preferences?: string[] | undefined;
147
153
  seniority?: "senior" | "junior" | "" | undefined;
@@ -160,6 +166,7 @@ export declare function useScheduleShiftPopover(board: ScheduleBoardApi, demand:
160
166
  isSingleOpenRecord: import("vue").ComputedRef<boolean>;
161
167
  totalHours: import("vue").ComputedRef<number>;
162
168
  totalLabel: import("vue").ComputedRef<string>;
169
+ warnings: import("vue").ComputedRef<string[]>;
163
170
  openForEmployee: (forEmpId: number, day: number, roleHint?: string, hours?: ScheduleShiftSegment) => void;
164
171
  openForNewOpenShift: (day: number, roleHint?: string, hours?: ScheduleShiftSegment) => void;
165
172
  openForEditOpenShift: (openShiftId: number) => void;
@@ -15,6 +15,8 @@ export interface ScheduleTimePickerState {
15
15
  * value gets read from to appear in the list at all. */
16
16
  value: string;
17
17
  query: string;
18
+ /** Which trigger button opened it, so only that one wears the open state. */
19
+ key: string;
18
20
  left: number;
19
21
  top: number;
20
22
  }
@@ -29,6 +31,7 @@ export declare function useScheduleTimePicker(): {
29
31
  open: boolean;
30
32
  value: string;
31
33
  query: string;
34
+ key: string;
32
35
  left: number;
33
36
  top: number;
34
37
  };
@@ -36,7 +39,9 @@ export declare function useScheduleTimePicker(): {
36
39
  amOptions: import("vue").ComputedRef<ScheduleTimePickerOption[]>;
37
40
  pmOptions: import("vue").ComputedRef<ScheduleTimePickerOption[]>;
38
41
  typedValue: import("vue").ComputedRef<string | null>;
39
- openFor: (anchor: HTMLElement, value: string, pick: (hhmm: string) => void) => void;
42
+ openFor: (anchor: HTMLElement, value: string, pick: (hhmm: string) => void, key?: string) => void;
43
+ anchorRect: () => DOMRect | null;
44
+ isOpenFor: (key: string) => boolean;
40
45
  close: () => void;
41
46
  pick: (value: string) => void;
42
47
  submitQuery: () => void;
@@ -0,0 +1,9 @@
1
+ import { type Ref } from 'vue';
2
+ /** Pins the scheduling screen to the viewport so only the grid scrolls.
3
+ *
4
+ * `PortalShell` wraps every route in two unstyled divs, and the height chain above them is the
5
+ * host app's, not ours: with no definite height anywhere up there, `.sch { height: 100% }` has
6
+ * nothing to resolve against, the whole page grows to its content and the browser scrolls it —
7
+ * header rows included. Measuring where the shell starts and giving it the rest of the viewport
8
+ * is the one thing that does not depend on how the host lays itself out. */
9
+ export declare function useScheduleViewportFit(rootEl: Ref<HTMLElement | null | undefined>): void;
@@ -2,7 +2,6 @@ import type { CompGroupMeta, Employee, ExistingStaffCandidate, OpenShift, Schedu
2
2
  import type { FdtoSchedulePosition, FdtoSchedulePositionSelectorReq } from '@/types/schedule';
3
3
  export declare const UNASSIGNED = "unassigned";
4
4
  export declare const WEEKDAYS: string[];
5
- export declare const DEFAULT_POSITION = "Any position";
6
5
  export declare const ALL_STATIONS = "All Stations";
7
6
  /** Employment seniority is a closed set in the model, not something an outlet configures. */
8
7
  export declare const SENIORITY_OPTIONS: Array<'senior' | 'junior'>;
@@ -36,6 +35,9 @@ export declare const OUTLET: {
36
35
  /** Outlets a person may be rostered at. Filled by useScheduleOutlet from the restaurant store
37
36
  * — the board payload only ever describes the one outlet it was asked for. */
38
37
  export declare const LOCATION_OPTIONS: string[];
38
+ /** Outlet id → name, so a person's POS `restaurantRole` (outlet ids) can be shown as the same
39
+ * labels LOCATION_OPTIONS offers. Filled alongside it by useScheduleOutlet. */
40
+ export declare const LOCATION_LABEL_BY_ID: Record<string, string>;
39
41
  /** No Mongo source: departments and compensation groups are not modelled. The Add Employee
40
42
  * form renders these as empty pickers rather than offering choices nobody configured. */
41
43
  export declare const DEPT_OPTIONS: string[];
@@ -74,6 +76,9 @@ export declare function gridDayIdx(dayOfWeek: number): number;
74
76
  export declare function jsDayOfWeek(gridIdx: number): number;
75
77
  export declare function employeeIdOf(num: number): string | undefined;
76
78
  export declare function employeeNumberOf(employeeId: string): number;
79
+ /** The outlets a person is rostered at, by name, from the POS roster's `restaurantRole`. */
80
+ /** The outlet being scheduled goes first in a list of locations; the rest keep their order. */
81
+ export declare function currentLocationFirst(locations: string[]): string[];
77
82
  export declare function createScheduleEmployees(dates?: Date[]): Employee[];
78
83
  /** Open shifts backed by a persisted Shift requirement never shipped — the backend never
79
84
  * carried that collection, so this always produced an empty list in practice. Kept as a stub,
@@ -7,6 +7,12 @@ export declare function isoDate(d: Date): string;
7
7
  export declare const payload: import("vue").ShallowRef<FdtoScheduleBoard | null, FdtoScheduleBoard | null>;
8
8
  export declare const loading: import("vue").Ref<boolean, boolean>;
9
9
  export declare const loadError: import("vue").Ref<string | null, string | null>;
10
+ /** Whether this outlet has finished setting up scheduling (onboarding). The schedule settings
11
+ * will carry this, but the backend has no such field yet, so it is a plain flag that defaults to
12
+ * "not finished" — the setup banner keys off it. TODO: when the field exists, set it from the
13
+ * settings payload where `payload` is applied (and flip it when the onboarding wizard finishes);
14
+ * nothing else needs to change. */
15
+ export declare const scheduleSetupCompleted: import("vue").Ref<boolean, boolean>;
10
16
  /** Bumped every time `payload` is replaced. Anything that caches a derived view of the data
11
17
  * — the board's per-week buckets above all — watches this and rebuilds. */
12
18
  export declare const dataVersion: import("vue").Ref<number, number>;
@@ -53,6 +59,11 @@ export declare function setOutlet(restaurantId: string): boolean;
53
59
  * separate invalidation path. A generous page size rather than looping pages: real restaurant
54
60
  * headcounts sit nowhere near it. */
55
61
  export declare function ensureRestaurantEmployeesLoaded(restaurantId: string): Promise<void>;
62
+ /** Every outlet each person works at (POS user id → outlet ids). The roster above is fetched
63
+ * FILTERED to one outlet, and a filtered read describes a person by that outlet alone, so the
64
+ * full list has to come from an unfiltered read. Paged until the total is covered. A failure
65
+ * leaves the map empty rather than failing the board: locations are display-only here. */
66
+ export declare const employeeOutletIds: import("vue").ShallowRef<Record<string, string[]>, Record<string, string[]>>;
56
67
  /** Guarantees the week starting `weekStart` is in memory, fetching a padded window around it
57
68
  * if it is not. Safe to call on every navigation: a week already covered costs nothing. */
58
69
  export declare function ensureWeekLoaded(weekStart: Date): Promise<void>;
@@ -113,4 +124,3 @@ export declare function deleteAssignments(ids: string[]): Promise<void>;
113
124
  /** Flips a batch of existing assignments to one status in a single request — see
114
125
  * `ScheduleAPI.bulkUpdateAssignmentStatus`. */
115
126
  export declare function bulkUpdateAssignmentStatus(req: FdtoScheduleBulkUpdateAssignmentStatusReq): Promise<FdtoScheduleAssignment[]>;
116
- export declare function devResetOutlet(): Promise<number>;
@@ -34,6 +34,9 @@ export interface LeaveSlot {
34
34
  reason: string;
35
35
  half?: boolean;
36
36
  halfPart?: 'AM' | 'PM';
37
+ /** Specific hours (HH:MM), for leave that is neither all day nor a morning / afternoon. */
38
+ from?: string;
39
+ to?: string;
37
40
  appliedOn?: string;
38
41
  note?: string;
39
42
  cert?: {
@@ -87,6 +90,9 @@ export interface Employee {
87
90
  payAmount?: number;
88
91
  maxHours?: number;
89
92
  maxOtHours?: number;
93
+ /** Shortest shift, in hours, this person will come in for. Asking for less is allowed but
94
+ * warned about in the shift popover. */
95
+ minHours?: number;
90
96
  otAfterDaily?: number;
91
97
  preferences?: string[];
92
98
  seniority?: 'senior' | 'junior' | '';
@@ -235,6 +241,8 @@ export interface ExistingStaffCandidate {
235
241
  * scheduling profile there, just enough context to tell two same-named people apart and to
236
242
  * warn against loaning someone who's clearly based elsewhere. */
237
243
  otherOutlets: string[];
244
+ /** Every outlet the person works at, by name (this one included when the POS lists it). */
245
+ locations: string[];
238
246
  }
239
247
  export interface CompGroupMeta {
240
248
  basis: 'Hourly' | 'Monthly';
@@ -287,7 +295,7 @@ export interface CoverageSegment {
287
295
  /** Nothing was asked for in these hours — an absence of a question, not a gap in one. */
288
296
  none: boolean;
289
297
  }
290
- export type DemandApplyMode = 'day' | 'weekday' | 'weekdays' | 'custom';
298
+ export type DemandApplyMode = 'day' | 'every' | 'weekday' | 'weekdays' | 'custom';
291
299
  export interface NoticeBanner {
292
300
  variant: 'holiday' | 'info' | 'warning';
293
301
  dayIdx: number;