@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.
- package/dist/{ApprovalCodeList-CJaNPHZC.js → ApprovalCodeList-DuPmMQ8Z.js} +7 -7
- package/dist/{AuditLogList-CHA98ZqW.js → AuditLogList-BeRA_284.js} +18 -19
- package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-C7rvthEI.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-StnBAQOk.js} +2 -2
- package/dist/{EmployeeList-CVmMKt71.js → EmployeeList-qmjsbCjj.js} +255 -266
- package/dist/{FormItem.vue_vue_type_script_setup_true_lang-CUnlKsxk.js → FormItem.vue_vue_type_script_setup_true_lang-oQJgMciC.js} +6 -6
- package/dist/{GrantUserList-MYjgt5-F.js → GrantUserList--WUK7zrV.js} +8 -8
- package/dist/{Main-hlcHtrsc.js → Main-9X2iCXoX.js} +5 -5
- package/dist/{Main-C0cnqQ3B.js → Main-BIAeEQV9.js} +8 -8
- package/dist/{Main-BgB9lD4K.js → Main-tPL_YTwT.js} +11 -11
- package/dist/{PermissionSetList-5f1WIaVa.js → PermissionSetList-ByTyQe0s.js} +19 -18
- package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Bp9WwlnI.js +4167 -0
- 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
- package/dist/ResponsiveContextMenu.vue_vue_type_script_setup_true_lang-mSJFKo7r.js +132 -0
- package/dist/{RoleList-DNR4miXr.js → RoleList-INlydQmP.js} +21 -20
- package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-d8KDvgNu.js +530 -0
- package/dist/ScheduleGeneralPage-DbOoP9Ez.js +776 -0
- package/dist/ScheduleModal.vue_vue_type_script_setup_true_lang-UowMybGr.js +2439 -0
- package/dist/SchedulePage-CjOZtRlK.js +19291 -0
- package/dist/{SchedulePositionPage-DyRckyUx.js → SchedulePositionPage-CnDqkvL9.js} +78 -80
- package/dist/{SelectFilter-CG13h83-.js → SelectFilter-BWw4B9tM.js} +1 -1
- package/dist/{TeamMemberList-mw5OveZG.js → TeamMemberList-BgYtoXht.js} +27 -27
- package/dist/{TimesheetList-BzXarZbM.js → TimesheetList-Dg0QYsWO.js} +52 -53
- 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
- package/dist/{app-DSsdRLHg.js → app-CDo04LrB.js} +2891 -2474
- package/dist/app.js +1 -1
- package/dist/{approval-code-C9DmR4Md.js → approval-code-BXUiojPH.js} +1 -1
- package/dist/{dayjs.min-B6xBXQtU.js → dayjs.min-KFBmxZF3.js} +1 -1
- package/dist/{employee-hMhzuqk1.js → employee-BRaYoaOY.js} +4 -4
- package/dist/{grant-user-Bv-pJ9Wt.js → grant-user-CBJ3gEgW.js} +1 -1
- package/dist/{iteration-B34AvpNC.js → iteration-p-TjO05t.js} +1 -1
- package/dist/{lodash-1Vyuy7Mu.js → lodash-D72lpJgs.js} +1 -1
- package/dist/object-Dwyg2LgX.js +16 -0
- package/dist/{restaurant-D7PEQjPY.js → restaurant-D2mfKHaH.js} +48 -48
- package/dist/{role-DKOrgO6f.js → role-a35Vc8gC.js} +2 -2
- package/dist/{rule-CBzQ3GeV.js → rule-BRRw0K7p.js} +3 -3
- package/dist/src/api/schedule/index.d.ts +9 -1
- package/dist/src/components/layout/SchedulePromoBanner.vue.d.ts +2 -0
- package/dist/src/composables/useDiscardConfirm.d.ts +3 -1
- package/dist/src/types/schedule.d.ts +3 -4
- package/dist/src/views/audit-log/locales/index.d.ts +252 -0
- package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +4 -8
- package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +1 -4
- package/dist/src/views/scheduling/components/ScheduleBoardEditOverlays.vue.d.ts +0 -2
- package/dist/src/views/scheduling/components/ScheduleBoardEmployeeRows.vue.d.ts +0 -7
- package/dist/src/views/scheduling/components/ScheduleBoardGridHeader.vue.d.ts +5 -0
- package/dist/src/views/scheduling/components/ScheduleBoardInteractionOverlays.vue.d.ts +0 -6
- package/dist/src/views/scheduling/components/ScheduleBoardOnboardingOverlays.vue.d.ts +1 -0
- package/dist/src/views/scheduling/components/ScheduleBoardToolbar.vue.d.ts +0 -1
- package/dist/src/views/scheduling/components/ScheduleConfirmModal.vue.d.ts +4 -1
- package/dist/src/views/scheduling/components/ScheduleContextMenu.vue.d.ts +1 -5
- package/dist/src/views/scheduling/components/ScheduleDayTimeline.vue.d.ts +5 -0
- package/dist/src/views/scheduling/components/ScheduleLoadState.vue.d.ts +0 -1
- package/dist/src/views/scheduling/components/{ScheduleAssignEmployeePopover.vue.d.ts → ScheduleOnboardingAssignPositionModal.vue.d.ts} +2 -2
- package/dist/src/views/scheduling/components/ScheduleOnboardingSettings.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/SchedulePublishShareArt.vue.d.ts +2 -0
- package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +10 -0
- package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +0 -10
- package/dist/src/views/scheduling/composables/onboarding-types.d.ts +2 -1
- package/dist/src/views/scheduling/composables/remyPrompt.d.ts +4 -2
- package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +12 -8
- package/dist/src/views/scheduling/composables/schedule-board-helpers.d.ts +4 -0
- package/dist/src/views/scheduling/composables/schedule-day-meta.d.ts +1 -3
- package/dist/src/views/scheduling/composables/schedule-demand-domain.d.ts +13 -1
- package/dist/src/views/scheduling/composables/schedule-error.d.ts +1 -0
- package/dist/src/views/scheduling/composables/schedule-quick-pick.d.ts +22 -0
- package/dist/src/views/scheduling/composables/schedule-shift-time.d.ts +3 -0
- package/dist/src/views/scheduling/composables/useRemyAppStore.d.ts +6 -0
- package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +29 -11
- package/dist/src/views/scheduling/composables/useScheduleAddPick.d.ts +3 -11
- package/dist/src/views/scheduling/composables/useScheduleAreaBoard.d.ts +0 -13
- package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +2 -9
- package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +11 -3
- package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +86 -11
- package/dist/src/views/scheduling/composables/useScheduleCopyWeek.d.ts +3 -10
- package/dist/src/views/scheduling/composables/useScheduleCostRail.d.ts +13 -1
- package/dist/src/views/scheduling/composables/useScheduleDayNote.d.ts +0 -1
- package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +16 -5
- package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +3 -5
- package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +13 -3
- package/dist/src/views/scheduling/composables/useScheduleDragDrop.d.ts +1 -0
- package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +20 -7
- package/dist/src/views/scheduling/composables/useScheduleEmployeeAvailability.d.ts +1 -1
- package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +5 -1
- package/dist/src/views/scheduling/composables/useScheduleEmployeePersistence.d.ts +5 -0
- package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +2 -2
- package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +2 -0
- package/dist/src/views/scheduling/composables/useScheduleOnboardingDemand.d.ts +1 -1
- package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +47 -3
- package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +408 -29
- package/dist/src/views/scheduling/composables/useScheduleOutlet.d.ts +11 -8
- package/dist/src/views/scheduling/composables/useSchedulePageCellDrop.d.ts +3 -1
- package/dist/src/views/scheduling/composables/useSchedulePageClearActions.d.ts +1 -0
- package/dist/src/views/scheduling/composables/useSchedulePageOverlays.d.ts +0 -4
- package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +1 -0
- package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +7 -1
- package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +2 -0
- package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +70 -4
- package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +7 -2
- package/dist/src/views/scheduling/composables/useScheduleSetupBanner.d.ts +2 -2
- package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +41 -3
- package/dist/src/views/scheduling/composables/useScheduleShiftDraft.d.ts +1 -0
- package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +47 -6
- package/dist/src/views/scheduling/country-rules/index.d.ts +9 -4
- package/dist/src/views/scheduling/data.d.ts +22 -1
- package/dist/src/views/scheduling/locales/index.d.ts +28 -0
- package/dist/src/views/scheduling/schedule-state.d.ts +272 -208
- package/dist/src/views/scheduling/schedule-store.d.ts +36 -11
- package/dist/src/views/scheduling/types.d.ts +30 -5
- package/dist/style.css +1 -1
- package/dist/tsconfig.app.tsbuildinfo +1 -1
- package/dist/{useAppStore-d_nHyK5u.js → useAppStore-DZCdxlCd.js} +1 -1
- package/dist/useDiscardConfirm-CzZSPyvh.js +28 -0
- package/dist/{useLoading-JFoghhRz.js → useLoading-Nygx2zn8.js} +1 -1
- package/dist/{useReportPermissions-B2ev0j4w.js → useReportPermissions-Ca-9DEOI.js} +3 -3
- package/package.json +1 -1
- package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-CFoTAGIX.js +0 -4167
- package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-B4VUyKW3.js +0 -470
- package/dist/ScheduleGeneralPage-Cd5AlY4z.js +0 -666
- package/dist/ScheduleModal.vue_vue_type_script_setup_true_lang-Cf0l2MRg.js +0 -2188
- package/dist/SchedulePage-C8m0-m3l.js +0 -18257
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +0 -9
- package/dist/src/views/scheduling/components/ScheduleAllShiftsRow.vue.d.ts +0 -22
- package/dist/src/views/scheduling/components/ScheduleStackPopover.vue.d.ts +0 -14
- package/dist/src/views/scheduling/composables/useScheduleAllShiftsRow.d.ts +0 -77
- package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +0 -124
- package/dist/src/views/scheduling/composables/useScheduleOpenShiftCard.d.ts +0 -23
- 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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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,
|
|
35
|
-
*
|
|
36
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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<
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
99
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|