@feedmepos/mf-hrm-portal 2.1.0-dev.3 → 2.1.1-dev

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 (34) hide show
  1. package/dist/{AuditLogList-C8VefmfL.js → AuditLogList-Cvp-5_0y.js} +4 -4
  2. package/dist/{ConditionFormHost.vue_vue_type_script_setup_true_lang-B25U2YoL.js → ConditionFormHost.vue_vue_type_script_setup_true_lang-Cb8-YaiH.js} +104 -100
  3. package/dist/{EmployeeList-DDY8DxQr.js → EmployeeList-DgrD3Hjm.js} +6 -6
  4. package/dist/{Main-D8zj09ZS.js → Main-BLRr_ORG.js} +9 -9
  5. package/dist/{Main-BQ36wEVl.js → Main-G3am-0Xi.js} +4 -4
  6. package/dist/{Main-D7xrzW8p.js → Main-mTxcltDY.js} +6 -6
  7. package/dist/{PermissionSetList-zdFnxyCb.js → PermissionSetList-OzyfE-Yg.js} +6 -6
  8. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Ca2NnAAF.js +4121 -0
  9. package/dist/{PortalUserSearcher.vue_vue_type_style_index_0_scoped_a439fdd8_lang-DqY-OTuj.js → PortalUserSearcher.vue_vue_type_style_index_0_scoped_79737e32_lang-Czo3FLbc.js} +2 -1
  10. package/dist/{RoleList-CRYU_eRb.js → RoleList-DOZ5RJ6A.js} +8 -8
  11. package/dist/TeamMemberList-CAqLUyQK.js +1186 -0
  12. package/dist/{TimesheetList-C00-tU7K.js → TimesheetList-D21j4zLV.js} +6 -6
  13. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_2c7a177a_lang-dT_CJJDV.js → TimesheetList.vue_vue_type_style_index_0_scoped_2c7a177a_lang-CRmmIfTk.js} +2 -2
  14. package/dist/{app-C-wWQrRY.js → app-CX-St7pv.js} +300 -284
  15. package/dist/app.js +1 -1
  16. package/dist/{dayjs.min-Bk9YhjTx.js → dayjs.min-MDoe5X-P.js} +1 -1
  17. package/dist/{employee-DzKKMXNo.js → employee-B2cdx2t4.js} +3 -3
  18. package/dist/{iteration-BV93u72h.js → iteration-B38iapI_.js} +1 -1
  19. package/dist/{lodash-psyQLJ6h.js → lodash-DZAGPZLQ.js} +1 -1
  20. package/dist/{rule-mNiIG4E8.js → rule-DftQBR76.js} +17 -13
  21. package/dist/src/composables/useBasePermission.d.ts +1 -1
  22. package/dist/src/helpers/filter.d.ts +15 -0
  23. package/dist/src/helpers/permission-reconcile.d.ts +15 -0
  24. package/dist/src/helpers/permission-reconcile.test.d.ts +1 -0
  25. package/dist/src/helpers/permission-set.d.ts +4 -2
  26. package/dist/src/views/team/locales/index.d.ts +4 -0
  27. package/dist/style.css +1 -1
  28. package/dist/tsconfig.app.tsbuildinfo +1 -1
  29. package/dist/{useAppStore-CEgLVGO6.js → useAppStore-BBsP5C3E.js} +1 -1
  30. package/dist/{useLoading-CJtXNU4d.js → useLoading-qgSjOzRD.js} +1 -1
  31. package/dist/{useReportPermissions-DoQyFUKj.js → useReportPermissions-CIhkjN3B.js} +3 -3
  32. package/package.json +2 -2
  33. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-DOgOa3cu.js +0 -4042
  34. package/dist/TeamMemberList-CMK7Yfn6.js +0 -1169
