@memberjunction/ng-resource-permissions 4.0.0 → 4.2.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 (2) hide show
  1. package/README.md +79 -311
  2. package/package.json +9 -9
package/README.md CHANGED
@@ -1,20 +1,6 @@
1
- # Resource Permissions Components
1
+ # @memberjunction/ng-resource-permissions
2
2
 
3
- A suite of Angular components for managing and displaying permissions for resources in MemberJunction applications. This package provides components for viewing and managing resource permissions, viewing available resources, and requesting access to restricted resources.
4
-
5
- ## Features
6
-
7
- - **Permission Management**: View, add, edit, and delete permissions for resources
8
- - **Available Resources Display**: Show resources available to a specific user
9
- - **Access Requests**: Allow users to request access to resources they don't have permission for
10
- - **Multiple Permission Types**: Support for both user and role-based permissions
11
- - **Configurable Permission Levels**: Customizable permission levels (View, Edit, Owner)
12
- - **Transaction Support**: All permission changes are grouped in transactions for data integrity
13
- - **Batch Operations**: Multiple permission changes can be saved together in a single transaction
14
- - **Filtering Options**: Filter available resources with custom criteria
15
- - **Resource Type Support**: Works with all MemberJunction resource types
16
- - **Responsive Design**: Adapts to different screen sizes and layouts
17
- - **Error Handling**: Comprehensive error handling with optional user notifications
3
+ Angular components for managing resource-level permissions in MemberJunction applications. Provides interfaces for viewing, granting, editing, and revoking permissions for any resource type, viewing available resources, and requesting access to restricted resources.
18
4
 
19
5
  ## Installation
20
6
 
@@ -22,353 +8,135 @@ A suite of Angular components for managing and displaying permissions for resour
22
8
  npm install @memberjunction/ng-resource-permissions
23
9
  ```
24
10
 
11
+ ## Overview
12
+
13
+ The resource permissions package provides three components that together form a complete permission management workflow: managing who can access a resource and at what level, viewing which resources a user has access to, and requesting access to restricted resources. All permission changes are grouped in transactions for data integrity.
14
+
15
+ ```mermaid
16
+ flowchart TD
17
+ subgraph Manage["Permission Management"]
18
+ A["ResourcePermissionsComponent"]
19
+ A --> B["Add User/Role Permission"]
20
+ A --> C["Edit Permission Level"]
21
+ A --> D["Remove Permission"]
22
+ end
23
+ subgraph View["Resource Browsing"]
24
+ E["AvailableResourcesComponent"]
25
+ E --> F["Filtered Resource Grid"]
26
+ end
27
+ subgraph Request["Access Request"]
28
+ G["RequestResourceAccessComponent"]
29
+ G --> H["Submit Access Request"]
30
+ end
31
+ subgraph Engine["Permission Engine"]
32
+ I["ResourcePermissionEngine"]
33
+ end
34
+
35
+ A --> I
36
+ E --> I
37
+ G --> I
38
+
39
+ style Manage fill:#2d6a9f,stroke:#1a4971,color:#fff
40
+ style View fill:#7c5295,stroke:#563a6b,color:#fff
41
+ style Request fill:#2d8659,stroke:#1a5c3a,color:#fff
42
+ style Engine fill:#b8762f,stroke:#8a5722,color:#fff
43
+ ```
44
+
25
45
  ## Usage
26
46
 
27
- ### Import the Module
47
+ ### Module Import
28
48
 
29
49
  ```typescript
30
50
  import { ResourcePermissionsModule } from '@memberjunction/ng-resource-permissions';
31
51
 
32
52
  @NgModule({
33
- imports: [
34
- ResourcePermissionsModule,
35
- // other imports
36
- ],
37
- // ...
53
+ imports: [ResourcePermissionsModule]
38
54
  })
39
- export class YourModule { }
55
+ export class YourModule {}
40
56
  ```
41
57
 
42
- ### Resource Permissions Component
58
+ ### Managing Permissions
43
59
 
44
60
  ```html
45
- <!-- Component for managing permissions for a resource -->
46
61
  <mj-resource-permissions
47
62
  [ResourceTypeID]="reportResourceTypeID"
48
63
  [ResourceRecordID]="reportID"
49
64
  [ShowSaveButton]="true"
50
65
  [AllowAddPermissions]="true"
51
66
  [AllowEditPermissions]="true"
