@memberjunction/ng-explorer-settings 2.32.1 → 2.33.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.
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# @memberjunction/ng-explorer-settings
|
|
2
|
+
|
|
3
|
+
Angular components for managing MemberJunction application settings, including users, roles, and permissions.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Complete settings management for MemberJunction Explorer
|
|
8
|
+
- User management with activation/deactivation functionality
|
|
9
|
+
- Role management and assignment
|
|
10
|
+
- Application entity configuration
|
|
11
|
+
- Entity permissions management
|
|
12
|
+
- Consistent navigation between settings sections
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @memberjunction/ng-explorer-settings
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
Import the module in your application:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { ExplorerSettingsModule } from '@memberjunction/ng-explorer-settings';
|
|
26
|
+
|
|
27
|
+
@NgModule({
|
|
28
|
+
imports: [
|
|
29
|
+
// ...
|
|
30
|
+
ExplorerSettingsModule
|
|
31
|
+
]
|
|
32
|
+
})
|
|
33
|
+
export class YourModule { }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Components
|
|
37
|
+
|
|
38
|
+
### SettingsComponent
|
|
39
|
+
|
|
40
|
+
The main component that provides navigation between different settings sections:
|
|
41
|
+
|
|
42
|
+
```html
|
|
43
|
+
<mj-settings></mj-settings>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The component handles routing to different settings sections:
|
|
47
|
+
- `/settings/users` - User management
|
|
48
|
+
- `/settings/user/:id` - Individual user details
|
|
49
|
+
- `/settings/roles` - Role management
|
|
50
|
+
- `/settings/role/:id` - Individual role details
|
|
51
|
+
- `/settings/applications` - Application management
|
|
52
|
+
- `/settings/application/:name` - Individual application details
|
|
53
|
+
- `/settings/entitypermissions` - Entity permission management
|
|
54
|
+
|
|
55
|
+
### SingleUserComponent
|
|
56
|
+
|
|
57
|
+
Component for managing an individual user:
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<mj-single-user [UserID]="userId"></mj-single-user>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### SingleRoleComponent
|
|
64
|
+
|
|
65
|
+
Component for managing an individual role:
|
|
66
|
+
|
|
67
|
+
```html
|
|
68
|
+
<mj-single-role [RoleID]="roleId"></mj-single-role>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### SingleApplicationComponent
|
|
72
|
+
|
|
73
|
+
Component for managing an individual application:
|
|
74
|
+
|
|
75
|
+
```html
|
|
76
|
+
<mj-single-application [ApplicationID]="applicationId"></mj-single-application>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### UserRolesGridComponent
|
|
80
|
+
|
|
81
|
+
Grid component for managing role assignments for a user:
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<mj-user-roles-grid [UserID]="userId"></mj-user-roles-grid>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### ApplicationEntitiesGridComponent
|
|
88
|
+
|
|
89
|
+
Grid component for managing entities associated with an application:
|
|
90
|
+
|
|
91
|
+
```html
|
|
92
|
+
<mj-application-entities-grid [ApplicationID]="applicationId"></mj-application-entities-grid>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## User Management Features
|
|
96
|
+
|
|
97
|
+
The settings module includes special functionality for user management, such as:
|
|
98
|
+
|
|
99
|
+
- Activating/deactivating users instead of deleting them
|
|
100
|
+
- Role assignment
|
|
101
|
+
- User details editing
|
|
102
|
+
|
|
103
|
+
Example of user activation toggle:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
// Toggle user activation status
|
|
107
|
+
async function toggleUserActivation(user: UserEntity) {
|
|
108
|
+
user.IsActive = !user.IsActive;
|
|
109
|
+
await user.Save();
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Integration
|
|
114
|
+
|
|
115
|
+
This module integrates with other MemberJunction Explorer components:
|
|
116
|
+
- Uses simple-record-list for displaying entity records
|
|
117
|
+
- Uses entity-form-dialog for editing records
|
|
118
|
+
- Uses entity-permissions for permission management
|
|
119
|
+
- Uses tabstrip for sectioned display
|
|
120
|
+
- Uses notifications for user feedback
|
|
@@ -33,6 +33,20 @@ export declare class SettingsComponent extends BaseNavigationComponent implement
|
|
|
33
33
|
selectApplication(a: BaseEntity): void;
|
|
34
34
|
selectRole(r: BaseEntity): void;
|
|
35
35
|
selectUser(u: BaseEntity): void;
|
|
36
|
+
/**
|
|
37
|
+
* Function that returns the appropriate Font Awesome icon for the user toggle button
|
|
38
|
+
* based on the user's IsActive status
|
|
39
|
+
*/
|
|
40
|
+
getUserToggleIcon(record: BaseEntity): string;
|
|
41
|
+
/**
|
|
42
|
+
* Function that returns the appropriate tooltip text for the user toggle button
|
|
43
|
+
* based on the user's IsActive status
|
|
44
|
+
*/
|
|
45
|
+
getUserToggleTooltip(record: BaseEntity): string;
|
|
46
|
+
/**
|
|
47
|
+
* Handles toggling a user's activation status when the custom action is confirmed
|
|
48
|
+
*/
|
|
49
|
+
toggleUserActivation(record: BaseEntity): Promise<void>;
|
|
36
50
|
selectRoute(route: string, value: any): void;
|
|
37
51
|
leftNavItemSelected(option: {
|
|
38
52
|
label: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/settings/settings.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAiB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAY,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/settings/settings.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAiB,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAY,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;;AAGpE,oBAAY,YAAY;IACtB,iBAAiB,sBAAsB;IACvC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;CAC5B;AAED,qBAMa,iBAAkB,SAAQ,uBAAwB,YAAW,MAAM;IAgClE,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,cAAc;IA/BnD,WAAW,EAAE,YAAY,CAAsB;IAC/C,SAAS,EAAE,MAAM,CAAe;IAEhC,cAAc,EAAE,MAAM,CAAM;IAC5B,cAAc,EAAE,MAAM,CAAM;IAC5B,uBAAuB,EAAE,MAAM,CAAM;IACrC,qBAAqB,EAAE,MAAM,CAAM;IAEnC,OAAO;;;QAKZ;IAGK,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,WAAW,GAAE,OAAc;IAU1E,WAAW,CAAC,OAAO,EAAE,MAAM;gBAKP,MAAM,EAAE,MAAM,EAAU,cAAc,EAAE,cAAc;IAK1E,QAAQ;IAYR,+BAA+B;IAyCxB,iBAAiB,CAAC,CAAC,EAAE,UAAU;IAG/B,UAAU,CAAC,CAAC,EAAE,UAAU;IAGxB,UAAU,CAAC,CAAC,EAAE,UAAU;IAI/B;;;OAGG;IACI,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAKpD;;;OAGG;IACI,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAKvD;;OAEG;IACU,oBAAoB,CAAC,MAAM,EAAE,UAAU;IAmC7C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAIrC,mBAAmB,CAAC,MAAM,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAC;yCAhKnD,iBAAiB;2CAAjB,iBAAiB;CAqK7B"}
|
|
@@ -4,10 +4,20 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
8
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
9
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
10
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
11
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
12
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
13
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
14
|
+
});
|
|
15
|
+
};
|
|
7
16
|
import { Component } from '@angular/core';
|
|
8
17
|
import { NavigationEnd } from '@angular/router';
|
|
9
18
|
import { Metadata } from '@memberjunction/core';
|
|
10
19
|
import { RegisterClass } from '@memberjunction/global';
|
|
20
|
+
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
11
21
|
import { BaseNavigationComponent } from '@memberjunction/ng-shared';
|
|
12
22
|
import { filter } from 'rxjs/operators';
|
|
13
23
|
import * as i0 from "@angular/core";
|
|
@@ -40,10 +50,11 @@ function SettingsComponent_Case_4_Template(rf, ctx) { if (rf & 1) {
|
|
|
40
50
|
function SettingsComponent_Case_5_Template(rf, ctx) { if (rf & 1) {
|
|
41
51
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
42
52
|
i0.ɵɵelementStart(0, "mj-simple-record-list", 11);
|
|
43
|
-
i0.ɵɵlistener("RecordSelected", function SettingsComponent_Case_5_Template_mj_simple_record_list_RecordSelected_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectUser($event)); });
|
|
53
|
+
i0.ɵɵlistener("RecordSelected", function SettingsComponent_Case_5_Template_mj_simple_record_list_RecordSelected_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.selectUser($event)); })("CustomActionConfirmed", function SettingsComponent_Case_5_Template_mj_simple_record_list_CustomActionConfirmed_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleUserActivation($event)); });
|
|
44
54
|
i0.ɵɵelementEnd();
|
|
45
55
|
} if (rf & 2) {
|
|
46
|
-
|
|
56
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
57
|
+
i0.ɵɵproperty("Columns", i0.ɵɵpureFunction0(8, _c0))("AllowDelete", false)("AllowCustomAction", true)("CustomActionIconFunction", ctx_r2.getUserToggleIcon)("CustomActionTooltipFunction", ctx_r2.getUserToggleTooltip)("CustomActionDialogTitle", "Toggle User Activation")("CustomActionDialogMessage", "Are you sure you want to toggle activation for this user?")("CustomActionDialogInfo", "Active users can log in to the system. Inactive users cannot log in.");
|
|
47
58
|
} }
|
|
48
59
|
function SettingsComponent_Case_6_Template(rf, ctx) { if (rf & 1) {
|
|
49
60
|
i0.ɵɵelement(0, "mj-single-user", 5);
|
|
@@ -175,6 +186,49 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
175
186
|
selectUser(u) {
|
|
176
187
|
this.selectRoute('/settings/user', u.ID);
|
|
177
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Function that returns the appropriate Font Awesome icon for the user toggle button
|
|
191
|
+
* based on the user's IsActive status
|
|
192
|
+
*/
|
|
193
|
+
getUserToggleIcon(record) {
|
|
194
|
+
const user = record;
|
|
195
|
+
return user.IsActive ? 'fa-user-lock' : 'fa-user-check';
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Function that returns the appropriate tooltip text for the user toggle button
|
|
199
|
+
* based on the user's IsActive status
|
|
200
|
+
*/
|
|
201
|
+
getUserToggleTooltip(record) {
|
|
202
|
+
const user = record;
|
|
203
|
+
return user.IsActive ? 'Deactivate user' : 'Activate user';
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Handles toggling a user's activation status when the custom action is confirmed
|
|
207
|
+
*/
|
|
208
|
+
toggleUserActivation(record) {
|
|
209
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
210
|
+
try {
|
|
211
|
+
const user = record;
|
|
212
|
+
// Get current status
|
|
213
|
+
const currentlyActive = user.IsActive;
|
|
214
|
+
const userName = user.Name;
|
|
215
|
+
// Toggle the IsActive flag
|
|
216
|
+
user.IsActive = !currentlyActive;
|
|
217
|
+
if (yield user.Save()) {
|
|
218
|
+
MJNotificationService.Instance.CreateSimpleNotification(`User ${userName} has been ${currentlyActive ? 'deactivated' : 'activated'} successfully.`, 'success', 3000);
|
|
219
|
+
// Refresh the user list
|
|
220
|
+
this.selectItem(SettingsItem.Users);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error ${currentlyActive ? 'deactivating' : 'activating'} user ${userName}`, 'error', 5000);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
console.error('Error toggling user activation:', error);
|
|
228
|
+
MJNotificationService.Instance.CreateSimpleNotification('An error occurred while toggling user activation.', 'error', 5000);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
178
232
|
selectRoute(route, value) {
|
|
179
233
|
this.router.navigate([route, value]);
|
|
180
234
|
}
|
|
@@ -185,12 +239,12 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
185
239
|
}
|
|
186
240
|
};
|
|
187
241
|
SettingsComponent.ɵfac = function SettingsComponent_Factory(t) { return new (t || SettingsComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute)); };
|
|
188
|
-
SettingsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsComponent, selectors: [["mj-settings"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 11, vars: 6, consts: [["mjFillContainer", "", 1, "container", 3, "bottomMargin", "rightMargin"], ["mjFillContainer", "", 1, "options-container", 3, "fillWidth"], ["class", "option-item", 3, "selected", "click", 4, "ngFor", "ngForOf"], ["mjFillContainer", "", 1, "display-container", 3, "fillWidth"], ["EntityName", "Users", "SortBy", "Name", 3, "Columns"], [3, "UserID"], ["EntityName", "Roles", "SortBy", "Name", 3, "Columns"], ["mjFillContainer", "", 3, "RoleID"], ["EntityName", "Applications", "SortBy", "Name", 3, "Columns"], [3, "ApplicationID"], [1, "option-item", 3, "click"], ["EntityName", "Users", "SortBy", "Name", 3, "RecordSelected", "Columns"], ["EntityName", "Roles", "SortBy", "Name", 3, "RecordSelected", "Columns"], ["EntityName", "Applications", "SortBy", "Name", 3, "RecordSelected", "Columns"]], template: function SettingsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
242
|
+
SettingsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsComponent, selectors: [["mj-settings"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 11, vars: 6, consts: [["mjFillContainer", "", 1, "container", 3, "bottomMargin", "rightMargin"], ["mjFillContainer", "", 1, "options-container", 3, "fillWidth"], ["class", "option-item", 3, "selected", "click", 4, "ngFor", "ngForOf"], ["mjFillContainer", "", 1, "display-container", 3, "fillWidth"], ["EntityName", "Users", "SortBy", "Name", 3, "Columns", "AllowDelete", "AllowCustomAction", "CustomActionIconFunction", "CustomActionTooltipFunction", "CustomActionDialogTitle", "CustomActionDialogMessage", "CustomActionDialogInfo"], [3, "UserID"], ["EntityName", "Roles", "SortBy", "Name", 3, "Columns"], ["mjFillContainer", "", 3, "RoleID"], ["EntityName", "Applications", "SortBy", "Name", 3, "Columns"], [3, "ApplicationID"], [1, "option-item", 3, "click"], ["EntityName", "Users", "SortBy", "Name", 3, "RecordSelected", "CustomActionConfirmed", "Columns", "AllowDelete", "AllowCustomAction", "CustomActionIconFunction", "CustomActionTooltipFunction", "CustomActionDialogTitle", "CustomActionDialogMessage", "CustomActionDialogInfo"], ["EntityName", "Roles", "SortBy", "Name", 3, "RecordSelected", "Columns"], ["EntityName", "Applications", "SortBy", "Name", 3, "RecordSelected", "Columns"]], template: function SettingsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
189
243
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
|
|
190
244
|
i0.ɵɵtemplate(2, SettingsComponent_div_2_Template, 2, 3, "div", 2);
|
|
191
245
|
i0.ɵɵelementEnd();
|
|
192
246
|
i0.ɵɵelementStart(3, "div", 3);
|
|
193
|
-
i0.ɵɵtemplate(4, SettingsComponent_Case_4_Template, 1, 0, "mj-entity-permissions-selector-with-grid")(5, SettingsComponent_Case_5_Template, 1,
|
|
247
|
+
i0.ɵɵtemplate(4, SettingsComponent_Case_4_Template, 1, 0, "mj-entity-permissions-selector-with-grid")(5, SettingsComponent_Case_5_Template, 1, 9, "mj-simple-record-list", 4)(6, SettingsComponent_Case_6_Template, 1, 1, "mj-single-user", 5)(7, SettingsComponent_Case_7_Template, 1, 2, "mj-simple-record-list", 6)(8, SettingsComponent_Case_8_Template, 1, 1, "mj-single-role", 7)(9, SettingsComponent_Case_9_Template, 1, 2, "mj-simple-record-list", 8)(10, SettingsComponent_Case_10_Template, 1, 1, "mj-single-application", 9);
|
|
194
248
|
i0.ɵɵelementEnd()();
|
|
195
249
|
} if (rf & 2) {
|
|
196
250
|
let tmp_5_0;
|
|
@@ -210,7 +264,7 @@ SettingsComponent = __decorate([
|
|
|
210
264
|
export { SettingsComponent };
|
|
211
265
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SettingsComponent, [{
|
|
212
266
|
type: Component,
|
|
213
|
-
args: [{ selector: 'mj-settings', template: "<div class=\"container\" mjFillContainer [bottomMargin]=\"5\" [rightMargin]=\"0\">\n <!-- Options container -->\n <div class=\"options-container\" mjFillContainer [fillWidth]=\"false\">\n <div *ngFor=\"let o of options\"\n class=\"option-item\"\n [class.selected]=\"leftNavItemSelected(o)\"\n (click)=\"selectItem(o.value)\"\n >{{o.label}}</div>\n </div>\n\n <!-- Display container -->\n <div class=\"display-container\" mjFillContainer [fillWidth]=\"false\">\n <!-- <mj-join-grid\n RowsEntityName=\"Entities\"\n RowsEntityDisplayField=\"Name\"\n RowsEntityDataSource=\"FullEntity\"\n RowsExtraFilter=\"SchemaName <> '__mj' AND (Name like 'a%' or Name like 'p%')\"\n RowsOrderBy=\"Name\"\n ColumnsEntityName=\"Actions\"\n ColumnsEntityDisplayField=\"Name\"\n ColumnsEntityDataSource= \"FullEntity\"\n ColumnsMode=\"Entity\"\n ColumnsExtraFilter=\"Name like 'v%' or Name like 'd%' or Name like 'test%'\"\n ColumnsOrderBy=\"Name\"\n JoinEntityName=\"Entity Actions\"\n JoinEntityRowForeignKey=\"EntityID\"\n JoinEntityColumnForeignKey=\"ActionID\"\n CheckBoxValueMode=\"RecordExists\"\n \n style=\"height: 750px; width: 800px;\"\n >\n\n </mj-join-grid> -->\n @switch (currentItem) {\n @case ('EntityPermissions') {\n <mj-entity-permissions-selector-with-grid></mj-entity-permissions-selector-with-grid>\n }\n @case ('Users') {\n <mj-simple-record-list\n EntityName=\"Users\"\n SortBy=\"Name\"\n [Columns]=\"['Name', 'Email', 'IsActive', 'Type']\"\n (RecordSelected)=\"selectUser($event)\"\n ></mj-simple-record-list>\n }\n @case ('User') {\n <mj-single-user [UserID]=\"selectedUserID\"></mj-single-user>\n }\n @case ('Roles') {\n <mj-simple-record-list\n EntityName=\"Roles\"\n SortBy=\"Name\"\n [Columns]=\"['Name', 'Description']\"\n (RecordSelected)=\"selectRole($event)\"\n ></mj-simple-record-list>\n }\n @case ('Role') {\n <mj-single-role [RoleID]=\"selectedRoleID\" mjFillContainer></mj-single-role>\n }\n @case ('Applications') {\n <mj-simple-record-list\n EntityName=\"Applications\"\n SortBy=\"Name\"\n [Columns]=\"['Name', 'Description']\"\n (RecordSelected)=\"selectApplication($event)\"\n ></mj-simple-record-list>\n }\n @case ('Application') {\n <mj-single-application [ApplicationID]=\"selectedApplicationID\"></mj-single-application>\n }\n }\n </div>\n</div>", styles: [".container {\n display: block;\n width: 100%;\n overflow: hidden; \n}\n\n.options-container {\n float: left; /* Float to the left */\n width: 150px; /* Fixed width as specified */\n flex: 0 0 150px;\n padding: 10px;\n border-right: solid 1px lightgray;\n box-sizing: border-box; /* Ensures padding is included in the width */\n}\n\n.option-item {\n cursor: pointer;\n margin-bottom: 10px; /* Adds space between the options for better readability */\n padding: 5px 10px; /* Optional: Adds some padding for a better visual appearance */\n border-radius: 4px; /* Optional: Adds rounded corners for a more polished look */\n}\n\n.display-container {\n display: block; /* Ensures it's treated as a block-level element */\n margin-left: 160px; /* Width of the options-container plus its padding */\n padding: 10px;\n box-sizing: border-box; /* Ensures padding doesn't add to the width */\n}\n\n.selected {\n background-color: #007bff; /* A blue background for selected item */\n color: white; /* White text color for better contrast */\n padding: 5px 10px; /* Optional: Adds some padding for a better visual appearance */\n border-radius: 4px; /* Optional: Adds rounded corners for a more polished look */\n}\n"] }]
|
|
267
|
+
args: [{ selector: 'mj-settings', template: "<div class=\"container\" mjFillContainer [bottomMargin]=\"5\" [rightMargin]=\"0\">\n <!-- Options container -->\n <div class=\"options-container\" mjFillContainer [fillWidth]=\"false\">\n <div *ngFor=\"let o of options\"\n class=\"option-item\"\n [class.selected]=\"leftNavItemSelected(o)\"\n (click)=\"selectItem(o.value)\"\n >{{o.label}}</div>\n </div>\n\n <!-- Display container -->\n <div class=\"display-container\" mjFillContainer [fillWidth]=\"false\">\n <!-- <mj-join-grid\n RowsEntityName=\"Entities\"\n RowsEntityDisplayField=\"Name\"\n RowsEntityDataSource=\"FullEntity\"\n RowsExtraFilter=\"SchemaName <> '__mj' AND (Name like 'a%' or Name like 'p%')\"\n RowsOrderBy=\"Name\"\n ColumnsEntityName=\"Actions\"\n ColumnsEntityDisplayField=\"Name\"\n ColumnsEntityDataSource= \"FullEntity\"\n ColumnsMode=\"Entity\"\n ColumnsExtraFilter=\"Name like 'v%' or Name like 'd%' or Name like 'test%'\"\n ColumnsOrderBy=\"Name\"\n JoinEntityName=\"Entity Actions\"\n JoinEntityRowForeignKey=\"EntityID\"\n JoinEntityColumnForeignKey=\"ActionID\"\n CheckBoxValueMode=\"RecordExists\"\n \n style=\"height: 750px; width: 800px;\"\n >\n\n </mj-join-grid> -->\n @switch (currentItem) {\n @case ('EntityPermissions') {\n <mj-entity-permissions-selector-with-grid></mj-entity-permissions-selector-with-grid>\n }\n @case ('Users') {\n <mj-simple-record-list\n EntityName=\"Users\"\n SortBy=\"Name\"\n [Columns]=\"['Name', 'Email', 'IsActive', 'Type']\" \n [AllowDelete]=\"false\"\n [AllowCustomAction]=\"true\"\n [CustomActionIconFunction]=\"getUserToggleIcon\"\n [CustomActionTooltipFunction]=\"getUserToggleTooltip\"\n [CustomActionDialogTitle]=\"'Toggle User Activation'\"\n [CustomActionDialogMessage]=\"'Are you sure you want to toggle activation for this user?'\"\n [CustomActionDialogInfo]=\"'Active users can log in to the system. Inactive users cannot log in.'\"\n (RecordSelected)=\"selectUser($event)\"\n (CustomActionConfirmed)=\"toggleUserActivation($event)\"\n ></mj-simple-record-list>\n }\n @case ('User') {\n <mj-single-user [UserID]=\"selectedUserID\"></mj-single-user>\n }\n @case ('Roles') {\n <mj-simple-record-list\n EntityName=\"Roles\"\n SortBy=\"Name\"\n [Columns]=\"['Name', 'Description']\"\n (RecordSelected)=\"selectRole($event)\"\n ></mj-simple-record-list>\n }\n @case ('Role') {\n <mj-single-role [RoleID]=\"selectedRoleID\" mjFillContainer></mj-single-role>\n }\n @case ('Applications') {\n <mj-simple-record-list\n EntityName=\"Applications\"\n SortBy=\"Name\"\n [Columns]=\"['Name', 'Description']\"\n (RecordSelected)=\"selectApplication($event)\"\n ></mj-simple-record-list>\n }\n @case ('Application') {\n <mj-single-application [ApplicationID]=\"selectedApplicationID\"></mj-single-application>\n }\n }\n </div>\n</div>", styles: [".container {\n display: block;\n width: 100%;\n overflow: hidden; \n}\n\n.options-container {\n float: left; /* Float to the left */\n width: 150px; /* Fixed width as specified */\n flex: 0 0 150px;\n padding: 10px;\n border-right: solid 1px lightgray;\n box-sizing: border-box; /* Ensures padding is included in the width */\n}\n\n.option-item {\n cursor: pointer;\n margin-bottom: 10px; /* Adds space between the options for better readability */\n padding: 5px 10px; /* Optional: Adds some padding for a better visual appearance */\n border-radius: 4px; /* Optional: Adds rounded corners for a more polished look */\n}\n\n.display-container {\n display: block; /* Ensures it's treated as a block-level element */\n margin-left: 160px; /* Width of the options-container plus its padding */\n padding: 10px;\n box-sizing: border-box; /* Ensures padding doesn't add to the width */\n}\n\n.selected {\n background-color: #007bff; /* A blue background for selected item */\n color: white; /* White text color for better contrast */\n padding: 5px 10px; /* Optional: Adds some padding for a better visual appearance */\n border-radius: 4px; /* Optional: Adds rounded corners for a more polished look */\n}\n"] }]
|
|
214
268
|
}], () => [{ type: i1.Router }, { type: i1.ActivatedRoute }], null); })();
|
|
215
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SettingsComponent, { className: "SettingsComponent", filePath: "src/lib/settings/settings.component.ts", lineNumber:
|
|
269
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SettingsComponent, { className: "SettingsComponent", filePath: "src/lib/settings/settings.component.ts", lineNumber: 26 }); })();
|
|
216
270
|
//# sourceMappingURL=settings.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.component.js","sourceRoot":"","sources":["../../../src/lib/settings/settings.component.ts","../../../src/lib/settings/settings.component.html"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.component.js","sourceRoot":"","sources":["../../../src/lib/settings/settings.component.ts","../../../src/lib/settings/settings.component.html"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-explorer-settings",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.33.0",
|
|
4
4
|
"description": "MemberJunction: Reusable Angular components for the settings section of the MJ Explorer App",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -25,17 +25,18 @@
|
|
|
25
25
|
"@angular/router": "18.0.2"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@memberjunction/core-entities": "2.
|
|
29
|
-
"@memberjunction/global": "2.
|
|
30
|
-
"@memberjunction/core": "2.
|
|
31
|
-
"@memberjunction/ng-container-directives": "2.
|
|
32
|
-
"@memberjunction/ng-shared": "2.
|
|
33
|
-
"@memberjunction/ng-
|
|
34
|
-
"@memberjunction/ng-
|
|
35
|
-
"@memberjunction/ng-
|
|
36
|
-
"@memberjunction/ng-
|
|
37
|
-
"@memberjunction/ng-
|
|
38
|
-
"@memberjunction/ng-
|
|
28
|
+
"@memberjunction/core-entities": "2.33.0",
|
|
29
|
+
"@memberjunction/global": "2.33.0",
|
|
30
|
+
"@memberjunction/core": "2.33.0",
|
|
31
|
+
"@memberjunction/ng-container-directives": "2.33.0",
|
|
32
|
+
"@memberjunction/ng-shared": "2.33.0",
|
|
33
|
+
"@memberjunction/ng-notifications": "2.33.0",
|
|
34
|
+
"@memberjunction/ng-entity-permissions": "2.33.0",
|
|
35
|
+
"@memberjunction/ng-base-forms": "2.33.0",
|
|
36
|
+
"@memberjunction/ng-entity-form-dialog": "2.33.0",
|
|
37
|
+
"@memberjunction/ng-user-view-grid": "2.33.0",
|
|
38
|
+
"@memberjunction/ng-simple-record-list": "2.33.0",
|
|
39
|
+
"@memberjunction/ng-tabstrip": "2.33.0",
|
|
39
40
|
"@progress/kendo-angular-dropdowns": "16.2.0",
|
|
40
41
|
"@progress/kendo-angular-grid": "16.2.0",
|
|
41
42
|
"@progress/kendo-angular-buttons": "16.2.0",
|