@feedmepos/mf-hrm-portal 1.1.6-dev → 2.0.0

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 (98) hide show
  1. package/dist/AuditLogList-Cm3ueTso.js +474 -0
  2. package/dist/EmployeeList-vMcIqBU_.js +626 -0
  3. package/dist/{main-C370wsCl.js → Main-CeGYov-a.js} +1502 -1531
  4. package/dist/Main-gHCENd4i.js +86 -0
  5. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-DuwNwJDM.js → PageLayout.vue_vue_type_script_setup_true_lang-HKK4cbW8.js} +2 -2
  6. package/dist/PermissionSetList-Dw69OYF4.js +323 -0
  7. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-bvPOPUhu.js +3092 -0
  8. package/dist/ResponsiveFabButton.vue_vue_type_script_setup_true_lang-Cn-3MRBO.js +38 -0
  9. package/dist/RoleList-D1CrixYc.js +497 -0
  10. package/dist/{useSearch-C25VELOk.js → SelectFilter-NbXrJ4iH.js} +90 -101
  11. package/dist/TeamMemberList-M0Q8CP4h.js +973 -0
  12. package/dist/{TimesheetList-qaolOL4w.js → TimesheetList-BmOfy0pc.js} +31 -29
  13. package/dist/api/audit-log/index.d.ts +14 -0
  14. package/dist/api/index.d.ts +5 -0
  15. package/dist/api/permission-assignment/index.d.ts +10 -0
  16. package/dist/api/permission-set/index.d.ts +8 -0
  17. package/dist/api/report-query/index.d.ts +5 -0
  18. package/dist/api/team/index.d.ts +2 -1
  19. package/dist/app-RUdgf-7_.js +3286 -0
  20. package/dist/app.js +1 -1
  21. package/dist/components/AppForm.vue.d.ts +3 -2
  22. package/dist/components/CheckboxInput.vue.d.ts +10 -4
  23. package/dist/components/CollapsibleWrapper.vue.d.ts +3 -2
  24. package/dist/components/form/SelectFilter.vue.d.ts +3 -2
  25. package/dist/components/layout/FormColumn.vue.d.ts +6 -3
  26. package/dist/components/layout/FormItem.vue.d.ts +2 -1
  27. package/dist/components/layout/FormSection.vue.d.ts +2 -1
  28. package/dist/components/layout/FullWrapper.vue.d.ts +6 -3
  29. package/dist/components/layout/PageLayout.vue.d.ts +2 -1
  30. package/dist/components/menu/BottomSheetMenu.vue.d.ts +2 -1
  31. package/dist/components/menu/BottomSheetMenuItem.vue.d.ts +6 -3
  32. package/dist/components/table/EmptyDataTemplate/index.vue.d.ts +6 -3
  33. package/dist/composables/useAppStore.d.ts +6 -6
  34. package/dist/composables/useDateRange.d.ts +1 -1
  35. package/dist/composables/useReportPermissions.d.ts +14 -0
  36. package/dist/composables/useRestaurantMap.d.ts +4 -8
  37. package/dist/composables/useSheet.d.ts +1 -1
  38. package/dist/dayjs.min-D9w2-Exz.js +282 -0
  39. package/dist/employee-B3jBmvNJ.js +144 -0
  40. package/dist/helpers/permission-set.d.ts +69 -0
  41. package/dist/helpers/portal-user.d.ts +8 -0
  42. package/dist/helpers/rule.d.ts +5 -4
  43. package/dist/index-BMVQbdBd.js +827 -0
  44. package/dist/index-BS6B6k7h.js +10340 -0
  45. package/dist/{empty-placeholder-ey8LJtN1.js → index.vue_vue_type_script_setup_true_lang-Vc5ARO29.js} +43 -2
  46. package/dist/{lodash-B5BTJU4_.js → lodash-CglPbFKR.js} +326 -343
  47. package/dist/router/shared.d.ts +4 -1
  48. package/dist/stores/employee.d.ts +4 -4
  49. package/dist/stores/permission-assignment.d.ts +277 -0
  50. package/dist/stores/permission-set.d.ts +265 -0
  51. package/dist/stores/role.d.ts +4 -4
  52. package/dist/stores/team.d.ts +300 -0
  53. package/dist/stores/timesheet.d.ts +19 -19
  54. package/dist/style.css +1 -1
  55. package/dist/team-afjBSzOz.js +33 -0
  56. package/dist/{timesheet-Cy-jSzje.js → timesheet-fOBJOS1i.js} +14 -14
  57. package/dist/tsconfig.app.tsbuildinfo +1 -1
  58. package/dist/types/audit-log.d.ts +1 -0
  59. package/dist/types/permission-assignment.d.ts +20 -0
  60. package/dist/types/permission-set.d.ts +24 -0
  61. package/dist/types/report-query.d.ts +6 -0
  62. package/dist/types/team.d.ts +13 -3
  63. package/dist/useAppStore-D-SLROq6.js +168 -0
  64. package/dist/useLoading-CLQGJW7G.js +99 -0
  65. package/dist/useReportPermissions-Cx4ghxj6.js +65 -0
  66. package/dist/{useRestaurantMap-CpS9-OSq.js → useRestaurantMap-D5BNPLKh.js} +7 -7
  67. package/dist/useSearch-B6WK1LBB.js +15 -0
  68. package/dist/views/audit-log/locales/index.d.ts +295 -0
  69. package/dist/views/hr/employee/{components/EmployeeForm.vue.d.ts → EmployeeForm.vue.d.ts} +10 -7
  70. package/dist/views/team/Main.vue.d.ts +2 -0
  71. package/dist/views/team/components/BasePermission.vue.d.ts +64 -0
  72. package/dist/views/team/components/{TeamMemberConditionPermission.vue.d.ts → ConditionPermission.vue.d.ts} +14 -1
  73. package/dist/views/team/components/InheritPermissionTooltip.vue.d.ts +14 -0
  74. package/dist/views/team/components/PermissionWithTooltip.vue.d.ts +14 -0
  75. package/dist/views/team/components/PortalPermissionEditor.vue.d.ts +68 -28
  76. package/dist/views/team/components/{TeamMemberRolePermission.vue.d.ts → PosRolePermission.vue.d.ts} +14 -1
  77. package/dist/views/team/locales/index.d.ts +200 -4
  78. package/dist/views/team/{components → member}/AddMemberForm.vue.d.ts +1 -0
  79. package/dist/views/team/member/TeamMemberList.vue.d.ts +4 -0
  80. package/dist/views/team/member/TeamMemberMasterUser.vue.d.ts +55 -0
  81. package/dist/views/team/permission-set/PermissionSetForm.vue.d.ts +19 -0
  82. package/dist/views/team/permission-set/PermissionSetList.vue.d.ts +5 -0
  83. package/package.json +15 -8
  84. package/dist/EmployeeList-CP42mLpi.js +0 -605
  85. package/dist/RoleList-CsctaXlu.js +0 -492
  86. package/dist/TeamMemberList-DtXoUa5K.js +0 -1508
  87. package/dist/app-G_Dbs0OJ.js +0 -1202
  88. package/dist/employee-BTWpYxn5.js +0 -449
  89. package/dist/index-8ift6lz3.js +0 -57
  90. package/dist/rule-CM7JgjNr.js +0 -142112
  91. package/dist/types/permission.d.ts +0 -4
  92. package/dist/useAppStore-zINIo0LR.js +0 -93
  93. package/dist/useLoading-CWBRIBiy.js +0 -141
  94. package/dist/views/team/components/TeamMemberBasePermission.vue.d.ts +0 -36
  95. package/dist/views/team/components/TeamMemberMasterUser.vue.d.ts +0 -718
  96. /package/dist/views/{hr/main.vue.d.ts → audit-log/AuditLogList.vue.d.ts} +0 -0
  97. /package/dist/views/{team/TeamMemberList.vue.d.ts → hr/Main.vue.d.ts} +0 -0
  98. /package/dist/views/team/{components → member}/MemberInfo.vue.d.ts +0 -0
