@hortiview/shared-components 2.11.2 → 2.12.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 (40) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +135 -3
  3. package/dist/components/Allowed/Allowed.d.ts +21 -0
  4. package/dist/components/Allowed/Allowed.js +13 -0
  5. package/dist/components/Allowed/Allowed.test.d.ts +1 -0
  6. package/dist/components/Allowed/Allowed.test.js +49 -0
  7. package/dist/components/AllowedButton/AllowedButton.d.ts +51 -0
  8. package/dist/components/AllowedButton/AllowedButton.js +28 -0
  9. package/dist/components/AllowedButton/AllowedButton.test.d.ts +1 -0
  10. package/dist/components/AllowedButton/AllowedButton.test.js +126 -0
  11. package/dist/components/AllowedIconButton/AllowedIconButton.d.ts +43 -0
  12. package/dist/components/AllowedIconButton/AllowedIconButton.js +23 -0
  13. package/dist/components/AllowedIconButton/AllowedIconButton.test.d.ts +1 -0
  14. package/dist/components/AllowedIconButton/AllowedIconButton.test.js +121 -0
  15. package/dist/components/Filter/Filter.js +7 -4
  16. package/dist/components/FormComponents/FormDatePicker/FormDatePicker.js +2 -10
  17. package/dist/components/FormComponents/FormNumber/CustomTextField.js +1 -1
  18. package/dist/components/GenericTable/GenericTable.js +7 -4
  19. package/dist/components/ModulePadding/ModulePadding.js +7 -4
  20. package/dist/components/PermissionChecks/PermissionService.d.ts +35 -0
  21. package/dist/components/PermissionChecks/PermissionService.js +28 -0
  22. package/dist/components/PermissionChecks/PermissionService.test.d.ts +1 -0
  23. package/dist/components/PermissionChecks/PermissionService.test.js +83 -0
  24. package/dist/components/PermissionChecks/mockedPermissions.d.ts +24 -0
  25. package/dist/components/PermissionChecks/mockedPermissions.js +299 -0
  26. package/dist/components/SharedComponentsPermissionProvider/PermissionContext.d.ts +17 -0
  27. package/dist/components/SharedComponentsPermissionProvider/PermissionContext.js +11 -0
  28. package/dist/components/SharedComponentsPermissionProvider/SharedComponentsPermissionProvider.d.ts +32 -0
  29. package/dist/components/SharedComponentsPermissionProvider/SharedComponentsPermissionProvider.js +17 -0
  30. package/dist/index-CuHybtft.js +51 -0
  31. package/dist/{isString-BNaBRq3S.js → isString-BifemsUQ.js} +1 -1
  32. package/dist/main.d.ts +8 -0
  33. package/dist/main.js +74 -58
  34. package/dist/{omit-uTAyrUTm.js → omit-Tf2F0V8l.js} +183 -183
  35. package/dist/services/UtilService.js +16 -13
  36. package/dist/test-utils.d.ts +82 -0
  37. package/dist/test-utils.js +32 -0
  38. package/dist/types/Permission.d.ts +153 -0
  39. package/dist/types/Permission.js +4 -0
  40. package/package.json +2 -1
