@feedmepos/mf-hrm-portal 2.3.0-dev.8 → 2.3.0-dev.9

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 (81) hide show
  1. package/dist/{ApprovalCodeList-D5E_FN3f.js → ApprovalCodeList-BDpxEJpC.js} +2 -2
  2. package/dist/{AuditLogList-CqqiS2xW.js → AuditLogList-Dgwj1gz8.js} +3 -3
  3. package/dist/{ConditionBuilderForm.vue_vue_type_script_setup_true_lang-DC_oQTsP.js → ConditionBuilderForm.vue_vue_type_script_setup_true_lang-BBK2gl7r.js} +2 -2
  4. package/dist/{EmployeeList-ChMlGxmu.js → EmployeeList-C8cbVcmY.js} +4 -4
  5. package/dist/{GrantUserList-DA26W3K3.js → GrantUserList-zul0_Dlm.js} +3 -3
  6. package/dist/{Main-B27Qx8R2.js → Main-5TsFTFpc.js} +5 -5
  7. package/dist/{Main-C0gVAR92.js → Main-Cjo4FMZZ.js} +2 -2
  8. package/dist/{Main-m39gMG-a.js → Main-DSr9KbjT.js} +9 -9
  9. package/dist/{PermissionSetList-mdA65jmw.js → PermissionSetList-CDhiiu37.js} +5 -5
  10. package/dist/{PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Dp6bdEZp.js → PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DoK944l0.js} +1034 -1034
  11. package/dist/{RoleList-BPayuLxA.js → RoleList-DEbOPQD_.js} +7 -7
  12. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-Cx9jFgBS.js +492 -0
  13. package/dist/ScheduleGeneralPage-B8PWNsc2.js +776 -0
  14. package/dist/{ScheduleModal.vue_vue_type_script_setup_true_lang-ABipaQiR.js → ScheduleModal.vue_vue_type_script_setup_true_lang-V1sZ_xhO.js} +765 -717
  15. package/dist/SchedulePage-ndLByVBl.js +17785 -0
  16. package/dist/{SchedulePositionPage-BUQy-Itg.js → SchedulePositionPage-Cuv4ydOK.js} +22 -22
  17. package/dist/{TeamMemberList-CIlvRlf8.js → TeamMemberList-DpCGqHCk.js} +6 -6
  18. package/dist/{TimesheetList-DFAfhWYG.js → TimesheetList-B7HAC5zS.js} +5 -5
  19. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-QGzHuY7V.js → TimesheetList.vue_vue_type_style_index_0_scoped_63294af2_lang-BGD6m5M-.js} +2 -2
  20. package/dist/{app-C_EW9DFr.js → app-Lh0cqgHy.js} +8 -8
  21. package/dist/app.js +1 -1
  22. package/dist/{dayjs.min-ibysRBBa.js → dayjs.min-joq4stsa.js} +1 -1
  23. package/dist/{employee-B1BQc4gB.js → employee-BPmp9c6i.js} +3 -3
  24. package/dist/{iteration-DQVB-iz0.js → iteration-jvdTHQUx.js} +1 -1
  25. package/dist/{lodash-DOj41a0A.js → lodash-CIAEpr9s.js} +1 -1
  26. package/dist/{role-B9MSLu4B.js → role-Dd1TUMhn.js} +1 -1
  27. package/dist/{rule-e6okoXK6.js → rule-DmxI7qEY.js} +2 -2
  28. package/dist/src/api/schedule/index.d.ts +2 -1
  29. package/dist/src/types/schedule.d.ts +3 -4
  30. package/dist/src/views/scheduling/components/ScheduleAreaRows.vue.d.ts +0 -8
  31. package/dist/src/views/scheduling/components/ScheduleBoardAreaRows.vue.d.ts +0 -5
  32. package/dist/src/views/scheduling/components/ScheduleBoardEditOverlays.vue.d.ts +0 -2
  33. package/dist/src/views/scheduling/components/ScheduleBoardEmployeeRows.vue.d.ts +0 -7
  34. package/dist/src/views/scheduling/components/ScheduleBoardInteractionOverlays.vue.d.ts +0 -6
  35. package/dist/src/views/scheduling/components/ScheduleContextMenu.vue.d.ts +1 -5
  36. package/dist/src/views/scheduling/components/ScheduleSelect.vue.d.ts +10 -0
  37. package/dist/src/views/scheduling/components/ScheduleStaffRows.vue.d.ts +0 -10
  38. package/dist/src/views/scheduling/composables/schedule-add-employee-form.d.ts +12 -8
  39. package/dist/src/views/scheduling/composables/useScheduleAddEmployee.d.ts +21 -9
  40. package/dist/src/views/scheduling/composables/useScheduleAreaBoard.d.ts +0 -13
  41. package/dist/src/views/scheduling/composables/useScheduleAreaDragDrop.d.ts +2 -8
  42. package/dist/src/views/scheduling/composables/useScheduleAutoSchedule.d.ts +3 -0
  43. package/dist/src/views/scheduling/composables/useScheduleBoard.d.ts +29 -4
  44. package/dist/src/views/scheduling/composables/useScheduleDayTimeline.d.ts +0 -3
  45. package/dist/src/views/scheduling/composables/useScheduleDemand.d.ts +3 -5
  46. package/dist/src/views/scheduling/composables/useScheduleDemandSheet.d.ts +11 -3
  47. package/dist/src/views/scheduling/composables/useScheduleEmployeeAccess.d.ts +7 -2
  48. package/dist/src/views/scheduling/composables/useScheduleEmployeeAvailability.d.ts +1 -1
  49. package/dist/src/views/scheduling/composables/useScheduleEmployeeCandidates.d.ts +1 -0
  50. package/dist/src/views/scheduling/composables/useScheduleEmployeePersistence.d.ts +4 -0
  51. package/dist/src/views/scheduling/composables/useScheduleEmployeeValidation.d.ts +2 -0
  52. package/dist/src/views/scheduling/composables/useScheduleGapPopover.d.ts +2 -0
  53. package/dist/src/views/scheduling/composables/useScheduleOnboardingEmployees.d.ts +21 -3
  54. package/dist/src/views/scheduling/composables/useScheduleOnboardingWizard.d.ts +99 -22
  55. package/dist/src/views/scheduling/composables/useSchedulePageOverlays.d.ts +0 -4
  56. package/dist/src/views/scheduling/composables/useSchedulePositionModal.d.ts +1 -0
  57. package/dist/src/views/scheduling/composables/useSchedulePositions.d.ts +1 -1
  58. package/dist/src/views/scheduling/composables/useSchedulePublish.d.ts +2 -0
  59. package/dist/src/views/scheduling/composables/useScheduleRoster.d.ts +24 -4
  60. package/dist/src/views/scheduling/composables/useScheduleSettings.d.ts +7 -2
  61. package/dist/src/views/scheduling/composables/useScheduleShiftActions.d.ts +12 -2
  62. package/dist/src/views/scheduling/composables/useScheduleShiftDraft.d.ts +1 -0
  63. package/dist/src/views/scheduling/composables/useScheduleShiftPopover.d.ts +15 -3
  64. package/dist/src/views/scheduling/country-rules/index.d.ts +4 -4
  65. package/dist/src/views/scheduling/data.d.ts +5 -1
  66. package/dist/src/views/scheduling/schedule-state.d.ts +76 -12
  67. package/dist/src/views/scheduling/schedule-store.d.ts +12 -5
  68. package/dist/src/views/scheduling/types.d.ts +22 -5
  69. package/dist/style.css +1 -1
  70. package/dist/tsconfig.app.tsbuildinfo +1 -1
  71. package/dist/{useReportPermissions-CJ9ey1bN.js → useReportPermissions-DM3GOFCC.js} +3 -3
  72. package/package.json +1 -1
  73. package/dist/ScheduleAddPositionModal.vue_vue_type_script_setup_true_lang-C_EQivMd.js +0 -470
  74. package/dist/ScheduleGeneralPage-sAqR1-hf.js +0 -666
  75. package/dist/SchedulePage-DhbtCR8U.js +0 -18546
  76. package/dist/src/views/scheduling/components/ScheduleAllShiftsRow.vue.d.ts +0 -22
  77. package/dist/src/views/scheduling/components/ScheduleAssignEmployeePopover.vue.d.ts +0 -6
  78. package/dist/src/views/scheduling/components/ScheduleStackPopover.vue.d.ts +0 -14
  79. package/dist/src/views/scheduling/composables/useScheduleAllShiftsRow.d.ts +0 -77
  80. package/dist/src/views/scheduling/composables/useScheduleAssign.d.ts +0 -124
  81. package/dist/src/views/scheduling/composables/useScheduleOpenShiftCard.d.ts +0 -23