@@ -1,1508 +0,0 @@
1
- import { defineComponent as z, ref as j, resolveComponent as M, openBlock as m, createBlock as I, withCtx as q, createElementVNode as u, renderSlot as Q, withModifiers as Re, createCommentVNode as O, nextTick as _e, createElementBlock as P, normalizeClass as oe, createTextVNode as xe, toDisplayString as A, computed as R, Fragment as ne, renderList as pe, createVNode as v, unref as d, useSlots as Ae, normalizeStyle as de, onMounted as Me, onUnmounted as Ie, watch as Ve, isRef as ye, createSlots as De } from "vue";
2
- import { useI18n as ee, Permission as G, useCoreStore as re, fullPermission as ce, baseClientInstance as Fe, RestaurantSelector as $e } from "@feedmepos/mf-common";
3
- import { useBreakpoints as Be, useSnackbar as we, useDialog as qe, components as Ee } from "@feedmepos/ui-library";
4
- import { u as je, _ as Le, S as Ue } from "./useSearch-C25VELOk.js";
5
- import { _ as Te } from "./app-G_Dbs0OJ.js";
6
- import { _ as ze } from "./PageLayout.vue_vue_type_script_setup_true_lang-DuwNwJDM.js";
7
- import { E as We } from "./empty-placeholder-ey8LJtN1.js";
8
- import { c as Z, i as ke, g as ge, b as Ke, u as Oe, a as Ge, d as Se } from "./rule-CM7JgjNr.js";
9
- import { p as ue, t as me } from "./index-8ift6lz3.js";
10
- const Je = /* @__PURE__ */ z({
11
- __name: "BottomSheetMenu",
12
- setup(l) {
13
- const t = j(!1);
14
- async function e() {
15
- await _e(), t.value = !t.value;
16
- }
17
- return (i, r) => {
18
- const n = M("FmButton"), k = M("FmBottomSheet");
19
- return m(), I(k, {
20
- modelValue: t.value,
21
- "onUpdate:modelValue": r[1] || (r[1] = ($) => t.value = $),
22
- "dismiss-away": "",
23
- "no-header": "",
24
- "z-index": 110
25
- }, {
26
- "bottom-sheet-button": q(() => [
27
- i.$slots.button ? O("", !0) : (m(), I(n, {
28
- key: 0,
29
- icon: "more_vert",
30
- variant: "tertiary",
31
- onClick: Re(e, ["stop"])
32
- })),
33
- Q(i.$slots, "button")
34
- ]),
35
- default: q(() => [
36
- u("div", {
37
- onClick: r[0] || (r[0] = ($) => t.value = !1)
38
- }, [
39
- Q(i.$slots, "default")
40
- ])
41
- ]),
42
- _: 3
43
- }, 8, ["modelValue"]);
44
- };
45
- }
46
- }), He = { class: "py-8 px-12 hover:bg-fm-color-neutral-gray-100" }, Ye = /* @__PURE__ */ z({
47
- __name: "BottomSheetMenuItem",
48
- props: {
49
- label: {},
50
- icon: {},
51
- disabled: { type: Boolean },
52
- itemClass: {}
53
- },
54
- setup(l) {
55
- const t = l;
56
- return (e, i) => {
57
- const r = M("FmIcon");
58
- return m(), P("div", He, [
59
- e.$slots.content ? O("", !0) : (m(), P("div", {
60
- key: 0,
61
- class: oe(["flex items-center", {
62
- "text-fm-color-typo-disabled": t.disabled,
63
- "cursor-pointer": !t.disabled,
64
- "cursor-not-allowed": t.disabled,
65
- [t.itemClass || ""]: t.itemClass && !t.disabled
66
- }])
67
- }, [
68
- l.icon ? (m(), I(r, {
69
- key: 0,
70
- name: l.icon
71
- }, null, 8, ["name"])) : O("", !0),
72
- xe(" " + A(l.label), 1)
73
- ], 2)),
74
- Q(e.$slots, "content")
75
- ]);
76
- };
77
- }
78
- }), Qe = /* @__PURE__ */ z({
79
- __name: "ResponsiveContextMenu",
80
- props: {
81
- items: {}
82
- },
83
- setup(l) {
84
- const t = Be(), e = R(() => t.breakpoints.value.xs);
85
- return (i, r) => {
86
- const n = M("FmButton"), k = M("FmMenuItem"), $ = M("FmMenu");
87
- return e.value ? (m(), I(Je, { key: 0 }, {
88
- default: q(() => [
89
- (m(!0), P(ne, null, pe(l.items, ({ icon: p, label: y, disabled: F, itemClass: s, onClick: _ }) => (m(), I(Ye, {
90
- key: y,
91
- icon: p,
92
- label: y,
93
- disabled: F,
94
- itemClass: s,
95
- onClick: () => {
96
- !F && (_ == null || _());
97
- }
98
- }, null, 8, ["icon", "label", "disabled", "itemClass", "onClick"]))), 128))
99
- ]),
100
- _: 1
101
- })) : (m(), I($, {
102
- key: 1,
103
- "stop-click-propagation": "",
104
- shift: !0
105
- }, {
106
- "menu-button": q(() => [
107
- v(n, {
108
- type: "button",
109
- variant: "tertiary",
110
- icon: "more_vert",
111
- "text-color": "neutral-gray-400",
112
- size: "md"
113
- })
114
- ]),
115
- default: q(() => [
116
- (m(!0), P(ne, null, pe(l.items, ({ label: p, disabled: y, itemClass: F, onClick: s }) => (m(), I(k, {
117
- key: p,
118
- disabled: y,
119
- label: p,
120
- onClick: () => {
121
- !y && (s == null || s());
122
- }
123
- }, {
124
- label: q(() => [
125
- u("span", {
126
- class: oe(y ? "text-fm-color-typo-disabled" : F)
127
- }, A(p), 3)
128
- ]),
129
- _: 2
130
- }, 1032, ["disabled", "label", "onClick"]))), 128))
131
- ]),
132
- _: 1
133
- }));
134
- };
135
- }
136
- });
137
- var ae = /* @__PURE__ */ ((l) => (l.Update = "Update", l.Remove = "Remove", l))(ae || {});
138
- const Xe = { class: "w-full flex flex-col gap-16" }, Ze = { class: "flex items-center gap-16" }, el = { class: "space-y-4 min-w-0 flex-1" }, ll = { class: "text-fm-color-typo-secondary fm-typo-en-body-lg-400" }, tl = { class: "fm-typo-en-body-lg-600 truncate" }, sl = { class: "w-full flex gap-16 items-center" }, al = { class: "flex-1 flex flex-col gap-4 min-w-0" }, ol = { class: "text-fm-color-typo-secondary fm-typo-en-body-lg-400" }, nl = { class: "fm-typo-en-body-lg-600 truncate" }, rl = { class: "flex-1 flex flex-col gap-4 min-w-0" }, il = { class: "text-fm-color-typo-secondary fm-typo-en-body-lg-400" }, ul = { class: "fm-typo-en-body-lg-600 truncate" }, ml = /* @__PURE__ */ z({
139
- __name: "MemberInfo",
140
- props: {
141
- data: {}
142
- },
143
- setup(l) {
144
- const { t } = ee();
145
- return (e, i) => {
146
- const r = M("FmAvatar");
147
- return m(), P("div", Xe, [
148
- u("div", Ze, [
149
- v(r, {
150
- size: "xl",
151
- initials: l.data.name
152
- }, null, 8, ["initials"]),
153
- u("div", el, [
154
- u("p", ll, A(d(t)("team.memberForm.memberInfo.memberName")), 1),
155
- u("p", tl, A(l.data.name || "--"), 1)
156
- ])
157
- ]),
158
- u("div", sl, [
159
- u("div", al, [
160
- u("p", ol, A(d(t)("team.memberForm.memberInfo.mobileNumber")), 1),
161
- u("p", nl, A(l.data.phoneNumber || "--"), 1)
162
- ]),
163
- u("div", rl, [
164
- u("p", il, A(d(t)("team.memberForm.memberInfo.emailAddress")), 1),
165
- u("p", ul, A(l.data.email || "--"), 1)
166
- ])
167
- ])
168
- ]);
169
- };
170
- }
171
- }), dl = { class: "space-y-16" }, cl = {
172
- key: 0,
173
- class: "flex fm-typo-en-title-sm-600"
174
- }, pl = {
175
- key: 0,
176
- class: "q-mr-xs text-red col"
177
- }, fl = { class: "form-input" }, vl = /* @__PURE__ */ z({
178
- __name: "AppForm",
179
- props: {
180
- title: {
181
- type: String,
182
- default: void 0
183
- },
184
- required: {
185
- type: [Boolean, String],
186
- default: !1
187
- },
188
- inline: {
189
- type: Boolean,
190
- default: !1
191
- }
192
- },
193
- setup(l) {
194
- const t = l;
195
- return (e, i) => (m(), P("div", dl, [
196
- Q(e.$slots, "top", {}, () => [
197
- t.title ? (m(), P("div", cl, [
198
- u("div", null, [
199
- t.required ? (m(), P("span", pl, "*")) : O("", !0),
200
- xe(A(t.title), 1)
201
- ]),
202
- Q(e.$slots, "title-right")
203
- ])) : O("", !0)
204
- ]),
205
- u("div", fl, [
206
- Q(e.$slots, "default")
207
- ])
208
- ]));
209
- }
210
- });
211
- function bl(l, t) {
212
- let e = "", i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
213
- const r = i.length;
214
- for (let n = 0; n < l; n++)
215
- e += i.charAt(Math.floor(Math.random() * r));
216
- return e;
217
- }
218
- const hl = { class: "col flex items-center" }, yl = {
219
- key: 1,
220
- class: "q-pa-sm form-error-message text-error"
221
- }, ie = /* @__PURE__ */ z({
222
- __name: "CheckboxInput",
223
- props: {
224
- options: {
225
- type: Array,
226
- required: !0
227
- },
228
- title: {
229
- type: String,
230
- required: !0
231
- },
232
- modelValue: {
233
- type: Array,
234
- required: !0
235
- },
236
- showAllToggle: {
237
- type: [Boolean, String],
238
- default: !0
239
- },
240
- includeDisabledOptionsWhenSelectAll: {
241
- type: Boolean,
242
- default: !1
243
- },
244
- disable: {
245
- type: Boolean,
246
- default: !1
247
- },
248
- min: {
249
- type: Number,
250
- default: 0
251
- },
252
- max: {
253
- type: Number,
254
- default: void 0
255
- },
256
- showIntermediate: {
257
- type: Boolean,
258
- default: !0
259
- },
260
- gutter: {
261
- type: Number,
262
- default: void 0
263
- },
264
- falsyShowSlot: {
265
- type: Boolean,
266
- default: !1
267
- },
268
- bottomSlotIndent: {
269
- type: String,
270
- default: "36px"
271
- },
272
- alignCenter: {
273
- type: Boolean,
274
- default: !0
275
- }
276
- },
277
- emits: ["update:model-value"],
278
- setup(l, { emit: t }) {
279
- const e = l, i = t, { t: r } = ee(), n = j(!1), k = Ae(), $ = R(() => e.modelValue.length < e.min ? `Min selection ${e.min}` : e.max !== void 0 && e.modelValue.length > e.max ? `Max selection ${e.max}` : !0), p = `checkbox-${bl(6)}`, y = R(() => $.value !== !0), F = R(
280
- () => e.modelValue.filter((V) => e.options.some((U) => U.value === V))
281
- ), s = R(
282
- () => typeof e.showAllToggle == "boolean" ? r("team.labels.all") : e.showAllToggle
283
- ), _ = R(() => e.options.length > 0 && e.options.length === F.value.length);
284
- function N() {
285
- const V = e.modelValue.filter((U) => !F.value.includes(U));
286
- if (_.value === !0)
287
- i("update:model-value", V);
288
- else {
289
- const U = e.includeDisabledOptionsWhenSelectAll ? e.options.map((C) => C.value) : e.options.filter((C) => !C.disabled).map((C) => C.value);
290
- i("update:model-value", [...V, ...U]);
291
- }
292
- }
293
- function B(V, U) {
294
- let C = Z(e.modelValue);
295
- U ? C.every((b) => b !== V) && C.push(V) : C = C.filter((b) => b !== V), i("update:model-value", C);
296
- }
297
- return (V, U) => {
298
- const C = M("FmCheckbox");
299
- return m(), I(vl, {
300
- id: p,
301
- title: l.title,
302
- required: !1
303
- }, {
304
- top: q(() => [
305
- Q(V.$slots, "top")
306
- ]),
307
- default: q(() => [
308
- e.showAllToggle ? (m(), I(C, {
309
- key: 0,
310
- "model-value": _.value,
311
- disabled: l.disable,
312
- label: s.value,
313
- style: de(`margin-bottom: ${e.gutter}px`),
314
- size: "sm",
315
- dense: "",
316
- value: s.value,
317
- "onUpdate:modelValue": N
318
- }, null, 8, ["model-value", "disabled", "label", "style", "value"])) : O("", !0),
319
- (m(!0), P(ne, null, pe(l.options, (b, c) => (m(), P("div", {
320
- key: b.value,
321
- style: de(`margin-bottom: ${c < l.options.length - 1 ? e.gutter : 0}px`),
322
- class: oe(c < l.options.length - 1 ? "q-mb-sm" : "")
323
- }, [
324
- u("div", {
325
- class: oe(["row justify-between", l.alignCenter ? "items-center" : "items-start"])
326
- }, [
327
- u("div", hl, [
328
- v(C, {
329
- "model-value": l.modelValue.includes(b.value),
330
- disabled: l.disable || b.disabled,
331
- size: "sm",
332
- label: b.label,
333
- value: b.label,
334
- "onUpdate:modelValue": (h) => B(b.value, h)
335
- }, null, 8, ["model-value", "disabled", "label", "value", "onUpdate:modelValue"])
336
- ]),
337
- d(k)[`checkbox-${b.key || b.value}-end`] && (l.modelValue.includes(b.value) || l.falsyShowSlot) ? (m(), P("div", {
338
- key: 0,
339
- class: oe([{ "q-checkbox disabled": l.disable || b.disabled }, "col"])
340
- }, [
341
- Q(V.$slots, `checkbox-${b.key || b.value}-end`, {
342
- option: b,
343
- value: l.modelValue.includes(b.value),
344
- disable: l.disable || b.disabled
345
- })
346
- ], 2)) : O("", !0)
347
- ], 2),
348
- d(k)[`checkbox-${b.key || b.value}-bottom`] && (l.modelValue.includes(b.value) || l.falsyShowSlot) ? (m(), P("div", {
349
- key: 0,
350
- class: oe(["q-mt-sm", { "q-checkbox disabled": l.disable || b.disabled }]),
351
- style: de(`margin-left: ${l.bottomSlotIndent}`)
352
- }, [
353
- Q(V.$slots, `checkbox-${b.key || b.value}-bottom`, {
354
- option: b,
355
- disable: l.disable || b.disabled,
356
- value: l.modelValue.includes(b.value)
357
- })
358
- ], 6)) : O("", !0)
359
- ], 6))), 128)),
360
- n.value && y.value ? (m(), P("div", yl, A($.value), 1)) : O("", !0)
361
- ]),
362
- _: 3
363
- }, 8, ["title"]);
364
- };
365
- }
366
- }), gl = { class: "flex flex-col gap-16" }, _l = /* @__PURE__ */ z({
367
- __name: "TeamMemberBasePermission",
368
- props: {
369
- modelValue: {
370
- type: Array,
371
- required: !0
372
- },
373
- disable: {
374
- type: Boolean,
375
- default: !1
376
- },
377
- excludedSubjects: {
378
- type: Array,
379
- required: !0
380
- }
381
- },
382
- emits: ["update:model-value"],
383
- setup(l, { emit: t }) {
384
- const e = l, i = t, { t: r } = ee(), n = R(() => ue.filter((s) => !e.excludedSubjects.includes(s.subject)).filter((s) => !ke.includes(s.subject)).map((s) => ({
385
- label: s.label,
386
- value: s.subject
387
- }))), k = R(() => ue.filter((s) => ke.includes(s.subject)).map((s) => ({
388
- label: s.label,
389
- value: s.subject
390
- }))), $ = R(() => e.modelValue.filter((s) => n.value.some((_) => _.value === s.subject)).map((s) => s.subject)), p = R(() => e.modelValue.filter((s) => k.value.some((_) => _.value === s.subject)).map((s) => s.subject));
391
- function y(s) {
392
- i("update:model-value", [
393
- // Keep non-general permissions unchanged
394
- ...e.modelValue.filter((_) => !n.value.some((N) => N.value === _.subject)),
395
- // Add selected general permissions
396
- ...ue.filter((_) => s.includes(_.subject))
397
- ]);
398
- }
399
- function F(s) {
400
- i("update:model-value", [
401
- // Keep non-inventory permissions unchanged
402
- ...e.modelValue.filter(
403
- (_) => !k.value.some((N) => N.value === _.subject)
404
- ),
405
- // Add selected inventory permissions
406
- ...ue.filter((_) => s.includes(_.subject))
407
- ]);
408
- }
409
- return (s, _) => (m(), P("div", gl, [
410
- v(ie, {
411
- "model-value": $.value,
412
- options: n.value,
413
- disable: l.disable,
414
- title: d(r)("team.memberForm.permissions.general"),
415
- "onUpdate:modelValue": y
416
- }, null, 8, ["model-value", "options", "disable", "title"]),
417
- k.value.length > 0 ? (m(), I(ie, {
418
- key: 0,
419
- "model-value": p.value,
420
- options: k.value,
421
- disable: l.disable,
422
- title: d(r)("team.memberForm.permissions.stock"),
423
- "onUpdate:modelValue": F
424
- }, null, 8, ["model-value", "options", "disable", "title"])) : O("", !0)
425
- ]));
426
- }
427
- }), xl = { class: "flex items-center" }, Vl = { class: "ml-auto" }, wl = /* @__PURE__ */ z({
428
- __name: "CollapsibleWrapper",
429
- props: {
430
- title: { default: "" },
431
- initiallyCollapsed: { type: Boolean, default: !1 }
432
- },
433
- setup(l) {
434
- const e = j(l.initiallyCollapsed), i = j(), r = j(0);
435
- let n;
436
- function k() {
437
- e.value = !e.value;
438
- }
439
- function $() {
440
- i.value && (r.value = i.value.scrollHeight);
441
- }
442
- return Me(async () => {
443
- await _e(), i.value && (n = new ResizeObserver(() => {
444
- $();
445
- }), n.observe(i.value));
446
- }), Ie(() => {
447
- n == null || n.disconnect();
448
- }), (p, y) => {
449
- const F = M("FmButton");
450
- return m(), P(ne, null, [
451
- u("div", { onClick: k }, [
452
- u("div", xl, [
453
- Q(p.$slots, "title"),
454
- u("div", Vl, [
455
- v(F, {
456
- icon: e.value ? "keyboard_arrow_down" : "keyboard_arrow_up",
457
- "text-color": "neutral-gray-400",
458
- variant: "tertiary",
459
- size: "md"
460
- }, null, 8, ["icon"])
461
- ])
462
- ])
463
- ]),
464
- u("div", {
465
- ref_key: "contentRef",
466
- ref: i,
467
- class: "transition-all duration-300 ease-in-out overflow-hidden",
468
- style: de({ maxHeight: e.value ? "0" : r.value + "px" })
469
- }, [
470
- Q(p.$slots, "default")
471
- ], 4)
472
- ], 64);
473
- };
474
- }
475
- }), Fl = { class: "fm-typo-en-title-sm-600" }, ve = "includedFuture", Ce = /* @__PURE__ */ z({
476
- __name: "TeamMemberConditionPermission",
477
- props: {
478
- modelValue: {
479
- type: Array,
480
- default: null
481
- },
482
- options: {
483
- type: Array,
484
- required: !0
485
- },
486
- disable: {
487
- type: Boolean,
488
- default: !1
489
- },
490
- context: {
491
- type: String,
492
- required: !0
493
- }
494
- },
495
- emits: ["update:model-value"],
496
- setup(l, { emit: t }) {
497
- const e = l, i = t, { t: r } = ee(), n = R(() => [
498
- {
499
- label: r("team.memberForm.permissions.includedFuture", { context: e.context }),
500
- value: ve,
501
- // Can only be selected if all other options are selected
502
- disable: !!e.modelValue && e.options.length > e.modelValue.length
503
- },
504
- ...e.options.filter(
505
- (y) => y.label.toLocaleLowerCase().includes(p.value.toLocaleLowerCase())
506
- )
507
- ]), k = R(() => e.modelValue ? e.modelValue : [ve, ...e.options.map((y) => y.value)]);
508
- function $(y) {
509
- const F = y.length === n.value.length;
510
- i("update:model-value", F ? null : y.filter((s) => s !== ve));
511
- }
512
- const p = j("");
513
- return (y, F) => {
514
- const s = M("fm-search");
515
- return m(), I(wl, null, {
516
- title: q(() => [
517
- u("p", Fl, A(d(r)("team.memberForm.permissions.manageable", { context: l.context })), 1)
518
- ]),
519
- default: q(() => [
520
- l.options.length > 1 ? (m(), I(s, {
521
- key: 0,
522
- modelValue: p.value,
523
- "onUpdate:modelValue": F[0] || (F[0] = (_) => p.value = _),
524
- class: "mt-16",
525
- placeholder: d(r)("team.memberForm.permissions.search", { context: l.context })
526
- }, null, 8, ["modelValue", "placeholder"])) : O("", !0),
527
- v(ie, {
528
- "model-value": k.value,
529
- options: n.value,
530
- "show-intermediate": !1,
531
- "show-all-toggle": !0,
532
- disable: l.disable,
533
- "include-disabled-options-when-select-all": !0,
534
- title: "",
535
- class: "mt-16",
536
- "onUpdate:modelValue": $
537
- }, null, 8, ["model-value", "options", "disable"])
538
- ]),
539
- _: 1
540
- });
541
- };
542
- }
543
- }), $l = { class: "flex flex-col gap-40" }, Ul = { class: "flex items-center" }, kl = { class: "flex-1 flex flex-col" }, Sl = { class: "fm-typo-en-title-sm-600" }, Cl = { class: "fm-typo-en-body-md-400 text-fm-color-typo-secondary" }, Pl = { class: "flex flex-row gap-16" }, Rl = { class: "flex flex-col gap-8" }, Ml = { class: "fm-typo-en-body-lg-400" }, Bl = { class: "p-16 fm-corner-radius-lg border border-fm-color-neutral-gray-200" }, be = 4, jl = /* @__PURE__ */ z({
544
- __name: "TeamMemberMasterUser",
545
- props: {
546
- modelValue: {
547
- type: Object,
548
- default: void 0
549
- },
550
- fallbackName: {
551
- type: String,
552
- required: !0
553
- },
554
- fallbackPasscode: {
555
- type: String,
556
- default: void 0
557
- },
558
- restaurants: {
559
- type: Array,
560
- required: !0
561
- },
562
- roles: {
563
- type: Array,
564
- required: !0
565
- }
566
- },
567
- emits: ["update:model-value"],
568
- setup(l, { emit: t }) {
569
- const e = l, i = t, { t: r } = ee(), { searchKey: n, filter: k } = je(""), $ = j(!0), p = j([]), y = R(() => {
570
- const c = {};
571
- return e.roles.forEach((h) => {
572
- c[h.value] = h.label;
573
- }), c;
574
- }), F = R(() => {
575
- var h;
576
- const c = {};
577
- return (h = e.modelValue) == null || h.roles.forEach((E) => {
578
- c[E.restaurantId] = E.roleId;
579
- }), c;
580
- }), s = R(() => e.restaurants.filter((c) => k([c.profile.name, c.profile.code, N(c._id)])).map((c) => ({
581
- label: `${c.profile.code ? c.profile.code + "-" : ""}${c.profile.name}`,
582
- value: c._id,
583
- slot: `checkbox-${c._id}-bottom`,
584
- disable: e.roles.filter((h) => !h.disabled).length === 0,
585
- roleOptions: e.roles
586
- }))), _ = R(() => {
587
- const c = e.roles.find((h) => !h.disabled);
588
- return c ? c.value : null;
589
- });
590
- function N(c) {
591
- const h = F.value[c] ?? "";
592
- return y.value[h] || "";
593
- }
594
- function B(c) {
595
- c ? e.modelValue || i("update:model-value", {
596
- code: "",
597
- name: e.fallbackName,
598
- roles: [],
599
- passcode: e.fallbackPasscode || ""
600
- }) : i("update:model-value", void 0);
601
- }
602
- function V(c, h) {
603
- if (!e.modelValue || c === "passcode" && e.modelValue.passcode === h)
604
- return;
605
- const E = Z(e.modelValue);
606
- E[c] = h, i("update:model-value", E);
607
- }
608
- function U(c) {
609
- V(
610
- "roles",
611
- c.map((h) => {
612
- var Y, g, a;
613
- const E = (g = (Y = s.value.find((w) => w.value === h)) == null ? void 0 : Y.roleOptions.find((w) => !w.disabled)) == null ? void 0 : g.value, L = (a = e.modelValue) == null ? void 0 : a.roles.find((w) => w.restaurantId === h);
614
- return {
615
- restaurantId: h,
616
- roleId: (L == null ? void 0 : L.roleId) || E
617
- };
618
- })
619
- );
620
- }
621
- function C(c, h) {
622
- V("roles", [
623
- ...e.modelValue.roles.filter(
624
- (E) => E.restaurantId !== c
625
- ),
626
- {
627
- restaurantId: c,
628
- roleId: h
629
- }
630
- ]);
631
- }
632
- function b() {
633
- $.value && ($.value = !1, p.value = [], V("passcode", ""));
634
- }
635
- return Ve(
636
- () => {
637
- var c;
638
- return (c = e.modelValue) == null ? void 0 : c.passcode;
639
- },
640
- (c) => {
641
- c && c.length === be ? (p.value = c.split(""), $.value = !0) : (p.value = [], $.value = !1);
642
- },
643
- { immediate: !0 }
644
- ), (c, h) => {
645
- const E = M("FmSwitch"), L = M("FmTextField"), Y = M("FmPinField"), g = M("FmFormGroup"), a = M("FmSearch"), w = M("FmSelect");
646
- return m(), P("div", $l, [
647
- u("div", Ul, [
648
- u("div", kl, [
649
- u("div", Sl, A(d(r)("team.memberForm.masterUser.title")), 1),
650
- u("div", Cl, A(d(r)("team.memberForm.masterUser.sublabel")), 1)
651
- ]),
652
- u("div", null, [
653
- v(E, {
654
- "model-value": !!l.modelValue,
655
- value: "master-user",
656
- "onUpdate:modelValue": B
657
- }, null, 8, ["model-value"])
658
- ])
659
- ]),
660
- l.modelValue ? (m(), P(ne, { key: 0 }, [
661
- u("div", Pl, [
662
- v(L, {
663
- "model-value": l.modelValue.code,
664
- label: d(r)("team.memberForm.masterUser.code"),
665
- "onUpdate:modelValue": h[0] || (h[0] = (f) => V("code", f))
666
- }, null, 8, ["model-value", "label"]),
667
- v(L, {
668
- "model-value": l.modelValue.name,
669
- class: "w-full",
670
- label: d(r)("team.memberForm.masterUser.name"),
671
- rules: [(f) => !!f || d(r)("team.memberForm.masterUser.nameEmptyError")],
672
- "onUpdate:modelValue": h[1] || (h[1] = (f) => V("name", f))
673
- }, null, 8, ["model-value", "label", "rules"])
674
- ]),
675
- u("div", Rl, [
676
- u("div", Ml, A(d(r)("team.memberForm.masterUser.passcode")), 1),
677
- v(g, {
678
- modelValue: p.value,
679
- "onUpdate:modelValue": h[4] || (h[4] = (f) => p.value = f),
680
- rules: [
681
- (f) => (f == null ? void 0 : f.filter((S) => !!S).length) !== be ? d(r)("team.memberForm.masterUser.passcodeRequired") : !0
682
- ]
683
- }, {
684
- default: q(() => [
685
- (m(), I(Y, {
686
- key: `pin-field-${$.value}`,
687
- modelValue: p.value,
688
- "onUpdate:modelValue": h[2] || (h[2] = (f) => p.value = f),
689
- length: be,
690
- masked: $.value,
691
- onComplete: h[3] || (h[3] = (f) => V("passcode", f)),
692
- onFocus: b
693
- }, null, 8, ["modelValue", "masked"]))
694
- ]),
695
- _: 1
696
- }, 8, ["modelValue", "rules"])
697
- ]),
698
- u("div", Bl, [
699
- v(a, {
700
- modelValue: d(n),
701
- "onUpdate:modelValue": h[5] || (h[5] = (f) => ye(n) ? n.value = f : null),
702
- placeholder: d(r)("team.memberForm.role.placeholder"),
703
- class: "mb-16"
704
- }, null, 8, ["modelValue", "placeholder"]),
705
- v(ie, {
706
- "model-value": l.modelValue.roles.map((f) => f.restaurantId),
707
- options: s.value,
708
- min: 1,
709
- title: d(r)("team.memberForm.masterUser.role"),
710
- "onUpdate:modelValue": U
711
- }, De({ _: 2 }, [
712
- pe(s.value, (f) => ({
713
- name: f.slot,
714
- fn: q(() => {
715
- var S;
716
- return [
717
- u("div", null, [
718
- v(w, {
719
- "model-value": ((S = l.modelValue.roles.find((D) => D.restaurantId === f.value)) == null ? void 0 : S.roleId) || _.value,
720
- items: f.roleOptions,
721
- "onUpdate:modelValue": (D) => C(f.value, D)
722
- }, null, 8, ["model-value", "items", "onUpdate:modelValue"])
723
- ])
724
- ];
725
- })
726
- }))
727
- ]), 1032, ["model-value", "options", "title"])
728
- ])
729
- ], 64)) : O("", !0)
730
- ]);
731
- };
732
- }
733
- }), he = "includedNewRole", Ol = /* @__PURE__ */ z({
734
- __name: "TeamMemberRolePermission",
735
- props: {
736
- modelValue: {
737
- type: Array,
738
- default: null
739
- },
740
- roles: {
741
- type: Array,
742
- required: !0
743
- },
744
- restaurantIds: {
745
- type: Array,
746
- default: null
747
- },
748
- disable: {
749
- type: Boolean,
750
- default: !1
751
- }
752
- },
753
- emits: ["update:model-value"],
754
- setup(l, { emit: t }) {
755
- const e = l, i = t, { t: r } = ee(), n = R(() => {
756
- const p = e.restaurantIds;
757
- return [
758
- {
759
- label: r("team.memberForm.permissions.includedNewRole"),
760
- value: he,
761
- disable: !!e.modelValue && e.roles.length > e.modelValue.length
762
- },
763
- ...e.roles.map((y) => ({
764
- label: y.name,
765
- value: y._id,
766
- disable: !!p && y.restaurants.every(({ id: F }) => !p.includes(F))
767
- }))
768
- ];
769
- }), k = R(() => e.modelValue ? e.modelValue : [he, ...e.roles.map((p) => p._id)]);
770
- function $(p) {
771
- const y = p.length === n.value.length;
772
- i("update:model-value", y ? null : p.filter((F) => F !== he));
773
- }
774
- return (p, y) => (m(), I(ie, {
775
- "model-value": k.value,
776
- options: n.value,
777
- "show-intermediate": !1,
778
- "show-all-toggle": !1,
779
- disable: l.disable,
780
- title: d(r)("team.memberForm.permissions.roles"),
781
- "onUpdate:modelValue": $
782
- }, null, 8, ["model-value", "options", "disable", "title"]));
783
- }
784
- }), Nl = {
785
- async readWarehouses() {
786
- return ge(await Ke().get("/warehouses"));
787
- }
788
- }, Al = { class: "flex flex-col gap-40" }, Il = {
789
- key: 0,
790
- class: "p-16 fm-corner-radius-lg border border-fm-color-neutral-gray-200"
791
- }, Dl = {
792
- key: 1,
793
- class: "p-16 fm-corner-radius-lg border border-fm-color-neutral-gray-200"
794
- }, ql = {
795
- key: 2,
796
- class: "p-16 fm-corner-radius-lg border border-fm-color-neutral-gray-200"
797
- }, El = {
798
- key: 3,
799
- class: "p-16 fm-corner-radius-lg border border-fm-color-neutral-gray-200"
800
- }, Ll = /* @__PURE__ */ z({
801
- __name: "PortalPermissionEditor",
802
- props: {
803
- initialValue: {
804
- type: Object,
805
- default: void 0
806
- },
807
- username: {
808
- type: String,
809
- required: !0
810
- },
811
- disable: {
812
- type: Boolean,
813
- default: !1
814
- },
815
- isOwner: {
816
- type: Boolean,
817
- default: !1
818
- }
819
- },
820
- emits: ["permissionChanged"],
821
- setup(l, { emit: t }) {
822
- const e = l, i = t, { t: r } = ee(), n = j({
823
- permissions: []
824
- }), k = [
825
- G.Subject.Business.restaurant,
826
- G.Subject.Business.role,
827
- G.Subject.Business.stock,
828
- G.Subject.Restaurant.restaurant
829
- ], $ = R(() => {
830
- var a;
831
- const g = (a = n.value) == null ? void 0 : a.permissions.find(
832
- (w) => w.subject === G.Subject.Business.stock
833
- );
834
- return g ? g.conditions ? JSON.parse(g.conditions).warehouseId.$in : null : [];
835
- }), p = j([]);
836
- Me(async () => {
837
- e.initialValue && (n.value = e.initialValue), p.value = await Nl.readWarehouses();
838
- });
839
- function y(g) {
840
- const a = F(n.value.permissions, g);
841
- n.value = {
842
- ...n.value,
843
- permissions: a,
844
- posUser: h(n.value.posUser, a)
845
- };
846
- }
847
- function F(g, a) {
848
- let w = Z(
849
- g.filter((f) => f.subject !== G.Subject.Business.stock)
850
- );
851
- if (!a || a.length > 0) {
852
- const f = {
853
- actions: [G.Action.manage],
854
- subject: G.Subject.Business.stock
855
- };
856
- a && (f.conditions = JSON.stringify({ warehouseId: { $in: a } })), w.push(f);
857
- }
858
- return w;
859
- }
860
- const { restaurants: s } = re(), _ = Oe().roles, N = R(() => s.value.reduce((g, a) => (g[a._id] = _.value.filter((w) => w.restaurants.some((f) => f.id === a._id)).map((w) => w._id), g), {})), B = R(() => Ge(n.value.permissions));
861
- function V(g) {
862
- const a = C(n.value.permissions, g);
863
- n.value = {
864
- ...n.value,
865
- permissions: a,
866
- posUser: h(n.value.posUser, a)
867
- };
868
- }
869
- const U = R(() => Se(n.value.permissions));
870
- function C(g, a) {
871
- var S;
872
- let w = Z(
873
- g.filter(
874
- (D) => D.subject !== G.Subject.Business.restaurant && D.subject !== G.Subject.Restaurant.restaurant
875
- )
876
- );
877
- if (!a || a.length > 0) {
878
- w.push(ce.restaurant);
879
- const D = {
880
- actions: [G.Action.manage],
881
- subject: G.Subject.Restaurant.restaurant
882
- };
883
- a && (D.conditions = JSON.stringify({ restaurantId: { $in: a } })), w.push(D);
884
- }
885
- if (a) {
886
- const D = [
887
- ...new Set(a.map((W) => N.value[W]).flatMap((W) => W))
888
- ], le = _.value.map((W) => W._id);
889
- D.length !== le.length && (w = f(
890
- w,
891
- (S = U.value || le) == null ? void 0 : S.filter((W) => D.includes(W))
892
- ));
893
- }
894
- function f(D, le) {
895
- let W = Z(
896
- D.filter((fe) => fe.subject !== G.Subject.Business.role)
897
- );
898
- const se = Z(ce.role);
899
- return le && (se.conditions = JSON.stringify({ roleId: { $in: le } })), W.push(se), W;
900
- }
901
- return w;
902
- }
903
- function b(g) {
904
- const a = c(n.value.permissions, g);
905
- n.value = {
906
- ...n.value,
907
- permissions: a,
908
- posUser: h(n.value.posUser, a)
909
- };
910
- }
911
- function c(g, a) {
912
- let w = Z(
913
- g.filter((S) => S.subject !== G.Subject.Business.role)
914
- );
915
- const f = Z(ce.role);
916
- return a && (f.conditions = JSON.stringify({ roleId: { $in: a } })), w.push(f), w;
917
- }
918
- function h(g, a) {
919
- if (!g) return;
920
- const w = Se(a);
921
- if (!w) return g;
922
- const f = Z(g);
923
- return f.roles = f.roles.reduce((S, D) => (w.includes(D.roleId) && S.push(D), S), []), f;
924
- }
925
- const E = R(() => {
926
- const g = U.value;
927
- return _.value.map((a) => ({
928
- label: a.name,
929
- value: a._id,
930
- disabled: !!g && !g.includes(a._id)
931
- }));
932
- }), L = j();
933
- async function Y() {
934
- await _e(), L.value && L.value.$el.scrollIntoView({ behavior: "smooth", block: "start" });
935
- }
936
- return Ve(
937
- n,
938
- (g) => {
939
- i("permissionChanged", g);
940
- },
941
- { deep: !0 }
942
- ), (g, a) => {
943
- var w, f;
944
- return m(), P("div", Al, [
945
- l.isOwner ? O("", !0) : (m(), P("div", Il, [
946
- v(_l, {
947
- modelValue: n.value.permissions,
948
- "onUpdate:modelValue": a[0] || (a[0] = (S) => n.value.permissions = S),
949
- disable: l.isOwner,
950
- "excluded-subjects": k
951
- }, null, 8, ["modelValue", "disable"])
952
- ])),
953
- l.isOwner ? O("", !0) : (m(), P("div", Dl, [
954
- v(Ce, {
955
- "model-value": $.value,
956
- options: p.value.map((S) => ({
957
- label: S.profile.name,
958
- value: S._id
959
- })),
960
- context: d(r)("team.labels.warehouse"),
961
- "onUpdate:modelValue": y
962
- }, null, 8, ["model-value", "options", "context"])
963
- ])),
964
- l.isOwner ? O("", !0) : (m(), P("div", ql, [
965
- v(Ce, {
966
- "model-value": B.value,
967
- options: d(s).map((S) => ({
968
- label: `${S.profile.code ? S.profile.code + "-" : ""}${S.profile.name}`,
969
- value: S._id
970
- })),
971
- context: d(r)("team.labels.restaurant"),
972
- "onUpdate:modelValue": V
973
- }, null, 8, ["model-value", "options", "context"])
974
- ])),
975
- l.isOwner ? O("", !0) : (m(), P("div", El, [
976
- v(Ol, {
977
- roles: d(_),
978
- "model-value": U.value,
979
- "restaurant-ids": B.value,
980
- "onUpdate:modelValue": b
981
- }, null, 8, ["roles", "model-value", "restaurant-ids"])
982
- ])),
983
- u("div", null, [
984
- v(jl, {
985
- ref_key: "masterUserContentRef",
986
- ref: L,
987
- modelValue: n.value.posUser,
988
- "onUpdate:modelValue": [
989
- a[1] || (a[1] = (S) => n.value.posUser = S),
990
- Y
991
- ],
992
- "fallback-name": l.username,
993
- "fallback-passcode": (f = (w = l.initialValue) == null ? void 0 : w.posUser) == null ? void 0 : f.passcode,
994
- restaurants: d(s),
995
- roles: E.value
996
- }, null, 8, ["modelValue", "fallback-name", "fallback-passcode", "restaurants", "roles"])
997
- ])
998
- ]);
999
- };
1000
- }
1001
- }), Pe = {
1002
- async readPermissionUserByPhoneNo(l) {
1003
- var e;
1004
- const { currentBusiness: t } = re();
1005
- return ge(
1006
- await Fe("/").get(`/user/b/${(e = t.value) == null ? void 0 : e._id}/phone/${l}`)
1007
- );
1008
- },
1009
- async readPermissionUserByEmail(l) {
1010
- var e;
1011
- const { currentBusiness: t } = re();
1012
- return ge(
1013
- await Fe("/").get(`/user/b/${(e = t.value) == null ? void 0 : e._id}/email/${l}`)
1014
- );
1015
- }
1016
- }, Tl = { class: "flex flex-col gap-24 w-full" }, zl = {
1017
- key: 0,
1018
- class: "flex flex-col gap-8"
1019
- }, Wl = { class: "user-info-icon user-info-icon--lg" }, Kl = { class: "flex-1 overflow-hidden" }, Gl = { class: "profile-displayName" }, Jl = { class: "profile-email" }, Hl = { class: "profile-phone" }, Yl = { key: 2 }, Ql = /* @__PURE__ */ z({
1020
- __name: "PortalUserSearcher",
1021
- emits: ["invite"],
1022
- setup(l, { emit: t }) {
1023
- const e = t, { t: i } = ee(), r = we(), n = re(), k = j("phone"), $ = j(""), p = j(""), y = j();
1024
- async function F() {
1025
- if (!$.value && !p.value) {
1026
- r.open({
1027
- type: "error",
1028
- title: i("team.memberForm.searchUser.emptyError")
1029
- });
1030
- return;
1031
- }
1032
- const V = k.value === "phone" ? await Pe.readPermissionUserByPhoneNo($.value.replace(/ /g, "")) : await Pe.readPermissionUserByEmail(p.value);
1033
- V || r.open({
1034
- type: "error",
1035
- title: i("team.memberForm.searchUser.userNotFound")
1036
- }), y.value = V;
1037
- }
1038
- const s = R(() => {
1039
- var b;
1040
- let V = ((b = y.value) == null ? void 0 : b.displayName) ?? "";
1041
- V || (V = "Feed Me");
1042
- const [U, C] = V.split(" ");
1043
- return C ? `${U[0]}${C[0]}` : U.slice(0, 2);
1044
- }), _ = j(!1);
1045
- function N(V) {
1046
- e("invite", V), _.value = !0;
1047
- }
1048
- function B() {
1049
- _.value = !1;
1050
- }
1051
- return (V, U) => {
1052
- var L, Y, g;
1053
- const C = M("FmRadio"), b = M("FmPhoneNumber"), c = M("FmTextField"), h = M("FmRadioGroup"), E = M("FmButton");
1054
- return m(), P("div", Tl, [
1055
- _.value ? O("", !0) : (m(), P("div", zl, [
1056
- v(h, {
1057
- modelValue: k.value,
1058
- "onUpdate:modelValue": U[2] || (U[2] = (a) => k.value = a)
1059
- }, {
1060
- default: q(() => [
1061
- v(C, {
1062
- value: "phone",
1063
- label: d(i)("team.memberForm.searchUser.phoneNumber")
1064
- }, null, 8, ["label"]),
1065
- k.value === "phone" ? (m(), I(b, {
1066
- key: 0,
1067
- modelValue: $.value,
1068
- "onUpdate:modelValue": U[0] || (U[0] = (a) => $.value = a),
1069
- "extra-country-codes": d(n).enabledCountries.value,
1070
- class: "ml-8"
1071
- }, null, 8, ["modelValue", "extra-country-codes"])) : O("", !0),
1072
- v(C, {
1073
- value: "email",
1074
- label: d(i)("team.memberForm.searchUser.email")
1075
- }, null, 8, ["label"]),
1076
- k.value === "email" ? (m(), I(c, {
1077
- key: 1,
1078
- modelValue: p.value,
1079
- "onUpdate:modelValue": U[1] || (U[1] = (a) => p.value = a),
1080
- placeholder: d(i)("team.memberForm.searchUser.emailPlaceholder"),
1081
- class: "ml-8"
1082
- }, null, 8, ["modelValue", "placeholder"])) : O("", !0)
1083
- ]),
1084
- _: 1
1085
- }, 8, ["modelValue"]),
1086
- v(E, {
1087
- label: d(i)("team.memberForm.searchUser.search"),
1088
- variant: "secondary",
1089
- onClick: F
1090
- }, null, 8, ["label"])
1091
- ])),
1092
- y.value ? (m(), P("div", {
1093
- key: 1,
1094
- class: "profile-menu--profile cursor-pointer hover:bg-fm-color-opacity-sm",
1095
- onClick: U[3] || (U[3] = (a) => N(y.value))
1096
- }, [
1097
- u("div", Wl, A(s.value), 1),
1098
- u("div", Kl, [
1099
- u("p", Gl, A((L = y.value) == null ? void 0 : L.displayName), 1),
1100
- u("p", Jl, A((Y = y.value) == null ? void 0 : Y.email), 1),
1101
- u("p", Hl, A((g = y.value) == null ? void 0 : g.phoneNumber), 1)
1102
- ])
1103
- ])) : O("", !0),
1104
- _.value ? (m(), P("div", Yl, [
1105
- v(E, {
1106
- label: d(i)("team.memberForm.searchUser.changeUser"),
1107
- variant: "secondary",
1108
- onClick: B
1109
- }, null, 8, ["label"])
1110
- ])) : O("", !0)
1111
- ]);
1112
- };
1113
- }
1114
- }), Xl = /* @__PURE__ */ Le(Ql, [["__scopeId", "data-v-c2c7ed35"]]), Zl = { class: "flex w-full pb-24" }, et = /* @__PURE__ */ z({
1115
- __name: "AddMemberForm",
1116
- props: {
1117
- initialValue: {
1118
- type: Object
1119
- },
1120
- roleErrorMessage: {
1121
- type: String,
1122
- default: ""
1123
- }
1124
- },
1125
- setup(l, { expose: t }) {
1126
- const e = l, i = j(), r = j({
1127
- permissions: []
1128
- });
1129
- function n(F) {
1130
- i.value = F;
1131
- }
1132
- function k(F) {
1133
- r.value = { ...r.value, ...F };
1134
- }
1135
- function $() {
1136
- var F, s, _, N, B, V, U, C;
1137
- return {
1138
- email: ((F = i.value) == null ? void 0 : F.email) ?? void 0,
1139
- phoneNumber: ((s = i.value) == null ? void 0 : s.phoneNumber) ?? void 0,
1140
- permissions: r.value.permissions,
1141
- posUser: r.value.posUser ? {
1142
- ...r.value.posUser,
1143
- name: r.value.posUser.name || ((N = (_ = e.initialValue) == null ? void 0 : _.posUser) == null ? void 0 : N.name) || ((B = e.initialValue) == null ? void 0 : B.name) || ((V = i.value) == null ? void 0 : V.displayName) || "",
1144
- code: r.value.posUser.code || ((C = (U = e.initialValue) == null ? void 0 : U.posUser) == null ? void 0 : C.code) || "",
1145
- passcode: r.value.posUser.passcode,
1146
- roles: r.value.posUser.roles.filter((b) => !!b.roleId)
1147
- } : void 0
1148
- };
1149
- }
1150
- const p = j();
1151
- async function y() {
1152
- return (await p.value.validateInputsWithoutSubmit()).length ? null : $();
1153
- }
1154
- return t({
1155
- readFormData: $,
1156
- validate: y
1157
- }), (F, s) => {
1158
- const _ = M("FmForm");
1159
- return m(), I(_, {
1160
- ref_key: "formRef",
1161
- ref: p,
1162
- class: "mx-4 flex flex-col"
1163
- }, {
1164
- default: q(() => {
1165
- var N, B, V;
1166
- return [
1167
- u("div", Zl, [
1168
- e.initialValue ? (m(), I(ml, {
1169
- key: 1,
1170
- data: e.initialValue
1171
- }, null, 8, ["data"])) : (m(), I(Xl, {
1172
- key: 0,
1173
- onInvite: s[0] || (s[0] = (U) => n(U))
1174
- }))
1175
- ]),
1176
- i.value || l.initialValue ? (m(), I(Ll, {
1177
- key: 0,
1178
- username: ((N = l.initialValue) == null ? void 0 : N.name) || ((B = i.value) == null ? void 0 : B.displayName) || "",
1179
- initialValue: l.initialValue,
1180
- isOwner: (V = l.initialValue) == null ? void 0 : V.isOwner,
1181
- onPermissionChanged: s[1] || (s[1] = (U) => k(U))
1182
- }, null, 8, ["username", "initialValue", "isOwner"])) : O("", !0)
1183
- ];
1184
- }),
1185
- _: 1
1186
- }, 512);
1187
- };
1188
- }
1189
- });
1190
- function lt() {
1191
- const l = we();
1192
- function t(i) {
1193
- l.open({ title: i, type: "success" });
1194
- }
1195
- function e(i) {
1196
- l.open({ title: i, type: "error" });
1197
- }
1198
- return {
1199
- success: t,
1200
- error: e
1201
- };
1202
- }
1203
- const tt = {
1204
- class: "space-y-24"
1205
- }, st = {
1206
- class: "space-y-8"
1207
- }, at = {
1208
- class: "xs:hidden flex w-full items-start justify-between px-16"
1209
- }, ot = {
1210
- class: "flex items-start gap-8"
1211
- }, nt = {
1212
- class: "space-y-4 hidden xs:block px-16"
1213
- }, rt = {
1214
- class: "flex items-start gap-8"
1215
- }, it = {
1216
- key: 0
1217
- }, ut = {
1218
- key: 1,
1219
- class: "bg-fm-color-neutral-white shadow-light-300 flex max-h-dvh items-center justify-center gap-24 self-stretch p-24"
1220
- }, mt = {
1221
- class: "flex flex-col items-center justify-center gap-16"
1222
- }, dt = ["src"], ct = {
1223
- class: "fm-typo-title-sm-700"
1224
- }, pt = {
1225
- class: "fm-typo-body-md-400 text-center text-gray-500"
1226
- }, ft = {
1227
- class: "flex items-center justify-start gap-8"
1228
- };
1229
- var H = /* @__PURE__ */ function(l) {
1230
- return l[l.ADD = 0] = "ADD", l[l.UPDATE = 1] = "UPDATE", l[l.CLOSED = 2] = "CLOSED", l;
1231
- }(H || {});
1232
- const Ft = /* @__PURE__ */ z({
1233
- __name: "TeamMemberList",
1234
- setup(l) {
1235
- const {
1236
- t
1237
- } = ee(), e = re(), i = Oe(), {
1238
- success: r,
1239
- error: n
1240
- } = lt(), k = ({
1241
- member: o,
1242
- className: x = ""
1243
- }) => {
1244
- const K = {
1245
- label: t("common.update"),
1246
- onClick: () => s(ae.Update, o)
1247
- }, J = {
1248
- label: t("common.remove"),
1249
- onClick: () => s(ae.Remove, o),
1250
- itemClass: "text-fm-color-typo-error"
1251
- }, X = o.doc.isOwner ? [K] : [K, J];
1252
- return v(Qe, {
1253
- class: x,
1254
- items: X
1255
- }, null);
1256
- }, $ = (o) => o.doc.isOwner ? t("team.labels.businessOwner") : o.restaurants.join(", "), p = [{
1257
- accessorKey: "name",
1258
- header: () => t("team.table.columns.name"),
1259
- enableSorting: !1
1260
- }, {
1261
- accessorKey: "phoneNumber",
1262
- header: () => t("team.table.columns.phoneNumber"),
1263
- enableSorting: !1
1264
- }, {
1265
- accessorKey: "restaurant",
1266
- header: () => t("team.table.columns.restaurant"),
1267
- enableSorting: !1,
1268
- cell(o) {
1269
- const x = o.row.original;
1270
- return $(x);
1271
- }
1272
- }, {
1273
- accessorKey: "permission",
1274
- header: () => t("team.table.columns.permission"),
1275
- enableSorting: !1,
1276
- cell(o) {
1277
- const x = o.row.original;
1278
- return y(x);
1279
- },
1280
- meta: {
1281
- width: "200px"
1282
- }
1283
- }, {
1284
- id: "action",
1285
- meta: {
1286
- cellClass: "pl-16",
1287
- headerContentClass: "-mx-16"
1288
- },
1289
- cell(o) {
1290
- const x = o.row.original;
1291
- return k({
1292
- member: x,
1293
- className: "flex justify-end w-full"
1294
- });
1295
- },
1296
- enableSorting: !1
1297
- }];
1298
- function y(o) {
1299
- return o.doc.isOwner ? t("team.labels.businessOwner") : v("div", {
1300
- class: "flex flex-row items-center gap-8"
1301
- }, [v("span", null, [t("team.labels.allowed", {
1302
- count: o.permissions.length
1303
- })]), v(Ee.FmTooltip, {
1304
- variant: "plain",
1305
- placement: "top"
1306
- }, {
1307
- default: () => v(M("componentsFmIcon"), {
1308
- name: "info",
1309
- class: "cursor-pointer text-fm-color-neutral-gray-300"
1310
- }, null),
1311
- content: () => v("div", null, [t("team.labels.permission"), o.permissions.map((x) => v("div", null, [xe("- "), x]))])
1312
- })]);
1313
- }
1314
- function F(o) {
1315
- var x, K, J, X;
1316
- return {
1317
- id: o.id,
1318
- isOwner: o.doc.isOwner,
1319
- name: o.name,
1320
- phoneNumber: o.phoneNumber,
1321
- email: o.email,
1322
- permissions: o.doc.permissions,
1323
- posUser: o.doc.posUser ? {
1324
- code: ((x = o.doc.posUser) == null ? void 0 : x.code) ?? "",
1325
- name: ((K = o.doc.posUser) == null ? void 0 : K.name) ?? o.name,
1326
- passcode: ((J = o.doc.posUser) == null ? void 0 : J.passcode) ?? "",
1327
- roles: ((X = o.doc.posUser) == null ? void 0 : X.roles) ?? []
1328
- } : void 0
1329
- };
1330
- }
1331
- const s = (o, x) => {
1332
- if (o == ae.Update) {
1333
- const K = F(x);
1334
- b.value = K, B.value = H.UPDATE;
1335
- }
1336
- o == ae.Remove && L(x);
1337
- }, _ = we(), N = qe(), B = j(H.CLOSED), V = R(() => B.value !== H.CLOSED), U = R(() => B.value === H.ADD ? t("common.add") : t("common.update")), C = R(() => B.value === H.ADD ? t("team.actions.addMember") : t("team.actions.updateMember")), b = j();
1338
- function c(o) {
1339
- o || (B.value = H.CLOSED);
1340
- }
1341
- function h() {
1342
- B.value = H.CLOSED;
1343
- }
1344
- const {
1345
- breakpoints: E
1346
- } = Be(), L = (o) => {
1347
- N.open({
1348
- title: t("team.actions.removeMember"),
1349
- message: t("team.removeMember.confirmationMessage", {
1350
- memberName: o.name
1351
- }),
1352
- minWidth: E.value.lg ? 588 : 0,
1353
- primaryActions: {
1354
- text: "Remove",
1355
- close: !1,
1356
- variant: "destructive"
1357
- },
1358
- secondaryActions: {
1359
- text: "Cancel",
1360
- close: !0
1361
- }
1362
- }).onPrimary(async () => {
1363
- await me.deleteTeamMember(o.id).then(() => _.open({
1364
- message: t("team.removeMember.successMessage", {
1365
- memberName: o.name
1366
- }),
1367
- type: "success"
1368
- })).catch((x) => n(x)), N.close(), W();
1369
- });
1370
- }, Y = () => {
1371
- b.value = null, B.value = H.ADD;
1372
- }, g = j([]), a = j(), w = j(), f = R(() => Object.values(ce).map((o) => ({
1373
- label: o.label,
1374
- value: o.subject
1375
- }))), {
1376
- searchKey: S,
1377
- filter: D
1378
- } = je(""), le = R(() => g.value.filter((o) => {
1379
- var X;
1380
- const x = !a.value || o.managableRestaurantIds.some((te) => a.value.includes(te)), K = ((X = o.doc.permissions) == null ? void 0 : X.map((te) => te.subject).flat().filter(Boolean)) || [], J = !w.value || K.some((te) => w.value.includes(te));
1381
- return x && J && D([o.name, o.phoneNumber, $(o)]);
1382
- }));
1383
- async function W(o = !0) {
1384
- const x = await me.readTeamMembers();
1385
- g.value = x.sort((K, J) => K.doc.isOwner ? -1 : K.name.localeCompare(J.name)), o || await i.readRoles();
1386
- }
1387
- const se = j();
1388
- async function fe() {
1389
- if (se.value) {
1390
- const o = await se.value.validate();
1391
- if (!o) return;
1392
- try {
1393
- await (B.value === H.ADD ? me.createTeamMember(o) : me.updateTeamMember(b.value.id, o)), await W(), B.value === H.ADD ? r(t("team.addMember.successMessage", {
1394
- memberName: o.name
1395
- })) : r(t("team.updateMember.successMessage", {
1396
- memberName: o.name
1397
- }));
1398
- } catch (x) {
1399
- n(x);
1400
- }
1401
- }
1402
- B.value = H.CLOSED;
1403
- }
1404
- return Ve(e.currentBusiness, () => {
1405
- var o;
1406
- (o = e.currentBusiness.value) != null && o._id && W(!1);
1407
- }, {
1408
- immediate: !0
1409
- }), (o, x) => {
1410
- const K = M("FmSpacer"), J = M("FmButton"), X = M("FmSearch"), te = M("FmTable"), Ne = M("FmSideSheet");
1411
- return m(), P(ne, null, [v(ze, {
1412
- heading: d(t)("team.title")
1413
- }, {
1414
- "append-heading": q(() => [v(K), v(J, {
1415
- "prepend-icon": "add",
1416
- label: d(t)("team.actions.addMember"),
1417
- onClick: Y
1418
- }, null, 8, ["label"])]),
1419
- default: q(() => [u("div", tt, [u("div", st, [u("div", at, [u("div", ot, [v(d($e), {
1420
- modelValue: a.value,
1421
- "onUpdate:modelValue": x[0] || (x[0] = (T) => a.value = T),
1422
- "managable-only": !1,
1423
- multiple: "",
1424
- variant: "dark",
1425
- class: "!w-auto"
1426
- }, null, 8, ["modelValue"]), v(Ue, {
1427
- modelValue: w.value,
1428
- "onUpdate:modelValue": x[1] || (x[1] = (T) => w.value = T),
1429
- multiple: "",
1430
- variant: "dark",
1431
- items: f.value,
1432
- "selected-prefix": d(t)("team.filter.selected_permission_prefix"),
1433
- placeholder: d(t)("team.filter.permission_placeholder")
1434
- }, null, 8, ["modelValue", "items", "selected-prefix", "placeholder"])]), v(X, {
1435
- modelValue: d(S),
1436
- "onUpdate:modelValue": x[2] || (x[2] = (T) => ye(S) ? S.value = T : null),
1437
- class: "w-[320px] xs:w-full xs:mt-8",
1438
- autofocus: "",
1439
- placeholder: d(t)("team.search.placeholder")
1440
- }, null, 8, ["modelValue", "placeholder"])]), u("div", nt, [v(X, {
1441
- modelValue: d(S),
1442
- "onUpdate:modelValue": x[3] || (x[3] = (T) => ye(S) ? S.value = T : null),
1443
- class: "w-[320px] xs:w-full xs:mt-8",
1444
- autofocus: "",
1445
- placeholder: d(t)("team.search.placeholder")
1446
- }, null, 8, ["modelValue", "placeholder"]), u("div", rt, [v(d($e), {
1447
- modelValue: a.value,
1448
- "onUpdate:modelValue": x[4] || (x[4] = (T) => a.value = T),
1449
- "managable-only": !1,
1450
- multiple: "",
1451
- variant: "dark",
1452
- class: "!w-auto"
1453
- }, null, 8, ["modelValue"]), v(Ue, {
1454
- modelValue: w.value,
1455
- "onUpdate:modelValue": x[5] || (x[5] = (T) => w.value = T),
1456
- multiple: "",
1457
- variant: "dark",
1458
- items: f.value,
1459
- "selected-prefix": d(t)("team.filter.selected_permission_prefix"),
1460
- placeholder: d(t)("team.filter.permission_placeholder")
1461
- }, null, 8, ["modelValue", "items", "selected-prefix", "placeholder"])])]), g.value && g.value.length > 0 ? (m(), P("div", it, [v(Te, null, {
1462
- default: q(() => [v(te, {
1463
- "column-defs": p,
1464
- "row-data": le.value,
1465
- "page-size": le.value.length,
1466
- "pin-header-row": "",
1467
- "hide-footer": "",
1468
- "shrink-at": !1,
1469
- onRowClick: x[6] || (x[6] = (T) => s(d(ae).Update, T.original))
1470
- }, null, 8, ["row-data", "page-size"])]),
1471
- _: 1
1472
- })])) : (m(), P("div", ut, [u("div", mt, [u("div", null, [u("img", {
1473
- src: d(We),
1474
- alt: "List is empty"
1475
- }, null, 8, dt)]), u("p", ct, A(d(t)("team.emptyState.title")), 1), u("p", pt, A(d(t)("team.emptyState.description")), 1)])]))])])]),
1476
- _: 1
1477
- }, 8, ["heading"]), v(Ne, {
1478
- header: C.value,
1479
- "model-value": V.value,
1480
- "max-width": 560,
1481
- "dismiss-away": "",
1482
- "onUpdate:modelValue": x[7] || (x[7] = (T) => c(T))
1483
- }, {
1484
- "side-sheet-footer": q(() => [u("div", ft, [v(J, {
1485
- label: U.value,
1486
- size: "md",
1487
- variant: "primary",
1488
- onClick: Re(fe, ["prevent"])
1489
- }, null, 8, ["label"]), v(J, {
1490
- label: d(t)("common.cancel"),
1491
- size: "md",
1492
- variant: "secondary",
1493
- onClick: h
1494
- }, null, 8, ["label"])])]),
1495
- default: q(() => [v(et, {
1496
- ref_key: "memberForm",
1497
- ref: se,
1498
- initialValue: b.value,
1499
- class: "gap-8"
1500
- }, null, 8, ["initialValue"])]),
1501
- _: 1
1502
- }, 8, ["header", "model-value"])], 64);
1503
- };
1504
- }
1505
- });
1506
- export {
1507
- Ft as default
1508
- };