@feedmepos/mf-hrm-portal 2.0.25 → 2.1.0-dev.2

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 (63) hide show
  1. package/dist/AuditLogList-AGlAsWwd.js +1608 -0
  2. package/dist/ConditionFormHost.vue_vue_type_script_setup_true_lang-BYHKFwRm.js +383 -0
  3. package/dist/EmployeeList-KvjoGI87.js +884 -0
  4. package/dist/{Main-C6YMg19H.js → Main-BLh16xRg.js} +187 -184
  5. package/dist/{Main-DQg87aB2.js → Main-D3TSdtSE.js} +7 -7
  6. package/dist/{Main-CyqPnLTe.js → Main-Dn1TfDRj.js} +1033 -1029
  7. package/dist/PermissionSetList-Ds69m9UU.js +392 -0
  8. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Bk6ub3Dv.js +4030 -0
  9. package/dist/{PortalUserSearcher.vue_vue_type_style_index_0_scoped_a439fdd8_lang-DWeS7VXx.js → PortalUserSearcher.vue_vue_type_style_index_0_scoped_a439fdd8_lang-BHxCP_uW.js} +1 -1
  10. package/dist/ResponsiveFabButton.vue_vue_type_script_setup_true_lang-QrqYEy8i.js +42 -0
  11. package/dist/RoleList-v8McRCnz.js +684 -0
  12. package/dist/Skeleton.vue_vue_type_script_setup_true_lang-B4PxNMwq.js +16 -0
  13. package/dist/{index.vue_vue_type_script_setup_true_lang-Vc5ARO29.js → TableEmptyState.vue_vue_type_script_setup_true_lang-Ci_MVqGK.js} +54 -20
  14. package/dist/TeamMemberList-BYQnNIhT.js +1169 -0
  15. package/dist/{TimesheetList-DzeE73Ns.js → TimesheetList-C1OWa6kf.js} +139 -133
  16. package/dist/{TimesheetList.vue_vue_type_style_index_0_scoped_91afda4e_lang-CTQs7MIl.js → TimesheetList.vue_vue_type_style_index_0_scoped_2c7a177a_lang-CLu9gzzi.js} +2 -2
  17. package/dist/{app-Df4eEEIU.js → app-CJouCBgi.js} +5248 -2273
  18. package/dist/app.js +1 -1
  19. package/dist/{dayjs.min-DmGoh5hw.js → dayjs.min-DUugkgDM.js} +1 -1
  20. package/dist/{employee-zWTRoOkw.js → employee-D5rEVmge.js} +3 -3
  21. package/dist/{iteration-DTV3udF0.js → iteration-QRRNYlps.js} +3 -3
  22. package/dist/{lodash-LInzVEDS.js → lodash-BlZhpHhM.js} +1 -1
  23. package/dist/rule-Dy7eMChN.js +1053 -0
  24. package/dist/src/api/audit-log/index.d.ts +6 -0
  25. package/dist/src/components/CheckboxInput.vue.d.ts +1 -1
  26. package/dist/src/components/button/ResponsiveFabButton.vue.d.ts +7 -1
  27. package/dist/src/components/table/EmptyDataTemplate/index.vue.d.ts +4 -1
  28. package/dist/src/components/table/TableEmptyState.vue.d.ts +31 -0
  29. package/dist/src/composables/useBasePermission.d.ts +1 -0
  30. package/dist/src/composables/useConditionDraft.d.ts +40 -0
  31. package/dist/src/composables/useCoverConditionOverride.d.ts +61 -0
  32. package/dist/src/helpers/business-timezone.d.ts +22 -0
  33. package/dist/src/helpers/permission-set.d.ts +4 -2
  34. package/dist/src/helpers/rule.d.ts +2 -1
  35. package/dist/src/stores/permission-set.d.ts +12 -3
  36. package/dist/src/types/audit-log.d.ts +1 -1
  37. package/dist/src/views/audit-log/event-line.d.ts +13 -0
  38. package/dist/src/views/audit-log/locales/index.d.ts +296 -0
  39. package/dist/src/views/audit-log/snapshot-diff.d.ts +11 -0
  40. package/dist/src/views/hr/employee/EmployeeList.vue.d.ts +1 -0
  41. package/dist/src/views/team/components/BasePermission.vue.d.ts +13 -0
  42. package/dist/src/views/team/condition-builders/ConditionFormHost.vue.d.ts +22 -0
  43. package/dist/src/views/team/condition-builders/ConditionFormRenderer.vue.d.ts +23 -0
  44. package/dist/src/views/team/condition-builders/component-map.d.ts +4 -0
  45. package/dist/src/views/team/condition-builders/condition-form-dedupe.d.ts +23 -0
  46. package/dist/src/views/team/locales/index.d.ts +68 -0
  47. package/dist/style.css +1 -1
  48. package/dist/tsconfig.app.tsbuildinfo +1 -1
  49. package/dist/{useAppStore-BlQSL2ZO.js → useAppStore-CtMoad7V.js} +1 -1
  50. package/dist/useDebounce-B8ZPVS5C.js +15 -0
  51. package/dist/{useLoading-NkUvAr71.js → useLoading-CNqlchYO.js} +1 -1
  52. package/dist/{useReportPermissions-R-eg1L2r.js → useReportPermissions-C5wGC9bf.js} +3 -3
  53. package/package.json +2 -2
  54. package/dist/AuditLogList-BWwgm5wH.js +0 -1145
  55. package/dist/CollapsibleWrapper.vue_vue_type_script_setup_true_lang-BLJlmPVa.js +0 -58
  56. package/dist/EmployeeList-aRGYYmxf.js +0 -851
  57. package/dist/PermissionSetList-BfKgFFUh.js +0 -356
  58. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-CNEAlTnY.js +0 -3457
  59. package/dist/ResponsiveFabButton.vue_vue_type_script_setup_true_lang-Cn-3MRBO.js +0 -38
  60. package/dist/RoleList-CtcVwAPE.js +0 -566
  61. package/dist/TeamMemberList-DU1jYeql.js +0 -1130
  62. package/dist/rule-O-E9JWJz.js +0 -995
  63. package/dist/useDebounce-CWb5QR9G.js +0 -28