package/dist/app.js CHANGED
@@ -1,4 +1,4 @@
1
- import { j as e, i as r, r as o } from "./app-C-wWQrRY.js";
1
+ import { j as e, i as r, r as o } from "./app-CX-St7pv.js";
2
2
  export {
3
3
  e as FmApp,
4
4
  r as i18nMessages,
@@ -1,4 +1,4 @@
1
- import { g as Q, c as K } from "./app-C-wWQrRY.js";
1
+ import { g as Q, c as K } from "./app-CX-St7pv.js";
2
2
  var E = { exports: {} };
3
3
  (function(V, X) {
4
4
  (function(W, k) {
@@ -1,9 +1,9 @@
1
- import { d as g } from "./dayjs.min-Bk9YhjTx.js";
1
+ import { d as g } from "./dayjs.min-MDoe5X-P.js";
2
2
  import { defineStore as $, storeToRefs as T } from "pinia";
3
3
  import { ref as m } from "vue";
4
- import { b as l, g as f, u as w, s as E } from "./iteration-BV93u72h.js";
4
+ import { b as l, g as f, u as w, s as E } from "./iteration-B38iapI_.js";
5
5
  import { i as v } from "./utils-BZkjJbju.js";
6
- import { u as _ } from "./useAppStore-CEgLVGO6.js";
6
+ import { u as _ } from "./useAppStore-BBsP5C3E.js";
7
7
  const o = {
8
8
  async readEmployees() {
9
9
  return f(await l().get("/pos-users"));
@@ -1,7 +1,7 @@
1
1
  import { defineStore as Gs, storeToRefs as Hs } from "pinia";
2
2
  import { ref as eo } from "vue";
3
3
  import { useCoreStore as ui, baseClientInstance as Dr, FeedMeAuth as qs } from "@feedmepos/mf-common";
4
- import { c as U } from "./app-C-wWQrRY.js";
4
+ import { c as U } from "./app-CX-St7pv.js";
5
5
  function Ur(e, n) {
6
6
  return function() {
7
7
  return e.apply(n, arguments);
@@ -1,4 +1,4 @@
1
- import { c as jt } from "./app-C-wWQrRY.js";
1
+ import { c as jt } from "./app-CX-St7pv.js";
2
2
  var Jr = { exports: {} };
3
3
  /**
4
4
  * @license
@@ -1,5 +1,5 @@
1
- import { g as b, b as v, q as F, u as Z, s as W, d as q, e as y } from "./iteration-BV93u72h.js";
2
- import { h as A, P as V, d as _, v as k, n as j, b as ee } from "./app-C-wWQrRY.js";
1
+ import { g as b, b as v, q as F, u as Z, s as W, d as q, e as y } from "./iteration-B38iapI_.js";
2
+ import { h as A, P as V, d as _, v as k, n as j, b as ee } from "./app-CX-St7pv.js";
3
3
  import { s as ne } from "./utils-BZkjJbju.js";
4
4
  import { defineStore as z, storeToRefs as K } from "pinia";
5
5
  import { ref as S, computed as U } from "vue";
@@ -426,13 +426,15 @@ function Q(e) {
426
426
  }
427
427
  d.setNames.push(c.name);
428
428
  const m = D(d.conditions);
429
- if (m && a) {
430
- for (const f in a)
431
- (r = m[f]) != null && r.$in && (u = a[f]) != null && u.$in ? m[f].$in = Array.from(
432
- /* @__PURE__ */ new Set([...m[f].$in, ...a[f].$in])
433
- ) : m[f] || (m[f] = a[f]);
434
- d.conditions = JSON.stringify(m);
429
+ if (!m || !a) {
430
+ d.conditions = void 0;
431
+ return;
435
432
  }
433
+ for (const f in a)
434
+ (r = m[f]) != null && r.$in && (u = a[f]) != null && u.$in ? m[f].$in = Array.from(
435
+ /* @__PURE__ */ new Set([...m[f].$in, ...a[f].$in])
436
+ ) : m[f] || (m[f] = a[f]);
437
+ d.conditions = JSON.stringify(m);
436
438
  };
437
439
  for (const i of e)
438
440
  for (const s of i.permissions)
@@ -648,11 +650,13 @@ function Ee(e, n) {
648
650
  if (!l || !d || !ue(d, r))
649
651
  return c.push(r), c;
650
652
  if (l.has("manage")) return c;
651
- const m = new Set(r.actions), f = m.has("manage");
652
- let p = !1;
653
- for (const g of l)
654
- g !== "manage" && m.delete(g) && (p = !0);
655
- return f && p && m.delete("manage"), m.size === 0 || c.push({ ...r, actions: Array.from(m) }), c;
653
+ const m = r.actions;
654
+ if (m.includes("manage"))
655
+ return c.push(r), c;
656
+ const f = new Set(m);
657
+ for (const p of l)
658
+ f.delete(p);
659
+ return f.size === 0 || c.push({ ...r, actions: Array.from(f) }), c;
656
660
  }, []);
657
661
  }
658
662
  function M(e, n) {
@@ -26,7 +26,7 @@ export declare function useBasePermission(modelValue: Readonly<Ref<FdoPermission
26
26
  toggleAllManage: (group: CategoryGroup) => void;
27
27
  isManageChecked: (group: CategoryGroup, subject: string) => boolean;
28
28
  isManageIndeterminate: (group: CategoryGroup, subject: string) => boolean;
29
- toggleManage: (_group: CategoryGroup, subject: string, checked: boolean) => void;
29
+ toggleManage: (group: CategoryGroup, subject: string, checked: boolean) => void;
30
30
  hasNonManageActions: (group: CategoryGroup, subject: string) => boolean;
31
31
  isActionChecked: (group: CategoryGroup, subject: string, action: string) => boolean;
32
32
  isRowFullyCoveredByCover: (group: CategoryGroup, subject: string) => boolean;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Sentinel value used in multi-select list filters (assigned role, restaurant, etc.) to
3
+ * represent "this field is empty/unassigned for the record". Must match the backend's
4
+ * `UNASSIGNED_FILTER_VALUE` in src/common/helpers/filter.ts.
5
+ *
6
+ * When sending a filter that includes this value to the backend, it must be the first element
7
+ * of the array -- the backend only checks index 0 to detect it (cheap even for filters with
8
+ * large option sets), it does not scan the whole list.
9
+ */
10
+ export declare const UNASSIGNED_FILTER_VALUE = "__unassigned__";
11
+ /**
12
+ * Reorders a multi-select filter's selected values so the "unassigned" sentinel (if present)
13
+ * is always first, matching what the backend's `splitUnassignedFilter` expects.
14
+ */
15
+ export declare function withUnassignedFirst(values?: string[]): string[] | undefined;
@@ -0,0 +1,15 @@
1
+ import type { FdoPermissionRule } from '@feedmepos/core/entity';
2
+ import type { IFdtoPortalPermissionsWithVisibilityCondition } from '@feedmepos/hrm-permission';
3
+ /**
4
+ * Reconcile a BasePermission update (which works with the expanded view) back to the raw modelValue.
5
+ *
6
+ * - Subject removed that was directly in raw → remove it
7
+ * - Subject removed that was system-expanded (not in raw) → add inverted rule to block re-expansion
8
+ * - Subject removed that was stored directly AND still reachable via expansion from remaining
9
+ * rules (e.g. previously materialized by an earlier save) → remove direct rule AND add inverted,
10
+ * otherwise materializeSystemPermissionSetOverrides re-injects it during save
11
+ * - Subject added that had an inverted rule → remove the inverted rule (expansion re-enables it)
12
+ * - Subject added that is genuinely new → add it to raw
13
+ * - Subject unchanged but actions changed → update actions in raw (multi-action permissions)
14
+ */
15
+ export declare function reconcileBasePermissionUpdate(prevExpandedRules: FdoPermissionRule[], newExpandedRules: FdoPermissionRule[], rawRules: FdoPermissionRule[], findPermissionDef: (subject: string) => IFdtoPortalPermissionsWithVisibilityCondition | undefined): FdoPermissionRule[];
@@ -0,0 +1 @@
1
+ export {};
@@ -75,8 +75,10 @@ export declare function filterStalePermissions(permissions: FdoPermissionRule[],
75
75
  * individual rule.
76
76
  * - Otherwise, only covered non-manage actions are stripped from individual rules when
77
77
  * the cover condition also covers the individual rule.
78
- * If `manage` was present and any non-manage action is stripped (breaking the
79
- * "manage = all non-manage selected" invariant), `manage` is also stripped.
78
+ * `manage` is a real CASL wildcard grant that implies every action, not merely a
79
+ * shorthand for "all non-manage actions selected" a rule carrying `manage` is
80
+ * pushed through UNCHANGED (a cover lacking `manage` cannot cover it). Stripping its
81
+ * constituent actions and then dropping `manage` would destroy the user's grant.
80
82
  * Rules that end up with no remaining actions are dropped.
81
83
  *
82
84
  * Inverted rules and the cover subjects themselves pass through untouched.
@@ -49,6 +49,7 @@ export declare const i18nMessages: {
49
49
  selected_permission_prefix: string;
50
50
  assigned_role_placeholder: string;
51
51
  selected_assigned_role_prefix: string;
52
+ unassigned_label: string;
52
53
  };
53
54
  emptyState: {
54
55
  title: string;
@@ -297,6 +298,7 @@ export declare const i18nMessages: {
297
298
  selected_permission_prefix: string;
298
299
  assigned_role_placeholder: string;
299
300
  selected_assigned_role_prefix: string;
301
+ unassigned_label: string;
300
302
  };
301
303
  emptyState: {
302
304
  title: string;
@@ -545,6 +547,7 @@ export declare const i18nMessages: {
545
547
  selected_permission_prefix: string;
546
548
  assigned_role_placeholder: string;
547
549
  selected_assigned_role_prefix: string;
550
+ unassigned_label: string;
548
551
  };
549
552
  emptyState: {
550
553
  title: string;
@@ -793,6 +796,7 @@ export declare const i18nMessages: {
793
796
  selected_permission_prefix: string;
794
797
  assigned_role_placeholder: string;
795
798
  selected_assigned_role_prefix: string;
799
+ unassigned_label: string;
796
800
  };
797
801
  emptyState: {
798
802
  title: string;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .employee-list-table[data-v-9cf34375] [class~=gap-24]>div:first-child{display:none}.timesheet-user-view[data-v-2c7a177a] .basis-72{display:none}.user-info-icon[data-v-a439fdd8]{flex-shrink:0;cursor:pointer;font-size:.75rem;font-weight:600;line-height:1rem;letter-spacing:.02em;text-decoration-line:none;color:var(--fm-color-neutral-white);display:flex;align-items:center;justify-content:center;background:linear-gradient(201deg,#fc9b40 10.3%,#ff6052 98.36%)}.user-info-icon--md[data-v-a439fdd8]{height:2.25rem;width:2.25rem;border-radius:8px}.user-info-icon--lg[data-v-a439fdd8]{height:48px;width:48px;border-radius:16px}.profile-menu[data-v-a439fdd8]{width:280px;padding-top:12px;padding-bottom:12px}.profile-menu--profile[data-v-a439fdd8]>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}.profile-menu--profile[data-v-a439fdd8]{padding:16px 16px 12px;border-radius:8px;display:flex;align-items:center;border-width:1px;border-color:var(--fm-color-neutral-gray-200)}.profile-menu--profile .profile-displayName[data-v-a439fdd8]{font-size:1rem;font-weight:400;line-height:1.25rem;letter-spacing:.005em;text-decoration-line:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-menu--profile .profile-email[data-v-a439fdd8],.profile-menu--profile .profile-phone[data-v-a439fdd8]{font-size:.875rem;font-weight:400;line-height:1.125rem;letter-spacing:.0125em;text-decoration-line:none;color:var(--fm-color-neutral-gray-300);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audit-log-list-table[data-v-c4118552] [class~=gap-24]>div:first-child{display:none}.audit-log-list-table[data-v-c4118552] tr:has(.audit-op-marker){background-color:var(--fm-color-neutral-gray-100);border-top:1px solid var(--fm-color-neutral-gray-200)}.audit-log-list-table[data-v-c4118552] tr:has(.audit-op-marker):hover{background-color:#e8e8ed}.audit-log-action-label[data-v-c4118552]{display:block;width:100%;max-width:100%;max-height:6.25rem;overflow-y:auto;white-space:pre-line;word-break:break-word;line-height:1.25rem;scrollbar-width:none;-ms-overflow-style:none}.audit-log-action-label[data-v-c4118552]::-webkit-scrollbar{display:none}.audit-log-operation-label-detail[data-v-c4118552]{max-height:6.875rem;overflow-y:auto;white-space:pre-line;word-break:break-word;line-height:1.375rem;scrollbar-width:none;-ms-overflow-style:none}.audit-log-operation-label-detail[data-v-c4118552]::-webkit-scrollbar{display:none}
1
+ .employee-list-table[data-v-9cf34375] [class~=gap-24]>div:first-child{display:none}.timesheet-user-view[data-v-2c7a177a] .basis-72{display:none}.user-info-icon[data-v-79737e32]{flex-shrink:0;cursor:pointer;font-size:.75rem;font-weight:600;line-height:1rem;letter-spacing:.02em;text-decoration-line:none;color:var(--fm-color-neutral-white);display:flex;align-items:center;justify-content:center;background:linear-gradient(201deg,#fc9b40 10.3%,#ff6052 98.36%)}.user-info-icon--md[data-v-79737e32]{height:2.25rem;width:2.25rem;border-radius:8px}.user-info-icon--lg[data-v-79737e32]{height:48px;width:48px;border-radius:16px}.profile-menu[data-v-79737e32]{width:280px;padding-top:12px;padding-bottom:12px}.profile-menu--profile[data-v-79737e32]>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}.profile-menu--profile[data-v-79737e32]{padding:16px 16px 12px;border-radius:8px;display:flex;align-items:center;border-width:1px;border-color:var(--fm-color-neutral-gray-200)}.profile-menu--profile .profile-displayName[data-v-79737e32]{font-size:1rem;font-weight:400;line-height:1.25rem;letter-spacing:.005em;text-decoration-line:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.profile-menu--profile .profile-email[data-v-79737e32],.profile-menu--profile .profile-phone[data-v-79737e32]{font-size:.875rem;font-weight:400;line-height:1.125rem;letter-spacing:.0125em;text-decoration-line:none;color:var(--fm-color-neutral-gray-300);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audit-log-list-table[data-v-c4118552] [class~=gap-24]>div:first-child{display:none}.audit-log-list-table[data-v-c4118552] tr:has(.audit-op-marker){background-color:var(--fm-color-neutral-gray-100);border-top:1px solid var(--fm-color-neutral-gray-200)}.audit-log-list-table[data-v-c4118552] tr:has(.audit-op-marker):hover{background-color:#e8e8ed}.audit-log-action-label[data-v-c4118552]{display:block;width:100%;max-width:100%;max-height:6.25rem;overflow-y:auto;white-space:pre-line;word-break:break-word;line-height:1.25rem;scrollbar-width:none;-ms-overflow-style:none}.audit-log-action-label[data-v-c4118552]::-webkit-scrollbar{display:none}.audit-log-operation-label-detail[data-v-c4118552]{max-height:6.875rem;overflow-y:auto;white-space:pre-line;word-break:break-word;line-height:1.375rem;scrollbar-width:none;-ms-overflow-style:none}.audit-log-operation-label-detail[data-v-c4118552]::-webkit-scrollbar{display:none}