52
- [AllowDeletePermissions]="true">
67
+ [AllowDeletePermissions]="true"
68
+ [PermissionLevels]="['View', 'Edit', 'Owner']">
53
69
  </mj-resource-permissions>
54
70
  ```
55
71
 
56
- ### Available Resources Component
72
+ ### Viewing Available Resources
57
73
 
58
74
  ```html
59
- <!-- Component for displaying resources available to a user -->
60
75
  <mj-available-resources
61
76
  [User]="currentUser"
62
77
  [ResourceTypeID]="dashboardResourceTypeID"
63
78
  [ResourceExtraFilter]="'IsActive = 1'"
64
79
  [SelectionMode]="'Multiple'"
65
- [ExtraColumns]="'CreatedAt,LastUpdatedAt'"
66
80
  (SelectionChanged)="onResourceSelectionChanged($event)">
67
81
  </mj-available-resources>
68
82
  ```
69
83
 
70
- ### Request Access Component
84
+ ### Requesting Access
71
85
 
72
86
  ```html
73
- <!-- Component for requesting access to a resource -->
74
87
  <mj-request-resource-access
75
88
  [ResourceType]="'Report'"
76
89
  [ResourceName]="'Sales Dashboard'"
77
90
  [ResourceRecordID]="reportID"
78
91
  [PermissionLevel]="'View'"
79
- [ShowPermissionLevelDropdown]="true"
80
92
  (AccessRequested)="onAccessRequested($event)">
81
93
  </mj-request-resource-access>