@@ -9,6 +9,9 @@ declare const AuditLogAPI: {
9
9
  actions?: string[];
10
10
  outcomes?: string[];
11
11
  feedmeAdminActors?: boolean;
12
+ search?: string;
13
+ searchUserIds?: string[];
14
+ searchSubjects?: string[];
12
15
  }): Promise<number>;
13
16
  read(params?: {
14
17
  limit?: number;
@@ -21,6 +24,9 @@ declare const AuditLogAPI: {
21
24
  actions?: string[];
22
25
  outcomes?: string[];
23
26
  feedmeAdminActors?: boolean;
27
+ search?: string;
28
+ searchUserIds?: string[];
29
+ searchSubjects?: string[];
24
30
  }): Promise<AuditLogEntry[]>;
25
31
  /**
26
32
  * FeedMe-admin options for the User filter. `actors` is the named admin list (internal
@@ -141,8 +141,8 @@ declare const __VLS_component: import("vue").DefineComponent<import("vue").Extra
141
141
  }>> & Readonly<{
142
142
  "onUpdate:model-value"?: ((...args: any[]) => any) | undefined;
143
143
  }>, {
144
- max: number;
145
144
  min: number;
145
+ max: number;
146
146
  disable: boolean;
147
147
  showAllToggle: string | boolean;
148
148
  includeDisabledOptionsWhenSelectAll: boolean;
@@ -1,3 +1,9 @@
1
1
  import { type FmButtonProps } from '@feedmepos/ui-library';
2
- declare const _default: import("vue").DefineComponent<FmButtonProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FmButtonProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
2
+ interface Props extends FmButtonProps {
3
+ /** Whether the page has a fixed bottom footer (e.g. a pagination bar) the mobile FAB should raise above. */
4
+ hasFooterBelow?: boolean;
5
+ }
6
+ declare const _default: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
7
+ hasFooterBelow: boolean;
8
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
3
9
  export default _default;