@@ -0,0 +1,776 @@
1
+ import { ref as w, reactive as B, computed as N, defineComponent as T, createBlock as I, openBlock as p, withCtx as b, createElementVNode as e, createVNode as k, createElementBlock as m, Fragment as L, createTextVNode as H, toDisplayString as h, withDirectives as f, vModelText as g, createCommentVNode as A, renderList as V, onMounted as z, unref as o, normalizeClass as U } from "vue";
2
+ import { useRouter as W } from "vue-router";
3
+ import { useSnackbar as Y } from "@feedmepos/ui-library";
4
+ import { R as q } from "./app-Lh0cqgHy.js";
5
+ import { b as v, o as M, L as E, g as G, aq as F, ao as x, as as j, at as J, aa as K, ap as Q } from "./ScheduleModal.vue_vue_type_script_setup_true_lang-V1sZ_xhO.js";
6
+ import "./iteration-jvdTHQUx.js";
7
+ import { useCoreStore as X } from "@feedmepos/mf-common";
8
+ import "./employee-BPmp9c6i.js";
9
+ const Z = [
10
+ { key: "payrates", label: "Pay rates" },
11
+ { key: "overtime", label: "Overtime" },
12
+ { key: "workingHours", label: "Working hours" }
13
+ ];
14
+ function $() {
15
+ return structuredClone({
16
+ // RULES is reactive, so spreading each rate tier first gives structuredClone plain
17
+ // objects instead of Vue Proxy instances, which structuredClone cannot clone.
18
+ payRate: {
19
+ NORMAL: { ...v.payRate.NORMAL },
20
+ REST_DAY: { ...v.payRate.REST_DAY },
21
+ PUBLIC_HOLIDAY: { ...v.payRate.PUBLIC_HOLIDAY }
22
+ },
23
+ otCapHours: v.otCapHours,
24
+ workingHours: { ...v.workingHours }
25
+ });
26
+ }
27
+ function _() {
28
+ const l = X(), d = w(!1), a = w("payrates"), r = B($()), t = w(!1);
29
+ let u = 0;
30
+ async function C() {
31
+ if (!M.value) return;
32
+ const c = ++u, i = M.value;
33
+ t.value = !0;
34
+ try {
35
+ const s = await E.getSettings(i);
36
+ if (c !== u || M.value !== i) return;
37
+ const n = G(l.currentCountry.value);
38
+ v.payRate = structuredClone(s.settingsConfigured ? s.payRate : n.payRate), v.otCapHours = s.settingsConfigured ? s.overtime.maxHoursPerMonth : n.overtime.maxHoursPerMonth, v.workingHours = s.settingsConfigured ? structuredClone(s.workingHours) : {
39
+ minHoursPerDay: null,
40
+ maxHoursPerDay: n.workingHours.maxHoursPerDay,
41
+ maxHoursPerWeek: n.workingHours.maxHoursPerWeek
42
+ };
43
+ } finally {
44
+ c === u && (t.value = !1);
45
+ }
46
+ }
47
+ function y(c) {
48
+ Object.assign(r, $()), a.value = c ?? "payrates", d.value = !0;
49
+ }
50
+ const S = N(() => JSON.stringify(r) !== JSON.stringify($()));
51
+ function P() {
52
+ return S.value ? !1 : (d.value = !1, !0);
53
+ }
54
+ function D() {
55
+ Object.assign(r, $()), d.value = !1;
56
+ }
57
+ async function R() {
58
+ if (!M.value) throw new Error("No outlet selected");
59
+ const c = r.otCapHours === 0 ? null : r.otCapHours;
60
+ if (c != null && c <= 0)
61
+ throw new Error("Maximum monthly overtime hours must be greater than zero");
62
+ const i = {
63
+ minHoursPerDay: r.workingHours.minHoursPerDay === 0 ? null : r.workingHours.minHoursPerDay,
64
+ maxHoursPerDay: r.workingHours.maxHoursPerDay === 0 ? null : r.workingHours.maxHoursPerDay,
65
+ maxHoursPerWeek: r.workingHours.maxHoursPerWeek === 0 ? null : r.workingHours.maxHoursPerWeek
66
+ };
67
+ if (i.minHoursPerDay != null && i.maxHoursPerDay != null && i.minHoursPerDay > i.maxHoursPerDay)
68
+ throw new Error("Minimum daily working hours cannot exceed maximum daily working hours");
69
+ const s = await E.saveSettings(M.value, {
70
+ payRate: r.payRate,
71
+ overtime: { maxHoursPerMonth: c },
72
+ workingHours: i
73
+ });
74
+ v.payRate = structuredClone(s.payRate), v.otCapHours = s.overtime.maxHoursPerMonth, v.workingHours = structuredClone(s.workingHours), d.value = !1;
75
+ }
76
+ return { isOpen: d, activeSection: a, draft: r, dirty: S, loading: t, load: C, open: y, close: P, discard: D, save: R };
77
+ }
78
+ function ee(l, d = {}) {
79
+ const a = w(!1), r = w(""), t = w(/* @__PURE__ */ new Set()), u = w(!1), C = w(null), y = N(
80
+ () => {
81
+ var i;
82
+ return ((i = l.options.value.find((s) => s.value === l.outletId.value)) == null ? void 0 : i.label) ?? "";
83
+ }
84
+ ), S = N(() => {
85
+ const i = r.value.trim().toLowerCase();
86
+ return l.options.value.filter(
87
+ (s) => s.value !== l.outletId.value && (!i || s.label.toLowerCase().includes(i))
88
+ );
89
+ });
90
+ function P() {
91
+ r.value = "", t.value = /* @__PURE__ */ new Set(), u.value = !1, C.value = null, a.value = !0;
92
+ }
93
+ function D() {
94
+ a.value = !1;
95
+ }
96
+ function R(i) {
97
+ const s = new Set(t.value);
98
+ s.has(i) ? s.delete(i) : s.add(i), t.value = s;
99
+ }
100
+ async function c() {
101
+ var s, n;
102
+ const i = [...t.value];
103
+ if (!(!i.length || u.value)) {
104
+ u.value = !0;
105
+ try {
106
+ await Promise.all(
107
+ i.map(
108
+ (O) => E.saveSettings(O, {
109
+ payRate: v.payRate,
110
+ overtime: { maxHoursPerMonth: v.otCapHours },
111
+ workingHours: v.workingHours
112
+ })
113
+ )
114
+ ), C.value = i.length, (s = d.notify) == null || s.call(
115
+ d,
116
+ `Setup copied to ${i.length} outlet${i.length === 1 ? "" : "s"}`,
117
+ "success"
118
+ );
119
+ } catch (O) {
120
+ (n = d.notify) == null || n.call(
121
+ d,
122
+ O instanceof Error ? O.message : "Could not clone outlet setup",
123
+ "error"
124
+ );
125
+ } finally {
126
+ u.value = !1;
127
+ }
128
+ }
129
+ }
130
+ return {
131
+ open: a,
132
+ query: r,
133
+ selected: t,
134
+ saving: u,
135
+ done: C,
136
+ sourceLabel: y,
137
+ targets: S,
138
+ openModal: P,
139
+ close: D,
140
+ toggle: R,
141
+ confirm: c
142
+ };
143
+ }
144
+ const se = { class: "am-head" }, te = { class: "ce-body" }, ae = {
145
+ class: "ce-hint",
146
+ style: { "margin-bottom": "var(--fm-spacing-10)" }
147
+ }, oe = { class: "sch-search" }, le = { class: "asg-list" }, re = ["checked", "onChange"], ne = { class: "asg-id" }, ie = { class: "asg-nm" }, ue = {
148
+ key: 0,
149
+ class: "asg-empty"
150
+ }, de = {
151
+ key: 1,
152
+ class: "cg-done"
153
+ }, pe = { class: "cg-st-main" }, ve = { class: "am-foot" }, me = { class: "am-cost-preview" }, ce = { class: "am-foot-btns" }, ye = /* @__PURE__ */ T({
154
+ __name: "ScheduleCloneOutletModal",
155
+ props: {
156
+ modal: {}
157
+ },
158
+ setup(l) {
159
+ return (d, a) => (p(), I(F, {
160
+ open: l.modal.open.value,
161
+ "panel-class": "ce-modal",
162
+ "panel-style": "width: min(460px, 95vw)",
163
+ "labelled-by": "schedule-clone-title",
164
+ onClose: a[5] || (a[5] = (r) => l.modal.close())
165
+ }, {
166
+ default: b(() => [
167
+ e("div", se, [
168
+ a[7] || (a[7] = e("div", {
169
+ id: "schedule-clone-title",
170
+ class: "am-title"
171
+ }, "Clone outlet setup", -1)),
172
+ k(x, {
173
+ hierarchy: "ghost",
174
+ size: "xs",
175
+ "icon-only": "",
176
+ class: "ce-close-x",
177
+ type: "button",
178
+ "aria-label": "Close",
179
+ onClick: a[0] || (a[0] = (r) => l.modal.close())
180
+ }, {
181
+ default: b(() => [...a[6] || (a[6] = [
182
+ e("svg", {
183
+ width: "20",
184
+ height: "20",
185
+ viewBox: "0 0 20 20",
186
+ fill: "none",
187
+ stroke: "currentColor",
188
+ "stroke-width": "1.8",
189
+ "stroke-linecap": "round",
190
+ "aria-hidden": "true"
191
+ }, [
192
+ e("path", { d: "M5.5 5.5l9 9M14.5 5.5l-9 9" })
193
+ ], -1)
194
+ ])]),
195
+ _: 1
196
+ })
197
+ ]),
198
+ e("div", te, [
199
+ l.modal.done.value === null ? (p(), m(L, { key: 0 }, [
200
+ e("div", ae, [
201
+ a[8] || (a[8] = H(" Copy ", -1)),
202
+ e("b", null, h(l.modal.sourceLabel.value), 1),
203
+ a[9] || (a[9] = H("'s pay rates to: ", -1))
204
+ ]),
205
+ e("div", oe, [
206
+ a[10] || (a[10] = e("svg", {
207
+ width: "16",
208
+ height: "16",
209
+ viewBox: "0 0 16 16",
210
+ fill: "none",
211
+ "aria-hidden": "true"
212
+ }, [
213
+ e("circle", {
214
+ cx: "7",
215
+ cy: "7",
216
+ r: "4.5",
217
+ stroke: "currentColor",
218
+ "stroke-width": "1.5"
219
+ }),
220
+ e("path", {
221
+ d: "M10.5 10.5L14 14",
222
+ stroke: "currentColor",
223
+ "stroke-width": "1.5",
224
+ "stroke-linecap": "round"
225
+ })
226
+ ], -1)),
227
+ f(e("input", {
228
+ "onUpdate:modelValue": a[1] || (a[1] = (r) => l.modal.query.value = r),
229
+ type: "search",
230
+ placeholder: "Search outlets",
231
+ "aria-label": "Search outlets",
232
+ autocomplete: "off"
233
+ }, null, 512), [
234
+ [g, l.modal.query.value]
235
+ ])
236
+ ]),
237
+ e("div", le, [
238
+ (p(!0), m(L, null, V(l.modal.targets.value, (r) => (p(), m("label", {
239
+ key: r.value,
240
+ class: "asg-row"
241
+ }, [
242
+ e("input", {
243
+ type: "checkbox",
244
+ class: "sch-checkbox",
245
+ "data-platform": "desktop",
246
+ checked: l.modal.selected.value.has(r.value),
247
+ onChange: (t) => l.modal.toggle(r.value)
248
+ }, null, 40, re),
249
+ e("span", ne, [
250
+ e("span", ie, h(r.label), 1)
251
+ ])
252
+ ]))), 128)),
253
+ l.modal.targets.value.length ? A("", !0) : (p(), m("div", ue, h(l.modal.query.value ? "No outlet matches that search." : "No other outlets."), 1))
254
+ ]),
255
+ a[11] || (a[11] = e("div", {
256
+ class: "ce-hint",
257
+ style: { "margin-top": "var(--fm-spacing-10)" }
258
+ }, " Copies this outlet's pay rates to the outlets you tick. Their current pay rates are replaced. ", -1))
259
+ ], 64)) : (p(), m("div", de, [
260
+ a[13] || (a[13] = e("span", {
261
+ class: "cg-done-tick",
262
+ "aria-hidden": "true"
263
+ }, "✓", -1)),
264
+ e("div", pe, [
265
+ a[12] || (a[12] = e("b", null, "Pay rates copied", -1)),
266
+ e("small", null, "Sent to " + h(l.modal.done.value) + " outlet" + h(l.modal.done.value === 1 ? "" : "s"), 1)
267
+ ])
268
+ ]))
269
+ ]),
270
+ e("div", ve, [
271
+ e("div", me, h(l.modal.done.value === null && l.modal.selected.value.size ? `${l.modal.selected.value.size} outlet${l.modal.selected.value.size === 1 ? "" : "s"} selected` : ""), 1),
272
+ e("div", ce, [
273
+ l.modal.done.value === null ? (p(), m(L, { key: 0 }, [
274
+ k(x, {
275
+ hierarchy: "secondary",
276
+ size: "sm",
277
+ class: "am-btn am-btn-sec",
278
+ type: "button",
279
+ onClick: a[2] || (a[2] = (r) => l.modal.close())
280
+ }, {
281
+ default: b(() => [...a[14] || (a[14] = [
282
+ H(" Cancel ", -1)
283
+ ])]),
284
+ _: 1
285
+ }),
286
+ k(x, {
287
+ hierarchy: "primary",
288
+ size: "sm",
289
+ class: "am-btn am-btn-primary",
290
+ type: "button",
291
+ disabled: !l.modal.selected.value.size || l.modal.saving.value,
292
+ onClick: a[3] || (a[3] = (r) => l.modal.confirm())
293
+ }, {
294
+ default: b(() => [
295
+ H(h(l.modal.saving.value ? "Copying…" : "Copy setup"), 1)
296
+ ]),
297
+ _: 1
298
+ }, 8, ["disabled"])
299
+ ], 64)) : (p(), I(x, {
300
+ key: 1,
301
+ hierarchy: "primary",
302
+ size: "sm",
303
+ class: "am-btn am-btn-primary",
304
+ type: "button",
305
+ onClick: a[4] || (a[4] = (r) => l.modal.close())
306
+ }, {
307
+ default: b(() => [...a[15] || (a[15] = [
308
+ H(" Done ", -1)
309
+ ])]),
310
+ _: 1
311
+ }))
312
+ ])
313
+ ])
314
+ ]),
315
+ _: 1
316
+ }, 8, ["open"]));
317
+ }
318
+ }), fe = { class: "main" }, ge = {
319
+ id: "viewSettings",
320
+ class: "view"
321
+ }, he = { class: "sp-head" }, we = { class: "outlet-bar" }, ke = { class: "sp-body" }, be = { class: "sp-tabs" }, He = ["onClick"], Ce = { class: "sp-content" }, xe = { class: "sp-panel" }, Se = {
322
+ key: 0,
323
+ id: "sp-payrates",
324
+ class: "sp-sec"
325
+ }, Pe = { class: "sp-card" }, De = { class: "sp-row" }, Re = { class: "sp-field" }, Oe = { class: "sp-row" }, Me = { class: "sp-field" }, $e = { class: "sp-row" }, Le = { class: "sp-field" }, Ne = { class: "sp-card" }, Ae = { class: "sp-row" }, Ee = { class: "sp-field" }, Ie = { class: "sp-row" }, Ue = { class: "sp-field" }, Te = {
326
+ key: 1,
327
+ id: "sp-working-hours",
328
+ class: "sp-sec"
329
+ }, Ve = { class: "sp-card" }, Be = { class: "sp-row" }, ze = { class: "sp-field" }, We = { class: "sp-row" }, Ye = { class: "sp-field" }, qe = { class: "sp-row" }, Ge = { class: "sp-field" }, Fe = {
330
+ key: 2,
331
+ id: "sp-overtime",
332
+ class: "sp-sec"
333
+ }, je = { class: "sp-card" }, Je = { class: "sp-row" }, Ke = { class: "sp-save-txt" }, Qe = { key: 0 }, ls = /* @__PURE__ */ T({
334
+ __name: "ScheduleGeneralPage",
335
+ setup(l) {
336
+ const d = w(null);
337
+ j(d);
338
+ const a = W(), r = Y(), t = _(), u = J(), C = ee(u, {
339
+ notify: (i, s) => r.open({ message: i, type: s })
340
+ }), y = w(!1);
341
+ z(async () => {
342
+ await u.resolve() && await K(/* @__PURE__ */ new Date()), await t.load(), t.open();
343
+ });
344
+ const S = N(
345
+ () => u.options.value.length ? u.options.value : [{ value: "", label: "No outlet selected", disabled: !0 }]
346
+ );
347
+ async function P(i) {
348
+ t.dirty.value || await u.switchTo(i, /* @__PURE__ */ new Date()) && (await t.load(), t.open());
349
+ }
350
+ function D() {
351
+ t.close() && a.push({ name: q.SCHEDULE });
352
+ }
353
+ function R() {
354
+ if (!y.value) {
355
+ y.value = !0;
356
+ return;
357
+ }
358
+ y.value = !1, t.discard();
359
+ }
360
+ async function c() {
361
+ try {
362
+ await t.save(), r.open({ message: "General settings saved", type: "success" });
363
+ } catch (i) {
364
+ r.open({
365
+ message: i instanceof Error ? i.message : "Could not save general settings",
366
+ type: "error"
367
+ });
368
+ }
369
+ }
370
+ return (i, s) => (p(), m("div", {
371
+ ref_key: "rootEl",
372
+ ref: d,
373
+ class: "sch"
374
+ }, [
375
+ e("div", fe, [
376
+ e("div", ge, [
377
+ e("div", he, [
378
+ k(x, {
379
+ hierarchy: "ghost",
380
+ size: "sm",
381
+ class: "sp-back",
382
+ type: "button",
383
+ onClick: D
384
+ }, {
385
+ default: b(() => [...s[12] || (s[12] = [
386
+ e("svg", {
387
+ width: "12",
388
+ height: "12",
389
+ viewBox: "0 0 16 16",
390
+ fill: "none",
391
+ "aria-hidden": "true"
392
+ }, [
393
+ e("path", {
394
+ d: "M10 3.5L5.5 8l4.5 4.5",
395
+ stroke: "currentColor",
396
+ "stroke-width": "1.7",
397
+ "stroke-linecap": "round",
398
+ "stroke-linejoin": "round"
399
+ })
400
+ ], -1),
401
+ e("span", null, "Back to schedule", -1)
402
+ ])]),
403
+ _: 1
404
+ }),
405
+ s[15] || (s[15] = e("div", { class: "sp-title" }, "General Settings", -1)),
406
+ s[16] || (s[16] = e("div", { class: "sp-sub" }, "Pay multipliers and overtime limit for this outlet.", -1)),
407
+ e("div", we, [
408
+ s[14] || (s[14] = e("span", { class: "outlet-bar-lbl" }, "Outlet", -1)),
409
+ k(Q, {
410
+ class: "outlet-sel",
411
+ "aria-label": "Outlet being configured",
412
+ searchable: "",
413
+ disabled: o(t).dirty.value || o(t).loading.value,
414
+ title: o(t).dirty.value ? "Save or discard changes before switching outlets" : "Which outlet these pay rates apply to",
415
+ "model-value": o(u).outletId.value,
416
+ options: S.value,
417
+ "onUpdate:modelValue": P
418
+ }, null, 8, ["disabled", "title", "model-value", "options"]),
419
+ k(x, {
420
+ hierarchy: "secondary",
421
+ size: "sm",
422
+ class: "outlet-clone",
423
+ type: "button",
424
+ disabled: o(t).dirty.value || o(t).loading.value || !o(u).outletId.value,
425
+ title: o(t).dirty.value ? "Save or discard changes before cloning" : "Copy this outlet's pay rates to other outlets",
426
+ onClick: s[0] || (s[0] = (n) => o(C).openModal())
427
+ }, {
428
+ default: b(() => [...s[13] || (s[13] = [
429
+ e("svg", {
430
+ width: "12",
431
+ height: "12",
432
+ viewBox: "0 0 16 16",
433
+ fill: "none",
434
+ "aria-hidden": "true"
435
+ }, [
436
+ e("rect", {
437
+ x: "5.5",
438
+ y: "5.5",
439
+ width: "8.5",
440
+ height: "8.5",
441
+ rx: "1.5",
442
+ stroke: "currentColor",
443
+ "stroke-width": "1.4"
444
+ }),
445
+ e("path", {
446
+ d: "M10.5 5.5V3.2A1.6 1.6 0 0 0 8.9 1.6H3.2A1.6 1.6 0 0 0 1.6 3.2v5.7a1.6 1.6 0 0 0 1.6 1.6h2.3",
447
+ stroke: "currentColor",
448
+ "stroke-width": "1.4",
449
+ "stroke-linecap": "round"
450
+ })
451
+ ], -1),
452
+ H(" Clone setup to… ", -1)
453
+ ])]),
454
+ _: 1
455
+ }, 8, ["disabled", "title"])
456
+ ])
457
+ ]),
458
+ e("div", ke, [
459
+ e("nav", be, [
460
+ (p(!0), m(L, null, V(o(Z), (n) => (p(), m("button", {
461
+ key: n.key,
462
+ type: "button",
463
+ class: U(["sch-tab sp-tab", { active: o(t).activeSection.value === n.key }]),
464
+ "data-active": "false",
465
+ onClick: (O) => o(t).activeSection.value = n.key
466
+ }, h(n.label), 11, He))), 128))
467
+ ]),
468
+ e("div", Ce, [
469
+ e("div", xe, [
470
+ o(t).activeSection.value === "payrates" ? (p(), m("section", Se, [
471
+ s[29] || (s[29] = e("div", { class: "sp-sec-head" }, [
472
+ e("div", { class: "sp-panel-title" }, "Pay rates")
473
+ ], -1)),
474
+ s[30] || (s[30] = e("div", { class: "sp-panel-desc" }, "Pay multipliers by kind of day.", -1)),
475
+ e("div", Pe, [
476
+ s[23] || (s[23] = e("div", { class: "sp-card-head" }, [
477
+ e("div", { class: "sp-card-title" }, "Overtime rate"),
478
+ e("div", { class: "sp-card-note" }, "Multiplier on every OT hour")
479
+ ], -1)),
480
+ e("div", De, [
481
+ s[18] || (s[18] = e("div", { class: "sp-row-main" }, [
482
+ e("div", { class: "sp-row-label" }, "Normal operations day"),
483
+ e("div", { class: "sp-row-hint" }, " Multiplier on their rate for hours past the weekly contract. ")
484
+ ], -1)),
485
+ e("div", Re, [
486
+ f(e("input", {
487
+ "onUpdate:modelValue": s[1] || (s[1] = (n) => o(t).draft.payRate.NORMAL.overtime = n),
488
+ class: "sch-input sp-num",
489
+ type: "number",
490
+ min: "1",
491
+ max: "4",
492
+ step: "0.1",
493
+ "aria-label": "Overtime rate on a normal day"
494
+ }, null, 512), [
495
+ [
496
+ g,
497
+ o(t).draft.payRate.NORMAL.overtime,
498
+ void 0,
499
+ { number: !0 }
500
+ ]
501
+ ]),
502
+ s[17] || (s[17] = e("span", { class: "sp-unit" }, "×", -1))
503
+ ])
504
+ ]),
505
+ e("div", Oe, [
506
+ s[20] || (s[20] = e("div", { class: "sp-row-main" }, [
507
+ e("div", { class: "sp-row-label" }, "Off day"),
508
+ e("div", { class: "sp-row-hint" }, " For a shift on the person's off day, weekly or booked. Check the rate with HR. ")
509
+ ], -1)),
510
+ e("div", Me, [
511
+ f(e("input", {
512
+ "onUpdate:modelValue": s[2] || (s[2] = (n) => o(t).draft.payRate.REST_DAY.overtime = n),
513
+ class: "sch-input sp-num",
514
+ type: "number",
515
+ min: "1",
516
+ max: "4",
517
+ step: "0.1",
518
+ "aria-label": "Overtime rate on an off day"
519
+ }, null, 512), [
520
+ [
521
+ g,
522
+ o(t).draft.payRate.REST_DAY.overtime,
523
+ void 0,
524
+ { number: !0 }
525
+ ]
526
+ ]),
527
+ s[19] || (s[19] = e("span", { class: "sp-unit" }, "×", -1))
528
+ ])
529
+ ]),
530
+ e("div", $e, [
531
+ s[22] || (s[22] = e("div", { class: "sp-row-main" }, [
532
+ e("div", { class: "sp-row-label" }, "Public holiday"),
533
+ e("div", { class: "sp-row-hint" }, " For dates on the holiday calendar. Wins over an off day on the same date. ")
534
+ ], -1)),
535
+ e("div", Le, [
536
+ f(e("input", {
537
+ "onUpdate:modelValue": s[3] || (s[3] = (n) => o(t).draft.payRate.PUBLIC_HOLIDAY.overtime = n),
538
+ class: "sch-input sp-num",
539
+ type: "number",
540
+ min: "1",
541
+ max: "4",
542
+ step: "0.1",
543
+ "aria-label": "Overtime rate on a public holiday"
544
+ }, null, 512), [
545
+ [
546
+ g,
547
+ o(t).draft.payRate.PUBLIC_HOLIDAY.overtime,
548
+ void 0,
549
+ { number: !0 }
550
+ ]
551
+ ]),
552
+ s[21] || (s[21] = e("span", { class: "sp-unit" }, "×", -1))
553
+ ])
554
+ ])
555
+ ]),
556
+ e("div", Ne, [
557
+ s[28] || (s[28] = e("div", { class: "sp-card-head" }, [
558
+ e("div", { class: "sp-card-title" }, "Regular rate"),
559
+ e("div", { class: "sp-card-note" }, "Multiplier on ordinary hours")
560
+ ], -1)),
561
+ e("div", Ae, [
562
+ s[25] || (s[25] = e("div", { class: "sp-row-main" }, [
563
+ e("div", { class: "sp-row-label" }, "Off day"),
564
+ e("div", { class: "sp-row-hint" }, "Ordinary hours worked on the person's off day.")
565
+ ], -1)),
566
+ e("div", Ee, [
567
+ f(e("input", {
568
+ "onUpdate:modelValue": s[4] || (s[4] = (n) => o(t).draft.payRate.REST_DAY.regular = n),
569
+ class: "sch-input sp-num",
570
+ type: "number",
571
+ min: "1",
572
+ max: "4",
573
+ step: "0.1",
574
+ "aria-label": "Regular rate on an off day"
575
+ }, null, 512), [
576
+ [
577
+ g,
578
+ o(t).draft.payRate.REST_DAY.regular,
579
+ void 0,
580
+ { number: !0 }
581
+ ]
582
+ ]),
583
+ s[24] || (s[24] = e("span", { class: "sp-unit" }, "×", -1))
584
+ ])
585
+ ]),
586
+ e("div", Ie, [
587
+ s[27] || (s[27] = e("div", { class: "sp-row-main" }, [
588
+ e("div", { class: "sp-row-label" }, "Public holiday"),
589
+ e("div", { class: "sp-row-hint" }, " Ordinary hours worked on a date on the holiday calendar. ")
590
+ ], -1)),
591
+ e("div", Ue, [
592
+ f(e("input", {
593
+ "onUpdate:modelValue": s[5] || (s[5] = (n) => o(t).draft.payRate.PUBLIC_HOLIDAY.regular = n),
594
+ class: "sch-input sp-num",
595
+ type: "number",
596
+ min: "1",
597
+ max: "4",
598
+ step: "0.1",
599
+ "aria-label": "Regular rate on a public holiday"
600
+ }, null, 512), [
601
+ [
602
+ g,
603
+ o(t).draft.payRate.PUBLIC_HOLIDAY.regular,
604
+ void 0,
605
+ { number: !0 }
606
+ ]
607
+ ]),
608
+ s[26] || (s[26] = e("span", { class: "sp-unit" }, "×", -1))
609
+ ])
610
+ ])
611
+ ])
612
+ ])) : o(t).activeSection.value === "workingHours" ? (p(), m("section", Te, [
613
+ s[38] || (s[38] = e("div", { class: "sp-sec-head" }, [
614
+ e("div", { class: "sp-panel-title" }, "Working hours")
615
+ ], -1)),
616
+ s[39] || (s[39] = e("div", { class: "sp-panel-desc" }, "Default employee working-hour limits when no individual setting is provided.", -1)),
617
+ e("div", Ve, [
618
+ s[37] || (s[37] = e("div", { class: "sp-card-head" }, [
619
+ e("div", { class: "sp-card-title" }, "Default working hours"),
620
+ e("div", { class: "sp-card-note" }, "Used as the employee default")
621
+ ], -1)),
622
+ e("div", Be, [
623
+ s[32] || (s[32] = e("div", { class: "sp-row-main" }, [
624
+ e("div", { class: "sp-row-label" }, "Min hours per day")
625
+ ], -1)),
626
+ e("div", ze, [
627
+ f(e("input", {
628
+ "onUpdate:modelValue": s[6] || (s[6] = (n) => o(t).draft.workingHours.minHoursPerDay = n),
629
+ class: "sch-input sp-num",
630
+ type: "number",
631
+ min: "0",
632
+ max: "24",
633
+ step: "1",
634
+ placeholder: "None",
635
+ "aria-label": "Default minimum working hours per day"
636
+ }, null, 512), [
637
+ [
638
+ g,
639
+ o(t).draft.workingHours.minHoursPerDay,
640
+ void 0,
641
+ { number: !0 }
642
+ ]
643
+ ]),
644
+ s[31] || (s[31] = e("span", { class: "sp-unit" }, "hours / day", -1))
645
+ ])
646
+ ]),
647
+ e("div", We, [
648
+ s[34] || (s[34] = e("div", { class: "sp-row-main" }, [
649
+ e("div", { class: "sp-row-label" }, "Max hours per day")
650
+ ], -1)),
651
+ e("div", Ye, [
652
+ f(e("input", {
653
+ "onUpdate:modelValue": s[7] || (s[7] = (n) => o(t).draft.workingHours.maxHoursPerDay = n),
654
+ class: "sch-input sp-num",
655
+ type: "number",
656
+ min: "0",
657
+ max: "24",
658
+ step: "1",
659
+ placeholder: "None",
660
+ "aria-label": "Default maximum working hours per day"
661
+ }, null, 512), [
662
+ [
663
+ g,
664
+ o(t).draft.workingHours.maxHoursPerDay,
665
+ void 0,
666
+ { number: !0 }
667
+ ]
668
+ ]),
669
+ s[33] || (s[33] = e("span", { class: "sp-unit" }, "hours / day", -1))
670
+ ])
671
+ ]),
672
+ e("div", qe, [
673
+ s[36] || (s[36] = e("div", { class: "sp-row-main" }, [
674
+ e("div", { class: "sp-row-label" }, "Max hours per week")
675
+ ], -1)),
676
+ e("div", Ge, [
677
+ f(e("input", {
678
+ "onUpdate:modelValue": s[8] || (s[8] = (n) => o(t).draft.workingHours.maxHoursPerWeek = n),
679
+ class: "sch-input sp-num",
680
+ type: "number",
681
+ min: "0",
682
+ max: "168",
683
+ step: "1",
684
+ placeholder: "None",
685
+ "aria-label": "Default maximum working hours per week"
686
+ }, null, 512), [
687
+ [
688
+ g,
689
+ o(t).draft.workingHours.maxHoursPerWeek,
690
+ void 0,
691
+ { number: !0 }
692
+ ]
693
+ ]),
694
+ s[35] || (s[35] = e("span", { class: "sp-unit" }, "hours / week", -1))
695
+ ])
696
+ ])
697
+ ])
698
+ ])) : o(t).activeSection.value === "overtime" ? (p(), m("section", Fe, [
699
+ s[42] || (s[42] = e("div", { class: "sp-sec-head" }, [
700
+ e("div", { class: "sp-panel-title" }, "Overtime")
701
+ ], -1)),
702
+ s[43] || (s[43] = e("div", { class: "sp-panel-desc" }, "The monthly statutory cap on overtime hours.", -1)),
703
+ e("div", je, [
704
+ s[41] || (s[41] = e("div", { class: "sp-card-head" }, [
705
+ e("div", { class: "sp-card-title" }, "Maximum OT Hours"),
706
+ e("div", { class: "sp-card-note" }, "Enforced")
707
+ ], -1)),
708
+ e("div", Je, [
709
+ s[40] || (s[40] = e("div", { class: "sp-row-main" }, [
710
+ e("div", { class: "sp-row-label" }, "Monthly OT cap"),
711
+ e("div", { class: "sp-row-hint" }, " Hours per person per month. Auto-Schedule never exceeds it. ")
712
+ ], -1)),
713
+ f(e("input", {
714
+ "onUpdate:modelValue": s[9] || (s[9] = (n) => o(t).draft.otCapHours = n),
715
+ class: "sch-input sp-num",
716
+ type: "number",
717
+ min: "0",
718
+ max: "300",
719
+ step: "1",
720
+ placeholder: "None",
721
+ "aria-label": "Monthly OT cap in hours"
722
+ }, null, 512), [
723
+ [
724
+ g,
725
+ o(t).draft.otCapHours,
726
+ void 0,
727
+ { number: !0 }
728
+ ]
729
+ ])
730
+ ])
731
+ ])
732
+ ])) : A("", !0)
733
+ ])
734
+ ]),
735
+ e("div", {
736
+ class: U(["sp-save", { dirty: o(t).dirty.value, arming: y.value }])
737
+ }, [
738
+ e("div", Ke, [
739
+ H(h(y.value ? "Discard unsaved changes?" : "Unsaved changes") + " ", 1),
740
+ y.value ? A("", !0) : (p(), m("span", Qe, "— save or discard before leaving."))
741
+ ]),
742
+ k(x, {
743
+ hierarchy: "secondary",
744
+ size: "sm",
745
+ class: "am-btn am-btn-sec",
746
+ type: "button",
747
+ onClick: s[10] || (s[10] = (n) => R())
748
+ }, {
749
+ default: b(() => [
750
+ H(h(y.value ? "Confirm discard" : "Discard"), 1)
751
+ ]),
752
+ _: 1
753
+ }),
754
+ k(x, {
755
+ hierarchy: "primary",
756
+ size: "sm",
757
+ class: "am-btn am-btn-primary",
758
+ type: "button",
759
+ onClick: s[11] || (s[11] = (n) => c())
760
+ }, {
761
+ default: b(() => [...s[44] || (s[44] = [
762
+ H(" Save changes ", -1)
763
+ ])]),
764
+ _: 1
765
+ })
766
+ ], 2)
767
+ ])
768
+ ])
769
+ ]),
770
+ k(ye, { modal: o(C) }, null, 8, ["modal"])
771
+ ], 512));
772
+ }
773
+ });
774
+ export {
775
+ ls as default
776
+ };