82
94
  ```
83
95
 
84
- ### TypeScript Component Example
85
-
86
- ```typescript
87
- import { Component, OnInit } from '@angular/core';
88
- import { ResourceData, ResourcePermissionEntity } from '@memberjunction/core-entities';
89
- import { UserInfo } from '@memberjunction/core';
90
- import { MJNotificationService } from '@memberjunction/ng-notifications';
91
-
92
- @Component({
93
- selector: 'app-resource-access-manager',
94
- template: `
95
- <div class="resource-manager">
96
- <h2>Resource Access Manager</h2>
97
-
98
- <!-- Tab navigation -->
99
- <ul class="nav-tabs">
100
- <li [class.active]="activeTab === 'permissions'">
101
- <a (click)="activeTab = 'permissions'">Manage Permissions</a>
102
- </li>
103
- <li [class.active]="activeTab === 'available'">
104
- <a (click)="activeTab = 'available'">Available Resources</a>
105
- </li>
106
- </ul>
107
-
108
- <!-- Permissions management tab -->
109
- <div *ngIf="activeTab === 'permissions'" class="tab-content">
110
- <h3>Manage Report Permissions</h3>
111
- <p>Control who can access this report and at what permission level.</p>
112
-
113
- <mj-resource-permissions
114
- [ResourceTypeID]="reportResourceTypeID"
115
- [ResourceRecordID]="selectedReportID"
116
- [ShowSaveButton]="true"
117
- [ShowPermissionLevels]="true"
118
- [PermissionTypes]="['User', 'Role']"
119
- [ExcludedRoleNames]="['System Administrator']">
120
- </mj-resource-permissions>
121
- </div>
122
-
123
- <!-- Available resources tab -->
124
- <div *ngIf="activeTab === 'available'" class="tab-content">
125
- <h3>Resources Available to User</h3>
126
- <p>Select a user to view their accessible resources:</p>
127
-
128
- <select [(ngModel)]="selectedUser">
129
- <option *ngFor="let user of users" [ngValue]="user">
130
- {{user.Name}} ({{user.Email}})
131
- </option>
132
- </select>
133
-
134
- <mj-available-resources
135
- *ngIf="selectedUser"
136
- [User]="selectedUser"
137
- [ResourceTypeID]="reportResourceTypeID"
138
- [ExtraColumns]="'CreatedAt,ModifiedAt'"
139
- (SelectionChanged)="onAvailableResourcesChanged($event)">
140
- </mj-available-resources>
141
- </div>
142
- </div>
143
- `,
144
- styles: [`
145
- .resource-manager {
146
- padding: 20px;
147
- }
148
- .nav-tabs {
149
- display: flex;
150
- list-style: none;
151
- padding: 0;
152
- border-bottom: 1px solid #ccc;
153
- }
154
- .nav-tabs li {
155
- padding: 10px 20px;
156
- cursor: pointer;
157
- }
158
- .nav-tabs li.active {
159
- border-bottom: 2px solid #0066cc;
160
- font-weight: bold;
161
- }
162
- .tab-content {
163
- padding: 20px 0;
164
- }
165
- `]
166
- })
167
- export class ResourceAccessManagerComponent implements OnInit {
168
- activeTab = 'permissions';
169
- reportResourceTypeID = '1'; // Resource type ID for reports
170
- selectedReportID = '123'; // ID of the selected report
171
- selectedUser?: UserInfo;
172
- users: UserInfo[] = [];
173
-
174
- constructor(private notificationService: MJNotificationService) {}
175
-
176
- async ngOnInit() {
177
- // Load users
178
- // This would typically come from your user service
179
- this.users = await this.loadUsers();
180
- }
181
-
182
- async loadUsers(): Promise<UserInfo[]> {
183
- // Implementation for loading users
184
- return [];
185
- }
186
-
187
- onAvailableResourcesChanged(resources: ResourceData[]) {
188
- console.log('Selected resources:', resources);
189
- }
190
-
191
- onAccessRequested(permission: ResourcePermissionEntity) {
192
- this.notificationService.CreateSimpleNotification(
193
- `Access request submitted for ${permission.Get('ResourceType')}`,
194
- 'success',
195
- 3000
196
- );
197
- }
198
- }
199
- ```
200
-
201
- ## API Reference
202
-
203
- ### ResourcePermissionsComponent
204
-
205
- Component for managing permissions for a specific resource.
206
-
207
- #### Inputs
208
-
209
- - `ResourceTypeID`: string - ID of the resource type record (required)
210
- - `ResourceRecordID`: string - ID of the resource record (required)
211
- - `ShowSaveButton`: boolean - Whether to show the Save button (default: false)
212
- - `ShowPermissionLevels`: boolean - Whether to show permission level options (default: true)
213
- - `ShowUserErrorMessages`: boolean - Whether to show error messages to the user (default: false)
214
- - `AllowAddPermissions`: boolean - Whether the user can add permissions (default: true)
215
- - `AllowEditPermissions`: boolean - Whether the user can edit permissions (default: true)
216
- - `AllowDeletePermissions`: boolean - Whether the user can delete permissions (default: true)
217
- - `PermissionLevels`: string[] - Available permission levels (default: ['View', 'Edit', 'Owner'])
218
- - `PermissionTypes`: string[] - Available permission types (default: ['User', 'Role'])
219
- - `ExcludedRoleNames`: string[] - Role names to exclude from selection
220
- - `ExcludedUserEmails`: string[] - User emails to exclude from selection
221
-
222
- #### Methods
96
+ ## Components
223
97
 
224
- - `SavePermissions()`: Promise<boolean> - Saves all permission changes
225
- - `UpdateResourceRecordID(ResourceRecordID: string)`: Updates the resource record ID
98
+ | Component | Selector | Purpose |
99
+ |-----------|----------|---------|
100
+ | `ResourcePermissionsComponent` | `mj-resource-permissions` | Manage user/role permissions for a resource |
101
+ | `AvailableResourcesComponent` | `mj-available-resources` | Display resources available to a user |
102
+ | `RequestResourceAccessComponent` | `mj-request-resource-access` | Request access to a restricted resource |
226
103
 
227
- ### AvailableResourcesComponent
104
+ ## ResourcePermissionsComponent
228
105
 
229
- Component for displaying resources available to a specific user.
106
+ ### Inputs
230
107
 
231
- #### Inputs
108
+ | Property | Type | Default | Description |
109
+ |----------|------|---------|-------------|
110
+ | `ResourceTypeID` | `string` | -- | ID of the resource type (required) |
111
+ | `ResourceRecordID` | `string` | -- | ID of the resource record (required) |
112
+ | `ShowSaveButton` | `boolean` | `false` | Show built-in Save button |
113
+ | `ShowPermissionLevels` | `boolean` | `true` | Show permission level options |
114
+ | `AllowAddPermissions` | `boolean` | `true` | Allow adding permissions |
115
+ | `AllowEditPermissions` | `boolean` | `true` | Allow editing permissions |
116
+ | `AllowDeletePermissions` | `boolean` | `true` | Allow deleting permissions |
117
+ | `PermissionLevels` | `string[]` | `['View', 'Edit', 'Owner']` | Available permission levels |
118
+ | `PermissionTypes` | `string[]` | `['User', 'Role']` | Available permission types |
232
119
 
233
- - `User`: UserInfo - The user to show resources for (required)
234
- - `ResourceTypeID`: string - ID of the resource type (required)
235
- - `ResourceExtraFilter`: string - Additional filter for resources
236
- - `SelectionMode`: 'Single' | 'Multiple' - Selection mode for the grid (default: 'Single')
237
- - `ExtraColumns`: string - Comma-delimited list of additional columns to display
238
- - `SelectedResources`: ResourceData[] - Array of currently selected resources
120
+ ### Methods
239
121
 
240
- #### Outputs
241
-
242
- - `SelectionChanged`: EventEmitter<ResourceData[]> - Emitted when resource selection changes
243
-
244
- #### Methods
245
-
246
- - `Refresh()`: Promise<void> - Refreshes the component data
247
-
248
- ### RequestResourceAccessComponent
249
-
250
- Component for requesting access to a resource.
251
-
252
- #### Inputs
253
-
254
- - `ResourceType`: string - The name of the resource type (required)
255
- - `ResourceName`: string - The name of the resource to display
256
- - `ResourceRecordID`: string - ID of the resource record (required)
257
- - `PermissionLevel`: 'View' | 'Edit' | 'Owner' - Default permission level (default: 'View')
258
- - `ShowPermissionLevelDropdown`: boolean - Whether to show permission level selection (default: true)
259
-
260
- #### Outputs
261
-
262
- - `AccessRequested`: EventEmitter<ResourcePermissionEntity> - Emitted when access is requested
263
-
264
- #### Methods
265
-
266
- - `requestAccess()`: Promise<void> - Submits the access request
122
+ | Method | Returns | Description |
123
+ |--------|---------|-------------|
124
+ | `SavePermissions()` | `Promise<boolean>` | Save all pending permission changes |
125
+ | `UpdateResourceRecordID(id)` | `void` | Change the resource record ID |
267
126
 
268
127
  ## Permission Workflow
269
128
 
270
- 1. **Managing Permissions**: Use the ResourcePermissionsComponent to add, edit, or remove permissions for users and roles
271
- 2. **Viewing Available Resources**: Use the AvailableResourcesComponent to display resources a user has access to
272
- 3. **Requesting Access**: Use the RequestResourceAccessComponent to allow users to request access to resources they don't have permission for
273
-
274
- ### Permission Status
275
-
276
- When using the RequestResourceAccessComponent, permissions are created with a status of 'Requested'. This allows resource owners to review and approve/deny access requests. The typical workflow is:
277
-
278
- 1. User requests access to a resource → Permission created with Status = 'Requested'
279
- 2. Resource owner reviews the request in ResourcePermissionsComponent
280
- 3. Resource owner can approve (change status) or deny (delete) the permission
281
- 4. Once approved, the user gains access to the resource at the specified permission level
282
-
283
- ## Resource Types
284
-
285
- The resource permissions system works with any resource type defined in MemberJunction, including:
286
-
287
- - Reports
288
- - Dashboards
289
- - Queries
290
- - Documents
291
- - Other custom resource types
292
-
293
- ## Styling
294
-
295
- The components include basic CSS that can be customized to match your application's design.
129
+ 1. **Grant access**: Add a user or role permission with a specific level (View, Edit, Owner)
130
+ 2. **Edit access**: Change an existing permission level
131
+ 3. **Revoke access**: Remove a permission entry
132
+ 4. **Request access**: Users without permission can submit a request (created with `Status = 'Requested'`)
133
+ 5. **Approve/deny**: Resource owner reviews and approves or denies the request
296
134
 
297
135
  ## Dependencies
298
136
 
299
- - `@memberjunction/core`: For metadata and entity access
300
- - `@memberjunction/core-entities`: For resource and permission entity types
301
- - `@memberjunction/global`: For global utilities
302
- - `@memberjunction/ng-base-types`: For Angular component base classes
303
- - `@memberjunction/ng-notifications`: For notification services
304
- - `@memberjunction/ng-container-directives`: For container directive utilities
305
- - `@memberjunction/ng-generic-dialog`: For dialog components
306
- - `@memberjunction/ng-compare-records`: For record comparison functionality
307
- - `@progress/kendo-angular-grid`: For grid components
308
- - `@progress/kendo-angular-buttons`: For UI buttons
309
- - `@progress/kendo-angular-dropdowns`: For dropdown selectors
310
- - `@progress/kendo-angular-dialog`: For dialog windows
311
- - `@progress/kendo-angular-indicators`: For loading indicators
312
- - `@progress/kendo-angular-listview`: For list view components
313
- - `@progress/kendo-angular-layout`: For layout components
314
-
315
- ## Building
316
-
317
- This package is part of the MemberJunction monorepo. To build:
318
-
319
- ```bash
320
- # From the package directory
321
- npm run build
322
-
323
- # Or from the monorepo root
324
- turbo build --filter="@memberjunction/ng-resource-permissions"
325
- ```
326
-
327
- ## Integration with MemberJunction
328
-
329
- This package integrates seamlessly with the MemberJunction ecosystem:
330
-
331
- - **ResourcePermissionEngine**: Leverages the core ResourcePermissionEngine for permission logic
332
- - **Entity Framework**: Uses MemberJunction's entity system for data access
333
- - **Metadata System**: Utilizes the metadata provider for entity discovery
334
- - **Transaction Support**: Integrates with MemberJunction's transaction management
335
- - **Notification System**: Sends notifications when access is requested
336
-
337
- ## Advanced Usage
338
-
339
- ### Custom Permission Validation
340
-
341
- You can extend the permission validation logic by implementing custom checks in your application before calling the save methods on the components.
342
-
343
- ### Programmatic Permission Management
344
-
345
- ```typescript
346
- import { ResourcePermissionEngine } from '@memberjunction/core-entities';
347
- import { Metadata } from '@memberjunction/core';
348
-
349
- // Get the engine instance
350
- const engine = ResourcePermissionEngine.Instance;
351
- await engine.Config();
352
-
353
- // Check if a user has access to a resource
354
- const hasAccess = engine.UserHasPermission(
355
- userID,
356
- resourceTypeID,
357
- resourceRecordID,
358
- 'View' // minimum permission level
359
- );
360
-
361
- // Get all permissions for a resource
362
- const permissions = await engine.GetResourcePermissions(
363
- resourceTypeID,
364
- resourceRecordID
365
- );
366
- ```
367
-
368
- ## Version
369
-
370
- Current version: 2.43.0
371
-
372
- ## License
373
-
374
- ISC
137
+ - [@memberjunction/core](../../MJCore/README.md) -- Metadata, entity framework
138
+ - [@memberjunction/core-entities](../../MJCoreEntities/README.md) -- ResourcePermissionEntity, ResourcePermissionEngine
139
+ - [@memberjunction/ng-notifications](../notifications/README.md) -- Notification service
140
+ - [@memberjunction/ng-generic-dialog](../generic-dialog/README.md) -- Dialog component
141
+ - `@progress/kendo-angular-grid` -- Grid rendering
142
+ - `@progress/kendo-angular-dropdowns` -- Dropdown selectors
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-resource-permissions",
3
- "version": "4.0.0",
3
+ "version": "4.2.0",
4
4
  "description": "MemberJunction: Generic Angular components for displaying/editing permissions for a resource",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -25,14 +25,14 @@
25
25
  "@angular/router": "21.1.3"
26
26
  },
27
27
  "dependencies": {
28
- "@memberjunction/core": "4.0.0",
29
- "@memberjunction/core-entities": "4.0.0",
30
- "@memberjunction/global": "4.0.0",
31
- "@memberjunction/ng-base-types": "4.0.0",
32
- "@memberjunction/ng-container-directives": "4.0.0",
33
- "@memberjunction/ng-generic-dialog": "4.0.0",
34
- "@memberjunction/ng-notifications": "4.0.0",
35
- "@memberjunction/ng-shared-generic": "4.0.0",
28
+ "@memberjunction/core": "4.2.0",
29
+ "@memberjunction/core-entities": "4.2.0",
30
+ "@memberjunction/global": "4.2.0",
31
+ "@memberjunction/ng-base-types": "4.2.0",
32
+ "@memberjunction/ng-container-directives": "4.2.0",
33
+ "@memberjunction/ng-generic-dialog": "4.2.0",
34
+ "@memberjunction/ng-notifications": "4.2.0",
35
+ "@memberjunction/ng-shared-generic": "4.2.0",
36
36
  "@progress/kendo-angular-buttons": "22.0.1",
37
37
  "@progress/kendo-angular-dialog": "22.0.1",
38
38
  "@progress/kendo-angular-dropdowns": "22.0.1",