@@ -1,6 +1,7 @@
1
1
  interface Props {
2
2
  title: string;
3
3
  subtitle: string;
4
+ isOutlined?: boolean;
4
5
  action?: {
5
6
  text: string;
6
7
  icon?: string;
@@ -11,7 +12,9 @@ declare var __VLS_8: {};
11
12
  type __VLS_Slots = {} & {
12
13
  action?: (props: typeof __VLS_8) => any;
13
14
  };
14
- declare const __VLS_component: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
+ declare const __VLS_component: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
16
+ isOutlined: boolean;
17
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
15
18
  declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
16
19
  export default _default;
17
20
  type __VLS_WithSlots<T, S> = T & {
@@ -0,0 +1,31 @@
1
+ import { type Breakpoints } from '@feedmepos/ui-library';
2
+ interface Props {
3
+ title: string;
4
+ subtitle: string;
5
+ isEmpty: boolean;
6
+ isLoading?: boolean;
7
+ /**
8
+ * At what width do the column titles disappear? Below/at this breakpoint the message is
9
+ * styled as a standalone bordered card instead of blending flat under the table header. Must
10
+ * mirror the wrapped FmTable's own `shrink-at` prop (both default to "sm"); pass `false` if
11
+ * the table never collapses.
12
+ */
13
+ collapseAt?: Breakpoints | false;
14
+ }
15
+ declare var __VLS_1: {
16
+ isEmpty: boolean;
17
+ };
18
+ type __VLS_Slots = {} & {
19
+ default?: (props: typeof __VLS_1) => any;
20
+ };
21
+ declare const __VLS_component: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {
22
+ isLoading: boolean;
23
+ collapseAt: Breakpoints | false;
24
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
25
+ declare const _default: __VLS_WithSlots<typeof __VLS_component, __VLS_Slots>;
26
+ export default _default;
27
+ type __VLS_WithSlots<T, S> = T & {
28
+ new (): {
29
+ $slots: S;
30
+ };
31
+ };
@@ -7,6 +7,7 @@ export type CategoryGroup = {
7
7
  options: {
8
8
  label: string;
9
9
  value: string;
10
+ optionKey: string;
10
11
  }[];
11
12
  selectedSubjects: string[];
12
13
  isMultiAction: boolean;
@@ -0,0 +1,40 @@
1
+ import { type Ref } from 'vue';
2
+ /**
3
+ * Local draft state for condition editing — tracks form field edits and
4
+ * inherit/custom mode changes for each builder, keyed by `${subject}::${builderKey}`.
5
+ *
6
+ * Drafts remain local until explicitly committed via `applyDrafts`. Closing
7
+ * a popover/menu without applying discards uncommitted changes.
8
+ */
9
+ export interface DraftKey {
10
+ subject: string;
11
+ builderKey: string;
12
+ }
13
+ export interface ConditionDraft {
14
+ /** The local draft form value for this builder. */
15
+ formValue: unknown;
16
+ /** Local draft inherit/custom mode for builders under a cover subject. */
17
+ inheritMode?: 'inherit' | 'custom';
18
+ }
19
+ /**
20
+ * Creates a composable to manage local draft state for condition editing.
21
+ *
22
+ * @param committedSource - Ref to the committed state (e.g., modelValue, reportExtraConditions)
23
+ * used to detect external changes and reset drafts accordingly
24
+ */
25
+ export declare function useConditionDraft<T>(committedSource?: Ref<T>): {
26
+ drafts: Ref<Map<string, {
27
+ formValue: unknown;
28
+ inheritMode?: "inherit" | "custom" | undefined;
29
+ }> & Omit<Map<string, ConditionDraft>, keyof Map<any, any>>, Map<string, ConditionDraft> | (Map<string, {
30
+ formValue: unknown;
31
+ inheritMode?: "inherit" | "custom" | undefined;
32
+ }> & Omit<Map<string, ConditionDraft>, keyof Map<any, any>>)>;
33
+ setDraft: (key: DraftKey, draft: ConditionDraft) => void;
34
+ getDraft: (key: DraftKey) => ConditionDraft | undefined;
35
+ hasDraftsForSubject: (subject: string) => boolean;
36
+ getDraftsForSubject: (subject: string) => Map<string, ConditionDraft>;
37
+ clearDraftsForSubject: (subject: string) => void;
38
+ clearAllDrafts: () => void;
39
+ clearDraft: (key: DraftKey) => void;
40
+ };
@@ -0,0 +1,61 @@
1
+ import { type Ref, type ComputedRef } from 'vue';
2
+ import type { FdoPermissionRule } from '@feedmepos/core/entity';
3
+ import { type IFdtoPortalPermissionsWithVisibilityCondition } from '@feedmepos/hrm-permission';
4
+ import { type ConditionBuilder, type ConditionSummary } from '@feedmepos/hrm-permission/condition-builder';
5
+ /**
6
+ * Generic "category cover" machinery for the portal permission editor: any
7
+ * subject whose permission-definition category declares a cover (see
8
+ * `getCoverSubjectFor`) can have its condition-builder settings either
9
+ * inherit the cover subject's condition or hold a custom override — and the
10
+ * cover subject itself can push its condition down onto every individual
11
+ * override in the category.
12
+ *
13
+ * Zero knowledge of any specific subject, category, or builder lives here —
14
+ * everything is driven by the `defs` list (permission definitions carrying
15
+ * `category`/`isCategoryCover`) and the `ConditionBuilder` contract
16
+ * (`ownedFields`, `appliesToActions`, `summarizeForm`).
17
+ */
18
+ /** The minimum shape the editor's per-row entry needs to expose for cover/inherit resolution. */
19
+ export interface CoverConditionEntry {
20
+ /** Index of this subject's raw rule in the model, or null when no direct rule exists yet. */
21
+ index: number | null;
22
+ subject: string;
23
+ label: string;
24
+ actions: readonly string[];
25
+ }
26
+ /** Resolution handles passed to `onOverridesConflict` — the caller (UI) decides which to invoke. */
27
+ export interface CoverOverrideResolution {
28
+ /** Strip this builder's fragment from every covered override rule (dropping a rule once it carries no more conditions and its actions are covered). */
29
+ override: () => void;
30
+ /** Leave every covered override rule untouched. */
31
+ keep: () => void;
32
+ }
33
+ export interface UpdateBuilderConditionOptions {
34
+ /** Create a direct rule even if the resulting condition is empty (used when explicitly switching to "custom"). */
35
+ forceCreateRule?: boolean;
36
+ afterCommit?: () => void;
37
+ /**
38
+ * Invoked instead of auto-resolving when this write touches a cover
39
+ * subject's row and other subjects in the same category hold a
40
+ * conditioned override on this builder. Omit only for callers that don't
41
+ * need a confirmation step — the write then defaults to keeping the
42
+ * overrides untouched (the non-destructive choice).
43
+ */
44
+ onOverridesConflict?: (resolution: CoverOverrideResolution) => void;
45
+ }
46
+ export interface BuilderConditionDraft {
47
+ builder: ConditionBuilder;
48
+ form: unknown;
49
+ mode: 'inherit' | 'custom';
50
+ }
51
+ export declare function useCoverConditionOverride(rules: Ref<FdoPermissionRule[]>, defs: ComputedRef<IFdtoPortalPermissionsWithVisibilityCondition[]>, updateRules: (next: FdoPermissionRule[]) => void): {
52
+ getCoverSubject: (subject: string) => string | undefined;
53
+ coverLabel: (subject: string) => string | undefined;
54
+ shouldShowInheritToggle: (entry: CoverConditionEntry, builder: ConditionBuilder) => boolean;
55
+ inheritMode: (entry: CoverConditionEntry, builder: ConditionBuilder) => "inherit" | "custom";
56
+ setInheritMode: (entry: CoverConditionEntry, builder: ConditionBuilder, mode: "inherit" | "custom") => void;
57
+ inheritedSummary: (entry: CoverConditionEntry, builder: ConditionBuilder, timeZone: string) => ConditionSummary | undefined;
58
+ getEffectiveActions: (subject: string) => readonly string[];
59
+ updateBuilderCondition: (entry: CoverConditionEntry, builder: ConditionBuilder, form: unknown, options?: UpdateBuilderConditionOptions) => void;
60
+ applyConditionDrafts: (entry: CoverConditionEntry, updates: BuilderConditionDraft[], options?: UpdateBuilderConditionOptions) => void;
61
+ };
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Business timezone resolution — a pure mapping from country code to IANA
3
+ * timezone, used as a fallback when a business has no explicit timezone
4
+ * configured. Kept independent of any store so it's testable in isolation;
5
+ * callers resolve the business/country from their own store and pass the
6
+ * plain values in.
7
+ */
8
+ /** IANA timezone for a country code; falls back to the runtime's local zone for unknown/missing codes. */
9
+ export declare function getCountryTimezone(country?: string): string;
10
+ /** Minimal shape a business needs for timezone resolution. */
11
+ export interface BusinessTimezoneSource {
12
+ timezone?: string;
13
+ timeZone?: string;
14
+ country?: string;
15
+ }
16
+ /**
17
+ * Resolve the effective IANA timezone for a business: an explicit business
18
+ * timezone field wins (`timezone`, then legacy `timeZone`), otherwise falls
19
+ * back to the country's default timezone (business's own country first, then
20
+ * `fallbackCountry`).
21
+ */
22
+ export declare function resolveBusinessTimezone(business: BusinessTimezoneSource | undefined, fallbackCountry?: string): string;
@@ -71,8 +71,10 @@ export declare function filterStalePermissions(permissions: FdoPermissionRule[],
71
71
  * `allCustomReports` positive grant, preventing redundant data from being saved.
72
72
  *
73
73
  * - If the cover rule has `manage` selected → every individual rule in that bucket is
74
- * fully covered and dropped entirely.
75
- * - Otherwise, only covered non-manage actions are stripped from individual rules.
74
+ * fully covered and dropped entirely only when the cover condition also covers the
75
+ * individual rule.
76
+ * - Otherwise, only covered non-manage actions are stripped from individual rules when
77
+ * the cover condition also covers the individual rule.
76
78
  * If `manage` was present and any non-manage action is stripped (breaking the
77
79
  * "manage = all non-manage selected" invariant), `manage` is also stripped.
78
80
  * Rules that end up with no remaining actions are dropped.
@@ -20,7 +20,8 @@ export declare function getMaxDiscount(rules: FdoPermissionRule[]): number;
20
20
  export declare function getManagableRestaurantIds(rules: (FdoPermissionRule | RawRule)[]): string[] | null;
21
21
  export declare function hasAdminRule(rules: FdoPermissionRule[]): boolean;
22
22
  export declare function usableRoleIds(rules: (FdoPermissionRule | RawRule)[]): string[] | null;
23
- export declare function fromValue(values: string[], maxDiscountPercentage: number): {
23
+ export declare function extractReportExtraCondition(rule: FdoPermissionRule): Record<string, unknown> | undefined;
24
+ export declare function fromValue(values: string[], maxDiscountPercentage: number, periodConditions?: Map<string, Record<string, unknown>>): {
24
25
  subject: string;
25
26
  actions: ("delete" | "create" | "update" | "read" | "manage")[];
26
27
  conditions: object;
@@ -1,5 +1,6 @@
1
1
  import type { IFdtoPermissionSet, IFdtoCreatePermissionSetReq, IFdtoUpdatePermissionSetReq } from '@/types/permission-set';
2
2
  export declare const usePermissionSetStore: () => {
3
+ isLoading: import("vue").Ref<boolean, boolean>;
3
4
  permissionSets: import("vue").Ref<{
4
5
  id: string;
5
6
  permissions: {
@@ -30,6 +31,7 @@ export declare const usePermissionSetStore: () => {
30
31
  name: string;
31
32
  }[]>;
32
33
  $state: {
34
+ isLoading: boolean;
33
35
  permissionSets: {
34
36
  id: string;
35
37
  permissions: {
@@ -75,12 +77,14 @@ export declare const usePermissionSetStore: () => {
75
77
  businessId: string;
76
78
  name: string;
77
79
  }[]>;
80
+ isLoading: import("vue").Ref<boolean, boolean>;
78
81
  readPermissionSets: () => Promise<void>;
79
82
  createPermissionSet: (dto: IFdtoCreatePermissionSetReq) => Promise<void>;
80
83
  updatePermissionSet: (id: string, dto: IFdtoUpdatePermissionSetReq) => Promise<void>;
81
84
  deletePermissionSet: (id: string) => Promise<void>;
82
- }, "permissionSets">>;
85
+ }, "isLoading" | "permissionSets">>;
83
86
  $patch(partialState: import("pinia")._DeepPartial<{
87
+ isLoading: boolean;
84
88
  permissionSets: {
85
89
  id: string;
86
90
  permissions: {
@@ -98,6 +102,7 @@ export declare const usePermissionSetStore: () => {
98
102
  }[];
99
103
  }>): void;
100
104
  $patch<F extends (state: {
105
+ isLoading: boolean;
101
106
  permissionSets: {
102
107
  id: string;
103
108
  permissions: {
@@ -145,11 +150,12 @@ export declare const usePermissionSetStore: () => {
145
150
  businessId: string;
146
151
  name: string;
147
152
  }[]>;
153
+ isLoading: import("vue").Ref<boolean, boolean>;
148
154
  readPermissionSets: () => Promise<void>;
149
155
  createPermissionSet: (dto: IFdtoCreatePermissionSetReq) => Promise<void>;
150
156
  updatePermissionSet: (id: string, dto: IFdtoUpdatePermissionSetReq) => Promise<void>;
151
157
  deletePermissionSet: (id: string) => Promise<void>;
152
- }, "permissionSets">>, options?: {
158
+ }, "isLoading" | "permissionSets">>, options?: {
153
159
  detached?: boolean;
154
160
  } & import("vue").WatchOptions): () => void;
155
161
  $onAction(callback: import("pinia").StoreOnActionListener<"permissionSet", Pick<{
@@ -182,11 +188,12 @@ export declare const usePermissionSetStore: () => {
182
188
  businessId: string;
183
189
  name: string;
184
190
  }[]>;
191
+ isLoading: import("vue").Ref<boolean, boolean>;
185
192
  readPermissionSets: () => Promise<void>;
186
193
  createPermissionSet: (dto: IFdtoCreatePermissionSetReq) => Promise<void>;
187
194
  updatePermissionSet: (id: string, dto: IFdtoUpdatePermissionSetReq) => Promise<void>;
188
195
  deletePermissionSet: (id: string) => Promise<void>;
189
- }, "permissionSets">, Pick<{
196
+ }, "isLoading" | "permissionSets">, Pick<{
190
197
  permissionSets: import("vue").Ref<{
191
198
  id: string;
192
199
  permissions: {
@@ -216,6 +223,7 @@ export declare const usePermissionSetStore: () => {
216
223
  businessId: string;
217
224
  name: string;
218
225
  }[]>;
226
+ isLoading: import("vue").Ref<boolean, boolean>;
219
227
  readPermissionSets: () => Promise<void>;
220
228
  createPermissionSet: (dto: IFdtoCreatePermissionSetReq) => Promise<void>;
221
229
  updatePermissionSet: (id: string, dto: IFdtoUpdatePermissionSetReq) => Promise<void>;
@@ -250,6 +258,7 @@ export declare const usePermissionSetStore: () => {
250
258
  businessId: string;
251
259
  name: string;
252
260
  }[]>;
261
+ isLoading: import("vue").Ref<boolean, boolean>;
253
262
  readPermissionSets: () => Promise<void>;
254
263
  createPermissionSet: (dto: IFdtoCreatePermissionSetReq) => Promise<void>;
255
264
  updatePermissionSet: (id: string, dto: IFdtoUpdatePermissionSetReq) => Promise<void>;
@@ -1 +1 @@
1
- export type { AuditLogEntry, AuditLogMetadata, AuditLogOutcome, AuditLogResolvedFrom } from '@feedmepos/hrm-permission';
1
+ export type { AuditLogEntry, AuditLogMetadata, AuditLogOperation, AuditLogOutcome, AuditLogResolvedFrom, } from '@feedmepos/hrm-permission';
@@ -0,0 +1,13 @@
1
+ export interface EventLineSource {
2
+ eventKey?: string;
3
+ params?: Record<string, string | number>;
4
+ operationLabel?: string;
5
+ }
6
+ type Translate = (key: string, params?: Record<string, unknown>) => string;
7
+ export declare function splitEventKey(key: string): {
8
+ entity: string;
9
+ verb: string;
10
+ } | null;
11
+ export declare function humanizeSegment(segment: string): string;
12
+ export declare function renderEventLine(t: Translate, source: EventLineSource): string;
13
+ export {};