@@ -0,0 +1,82 @@
1
+ import { RenderOptions, RenderResult } from '@testing-library/react';
2
+ import { default as React, ReactElement } from 'react';
3
+ import { PermissionsByEntity } from './types/Permission';
4
+
5
+ interface CustomRenderOptions extends Omit<RenderOptions, 'wrapper'> {
6
+ /**
7
+ * Mock user permissions for testing.
8
+ * @example
9
+ * ```tsx
10
+ * {
11
+ * 'farm-id-123': [Permission.FarmsUpdate, Permission.FarmsRead],
12
+ * 'General': [Permission.CurrentUserRead],
13
+ * }
14
+ * ```
15
+ */
16
+ userPermissions?: PermissionsByEntity;
17
+ /**
18
+ * Mock active organization ID for testing.
19
+ */
20
+ activeOrganizationId?: string;
21
+ }
22
+ /**
23
+ * Custom render function that wraps components with the SharedComponentsPermissionProvider.
24
+ * Use this in tests instead of the default render from @testing-library/react when testing
25
+ * components that use permission-gated features (AllowedButton, AllowedIconButton, useIsAllowed).
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * import { renderWithPermissions } from './test-utils';
30
+ * import { Permission } from './types/Permission';
31
+ *
32
+ * test('renders edit button when user has permission', () => {
33
+ * renderWithPermissions(<MyComponent farmId="farm-123" />, {
34
+ * userPermissions: {
35
+ * 'farm-123': [Permission.FarmsUpdate, Permission.FarmsRead],
36
+ * },
37
+ * activeOrganizationId: 'farm-123',
38
+ * });
39
+ *
40
+ * expect(screen.getByText('Edit Farm')).toBeInTheDocument();
41
+ * });
42
+ * ```
43
+ *
44
+ * @param componentToRender - The React component to render
45
+ * @param options - Custom render options including userPermissions and activeOrganizationId
46
+ * @returns The result from @testing-library/react render
47
+ */
48
+ export declare const renderWithPermissions: (componentToRender: ReactElement, { userPermissions, activeOrganizationId, ...renderOptions }?: CustomRenderOptions) => RenderResult;
49
+ /**
50
+ * Creates a wrapper component with the SharedComponentsPermissionProvider for use with renderHook.
51
+ * Use this when testing hooks that depend on permission context (like useIsAllowed).
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * import { renderHook } from '@testing-library/react';
56
+ * import { createPermissionWrapper } from './test-utils';
57
+ * import { Permission } from './types/Permission';
58
+ *
59
+ * test('hook returns true when user has permission', () => {
60
+ * const { result } = renderHook(() => useIsAllowed(), {
61
+ * wrapper: createPermissionWrapper({
62
+ * userPermissions: {
63
+ * 'farm-123': [Permission.FarmsUpdate],
64
+ * },
65
+ * }),
66
+ * });
67
+ *
68
+ * expect(result.current([Permission.FarmsUpdate], 'farm-123')).toBe(true);
69
+ * });
70
+ * ```
71
+ *
72
+ * @param userPermissions - Mock user permissions for testing
73
+ * @param activeOrganizationId - Mock active organization ID for testing
74
+ * @returns A wrapper component for renderHook
75
+ */
76
+ export declare const createPermissionWrapper: ({ userPermissions, activeOrganizationId, }?: {
77
+ userPermissions?: PermissionsByEntity;
78
+ activeOrganizationId?: string;
79
+ }) => ({ children }: {
80
+ children: React.ReactNode;
81
+ }) => import("react/jsx-runtime").JSX.Element;
82
+ export {};
@@ -0,0 +1,32 @@
1
+ import { jsx as i } from "react/jsx-runtime";
2
+ import { a as t } from "./react.esm-BbMrgZCM.js";
3
+ import { SharedComponentsPermissionProvider as n } from "./components/SharedComponentsPermissionProvider/SharedComponentsPermissionProvider.js";
4
+ const a = (r, {
5
+ userPermissions: e = {},
6
+ activeOrganizationId: o = void 0,
7
+ ...s
8
+ } = {}) => t(
9
+ /* @__PURE__ */ i(
10
+ n,
11
+ {
12
+ userPermissions: e,
13
+ activeOrganizationId: o,
14
+ children: r
15
+ }
16
+ ),
17
+ s
18
+ ), c = ({
19
+ userPermissions: r = {},
20
+ activeOrganizationId: e = void 0
21
+ } = {}) => ({ children: o }) => /* @__PURE__ */ i(
22
+ n,
23
+ {
24
+ userPermissions: r,
25
+ activeOrganizationId: e,
26
+ children: o
27
+ }
28
+ );
29
+ export {
30
+ c as createPermissionWrapper,
31
+ a as renderWithPermissions
32
+ };
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Type representing user permissions mapped by entity IDs.
3
+ *
4
+ * @remarks
5
+ * The keys are entity IDs (e.g., FarmOrganizationId, VendorOrganizationId) and the values are arrays of permission strings associated with those entities.
6
+ * @example
7
+ * {
8
+ * "0000-0000-0000-0000": ["read", "write", "delete"],
9
+ * "0000-0000-0000-0001": ["read", "delete"],
10
+ * }
11
+ */
12
+ export type PermissionsByEntity = {
13
+ [entityId: string]: string[];
14
+ } | undefined;
15
+ /**
16
+ * Type representing the structure of a parsed module permission token.
17
+ */
18
+ export type ModulePermissionTokenParsed = {
19
+ ModuleRolesAndPermissions: {
20
+ FarmOrganizationId: string;
21
+ UserId: string;
22
+ ModuleId: string;
23
+ RoleNames: string[];
24
+ ExecuteEndpointPermissionNames: string[];
25
+ };
26
+ };
27
+ /**
28
+ * Type representing all possible permissions in the system.
29
+ */
30
+ export type HVPermissions = HVMainPermissions | `${string}`;
31
+ /**
32
+ * Enum for all main permissions available in the HortiView platform.
33
+ */
34
+ export declare enum HVMainPermissions {
35
+ RoleHVAdmin = "HVAdmin",
36
+ RoleHVDeveloper = "HVDeveloper",
37
+ FarmManager = "Farm Manager",
38
+ FarmWorker = "Farm Worker",
39
+ Agronomist = "Agronomist",
40
+ Advisor = "Advisor",
41
+ FarmOrganizationMember = "Farm Organization Member",
42
+ FarmOrganizationAdmin = "Organization Administrator",
43
+ Developer = "Developer",
44
+ LeadDeveloper = "Lead Developer",
45
+ BusinessManager = "Business Manager",
46
+ BusinessOwner = "Business Owner",
47
+ VendorOrganizationMember = "Vendor Organization Member",
48
+ BlocksCreate = "blocks-create",
49
+ BlocksDelete = "blocks-delete",
50
+ BlocksRead = "blocks-read",
51
+ BlocksUpdate = "blocks-update",
52
+ CurrentUserRead = "current-user-read",
53
+ CurrentUserUpdate = "current-user-update",
54
+ FarmAlertRulesCreate = "farmalertrules-create",
55
+ FarmAlertRulesDelete = "farmalertrules-delete",
56
+ FarmAlertRulesRead = "farmalertrules-read",
57
+ FarmAlertRulesUpdate = "farmalertrules-update",
58
+ FarmAlertsCreate = "farmalerts-create",
59
+ FarmAlertsDelete = "farmalerts-delete",
60
+ FarmAlertsRead = "farmalerts-read",
61
+ FarmAlertsUpdate = "farmalerts-update",
62
+ FarmBillingInformationsCreate = "farm_billing_informations-create",
63
+ FarmBillingInformationsDelete = "farm_billing_informations-delete",
64
+ FarmBillingInformationsRead = "farm_billing_informations-read",
65
+ FarmBillingInformationsUpdate = "farm_billing_informations-update",
66
+ FarmMembersCreate = "farmmembers-create",
67
+ FarmMembersDelete = "farmmembers-delete",
68
+ FarmMembersRead = "farmmembers-read",
69
+ FarmMembersUpdate = "farmmembers-update",
70
+ FarmOrganizationMembersCreate = "farmorganizationmembers-create",
71
+ FarmOrganizationMembersDelete = "farmorganizationmembers-delete",
72
+ FarmOrganizationMembersRead = "farmorganizationmembers-read",
73
+ FarmOrganizationMembersUpdate = "farmorganizationmembers-update",
74
+ FarmOrganizationModuleRead = "farm_organization_module-read",
75
+ FarmOrganizationsCreate = "farm_organizations-create",
76
+ FarmOrganizationsDelete = "farm_organizations-delete",
77
+ FarmOrganizationsRead = "farm_organizations-read",
78
+ FarmOrganizationsUpdate = "farm_organizations-update",
79
+ FarmRolesRead = "farm_roles-read",
80
+ FarmTagsCreate = "farmtags-create",
81
+ FarmTagsDelete = "farmtags-delete",
82
+ FarmTagsRead = "farmtags-read",
83
+ FarmTagsUpdate = "farmtags-update",
84
+ FarmsCreate = "farms-create",
85
+ FarmsDelete = "farms-delete",
86
+ FarmsRead = "farms-read",
87
+ FarmsUpdate = "farms-update",
88
+ FieldMembersCreate = "fieldmembers-create",
89
+ FieldMembersDelete = "fieldmembers-delete",
90
+ FieldMembersRead = "fieldmembers-read",
91
+ FieldMembersUpdate = "fieldmembers-update",
92
+ FieldsCreate = "fields-create",
93
+ FieldsDelete = "fields-delete",
94
+ FieldsRead = "fields-read",
95
+ FieldsUpdate = "fields-update",
96
+ InviteUserToOrganization = "invite-user-to-organization",
97
+ InvitedUsersCreate = "invitedusers-create",
98
+ InvitedUsersDelete = "invitedusers-delete",
99
+ InvitedUsersRead = "invitedusers-read",
100
+ InvitedUsersUpdate = "invitedusers-update",
101
+ InvoiceRead = "invoice-read",
102
+ IrrigationStationsCreate = "irrigationstations-create",
103
+ IrrigationStationsDelete = "irrigationstations-delete",
104
+ IrrigationStationsRead = "irrigationstations-read",
105
+ IrrigationStationsUpdate = "irrigationstations-update",
106
+ LegalAddressCreate = "legal_address-create",
107
+ LegalAddressDelete = "legal_address-delete",
108
+ LegalAddressRead = "legal_address-read",
109
+ LegalAddressUpdate = "legal_address-update",
110
+ LoginUser = "login-user",
111
+ MapProxyRead = "mapproxy-read",
112
+ ModuleMetricsRead = "module_metrics-read",
113
+ ModuleRatingsCreate = "module_ratings-create",
114
+ ModuleRatingsDelete = "module_ratings-delete",
115
+ ModuleRatingsRead = "module_ratings-read",
116
+ ModuleRatingsUpdate = "module_ratings-update",
117
+ ModuleReviewRequestsRead = "module_review_requests-read",
118
+ ModulesCreate = "modules-create",
119
+ ModulesDelete = "modules-delete",
120
+ ModulesPublish = "modules-publish",
121
+ ModulesRead = "modules-read",
122
+ ModulesRequestReview = "modules-request_review",
123
+ ModulesSearch = "modules-search",
124
+ ModulesSuspend = "modules-suspend",
125
+ ModulesUpdate = "modules-update",
126
+ OrganizationModulesCreate = "organization_modules-create",
127
+ OrganizationModulesDelete = "organization_modules-delete",
128
+ PaymentDetailsUpdate = "payment_details-update",
129
+ ProfilesDelete = "profiles-delete",
130
+ ProfilesUpdate = "profiles-update",
131
+ RegisterUser = "register-user",
132
+ ResetPassword = "reset-password",
133
+ SubscriptionsRead = "subscriptions-read",
134
+ SuperUser = "superuser",
135
+ UserRoleUpdate = "user_role-update",
136
+ UsersCreate = "users-create",
137
+ UsersDelete = "users-delete",
138
+ UsersRead = "users-read",
139
+ UsersUpdate = "users-update",
140
+ VendorBillingInformationsCreate = "vendor_billing_informations-create",
141
+ VendorBillingInformationsDelete = "vendor_billing_informations-delete",
142
+ VendorBillingInformationsRead = "vendor_billing_informations-read",
143
+ VendorBillingInformationsUpdate = "vendor_billing_informations-update",
144
+ VendorOrganizationMembersCreate = "vendor_members-create",
145
+ VendorOrganizationMembersDelete = "vendor_members-delete",
146
+ VendorOrganizationMembersRead = "vendor_members-read",
147
+ VendorOrganizationMembersUpdate = "vendor_members-update",
148
+ VendorOrganizationsCreate = "vendor_organizations-create",
149
+ VendorOrganizationsDelete = "vendor_organizations-delete",
150
+ VendorOrganizationsRead = "vendor_organizations-read",
151
+ VendorOrganizationsUpdate = "vendor_organizations-update",
152
+ WeatherProxyRead = "weatherproxy-read"
153
+ }
@@ -0,0 +1,4 @@
1
+ var r = /* @__PURE__ */ ((e) => (e.RoleHVAdmin = "HVAdmin", e.RoleHVDeveloper = "HVDeveloper", e.FarmManager = "Farm Manager", e.FarmWorker = "Farm Worker", e.Agronomist = "Agronomist", e.Advisor = "Advisor", e.FarmOrganizationMember = "Farm Organization Member", e.FarmOrganizationAdmin = "Organization Administrator", e.Developer = "Developer", e.LeadDeveloper = "Lead Developer", e.BusinessManager = "Business Manager", e.BusinessOwner = "Business Owner", e.VendorOrganizationMember = "Vendor Organization Member", e.BlocksCreate = "blocks-create", e.BlocksDelete = "blocks-delete", e.BlocksRead = "blocks-read", e.BlocksUpdate = "blocks-update", e.CurrentUserRead = "current-user-read", e.CurrentUserUpdate = "current-user-update", e.FarmAlertRulesCreate = "farmalertrules-create", e.FarmAlertRulesDelete = "farmalertrules-delete", e.FarmAlertRulesRead = "farmalertrules-read", e.FarmAlertRulesUpdate = "farmalertrules-update", e.FarmAlertsCreate = "farmalerts-create", e.FarmAlertsDelete = "farmalerts-delete", e.FarmAlertsRead = "farmalerts-read", e.FarmAlertsUpdate = "farmalerts-update", e.FarmBillingInformationsCreate = "farm_billing_informations-create", e.FarmBillingInformationsDelete = "farm_billing_informations-delete", e.FarmBillingInformationsRead = "farm_billing_informations-read", e.FarmBillingInformationsUpdate = "farm_billing_informations-update", e.FarmMembersCreate = "farmmembers-create", e.FarmMembersDelete = "farmmembers-delete", e.FarmMembersRead = "farmmembers-read", e.FarmMembersUpdate = "farmmembers-update", e.FarmOrganizationMembersCreate = "farmorganizationmembers-create", e.FarmOrganizationMembersDelete = "farmorganizationmembers-delete", e.FarmOrganizationMembersRead = "farmorganizationmembers-read", e.FarmOrganizationMembersUpdate = "farmorganizationmembers-update", e.FarmOrganizationModuleRead = "farm_organization_module-read", e.FarmOrganizationsCreate = "farm_organizations-create", e.FarmOrganizationsDelete = "farm_organizations-delete", e.FarmOrganizationsRead = "farm_organizations-read", e.FarmOrganizationsUpdate = "farm_organizations-update", e.FarmRolesRead = "farm_roles-read", e.FarmTagsCreate = "farmtags-create", e.FarmTagsDelete = "farmtags-delete", e.FarmTagsRead = "farmtags-read", e.FarmTagsUpdate = "farmtags-update", e.FarmsCreate = "farms-create", e.FarmsDelete = "farms-delete", e.FarmsRead = "farms-read", e.FarmsUpdate = "farms-update", e.FieldMembersCreate = "fieldmembers-create", e.FieldMembersDelete = "fieldmembers-delete", e.FieldMembersRead = "fieldmembers-read", e.FieldMembersUpdate = "fieldmembers-update", e.FieldsCreate = "fields-create", e.FieldsDelete = "fields-delete", e.FieldsRead = "fields-read", e.FieldsUpdate = "fields-update", e.InviteUserToOrganization = "invite-user-to-organization", e.InvitedUsersCreate = "invitedusers-create", e.InvitedUsersDelete = "invitedusers-delete", e.InvitedUsersRead = "invitedusers-read", e.InvitedUsersUpdate = "invitedusers-update", e.InvoiceRead = "invoice-read", e.IrrigationStationsCreate = "irrigationstations-create", e.IrrigationStationsDelete = "irrigationstations-delete", e.IrrigationStationsRead = "irrigationstations-read", e.IrrigationStationsUpdate = "irrigationstations-update", e.LegalAddressCreate = "legal_address-create", e.LegalAddressDelete = "legal_address-delete", e.LegalAddressRead = "legal_address-read", e.LegalAddressUpdate = "legal_address-update", e.LoginUser = "login-user", e.MapProxyRead = "mapproxy-read", e.ModuleMetricsRead = "module_metrics-read", e.ModuleRatingsCreate = "module_ratings-create", e.ModuleRatingsDelete = "module_ratings-delete", e.ModuleRatingsRead = "module_ratings-read", e.ModuleRatingsUpdate = "module_ratings-update", e.ModuleReviewRequestsRead = "module_review_requests-read", e.ModulesCreate = "modules-create", e.ModulesDelete = "modules-delete", e.ModulesPublish = "modules-publish", e.ModulesRead = "modules-read", e.ModulesRequestReview = "modules-request_review", e.ModulesSearch = "modules-search", e.ModulesSuspend = "modules-suspend", e.ModulesUpdate = "modules-update", e.OrganizationModulesCreate = "organization_modules-create", e.OrganizationModulesDelete = "organization_modules-delete", e.PaymentDetailsUpdate = "payment_details-update", e.ProfilesDelete = "profiles-delete", e.ProfilesUpdate = "profiles-update", e.RegisterUser = "register-user", e.ResetPassword = "reset-password", e.SubscriptionsRead = "subscriptions-read", e.SuperUser = "superuser", e.UserRoleUpdate = "user_role-update", e.UsersCreate = "users-create", e.UsersDelete = "users-delete", e.UsersRead = "users-read", e.UsersUpdate = "users-update", e.VendorBillingInformationsCreate = "vendor_billing_informations-create", e.VendorBillingInformationsDelete = "vendor_billing_informations-delete", e.VendorBillingInformationsRead = "vendor_billing_informations-read", e.VendorBillingInformationsUpdate = "vendor_billing_informations-update", e.VendorOrganizationMembersCreate = "vendor_members-create", e.VendorOrganizationMembersDelete = "vendor_members-delete", e.VendorOrganizationMembersRead = "vendor_members-read", e.VendorOrganizationMembersUpdate = "vendor_members-update", e.VendorOrganizationsCreate = "vendor_organizations-create", e.VendorOrganizationsDelete = "vendor_organizations-delete", e.VendorOrganizationsRead = "vendor_organizations-read", e.VendorOrganizationsUpdate = "vendor_organizations-update", e.WeatherProxyRead = "weatherproxy-read", e))(r || {});
2
+ export {
3
+ r as HVMainPermissions
4
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hortiview/shared-components",
3
3
  "description": "This is a shared component library. It should used in the HortiView platform and its modules.",
4
- "version": "2.11.2",
4
+ "version": "2.12.0",
5
5
  "type": "module",
6
6
  "repository": "https://dev.azure.com/sdundc/HV%20Platform/_git/HortiView-Frontend-Shared",
7
7
  "author": "Falk Menge <falk.menge.ext@bayer.com>",
@@ -86,6 +86,7 @@
86
86
  "glob": "^10.3.10",
87
87
  "husky": "^9.1.7",
88
88
  "jsdom": "^24.0.0",
89
+ "jwt-decode": "^4.0.0",
89
90
  "lodash": "^4.17.21",
90
91
  "react": "^18.3.1",
91
92
  "react-dom": "^18.3.1",