@feedmepos/mf-hrm-portal 2.2.5-dev → 2.2.5-dev.10
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-DgcWZ3SZ.js → ApprovalCodeList-BsDMMSIz.js} +4 -4
- package/dist/{AuditLogList-vWKMMGvd.js → AuditLogList-CGNZdtmn.js} +18 -17
- package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-DuhXogXK.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-C6MoToqi.js} +2 -2
- package/dist/EmployeeList-B_OuDWWQ.js +787 -0
- package/dist/{FormItem.vue_vue_type_script_setup_true_lang-DPT2FoIc.js → FormItem.vue_vue_type_script_setup_true_lang-CUnlKsxk.js} +1 -1
- package/dist/{GrantUserList-BAW0C1bA.js → GrantUserList-Bd0lXmFo.js} +5 -5
- package/dist/{Main-NzpdRNB3.js → Main-B66lSeOv.js} +5 -5
- package/dist/{Main-Wr6cTqfM.js → Main-CzHSNHsH.js} +2 -2
- package/dist/{Main-B7Nn8CLQ.js → Main-njRQ1tFk.js} +9 -9
- package/dist/PasscodePinField.vue_vue_type_script_setup_true_lang-CqG0v0Sz.js +243 -0
- package/dist/{PermissionSetList-D6AFOleD.js → PermissionSetList-GTI6Cwj5.js} +18 -18
- package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Bzq2_BMn.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-C-QEQ-js.js} +1052 -1052
- package/dist/{RoleList-BuqpmXn_.js → RoleList-CmHgtM0m.js} +7 -7
- package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-SFqxftRx.js +426 -0
- package/dist/ScheduleButton.vue_vue_type_script_setup_true_lang-CrWfo-zF.js +690 -0
- package/dist/ScheduleGeneralPage-DxFxJN5j.js +320 -0
- package/dist/SchedulePage-cJDI3-E7.js +14647 -0
- package/dist/SchedulePositionPage-n1wUShIM.js +293 -0
- package/dist/ScheduleSelect.vue_vue_type_script_setup_true_lang-B8W4sTsA.js +242 -0
- package/dist/SelectFilter-CG13h83-.js +264 -0
- package/dist/TeamMemberList-ByZt3VqN.js +1154 -0
- package/dist/{TimesheetList-B5FyVyCz.js → TimesheetList-Dv0-W--W.js} +54 -53
- package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-C99Jr6Ax.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-DIo6h5-a.js} +2 -2
- package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
- package/dist/{app-8samJY5z.js → app-SCXGJ95F.js} +3146 -2553
- package/dist/app.js +1 -1
- package/dist/{dayjs.min-Ba4X_9nY.js → dayjs.min-DqMLPYv-.js} +1 -1
- package/dist/{employee-BcFgm8Rt.js → employee-DT_xYQkz.js} +3 -3
- package/dist/{iteration-Dhdew1jW.js → iteration-B5dB9ecy.js} +1 -1
- package/dist/{lodash-CJ3mHku0.js → lodash-CRHFapxI.js} +1 -1
- package/dist/{role-BViYS7RK.js → role-CJm8pXaw.js} +1 -1
- package/dist/{rule-Dxt1ZSQS.js → rule-AJm-eVzJ.js} +276 -272
- package/dist/src/api/schedule/index.d.ts +41 -0
- package/dist/src/components/form/OutletRoleAssignment.vue.d.ts +16 -0
- package/dist/src/components/layout/AppSidebar.vue.d.ts +2 -0
- package/dist/src/components/layout/PortalShell.vue.d.ts +12 -0
- package/dist/src/components/layout/withShell.d.ts +14 -0
- package/dist/src/helpers/outlet-role-assignment.d.ts +40 -0
- package/dist/src/helpers/rule.d.ts +15 -0
- package/dist/src/router/shared.d.ts +4 -1
- package/dist/src/types/schedule.d.ts +232 -0
- package/dist/src/views/scheduling/ScheduleGeneralPage.vue.d.ts +3 -0
- package/dist/src/views/scheduling/SchedulePage.vue.d.ts +3 -0
- package/dist/src/views/scheduling/SchedulePositionPage.vue.d.ts +3 -0
- package/dist/src/views/scheduling/components/ScheduleAddEmployeeIdentitySection.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleAddEmployeeModal.vue.d.ts +10 -0
- package/dist/src/views/scheduling/components/ScheduleAddEmployeeModeStep.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleAddEmployeePosAccessSection.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleAddEmployeePositionsSection.vue.d.ts +10 -0
- package/dist/src/views/scheduling/components/ScheduleAddEmployeeSchedulingSection.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleAddPickPopover.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleAddPositionModal.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleAllShiftsRow.vue.d.ts +22 -0
- package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +34 -0
- package/dist/src/views/scheduling/components/ScheduleAssignEmployeePopover.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleAutoScheduleModal.vue.d.ts +10 -0
- package/dist/src/views/scheduling/components/ScheduleButton.vue.d.ts +23 -0
- package/dist/src/views/scheduling/components/ScheduleChangeEmployeeModal.vue.d.ts +8 -0
- package/dist/src/views/scheduling/components/ScheduleConfirmModal.vue.d.ts +24 -0
- package/dist/src/views/scheduling/components/ScheduleCostRail.vue.d.ts +8 -0
- package/dist/src/views/scheduling/components/ScheduleDateRangePopover.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleDayNotePopover.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleDayTimeline.vue.d.ts +12 -0
- package/dist/src/views/scheduling/components/ScheduleDemandRow.vue.d.ts +23 -0
- package/dist/src/views/scheduling/components/ScheduleDemandSheet.vue.d.ts +10 -0
- package/dist/src/views/scheduling/components/ScheduleDotsIcon.vue.d.ts +2 -0
- package/dist/src/views/scheduling/components/ScheduleEmployeeDetailPanel.vue.d.ts +12 -0
- package/dist/src/views/scheduling/components/ScheduleEmployeeIdentity.vue.d.ts +17 -0
- package/dist/src/views/scheduling/components/ScheduleEmployeeMenu.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleFilterBar.vue.d.ts +18 -0
- package/dist/src/views/scheduling/components/ScheduleGapPopover.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleGridHeader.vue.d.ts +18 -0
- package/dist/src/views/scheduling/components/ScheduleGridSkeleton.vue.d.ts +2 -0
- package/dist/src/views/scheduling/components/ScheduleLeaveEditModal.vue.d.ts +8 -0
- package/dist/src/views/scheduling/components/ScheduleLegendBar.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleOnboardingWelcome.vue.d.ts +12 -0
- package/dist/src/views/scheduling/components/ScheduleOnboardingWizard.vue.d.ts +9 -0
- package/dist/src/views/scheduling/components/ScheduleOpenShiftCardMenu.vue.d.ts +14 -0
- package/dist/src/views/scheduling/components/SchedulePdfPreview.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/SchedulePublishModal.vue.d.ts +8 -0
- package/dist/src/views/scheduling/components/ScheduleReviewBar.vue.d.ts +12 -0
- package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +54 -0
- package/dist/src/views/scheduling/components/ScheduleSelectExistingEmployeeModal.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleShiftCardMenu.vue.d.ts +12 -0
- package/dist/src/views/scheduling/components/ScheduleShiftCell.vue.d.ts +35 -0
- package/dist/src/views/scheduling/components/ScheduleShiftHeadcountEditor.vue.d.ts +10 -0
- package/dist/src/views/scheduling/components/ScheduleShiftImpact.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleShiftMoreOptions.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleShiftPopover.vue.d.ts +16 -0
- package/dist/src/views/scheduling/components/ScheduleShiftRepeatDaysRow.vue.d.ts +8 -0
- package/dist/src/views/scheduling/components/ScheduleShiftSegmentsEditor.vue.d.ts +8 -0
- package/dist/src/views/scheduling/components/ScheduleShiftWhoPicker.vue.d.ts +25 -0
- package/dist/src/views/scheduling/components/ScheduleStackPopover.vue.d.ts +14 -0
- package/dist/src/views/scheduling/components/ScheduleStaffRail.vue.d.ts +18 -0
- package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +60 -0
- package/dist/src/views/scheduling/components/ScheduleStatsRow.vue.d.ts +12 -0
- package/dist/src/views/scheduling/components/ScheduleSwapShiftsModal.vue.d.ts +8 -0
- package/dist/src/views/scheduling/components/ScheduleTimePickerPopover.vue.d.ts +6 -0
- package/dist/src/views/scheduling/components/ScheduleTopbar.vue.d.ts +20 -0
- package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +72 -0
- package/dist/src/views/scheduling/composables/schedule-board-helpers.d.ts +38 -0
- package/dist/src/views/scheduling/composables/schedule-day-meta.d.ts +29 -0
- package/dist/src/views/scheduling/composables/schedule-employee-profile.d.ts +7 -0
- package/dist/src/views/scheduling/composables/schedule-popover-position.d.ts +16 -0
- package/dist/src/views/scheduling/composables/schedule-shift-time.d.ts +14 -0
- package/dist/src/views/scheduling/composables/schedule-week-cache.d.ts +10 -0
- package/dist/src/views/scheduling/composables/scheduleAutoSolver.d.ts +21 -0
- package/dist/src/views/scheduling/composables/useCollapsedList.d.ts +9 -0
- package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +98 -0
- package/dist/src/views/scheduling/composables/useScheduleAddPick.d.ts +73 -0
- package/dist/src/views/scheduling/composables/useScheduleAllShiftsRow.d.ts +77 -0
- package/dist/src/views/scheduling/composables/useScheduleAreaBoard.d.ts +50 -0
- package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +18 -0
- package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +122 -0
- package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +143 -0
- package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +426 -0
- package/dist/src/views/scheduling/composables/useScheduleCellState.d.ts +27 -0
- package/dist/src/views/scheduling/composables/useScheduleClashDetection.d.ts +18 -0
- package/dist/src/views/scheduling/composables/useScheduleCopyWeek.d.ts +19 -0
- package/dist/src/views/scheduling/composables/useScheduleCostRail.d.ts +43 -0
- package/dist/src/views/scheduling/composables/useScheduleDayNote.d.ts +48 -0
- package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +77 -0
- package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +76 -0
- package/dist/src/views/scheduling/composables/useScheduleDemandRow.d.ts +45 -0
- package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +145 -0
- package/dist/src/views/scheduling/composables/useScheduleDragDrop.d.ts +22 -0
- package/dist/src/views/scheduling/composables/useScheduleEmployeeIdentity.d.ts +41 -0
- package/dist/src/views/scheduling/composables/useScheduleEmployeeMenu.d.ts +35 -0
- package/dist/src/views/scheduling/composables/useScheduleEmployeeProfile.d.ts +16 -0
- package/dist/src/views/scheduling/composables/useScheduleExport.d.ts +26 -0
- package/dist/src/views/scheduling/composables/useScheduleFilterBar.d.ts +14 -0
- package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +82 -0
- package/dist/src/views/scheduling/composables/useScheduleLeave.d.ts +70 -0
- package/dist/src/views/scheduling/composables/useScheduleLegend.d.ts +15 -0
- package/dist/src/views/scheduling/composables/useScheduleLegendBar.d.ts +35 -0
- package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +1316 -0
- package/dist/src/views/scheduling/composables/useScheduleOpenShiftCard.d.ts +23 -0
- package/dist/src/views/scheduling/composables/useScheduleOutlet.d.ts +20 -0
- package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +50 -0
- package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +32 -0
- package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +93 -0
- package/dist/src/views/scheduling/composables/useScheduleRangeCalendar.d.ts +27 -0
- package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +189 -0
- package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +54 -0
- package/dist/src/views/scheduling/composables/useScheduleSetupBanner.d.ts +18 -0
- package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +163 -0
- package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +181 -0
- package/dist/src/views/scheduling/composables/useScheduleStaffRail.d.ts +23 -0
- package/dist/src/views/scheduling/composables/useScheduleStatsRow.d.ts +25 -0
- package/dist/src/views/scheduling/composables/useScheduleTimePicker.d.ts +49 -0
- package/dist/src/views/scheduling/composables/useScheduleTopbar.d.ts +10 -0
- package/dist/src/views/scheduling/composables/useScheduleViewportFit.d.ts +9 -0
- package/dist/src/views/scheduling/data.d.ts +110 -0
- package/dist/src/views/scheduling/locales/index.d.ts +496 -0
- package/dist/src/views/scheduling/schedule-store.d.ts +151 -0
- package/dist/src/views/scheduling/types.d.ts +324 -0
- package/dist/src/views/team/components/PortalConditionForm.vue.d.ts +2 -2
- package/dist/src/views/team/condition-builders/ConditionBuilderForm.vue.d.ts +2 -2
- package/dist/src/views/team/member/TeamMemberMasterUser.vue.d.ts +12 -3
- package/dist/style.css +1 -1
- package/dist/tsconfig.app.tsbuildinfo +1 -1
- package/dist/{useReportPermissions-BiyAfGvZ.js → useReportPermissions-Cg3lV70m.js} +3 -3
- package/package.json +1 -1
- package/dist/EmployeeList-Cu4RxVQX.js +0 -889
- package/dist/PasscodePinField.vue_vue_type_script_setup_true_lang-BUI0Xsgc.js +0 -85
- package/dist/SelectFilter-ATOm0hdn.js +0 -269
- package/dist/TeamMemberList-M6HA9BWu.js +0 -1248
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ScheduleBoardApi } from './useScheduleBoard';
|
|
2
|
+
export interface ScheduleOpenShiftMenuState {
|
|
3
|
+
open: boolean;
|
|
4
|
+
openShiftId: number | null;
|
|
5
|
+
left: number;
|
|
6
|
+
top: number;
|
|
7
|
+
}
|
|
8
|
+
/** The open-shift card's "⋯" menu (Assign/Edit/Remove) and its "N can cover" candidate
|
|
9
|
+
* count — split out from the shift popover itself, since these apply to the card at rest,
|
|
10
|
+
* not to the form. */
|
|
11
|
+
export declare function useScheduleOpenShiftCard(board: ScheduleBoardApi): {
|
|
12
|
+
menu: {
|
|
13
|
+
open: boolean;
|
|
14
|
+
openShiftId: number | null;
|
|
15
|
+
left: number;
|
|
16
|
+
top: number;
|
|
17
|
+
};
|
|
18
|
+
openMenu: (openShiftId: number, anchor: HTMLElement) => void;
|
|
19
|
+
closeMenu: () => void;
|
|
20
|
+
remove: (openShiftId: number) => void;
|
|
21
|
+
candidateCountFor: (openShiftId: number) => number;
|
|
22
|
+
};
|
|
23
|
+
export type ScheduleOpenShiftCardApi = ReturnType<typeof useScheduleOpenShiftCard>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ScheduleSelectOption } from '../components/ScheduleSelect.vue';
|
|
2
|
+
/** Which outlet the board is scheduling, and the picker that changes it.
|
|
3
|
+
*
|
|
4
|
+
* On entry the host shell's own selection wins — mf-common keeps `currentRestaurant` in sync
|
|
5
|
+
* with the `?restaurantId=` in the URL, so arriving from anywhere else in the portal lands on
|
|
6
|
+
* the outlet that was already being looked at. Only when the shell has no opinion does this
|
|
7
|
+
* fall back to the first outlet in the business, which is better than an empty board.
|
|
8
|
+
*
|
|
9
|
+
* Switching from the picker deliberately does NOT write back to the shell: the URL is the
|
|
10
|
+
* shell's to own, and a board that silently repoints the whole portal is doing more than the
|
|
11
|
+
* control it was clicked on said it would. */
|
|
12
|
+
export declare function useScheduleOutlet(): {
|
|
13
|
+
options: import("vue").ComputedRef<ScheduleSelectOption[]>;
|
|
14
|
+
ready: import("vue").Ref<boolean, boolean>;
|
|
15
|
+
outletId: import("vue").Ref<string, string>;
|
|
16
|
+
resolve: () => Promise<string>;
|
|
17
|
+
resolveOutlet: () => Promise<string>;
|
|
18
|
+
switchTo: (restaurantId: string, weekStart: Date) => Promise<boolean>;
|
|
19
|
+
};
|
|
20
|
+
export type ScheduleOutletApi = ReturnType<typeof useScheduleOutlet>;
|
|
@@ -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>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface SchedulePositionRow {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function useSchedulePositions(): {
|
|
6
|
+
positions: import("vue").Ref<{
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
}[], SchedulePositionRow[] | {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
}[]>;
|
|
13
|
+
count: import("vue").ComputedRef<number>;
|
|
14
|
+
isAdding: import("vue").Ref<boolean, boolean>;
|
|
15
|
+
newName: import("vue").Ref<string, string>;
|
|
16
|
+
editingId: import("vue").Ref<string | null, string | null>;
|
|
17
|
+
editingName: import("vue").Ref<string, string>;
|
|
18
|
+
pendingDeleteId: import("vue").Ref<string | null, string | null>;
|
|
19
|
+
saving: import("vue").Ref<boolean, boolean>;
|
|
20
|
+
error: import("vue").Ref<string | null, string | null>;
|
|
21
|
+
usageCountFor: (name: string) => number;
|
|
22
|
+
startAdd: () => void;
|
|
23
|
+
cancelAdd: () => void;
|
|
24
|
+
confirmAdd: () => Promise<void>;
|
|
25
|
+
startEdit: (id: string) => void;
|
|
26
|
+
cancelEdit: () => void;
|
|
27
|
+
saveEdit: (id: string) => Promise<void>;
|
|
28
|
+
askDelete: (id: string) => void;
|
|
29
|
+
cancelDelete: () => void;
|
|
30
|
+
confirmDelete: (id: string) => Promise<void>;
|
|
31
|
+
};
|
|
32
|
+
export type SchedulePositionsApi = ReturnType<typeof useSchedulePositions>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ScheduleBoardApi } from './useScheduleBoard';
|
|
2
|
+
import type { ScheduleVersion } from '../types';
|
|
3
|
+
export interface VersionDiffRow {
|
|
4
|
+
name: string;
|
|
5
|
+
day: string;
|
|
6
|
+
kind: 'add' | 'rem' | 'chg';
|
|
7
|
+
from: string | null;
|
|
8
|
+
to: string | null;
|
|
9
|
+
}
|
|
10
|
+
/** The mockup's Publish modal (openPublish/renderPublish/confirmPublish) — draft vs. published
|
|
11
|
+
* stamps, a conflict-acknowledgement gate, the pending-change list, and per-version diffing
|
|
12
|
+
* against the previous version. The mockup's WhatsApp/push/email notify-channel block is not
|
|
13
|
+
* ported: it depends on per-employee notification-preference data that doesn't exist anywhere
|
|
14
|
+
* in this mock model, and building it would mean inventing a whole notification-preferences
|
|
15
|
+
* concept with no other consumer — publish here just publishes. */
|
|
16
|
+
export declare function useSchedulePublish(board: ScheduleBoardApi): {
|
|
17
|
+
isOpen: import("vue").Ref<boolean, boolean>;
|
|
18
|
+
pubAcked: import("vue").Ref<boolean, boolean>;
|
|
19
|
+
showAllVersions: import("vue").Ref<boolean, boolean>;
|
|
20
|
+
expandedVersion: import("vue").Ref<number | null, number | null>;
|
|
21
|
+
open: () => void;
|
|
22
|
+
close: () => void;
|
|
23
|
+
conflicts: import("vue").ComputedRef<number>;
|
|
24
|
+
confirmDisabled: import("vue").ComputedRef<boolean>;
|
|
25
|
+
visibleVersions: import("vue").ComputedRef<{
|
|
26
|
+
v: number;
|
|
27
|
+
at: Date;
|
|
28
|
+
by: string;
|
|
29
|
+
note: string;
|
|
30
|
+
changeCount: number;
|
|
31
|
+
staffAffected: number;
|
|
32
|
+
snapshot: {
|
|
33
|
+
id: number;
|
|
34
|
+
name: string;
|
|
35
|
+
weekHours: number;
|
|
36
|
+
shifts: ({
|
|
37
|
+
start: string;
|
|
38
|
+
end: string;
|
|
39
|
+
role: string;
|
|
40
|
+
status: import("../types").ShiftStatus;
|
|
41
|
+
clock?: {
|
|
42
|
+
in: string | null;
|
|
43
|
+
out: string | null;
|
|
44
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
45
|
+
} | undefined;
|
|
46
|
+
conflict?: boolean | undefined;
|
|
47
|
+
conflictReason?: string | undefined;
|
|
48
|
+
openId?: number | undefined;
|
|
49
|
+
breakMins?: number | undefined;
|
|
50
|
+
assignmentId?: string | undefined;
|
|
51
|
+
} | {
|
|
52
|
+
timeOff: "approved" | "pending";
|
|
53
|
+
reason: string;
|
|
54
|
+
half?: boolean | undefined;
|
|
55
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
56
|
+
from?: string | undefined;
|
|
57
|
+
to?: string | undefined;
|
|
58
|
+
appliedOn?: string | undefined;
|
|
59
|
+
note?: string | undefined;
|
|
60
|
+
cert?: {
|
|
61
|
+
name: string;
|
|
62
|
+
size: string;
|
|
63
|
+
} | null | undefined;
|
|
64
|
+
bal?: {
|
|
65
|
+
type: string;
|
|
66
|
+
entitled: number;
|
|
67
|
+
used: number;
|
|
68
|
+
} | undefined;
|
|
69
|
+
} | {
|
|
70
|
+
start: string;
|
|
71
|
+
end: string;
|
|
72
|
+
role: string;
|
|
73
|
+
status: import("../types").ShiftStatus;
|
|
74
|
+
clock?: {
|
|
75
|
+
in: string | null;
|
|
76
|
+
out: string | null;
|
|
77
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
78
|
+
} | undefined;
|
|
79
|
+
conflict?: boolean | undefined;
|
|
80
|
+
conflictReason?: string | undefined;
|
|
81
|
+
openId?: number | undefined;
|
|
82
|
+
breakMins?: number | undefined;
|
|
83
|
+
assignmentId?: string | undefined;
|
|
84
|
+
}[] | null)[];
|
|
85
|
+
}[];
|
|
86
|
+
}[]>;
|
|
87
|
+
toggleAllVersions: () => void;
|
|
88
|
+
toggleVersionDiff: (v: number) => void;
|
|
89
|
+
diffFor: (version: ScheduleVersion) => VersionDiffRow[];
|
|
90
|
+
confirm: () => void;
|
|
91
|
+
restoreVersion: (v: number) => void;
|
|
92
|
+
};
|
|
93
|
+
export type SchedulePublishApi = ReturnType<typeof useSchedulePublish>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ScheduleBoardApi } from './useScheduleBoard';
|
|
2
|
+
/** Range-calendar popover behind the topbar's date label — month grid + Today/This
|
|
3
|
+
* week/Next week presets, matching the mockup's range calendar. */
|
|
4
|
+
export declare function useScheduleRangeCalendar(board: ScheduleBoardApi): {
|
|
5
|
+
open: import("vue").Ref<boolean, boolean>;
|
|
6
|
+
pos: {
|
|
7
|
+
left: number;
|
|
8
|
+
top: number;
|
|
9
|
+
};
|
|
10
|
+
toggle: (anchor?: HTMLElement) => void;
|
|
11
|
+
close: () => void;
|
|
12
|
+
cursorMonth: import("vue").Ref<Date, Date>;
|
|
13
|
+
shiftMonth: (delta: number) => void;
|
|
14
|
+
monthLabel: import("vue").ComputedRef<string>;
|
|
15
|
+
calendarDays: import("vue").ComputedRef<{
|
|
16
|
+
date: Date | null;
|
|
17
|
+
}[]>;
|
|
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>;
|
|
24
|
+
pickDate: (date: Date) => void;
|
|
25
|
+
presetToday: () => void;
|
|
26
|
+
presetNextWeek: () => void;
|
|
27
|
+
};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import type { ScheduleBoardApi } from './useScheduleBoard';
|
|
2
|
+
/** The employee grid's own row list — search-filtered, in the roster's own order.
|
|
3
|
+
*
|
|
4
|
+
* Ported from the mockup's getSorted()/EMP_ORDER. The grid's rows are the axis you edit along,
|
|
5
|
+
* so load-sorting them (the way the area view's staff rail does) meant every assignment moved
|
|
6
|
+
* that person down the list — the row you just used slid out from under the cursor. The order
|
|
7
|
+
* seeds from name order and only ever changes when a manager drags a name, so a row stays put
|
|
8
|
+
* while you work. There is deliberately no "sort by load" control here; that's a staff-rail
|
|
9
|
+
* feature. */
|
|
10
|
+
export declare function useScheduleRoster(board: ScheduleBoardApi): {
|
|
11
|
+
search: import("vue").Ref<string, string>;
|
|
12
|
+
filteredEmployees: import("vue").ComputedRef<{
|
|
13
|
+
id: number;
|
|
14
|
+
name: string;
|
|
15
|
+
role: string;
|
|
16
|
+
initials: string;
|
|
17
|
+
color: string;
|
|
18
|
+
weekHours: number;
|
|
19
|
+
pct: number;
|
|
20
|
+
contractHours?: number | undefined;
|
|
21
|
+
rate: number;
|
|
22
|
+
positions: string[];
|
|
23
|
+
shifts: ({
|
|
24
|
+
start: string;
|
|
25
|
+
end: string;
|
|
26
|
+
role: string;
|
|
27
|
+
status: import("../types").ShiftStatus;
|
|
28
|
+
clock?: {
|
|
29
|
+
in: string | null;
|
|
30
|
+
out: string | null;
|
|
31
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
32
|
+
} | undefined;
|
|
33
|
+
conflict?: boolean | undefined;
|
|
34
|
+
conflictReason?: string | undefined;
|
|
35
|
+
openId?: number | undefined;
|
|
36
|
+
breakMins?: number | undefined;
|
|
37
|
+
assignmentId?: string | undefined;
|
|
38
|
+
} | {
|
|
39
|
+
timeOff: "approved" | "pending";
|
|
40
|
+
reason: string;
|
|
41
|
+
half?: boolean | undefined;
|
|
42
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
43
|
+
from?: string | undefined;
|
|
44
|
+
to?: string | undefined;
|
|
45
|
+
appliedOn?: string | undefined;
|
|
46
|
+
note?: string | undefined;
|
|
47
|
+
cert?: {
|
|
48
|
+
name: string;
|
|
49
|
+
size: string;
|
|
50
|
+
} | null | undefined;
|
|
51
|
+
bal?: {
|
|
52
|
+
type: string;
|
|
53
|
+
entitled: number;
|
|
54
|
+
used: number;
|
|
55
|
+
} | undefined;
|
|
56
|
+
} | {
|
|
57
|
+
start: string;
|
|
58
|
+
end: string;
|
|
59
|
+
role: string;
|
|
60
|
+
status: import("../types").ShiftStatus;
|
|
61
|
+
clock?: {
|
|
62
|
+
in: string | null;
|
|
63
|
+
out: string | null;
|
|
64
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
65
|
+
} | undefined;
|
|
66
|
+
conflict?: boolean | undefined;
|
|
67
|
+
conflictReason?: string | undefined;
|
|
68
|
+
openId?: number | undefined;
|
|
69
|
+
breakMins?: number | undefined;
|
|
70
|
+
assignmentId?: string | undefined;
|
|
71
|
+
}[] | null)[];
|
|
72
|
+
remarks: {
|
|
73
|
+
author: string;
|
|
74
|
+
date: string;
|
|
75
|
+
type: "note" | "warning" | "praise";
|
|
76
|
+
text: string;
|
|
77
|
+
}[];
|
|
78
|
+
section: string;
|
|
79
|
+
compGroup?: string | undefined;
|
|
80
|
+
mobile?: string | undefined;
|
|
81
|
+
dial?: string | undefined;
|
|
82
|
+
locations?: string[] | undefined;
|
|
83
|
+
payBasis?: "hourly" | "monthly" | undefined;
|
|
84
|
+
payAmount?: number | undefined;
|
|
85
|
+
maxHours?: number | undefined;
|
|
86
|
+
maxOtHours?: number | undefined;
|
|
87
|
+
minHours?: number | undefined;
|
|
88
|
+
otAfterDaily?: number | undefined;
|
|
89
|
+
preferences?: string[] | undefined;
|
|
90
|
+
seniority?: "senior" | "junior" | "" | undefined;
|
|
91
|
+
availDays?: boolean[] | undefined;
|
|
92
|
+
availHours?: {
|
|
93
|
+
from: string;
|
|
94
|
+
to: string;
|
|
95
|
+
}[] | undefined;
|
|
96
|
+
passcode?: string | undefined;
|
|
97
|
+
masterUser?: boolean | undefined;
|
|
98
|
+
}[]>;
|
|
99
|
+
orderedEmployees: import("vue").ComputedRef<{
|
|
100
|
+
id: number;
|
|
101
|
+
name: string;
|
|
102
|
+
role: string;
|
|
103
|
+
initials: string;
|
|
104
|
+
color: string;
|
|
105
|
+
weekHours: number;
|
|
106
|
+
pct: number;
|
|
107
|
+
contractHours?: number | undefined;
|
|
108
|
+
rate: number;
|
|
109
|
+
positions: string[];
|
|
110
|
+
shifts: ({
|
|
111
|
+
start: string;
|
|
112
|
+
end: string;
|
|
113
|
+
role: string;
|
|
114
|
+
status: import("../types").ShiftStatus;
|
|
115
|
+
clock?: {
|
|
116
|
+
in: string | null;
|
|
117
|
+
out: string | null;
|
|
118
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
119
|
+
} | undefined;
|
|
120
|
+
conflict?: boolean | undefined;
|
|
121
|
+
conflictReason?: string | undefined;
|
|
122
|
+
openId?: number | undefined;
|
|
123
|
+
breakMins?: number | undefined;
|
|
124
|
+
assignmentId?: string | undefined;
|
|
125
|
+
} | {
|
|
126
|
+
timeOff: "approved" | "pending";
|
|
127
|
+
reason: string;
|
|
128
|
+
half?: boolean | undefined;
|
|
129
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
130
|
+
from?: string | undefined;
|
|
131
|
+
to?: string | undefined;
|
|
132
|
+
appliedOn?: string | undefined;
|
|
133
|
+
note?: string | undefined;
|
|
134
|
+
cert?: {
|
|
135
|
+
name: string;
|
|
136
|
+
size: string;
|
|
137
|
+
} | null | undefined;
|
|
138
|
+
bal?: {
|
|
139
|
+
type: string;
|
|
140
|
+
entitled: number;
|
|
141
|
+
used: number;
|
|
142
|
+
} | undefined;
|
|
143
|
+
} | {
|
|
144
|
+
start: string;
|
|
145
|
+
end: string;
|
|
146
|
+
role: string;
|
|
147
|
+
status: import("../types").ShiftStatus;
|
|
148
|
+
clock?: {
|
|
149
|
+
in: string | null;
|
|
150
|
+
out: string | null;
|
|
151
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
152
|
+
} | undefined;
|
|
153
|
+
conflict?: boolean | undefined;
|
|
154
|
+
conflictReason?: string | undefined;
|
|
155
|
+
openId?: number | undefined;
|
|
156
|
+
breakMins?: number | undefined;
|
|
157
|
+
assignmentId?: string | undefined;
|
|
158
|
+
}[] | null)[];
|
|
159
|
+
remarks: {
|
|
160
|
+
author: string;
|
|
161
|
+
date: string;
|
|
162
|
+
type: "note" | "warning" | "praise";
|
|
163
|
+
text: string;
|
|
164
|
+
}[];
|
|
165
|
+
section: string;
|
|
166
|
+
compGroup?: string | undefined;
|
|
167
|
+
mobile?: string | undefined;
|
|
168
|
+
dial?: string | undefined;
|
|
169
|
+
locations?: string[] | undefined;
|
|
170
|
+
payBasis?: "hourly" | "monthly" | undefined;
|
|
171
|
+
payAmount?: number | undefined;
|
|
172
|
+
maxHours?: number | undefined;
|
|
173
|
+
maxOtHours?: number | undefined;
|
|
174
|
+
minHours?: number | undefined;
|
|
175
|
+
otAfterDaily?: number | undefined;
|
|
176
|
+
preferences?: string[] | undefined;
|
|
177
|
+
seniority?: "senior" | "junior" | "" | undefined;
|
|
178
|
+
availDays?: boolean[] | undefined;
|
|
179
|
+
availHours?: {
|
|
180
|
+
from: string;
|
|
181
|
+
to: string;
|
|
182
|
+
}[] | undefined;
|
|
183
|
+
passcode?: string | undefined;
|
|
184
|
+
masterUser?: boolean | undefined;
|
|
185
|
+
}[]>;
|
|
186
|
+
order: import("vue").Ref<number[], number[]>;
|
|
187
|
+
reorder: (draggedId: number, targetId: number, after: boolean) => void;
|
|
188
|
+
};
|
|
189
|
+
export type ScheduleRosterApi = ReturnType<typeof useScheduleRoster>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type ScheduleSettingsSection = 'budget' | 'overtime' | 'notify';
|
|
2
|
+
/** Labour budget and Notifications are out of the General page for now — see
|
|
3
|
+
* ScheduleSettingsPage's own note. `ScheduleSettingsSection` stays the full union (rather
|
|
4
|
+
* than narrowing to a literal `'overtime'`) so `draft`/`save()` below don't have to change
|
|
5
|
+
* shape the day a section comes back; only the nav and the page's own rendering are trimmed. */
|
|
6
|
+
export declare const SETTINGS_SECTIONS: {
|
|
7
|
+
key: ScheduleSettingsSection;
|
|
8
|
+
label: string;
|
|
9
|
+
}[];
|
|
10
|
+
/** The mockup's Scheduling Settings page, scoped to the 3 tabs the topbar gear icon opens
|
|
11
|
+
* (Labour budget / Overtime / Notifications). The mockup's sibling Shift & coverage / Seasonal
|
|
12
|
+
* / Positions pages are a separate, out-of-scope epic — not built here. One draft object, like
|
|
13
|
+
* the mockup's settingsDraft/spSnapshot(). */
|
|
14
|
+
export declare function useScheduleSettings(): {
|
|
15
|
+
isOpen: import("vue").Ref<boolean, boolean>;
|
|
16
|
+
activeSection: import("vue").Ref<ScheduleSettingsSection, ScheduleSettingsSection>;
|
|
17
|
+
draft: {
|
|
18
|
+
salesForecast: number;
|
|
19
|
+
labourTarget: number;
|
|
20
|
+
budgetFromSales: boolean;
|
|
21
|
+
budget: number;
|
|
22
|
+
payRate: {
|
|
23
|
+
NORMAL: {
|
|
24
|
+
overtime: number;
|
|
25
|
+
};
|
|
26
|
+
REST_DAY: {
|
|
27
|
+
regular: number;
|
|
28
|
+
overtime: number;
|
|
29
|
+
};
|
|
30
|
+
PUBLIC_HOLIDAY: {
|
|
31
|
+
regular: number;
|
|
32
|
+
overtime: number;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
otCapHours: number;
|
|
36
|
+
otBudget: number;
|
|
37
|
+
notify: {
|
|
38
|
+
waConnected: boolean;
|
|
39
|
+
waNumber: string;
|
|
40
|
+
waDisplayName: string;
|
|
41
|
+
defaults: {
|
|
42
|
+
wa: boolean;
|
|
43
|
+
push: boolean;
|
|
44
|
+
email: boolean;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
dirty: import("vue").ComputedRef<boolean>;
|
|
49
|
+
open: (section?: ScheduleSettingsSection) => void;
|
|
50
|
+
close: () => boolean;
|
|
51
|
+
discard: () => void;
|
|
52
|
+
save: () => void;
|
|
53
|
+
};
|
|
54
|
+
export type ScheduleSettingsApi = ReturnType<typeof useScheduleSettings>;
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
*
|
|
6
|
+
* The welcome dialog answers a different question — "has this outlet's owner seen the
|
|
7
|
+
* onboarding greeting" — and is deliberately NOT tied to whether positions currently exist:
|
|
8
|
+
* the board's data lands from an async fetch, so gating the dialog on it
|
|
9
|
+
* meant a fast response for an outlet that already had positions saved could yank the dialog
|
|
10
|
+
* shut within the same tick it opened, before anyone could read it. `localStorage`, keyed per
|
|
11
|
+
* outlet, is what makes "seen" durable and independent of that fetch. */
|
|
12
|
+
export declare function useScheduleSetupBanner(): {
|
|
13
|
+
open: import("vue").ComputedRef<boolean>;
|
|
14
|
+
start: () => void;
|
|
15
|
+
dismiss: () => void;
|
|
16
|
+
welcomeOpen: import("vue").ComputedRef<boolean>;
|
|
17
|
+
dismissWelcome: () => void;
|
|
18
|
+
};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { Employee } from '../types';
|
|
2
|
+
import type { ScheduleBoardApi } from './useScheduleBoard';
|
|
3
|
+
export interface ScheduleCardMenuState {
|
|
4
|
+
open: boolean;
|
|
5
|
+
empId: number | null;
|
|
6
|
+
dayIdx: number | null;
|
|
7
|
+
left: number;
|
|
8
|
+
top: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ScheduleChangeState {
|
|
11
|
+
open: boolean;
|
|
12
|
+
empId: number | null;
|
|
13
|
+
dayIdx: number | null;
|
|
14
|
+
}
|
|
15
|
+
export interface ScheduleSwapState {
|
|
16
|
+
open: boolean;
|
|
17
|
+
empId: number | null;
|
|
18
|
+
dayIdx: number | null;
|
|
19
|
+
/** Set when the swap came from dropping one shift on another: that shift is the only choice. */
|
|
20
|
+
preset: {
|
|
21
|
+
empId: number;
|
|
22
|
+
dayIdx: number;
|
|
23
|
+
} | null;
|
|
24
|
+
}
|
|
25
|
+
/** The shift card's "⋯" menu (Change employee / Swap shifts / Edit / Remove), plus the two
|
|
26
|
+
* dialogs it opens that the rest of Phase 1 didn't need: handing a shift to somebody else,
|
|
27
|
+
* and trading two people's shifts on the same day. Both skip the mockup's OT/pay-band cost
|
|
28
|
+
* preview and hard/soft override tiers — this board has no per-person pay bands to price
|
|
29
|
+
* against, so a candidate is either qualified-and-free or it isn't offered at all. */
|
|
30
|
+
export declare function useScheduleShiftActions(board: ScheduleBoardApi): {
|
|
31
|
+
menu: {
|
|
32
|
+
open: boolean;
|
|
33
|
+
empId: number | null;
|
|
34
|
+
dayIdx: number | null;
|
|
35
|
+
left: number;
|
|
36
|
+
top: number;
|
|
37
|
+
};
|
|
38
|
+
openMenu: (empId: number, dayIdx: number, anchor: HTMLElement) => void;
|
|
39
|
+
closeMenu: () => void;
|
|
40
|
+
change: {
|
|
41
|
+
open: boolean;
|
|
42
|
+
empId: number | null;
|
|
43
|
+
dayIdx: number | null;
|
|
44
|
+
};
|
|
45
|
+
changeSlot: import("vue").ComputedRef<import("../types").WorkSlot[]>;
|
|
46
|
+
changeCandidates: import("vue").ComputedRef<{
|
|
47
|
+
id: number;
|
|
48
|
+
name: string;
|
|
49
|
+
role: string;
|
|
50
|
+
initials: string;
|
|
51
|
+
color: string;
|
|
52
|
+
weekHours: number;
|
|
53
|
+
pct: number;
|
|
54
|
+
contractHours?: number | undefined;
|
|
55
|
+
rate: number;
|
|
56
|
+
positions: string[];
|
|
57
|
+
shifts: ({
|
|
58
|
+
start: string;
|
|
59
|
+
end: string;
|
|
60
|
+
role: string;
|
|
61
|
+
status: import("../types").ShiftStatus;
|
|
62
|
+
clock?: {
|
|
63
|
+
in: string | null;
|
|
64
|
+
out: string | null;
|
|
65
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
66
|
+
} | undefined;
|
|
67
|
+
conflict?: boolean | undefined;
|
|
68
|
+
conflictReason?: string | undefined;
|
|
69
|
+
openId?: number | undefined;
|
|
70
|
+
breakMins?: number | undefined;
|
|
71
|
+
assignmentId?: string | undefined;
|
|
72
|
+
} | {
|
|
73
|
+
timeOff: "approved" | "pending";
|
|
74
|
+
reason: string;
|
|
75
|
+
half?: boolean | undefined;
|
|
76
|
+
halfPart?: "AM" | "PM" | undefined;
|
|
77
|
+
from?: string | undefined;
|
|
78
|
+
to?: string | undefined;
|
|
79
|
+
appliedOn?: string | undefined;
|
|
80
|
+
note?: string | undefined;
|
|
81
|
+
cert?: {
|
|
82
|
+
name: string;
|
|
83
|
+
size: string;
|
|
84
|
+
} | null | undefined;
|
|
85
|
+
bal?: {
|
|
86
|
+
type: string;
|
|
87
|
+
entitled: number;
|
|
88
|
+
used: number;
|
|
89
|
+
} | undefined;
|
|
90
|
+
} | {
|
|
91
|
+
start: string;
|
|
92
|
+
end: string;
|
|
93
|
+
role: string;
|
|
94
|
+
status: import("../types").ShiftStatus;
|
|
95
|
+
clock?: {
|
|
96
|
+
in: string | null;
|
|
97
|
+
out: string | null;
|
|
98
|
+
status: "on-time" | "late" | "early-out" | "absent";
|
|
99
|
+
} | undefined;
|
|
100
|
+
conflict?: boolean | undefined;
|
|
101
|
+
conflictReason?: string | undefined;
|
|
102
|
+
openId?: number | undefined;
|
|
103
|
+
breakMins?: number | undefined;
|
|
104
|
+
assignmentId?: string | undefined;
|
|
105
|
+
}[] | null)[];
|
|
106
|
+
remarks: {
|
|
107
|
+
author: string;
|
|
108
|
+
date: string;
|
|
109
|
+
type: "note" | "warning" | "praise";
|
|
110
|
+
text: string;
|
|
111
|
+
}[];
|
|
112
|
+
section: string;
|
|
113
|
+
compGroup?: string | undefined;
|
|
114
|
+
mobile?: string | undefined;
|
|
115
|
+
dial?: string | undefined;
|
|
116
|
+
locations?: string[] | undefined;
|
|
117
|
+
payBasis?: "hourly" | "monthly" | undefined;
|
|
118
|
+
payAmount?: number | undefined;
|
|
119
|
+
maxHours?: number | undefined;
|
|
120
|
+
maxOtHours?: number | undefined;
|
|
121
|
+
minHours?: number | undefined;
|
|
122
|
+
otAfterDaily?: number | undefined;
|
|
123
|
+
preferences?: string[] | undefined;
|
|
124
|
+
seniority?: "senior" | "junior" | "" | undefined;
|
|
125
|
+
availDays?: boolean[] | undefined;
|
|
126
|
+
availHours?: {
|
|
127
|
+
from: string;
|
|
128
|
+
to: string;
|
|
129
|
+
}[] | undefined;
|
|
130
|
+
passcode?: string | undefined;
|
|
131
|
+
masterUser?: boolean | undefined;
|
|
132
|
+
}[]>;
|
|
133
|
+
openChange: (empId: number, dayIdx: number) => void;
|
|
134
|
+
closeChange: () => void;
|
|
135
|
+
confirmChange: (toId: number) => void;
|
|
136
|
+
swap: {
|
|
137
|
+
open: boolean;
|
|
138
|
+
empId: number | null;
|
|
139
|
+
dayIdx: number | null;
|
|
140
|
+
preset: {
|
|
141
|
+
empId: number;
|
|
142
|
+
dayIdx: number;
|
|
143
|
+
} | null;
|
|
144
|
+
};
|
|
145
|
+
swapSlot: import("vue").ComputedRef<import("../types").WorkSlot[]>;
|
|
146
|
+
swapCandidates: import("vue").ComputedRef<{
|
|
147
|
+
emp: Employee;
|
|
148
|
+
dayIdx: number;
|
|
149
|
+
slot: import("../types").WorkSlot[];
|
|
150
|
+
soft: string | null;
|
|
151
|
+
}[]>;
|
|
152
|
+
swapPreset: import("vue").ComputedRef<{
|
|
153
|
+
emp: Employee;
|
|
154
|
+
dayIdx: number;
|
|
155
|
+
slot: import("../types").WorkSlot[];
|
|
156
|
+
soft: string | null;
|
|
157
|
+
} | null>;
|
|
158
|
+
openSwap: (empId: number, dayIdx: number, preset?: ScheduleSwapState["preset"]) => void;
|
|
159
|
+
closeSwap: () => void;
|
|
160
|
+
confirmSwap: (toEmpId: number, toDayIdx: number) => void;
|
|
161
|
+
removeShift: (empId: number, dayIdx: number) => void;
|
|
162
|
+
};
|
|
163
|
+
export type ScheduleShiftActionsApi = ReturnType<typeof useScheduleShiftActions>;
|