@memberjunction/ng-explorer-settings 3.4.0 → 4.1.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 +102 -454
- package/dist/lib/account-info/account-info.component.d.ts.map +1 -1
- package/dist/lib/account-info/account-info.component.js +7 -5
- package/dist/lib/account-info/account-info.component.js.map +1 -1
- package/dist/lib/appearance-settings/appearance-settings.component.d.ts.map +1 -1
- package/dist/lib/appearance-settings/appearance-settings.component.js +3 -3
- package/dist/lib/appearance-settings/appearance-settings.component.js.map +1 -1
- package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-dialog/application-dialog.component.js +20 -18
- package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
- package/dist/lib/application-management/application-management.component.d.ts +3 -2
- package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-management.component.js +20 -15
- package/dist/lib/application-management/application-management.component.js.map +1 -1
- package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -1
- package/dist/lib/application-settings/application-settings.component.js +12 -9
- package/dist/lib/application-settings/application-settings.component.js.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.js +13 -10
- package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +44 -43
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
- package/dist/lib/general-settings/general-settings.component.d.ts.map +1 -1
- package/dist/lib/general-settings/general-settings.component.js +3 -3
- package/dist/lib/general-settings/general-settings.component.js.map +1 -1
- package/dist/lib/module.d.ts +11 -12
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +0 -4
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.js +9 -8
- package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.js +32 -32
- package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
- package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-management.component.js +11 -8
- package/dist/lib/role-management/role-management.component.js.map +1 -1
- package/dist/lib/settings/settings.component.d.ts.map +1 -1
- package/dist/lib/settings/settings.component.js +17 -11
- package/dist/lib/settings/settings.component.js.map +1 -1
- package/dist/lib/shared/settings-card.component.d.ts.map +1 -1
- package/dist/lib/shared/settings-card.component.js +4 -4
- package/dist/lib/shared/settings-card.component.js.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.d.ts +2 -2
- package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.js +21 -16
- package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.d.ts.map +1 -1
- package/dist/lib/user-app-config/user-app-config.component.js +14 -11
- package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.js +37 -36
- package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
- package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-management.component.js +23 -19
- package/dist/lib/user-management/user-management.component.js.map +1 -1
- package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts.map +1 -1
- package/dist/lib/user-profile-settings/user-profile-settings.component.js +16 -12
- package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
- package/dist/public-api.d.ts +5 -12
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +6 -38
- package/dist/public-api.js.map +1 -1
- package/package.json +35 -36
package/README.md
CHANGED
|
@@ -1,21 +1,67 @@
|
|
|
1
1
|
# @memberjunction/ng-explorer-settings
|
|
2
2
|
|
|
3
|
-
Angular components for
|
|
3
|
+
Angular components for the Settings section of MemberJunction Explorer. Provides a tabbed settings interface covering general preferences, user management, role management, application management, entity permissions, appearance, notifications, SQL logging, and profile settings.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
The
|
|
7
|
+
The `SettingsComponent` serves as the main container, registered via `@RegisterClass(BaseNavigationComponent, 'Settings')`. It provides a searchable, tabbed interface for administrative and user settings. Each settings area is implemented as a standalone component that can be used independently.
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
graph TD
|
|
11
|
+
SC["SettingsComponent\n(<mj-settings>)"] --> GS["GeneralSettingsComponent"]
|
|
12
|
+
SC --> AI["AccountInfoComponent"]
|
|
13
|
+
SC --> AS["AppearanceSettingsComponent"]
|
|
14
|
+
SC --> APS["ApplicationSettingsComponent"]
|
|
15
|
+
SC --> UM["UserManagementComponent"]
|
|
16
|
+
SC --> RM["RoleManagementComponent"]
|
|
17
|
+
SC --> AM["ApplicationManagementComponent"]
|
|
18
|
+
SC --> EP["EntityPermissionsComponent"]
|
|
19
|
+
SC --> NP["NotificationPreferencesComponent"]
|
|
20
|
+
SC --> SL["SQLLoggingComponent"]
|
|
21
|
+
SC --> UP["UserProfileSettingsComponent"]
|
|
22
|
+
SC --> UAC["UserAppConfigComponent"]
|
|
23
|
+
|
|
24
|
+
UM --> UD["UserDialogComponent"]
|
|
25
|
+
RM --> RD["RoleDialogComponent"]
|
|
26
|
+
AM --> AD["ApplicationDialogComponent"]
|
|
27
|
+
EP --> PD["PermissionDialogComponent"]
|
|
28
|
+
|
|
29
|
+
style SC fill:#7c5295,stroke:#563a6b,color:#fff
|
|
30
|
+
style GS fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
31
|
+
style AI fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
32
|
+
style AS fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
33
|
+
style APS fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
34
|
+
style UM fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
35
|
+
style RM fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
36
|
+
style AM fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
37
|
+
style EP fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
38
|
+
style NP fill:#b8762f,stroke:#8a5722,color:#fff
|
|
39
|
+
style SL fill:#b8762f,stroke:#8a5722,color:#fff
|
|
40
|
+
style UP fill:#b8762f,stroke:#8a5722,color:#fff
|
|
41
|
+
style UAC fill:#b8762f,stroke:#8a5722,color:#fff
|
|
42
|
+
style UD fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
43
|
+
style RD fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
44
|
+
style AD fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
45
|
+
style PD fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
46
|
+
```
|
|
8
47
|
|
|
9
48
|
## Features
|
|
10
49
|
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
15
|
-
- **
|
|
16
|
-
- **
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
50
|
+
- **Tabbed settings interface** with search across all settings
|
|
51
|
+
- **General settings**: Core application preferences
|
|
52
|
+
- **Account info**: User account details
|
|
53
|
+
- **Appearance settings**: Theme and display preferences
|
|
54
|
+
- **Application settings**: Application-specific configuration
|
|
55
|
+
- **User management**: CRUD for users with dialog-based editing
|
|
56
|
+
- **Role management**: CRUD for roles with dialog-based editing
|
|
57
|
+
- **Application management**: CRUD for applications with dialog-based editing
|
|
58
|
+
- **Entity permissions**: Permission grid integrated from `@memberjunction/ng-entity-permissions`
|
|
59
|
+
- **Notification preferences**: Notification configuration
|
|
60
|
+
- **SQL logging**: SQL query logging viewer
|
|
61
|
+
- **User profile settings**: Profile editing
|
|
62
|
+
- **User app configuration**: Per-user application configuration
|
|
63
|
+
- **Reusable settings card**: `SettingsCardComponent` for consistent card layout
|
|
64
|
+
- **Shared settings module**: Common settings UI elements
|
|
19
65
|
|
|
20
66
|
## Installation
|
|
21
67
|
|
|
@@ -23,461 +69,63 @@ The `@memberjunction/ng-explorer-settings` package provides a complete settings
|
|
|
23
69
|
npm install @memberjunction/ng-explorer-settings
|
|
24
70
|
```
|
|
25
71
|
|
|
26
|
-
##
|
|
72
|
+
## Key Dependencies
|
|
27
73
|
|
|
28
|
-
|
|
74
|
+
| Dependency | Purpose |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `@memberjunction/core`, `@memberjunction/core-entities` | Entity metadata and data |
|
|
77
|
+
| `@memberjunction/ng-base-application` | BaseNavigationComponent |
|
|
78
|
+
| `@memberjunction/ng-entity-permissions` | Entity permission grid |
|
|
79
|
+
| `@memberjunction/ng-entity-form-dialog` | Entity form dialogs |
|
|
80
|
+
| `@memberjunction/ng-simple-record-list` | Simple record CRUD lists |
|
|
81
|
+
| `@memberjunction/ng-join-grid` | Join/relationship grid |
|
|
82
|
+
| `@memberjunction/ng-user-avatar` | User avatar display |
|
|
83
|
+
| `@progress/kendo-angular-*` | Kendo UI components |
|
|
84
|
+
| `@angular/cdk` | Angular CDK utilities |
|
|
29
85
|
|
|
30
|
-
|
|
86
|
+
## Usage
|
|
31
87
|
|
|
32
88
|
```typescript
|
|
33
89
|
import { ExplorerSettingsModule } from '@memberjunction/ng-explorer-settings';
|
|
34
90
|
|
|
35
91
|
@NgModule({
|
|
36
|
-
imports: [
|
|
37
|
-
CommonModule,
|
|
38
|
-
ExplorerSettingsModule,
|
|
39
|
-
// other imports...
|
|
40
|
-
]
|
|
92
|
+
imports: [ExplorerSettingsModule]
|
|
41
93
|
})
|
|
42
|
-
export class
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
- `/settings/roles` - Role list view
|
|
73
|
-
- `/settings/role/:id` - Individual role details
|
|
74
|
-
- `/settings/applications` - Application list view
|
|
75
|
-
- `/settings/application/:name` - Individual application details
|
|
76
|
-
- `/settings/entitypermissions` - Entity permission management
|
|
77
|
-
- `/settings/sqllogging` - SQL logging configuration and session management
|
|
78
|
-
|
|
79
|
-
**Example**:
|
|
80
|
-
```typescript
|
|
81
|
-
// Navigate to a specific user
|
|
82
|
-
this.router.navigate(['/settings/user', userId]);
|
|
83
|
-
|
|
84
|
-
// Navigate to roles section
|
|
85
|
-
this.router.navigate(['/settings/roles']);
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### SingleUserComponent
|
|
89
|
-
|
|
90
|
-
Manages individual user details and configurations.
|
|
91
|
-
|
|
92
|
-
**Selector**: `mj-single-user`
|
|
93
|
-
|
|
94
|
-
**Inputs**:
|
|
95
|
-
- `UserID: string` - The ID of the user to display/edit
|
|
96
|
-
|
|
97
|
-
**Features**:
|
|
98
|
-
- User information display and editing
|
|
99
|
-
- User role assignments via embedded grid
|
|
100
|
-
- User views management
|
|
101
|
-
- Integration with entity form dialog for editing
|
|
102
|
-
|
|
103
|
-
**Example**:
|
|
104
|
-
```html
|
|
105
|
-
<mj-single-user [UserID]="selectedUserId"></mj-single-user>
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### SingleRoleComponent
|
|
109
|
-
|
|
110
|
-
Manages individual role details and user assignments.
|
|
111
|
-
|
|
112
|
-
**Selector**: `mj-single-role`
|
|
113
|
-
|
|
114
|
-
**Inputs**:
|
|
115
|
-
- `RoleID: string` - The ID of the role to display/edit
|
|
116
|
-
|
|
117
|
-
**Features**:
|
|
118
|
-
- Role information display and editing
|
|
119
|
-
- User assignments to the role
|
|
120
|
-
- Batch operations for user-role assignments
|
|
121
|
-
|
|
122
|
-
**Example**:
|
|
123
|
-
```html
|
|
124
|
-
<mj-single-role [RoleID]="selectedRoleId"></mj-single-role>
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### SingleApplicationComponent
|
|
128
|
-
|
|
129
|
-
Manages application configurations and entity associations.
|
|
130
|
-
|
|
131
|
-
**Selector**: `mj-single-application`
|
|
132
|
-
|
|
133
|
-
**Inputs**:
|
|
134
|
-
- `ApplicationID: string` - The ID of the application to manage
|
|
135
|
-
|
|
136
|
-
**Features**:
|
|
137
|
-
- Application details management
|
|
138
|
-
- Entity associations configuration
|
|
139
|
-
- Bulk entity assignment operations
|
|
140
|
-
|
|
141
|
-
**Example**:
|
|
142
|
-
```html
|
|
143
|
-
<mj-single-application [ApplicationID]="selectedApplicationId"></mj-single-application>
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### UserRolesGridComponent
|
|
147
|
-
|
|
148
|
-
A specialized grid for managing user-role relationships.
|
|
149
|
-
|
|
150
|
-
**Selector**: `mj-user-roles-grid`
|
|
151
|
-
|
|
152
|
-
**Inputs**:
|
|
153
|
-
- `UserID: string` - User ID when in 'Users' mode
|
|
154
|
-
- `RoleID: string` - Role ID when in 'Roles' mode
|
|
155
|
-
- `Mode: 'Users' | 'Roles'` - Determines the grid's perspective
|
|
156
|
-
- `UserRecord: UserEntity | null` - User entity when in 'Users' mode
|
|
157
|
-
- `RoleRecord: RoleEntity | null` - Role entity when in 'Roles' mode
|
|
158
|
-
|
|
159
|
-
**Features**:
|
|
160
|
-
- Checkbox-based role/user selection
|
|
161
|
-
- Batch save/cancel operations
|
|
162
|
-
- Flip all functionality
|
|
163
|
-
- Transaction-based updates
|
|
164
|
-
- Visual indication of pending changes
|
|
165
|
-
|
|
166
|
-
**Example**:
|
|
167
|
-
```html
|
|
168
|
-
<!-- For managing roles assigned to a user -->
|
|
169
|
-
<mj-user-roles-grid
|
|
170
|
-
[UserID]="userId"
|
|
171
|
-
[UserRecord]="userEntity"
|
|
172
|
-
Mode="Users">
|
|
173
|
-
</mj-user-roles-grid>
|
|
174
|
-
|
|
175
|
-
<!-- For managing users assigned to a role -->
|
|
176
|
-
<mj-user-roles-grid
|
|
177
|
-
[RoleID]="roleId"
|
|
178
|
-
[RoleRecord]="roleEntity"
|
|
179
|
-
Mode="Roles">
|
|
180
|
-
</mj-user-roles-grid>
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### ApplicationEntitiesGridComponent
|
|
184
|
-
|
|
185
|
-
Manages entity associations with applications.
|
|
186
|
-
|
|
187
|
-
**Selector**: `mj-application-entities-grid`
|
|
188
|
-
|
|
189
|
-
**Inputs**:
|
|
190
|
-
- `ApplicationID: string` - Application ID when in 'Applications' mode
|
|
191
|
-
- `EntityID: string` - Entity ID when in 'Entities' mode
|
|
192
|
-
- `Mode: 'Applications' | 'Entities'` - Determines the grid's perspective
|
|
193
|
-
- `ApplicationRecord: ApplicationEntity | null` - Application entity
|
|
194
|
-
- `EntityRecord: EntityEntity | null` - Entity record
|
|
195
|
-
|
|
196
|
-
**Features**:
|
|
197
|
-
- Entity-application association management
|
|
198
|
-
- Bulk selection/deselection
|
|
199
|
-
- Transaction-based saves
|
|
200
|
-
- Dirty state tracking
|
|
201
|
-
|
|
202
|
-
**Example**:
|
|
203
|
-
```html
|
|
204
|
-
<mj-application-entities-grid
|
|
205
|
-
[ApplicationID]="appId"
|
|
206
|
-
[ApplicationRecord]="appEntity"
|
|
207
|
-
Mode="Applications">
|
|
208
|
-
</mj-application-entities-grid>
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
### SqlLoggingComponent
|
|
212
|
-
|
|
213
|
-
Provides comprehensive SQL logging management for debugging and migration generation.
|
|
214
|
-
|
|
215
|
-
**Selector**: `mj-sql-logging`
|
|
216
|
-
|
|
217
|
-
**Features**:
|
|
218
|
-
- Real-time SQL logging session management
|
|
219
|
-
- Owner-level access control (requires `Type = 'Owner'`)
|
|
220
|
-
- Session configuration with filtering options
|
|
221
|
-
- Live session monitoring with statement counts
|
|
222
|
-
- Multiple concurrent session support
|
|
223
|
-
- Auto-refresh capabilities
|
|
224
|
-
- Integration with MemberJunction's GraphQL API
|
|
225
|
-
|
|
226
|
-
**Key Capabilities**:
|
|
227
|
-
- **Session Creation**: Start new SQL logging sessions with custom options
|
|
228
|
-
- **User Filtering**: Capture SQL statements from specific users only
|
|
229
|
-
- **Format Options**: Standard SQL logs or migration-ready files
|
|
230
|
-
- **Real-time Monitoring**: View active sessions and their progress
|
|
231
|
-
- **Batch Operations**: Stop individual sessions or all sessions at once
|
|
232
|
-
- **Auto-cleanup**: Sessions automatically expire and clean up empty files
|
|
233
|
-
|
|
234
|
-
**Security Requirements**:
|
|
235
|
-
- User must have `Type = 'Owner'` in the Users table
|
|
236
|
-
- SQL logging must be enabled in server configuration
|
|
237
|
-
- Valid authentication required for all operations
|
|
238
|
-
|
|
239
|
-
**Example Usage**:
|
|
240
|
-
```html
|
|
241
|
-
<!-- Include in settings navigation -->
|
|
242
|
-
<mj-sql-logging></mj-sql-logging>
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
**Session Configuration Options**:
|
|
246
|
-
```typescript
|
|
247
|
-
interface SessionOptions {
|
|
248
|
-
fileName?: string; // Custom log file name
|
|
249
|
-
sessionName?: string; // Human-readable session name
|
|
250
|
-
filterToCurrentUser?: boolean; // Filter to current user's SQL only
|
|
251
|
-
formatAsMigration?: boolean; // Format as migration file
|
|
252
|
-
prettyPrint?: boolean; // Format SQL with indentation
|
|
253
|
-
statementTypes?: 'queries' | 'mutations' | 'both'; // SQL types to capture
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
**GraphQL Integration**:
|
|
258
|
-
```typescript
|
|
259
|
-
// The component automatically handles GraphQL operations:
|
|
260
|
-
// - sqlLoggingConfig: Get current configuration
|
|
261
|
-
// - activeSqlLoggingSessions: List active sessions
|
|
262
|
-
// - startSqlLogging: Create new session
|
|
263
|
-
// - stopSqlLogging: Stop specific session
|
|
264
|
-
// - stopAllSqlLogging: Stop all sessions
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
**UI Features**:
|
|
268
|
-
- **Dashboard-style interface** with modern AI dashboard styling
|
|
269
|
-
- **Status indicators** showing configuration state and active sessions
|
|
270
|
-
- **Interactive session cards** with duration, statement counts, and controls
|
|
271
|
-
- **Dialog-based session creation** with comprehensive options
|
|
272
|
-
- **Auto-refresh toggle** for real-time session monitoring
|
|
273
|
-
- **Responsive layout** optimized for desktop use
|
|
274
|
-
|
|
275
|
-
**Access Control**:
|
|
276
|
-
- Non-Owner users see access denied message with permission refresh option
|
|
277
|
-
- Disabled state shown when SQL logging not enabled in server config
|
|
278
|
-
- Clear instructions provided for enabling SQL logging
|
|
279
|
-
|
|
280
|
-
**Error Handling**:
|
|
281
|
-
- Comprehensive error messages for common issues
|
|
282
|
-
- Graceful handling of permission and configuration problems
|
|
283
|
-
- User-friendly notifications for all operations
|
|
284
|
-
- Debug logging for troubleshooting
|
|
285
|
-
|
|
286
|
-
**Integration Notes**:
|
|
287
|
-
- Requires MJServer with SqlLoggingConfigResolver
|
|
288
|
-
- Works with SQLServerDataProvider logging capabilities
|
|
289
|
-
- Follows MemberJunction's security and styling patterns
|
|
290
|
-
- Compatible with modern Angular control flow syntax (`@if`, `@for`)
|
|
291
|
-
|
|
292
|
-
## User Management Features
|
|
293
|
-
|
|
294
|
-
### User Activation/Deactivation
|
|
295
|
-
|
|
296
|
-
The settings module implements a soft-delete pattern for users:
|
|
297
|
-
|
|
298
|
-
```typescript
|
|
299
|
-
// Example implementation in SettingsComponent
|
|
300
|
-
public async toggleUserActivation(record: BaseEntity) {
|
|
301
|
-
try {
|
|
302
|
-
const user = record as UserEntity;
|
|
303
|
-
const currentlyActive = user.IsActive;
|
|
304
|
-
|
|
305
|
-
// Toggle the IsActive flag
|
|
306
|
-
user.IsActive = !currentlyActive;
|
|
307
|
-
|
|
308
|
-
if (await user.Save()) {
|
|
309
|
-
MJNotificationService.Instance.CreateSimpleNotification(
|
|
310
|
-
`User ${user.Name} has been ${currentlyActive ? 'deactivated' : 'activated'} successfully.`,
|
|
311
|
-
'success',
|
|
312
|
-
3000
|
|
313
|
-
);
|
|
314
|
-
}
|
|
315
|
-
} catch (error) {
|
|
316
|
-
console.error('Error toggling user activation:', error);
|
|
317
|
-
MJNotificationService.Instance.CreateSimpleNotification(
|
|
318
|
-
'An error occurred while toggling user activation.',
|
|
319
|
-
'error',
|
|
320
|
-
5000
|
|
321
|
-
);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
### Custom Action Support
|
|
327
|
-
|
|
328
|
-
The user list supports custom actions with configurable icons and tooltips:
|
|
329
|
-
|
|
330
|
-
```typescript
|
|
331
|
-
// Icon function for toggle button
|
|
332
|
-
public getUserToggleIcon(record: BaseEntity): string {
|
|
333
|
-
const user = record as UserEntity;
|
|
334
|
-
return user.IsActive ? 'fa-user-lock' : 'fa-user-check';
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
// Tooltip function for toggle button
|
|
338
|
-
public getUserToggleTooltip(record: BaseEntity): string {
|
|
339
|
-
const user = record as UserEntity;
|
|
340
|
-
return user.IsActive ? 'Deactivate user' : 'Activate user';
|
|
341
|
-
}
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
## Configuration Options
|
|
345
|
-
|
|
346
|
-
### Navigation Options
|
|
347
|
-
|
|
348
|
-
The settings component defines navigation options:
|
|
349
|
-
|
|
350
|
-
```typescript
|
|
351
|
-
public options = [
|
|
352
|
-
{ label: 'Users', value: SettingsItem.Users },
|
|
353
|
-
{ label: 'Roles', value: SettingsItem.Roles },
|
|
354
|
-
{ label: 'Applications', value: SettingsItem.Applications },
|
|
355
|
-
{ label: 'Entity Permissions', value: SettingsItem.EntityPermissions },
|
|
356
|
-
{ label: 'SQL Logging', value: SettingsItem.SqlLogging }
|
|
357
|
-
];
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
### Grid Configuration
|
|
361
|
-
|
|
362
|
-
User roles and application entities grids support various configurations:
|
|
363
|
-
|
|
364
|
-
```typescript
|
|
365
|
-
// Example: Configure grid height
|
|
366
|
-
<mj-user-roles-grid
|
|
367
|
-
[UserID]="userId"
|
|
368
|
-
style="height: 600px;">
|
|
369
|
-
</mj-user-roles-grid>
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
## Dependencies
|
|
373
|
-
|
|
374
|
-
This package depends on several MemberJunction and third-party packages:
|
|
375
|
-
|
|
376
|
-
### MemberJunction Dependencies
|
|
377
|
-
- `@memberjunction/core`: Core functionality and metadata
|
|
378
|
-
- `@memberjunction/core-entities`: Entity definitions
|
|
379
|
-
- `@memberjunction/global`: Global utilities and decorators
|
|
380
|
-
- `@memberjunction/ng-container-directives`: Layout directives
|
|
381
|
-
- `@memberjunction/ng-shared`: Shared Angular components
|
|
382
|
-
- `@memberjunction/ng-notifications`: Notification service
|
|
383
|
-
- `@memberjunction/ng-entity-permissions`: Entity permission components
|
|
384
|
-
- `@memberjunction/ng-base-forms`: Base form components
|
|
385
|
-
- `@memberjunction/ng-entity-form-dialog`: Entity editing dialogs
|
|
386
|
-
- `@memberjunction/ng-user-view-grid`: User view grid component
|
|
387
|
-
- `@memberjunction/ng-simple-record-list`: Record list component
|
|
388
|
-
- `@memberjunction/ng-tabstrip`: Tab navigation component
|
|
389
|
-
- `@memberjunction/graphql-dataprovider`: GraphQL operations for SQL logging
|
|
390
|
-
|
|
391
|
-
### Kendo UI Dependencies
|
|
392
|
-
- `@progress/kendo-angular-dropdowns`: Dropdown components
|
|
393
|
-
- `@progress/kendo-angular-grid`: Grid functionality
|
|
394
|
-
- `@progress/kendo-angular-buttons`: Button components
|
|
395
|
-
- `@progress/kendo-angular-dialog`: Dialog components
|
|
396
|
-
- `@progress/kendo-angular-layout`: Layout utilities
|
|
397
|
-
- `@progress/kendo-angular-indicators`: Loading indicators
|
|
398
|
-
- `@progress/kendo-angular-inputs`: Form input components
|
|
399
|
-
- `@progress/kendo-angular-label`: Label components
|
|
400
|
-
- `@progress/kendo-angular-dialog`: Modal dialogs for session configuration
|
|
401
|
-
|
|
402
|
-
### Angular Dependencies (Peer)
|
|
403
|
-
- `@angular/common`: ^18.0.2
|
|
404
|
-
- `@angular/core`: ^18.0.2
|
|
405
|
-
- `@angular/forms`: ^18.0.2
|
|
406
|
-
- `@angular/router`: ^18.0.2
|
|
407
|
-
|
|
408
|
-
## Integration with MemberJunction
|
|
409
|
-
|
|
410
|
-
### Entity Registration
|
|
411
|
-
|
|
412
|
-
Components register with MemberJunction's class system:
|
|
413
|
-
|
|
414
|
-
```typescript
|
|
415
|
-
@RegisterClass(BaseNavigationComponent, 'Settings')
|
|
416
|
-
export class SettingsComponent extends BaseNavigationComponent {
|
|
417
|
-
// Component implementation
|
|
418
|
-
}
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
### Transaction Support
|
|
422
|
-
|
|
423
|
-
Batch operations use MemberJunction's transaction system:
|
|
424
|
-
|
|
425
|
-
```typescript
|
|
426
|
-
const md = new Metadata();
|
|
427
|
-
const tg = await md.CreateTransactionGroup();
|
|
428
|
-
|
|
429
|
-
for (const record of records) {
|
|
430
|
-
record.TransactionGroup = tg;
|
|
431
|
-
await record.Save();
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
await tg.Submit();
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
### Metadata Integration
|
|
438
|
-
|
|
439
|
-
Components leverage MemberJunction's metadata system:
|
|
440
|
-
|
|
441
|
-
```typescript
|
|
442
|
-
const md = new Metadata();
|
|
443
|
-
const userEntity = await md.GetEntityObject<UserEntity>('Users');
|
|
444
|
-
const applications = md.Applications;
|
|
445
|
-
const roles = md.Roles;
|
|
446
|
-
```
|
|
447
|
-
|
|
448
|
-
## Build and Development
|
|
449
|
-
|
|
450
|
-
### Building the Package
|
|
94
|
+
export class AppModule {}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The `SettingsComponent` is registered via `@RegisterClass(BaseNavigationComponent, 'Settings')` and is typically loaded through Explorer's navigation system.
|
|
98
|
+
|
|
99
|
+
## Exported API
|
|
100
|
+
|
|
101
|
+
| Export | Type | Description |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| `ExplorerSettingsModule` | NgModule | Main settings module |
|
|
104
|
+
| `SettingsComponent` | Component | Main tabbed settings container |
|
|
105
|
+
| `GeneralSettingsComponent` | Component | General preferences |
|
|
106
|
+
| `AccountInfoComponent` | Component | Account information |
|
|
107
|
+
| `AppearanceSettingsComponent` | Component | Theme/display settings |
|
|
108
|
+
| `ApplicationSettingsComponent` | Component | Application preferences |
|
|
109
|
+
| `UserManagementComponent` | Component | User CRUD management |
|
|
110
|
+
| `RoleManagementComponent` | Component | Role CRUD management |
|
|
111
|
+
| `ApplicationManagementComponent` | Component | Application CRUD management |
|
|
112
|
+
| `EntityPermissionsSettingsComponent` | Component | Entity permission management |
|
|
113
|
+
| `NotificationPreferencesComponent` | Component | Notification settings |
|
|
114
|
+
| `SQLLoggingComponent` | Component | SQL logging viewer |
|
|
115
|
+
| `UserProfileSettingsComponent` | Component | Profile editing |
|
|
116
|
+
| `UserAppConfigComponent` | Component | User app configuration |
|
|
117
|
+
| `SettingsCardComponent` | Component | Reusable settings card layout |
|
|
118
|
+
| `UserDialogComponent` | Component | User edit dialog |
|
|
119
|
+
| `RoleDialogComponent` | Component | Role edit dialog |
|
|
120
|
+
| `ApplicationDialogComponent` | Component | Application edit dialog |
|
|
121
|
+
| `PermissionDialogComponent` | Component | Permission edit dialog |
|
|
122
|
+
|
|
123
|
+
## Build
|
|
451
124
|
|
|
452
125
|
```bash
|
|
453
|
-
|
|
454
|
-
npm run build
|
|
455
|
-
|
|
456
|
-
# Or from the repository root
|
|
457
|
-
npm run build -- --filter="@memberjunction/ng-explorer-settings"
|
|
126
|
+
cd packages/Angular/Explorer/explorer-settings && npm run build
|
|
458
127
|
```
|
|
459
128
|
|
|
460
|
-
### TypeScript Configuration
|
|
461
|
-
|
|
462
|
-
The package uses strict TypeScript settings:
|
|
463
|
-
- Target: ES2015
|
|
464
|
-
- Module: ES2020
|
|
465
|
-
- Strict mode enabled
|
|
466
|
-
- Source maps generated
|
|
467
|
-
- Declaration files generated
|
|
468
|
-
|
|
469
|
-
## Best Practices
|
|
470
|
-
|
|
471
|
-
1. **Always use transactions** for batch operations to ensure data consistency
|
|
472
|
-
2. **Leverage entity metadata** instead of hardcoding entity names
|
|
473
|
-
3. **Use the provided navigation methods** for consistent routing behavior
|
|
474
|
-
4. **Handle errors appropriately** with user-friendly notifications
|
|
475
|
-
5. **Follow MemberJunction patterns** for entity instantiation and data loading
|
|
476
|
-
|
|
477
|
-
## Version
|
|
478
|
-
|
|
479
|
-
Current version: 2.43.0
|
|
480
|
-
|
|
481
129
|
## License
|
|
482
130
|
|
|
483
|
-
ISC
|
|
131
|
+
ISC
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-info.component.d.ts","sourceRoot":"","sources":["../../../src/lib/account-info/account-info.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;;AAE3D;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"account-info.component.d.ts","sourceRoot":"","sources":["../../../src/lib/account-info/account-info.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;;AAE3D;;;GAGG;AACH,qBAMa,oBAAqB,YAAW,MAAM;IAKrC,OAAO,CAAC,GAAG;IAJvB,SAAS,UAAQ;IACjB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAQ;IACtC,YAAY,SAAM;gBAEE,GAAG,EAAE,iBAAiB;IAEpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,eAAe;IA0B7B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;yCAxCtC,oBAAoB;2CAApB,oBAAoB;CAiDhC"}
|
|
@@ -67,7 +67,7 @@ function AccountInfoComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
67
67
|
i0.ɵɵelementStart(28, "div", 8);
|
|
68
68
|
i0.ɵɵtext(29);
|
|
69
69
|
i0.ɵɵelementEnd()();
|
|
70
|
-
i0.ɵɵ
|
|
70
|
+
i0.ɵɵconditionalCreate(30, AccountInfoComponent_Conditional_2_Conditional_30_Template, 8, 5, "div", 5);
|
|
71
71
|
i0.ɵɵelementEnd();
|
|
72
72
|
} if (rf & 2) {
|
|
73
73
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -137,8 +137,10 @@ export class AccountInfoComponent {
|
|
|
137
137
|
});
|
|
138
138
|
}
|
|
139
139
|
static ɵfac = function AccountInfoComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AccountInfoComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
140
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AccountInfoComponent, selectors: [["mj-account-info"]], decls: 3, vars: 3, consts: [[1, "loading-container"], [1, "error-message"], [1, "account-info"], ["text", "Loading account info..."], [1, "fa-solid", "fa-exclamation-circle"], [1, "info-row"], [1, "info-label"], [1, "fa-solid", "fa-user"], [1, "info-value"], [1, "fa-solid", "fa-envelope"], [1, "fa-solid", "fa-shield-halved"], [1, "type-badge"], [1, "fa-solid", "fa-calendar-plus"], [1, "fa-solid", "fa-circle-check"], [1, "status-badge"]], template: function AccountInfoComponent_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
-
i0.ɵɵ
|
|
140
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AccountInfoComponent, selectors: [["mj-account-info"]], standalone: false, decls: 3, vars: 3, consts: [[1, "loading-container"], [1, "error-message"], [1, "account-info"], ["text", "Loading account info..."], [1, "fa-solid", "fa-exclamation-circle"], [1, "info-row"], [1, "info-label"], [1, "fa-solid", "fa-user"], [1, "info-value"], [1, "fa-solid", "fa-envelope"], [1, "fa-solid", "fa-shield-halved"], [1, "type-badge"], [1, "fa-solid", "fa-calendar-plus"], [1, "fa-solid", "fa-circle-check"], [1, "status-badge"]], template: function AccountInfoComponent_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
i0.ɵɵconditionalCreate(0, AccountInfoComponent_Conditional_0_Template, 2, 0, "div", 0);
|
|
142
|
+
i0.ɵɵconditionalCreate(1, AccountInfoComponent_Conditional_1_Template, 4, 1, "div", 1);
|
|
143
|
+
i0.ɵɵconditionalCreate(2, AccountInfoComponent_Conditional_2_Template, 31, 7, "div", 2);
|
|
142
144
|
} if (rf & 2) {
|
|
143
145
|
i0.ɵɵconditional(ctx.IsLoading ? 0 : -1);
|
|
144
146
|
i0.ɵɵadvance();
|
|
@@ -149,7 +151,7 @@ export class AccountInfoComponent {
|
|
|
149
151
|
}
|
|
150
152
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AccountInfoComponent, [{
|
|
151
153
|
type: Component,
|
|
152
|
-
args: [{ selector: 'mj-account-info', template: "@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading account info...\"></mj-loading>\n </div>\n}\n\n@if (ErrorMessage && !IsLoading) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n}\n\n@if (CurrentUser && !IsLoading) {\n <div class=\"account-info\">\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Full Name</span>\n </div>\n <div class=\"info-value\">{{ CurrentUser.Name || 'Not set' }}</div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span>Email</span>\n </div>\n <div class=\"info-value\">{{ CurrentUser.Email || 'Not set' }}</div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Account Type</span>\n </div>\n <div class=\"info-value\">\n <span class=\"type-badge\" [class]=\"'type-' + (CurrentUser.Type || 'user').toLowerCase()\">\n {{ CurrentUser.Type || 'User' }}\n </span>\n </div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-calendar-plus\"></i>\n <span>Account Created</span>\n </div>\n <div class=\"info-value\">{{ FormatDate(CurrentUser.__mj_CreatedAt) }}</div>\n </div>\n\n @if (CurrentUser.IsActive !== undefined) {\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Status</span>\n </div>\n <div class=\"info-value\">\n <span class=\"status-badge\" [class.active]=\"CurrentUser.IsActive\" [class.inactive]=\"!CurrentUser.IsActive\">\n {{ CurrentUser.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n }\n </div>\n}\n", styles: [".loading-container {\n display: flex;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-message {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n border-radius: 8px;\n font-size: 0.875rem;\n}\n\n.error-message i {\n font-size: 1rem;\n}\n\n.account-info {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 0;\n border-bottom: 1px solid var(--mj-border-color, #e5e7eb);\n}\n\n.info-row:last-child {\n border-bottom: none;\n}\n\n.info-label {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--mj-text-secondary, #6b7280);\n font-size: 0.875rem;\n}\n\n.info-label i {\n width: 1rem;\n text-align: center;\n color: var(--mj-text-tertiary, #9ca3af);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n text-align: right;\n}\n\n.type-badge {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.type-owner {\n background-color: var(--mj-warning-bg, #fef3c7);\n color: var(--mj-warning-text, #d97706);\n}\n\n.type-admin {\n background-color: var(--mj-info-bg, #dbeafe);\n color: var(--mj-info-text, #2563eb);\n}\n\n.type-user {\n background-color: var(--mj-neutral-bg, #f3f4f6);\n color: var(--mj-neutral-text, #4b5563);\n}\n\n.status-badge {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.status-badge.active {\n background-color: var(--mj-success-bg, #dcfce7);\n color: var(--mj-success-text, #16a34a);\n}\n\n.status-badge.inactive {\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n}\n\n@media (max-width: 480px) {\n .info-row {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.5rem;\n }\n\n .info-value {\n text-align: left;\n padding-left: 1.75rem;\n }\n}\n"] }]
|
|
154
|
+
args: [{ standalone: false, selector: 'mj-account-info', template: "@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading account info...\"></mj-loading>\n </div>\n}\n\n@if (ErrorMessage && !IsLoading) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n}\n\n@if (CurrentUser && !IsLoading) {\n <div class=\"account-info\">\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Full Name</span>\n </div>\n <div class=\"info-value\">{{ CurrentUser.Name || 'Not set' }}</div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span>Email</span>\n </div>\n <div class=\"info-value\">{{ CurrentUser.Email || 'Not set' }}</div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Account Type</span>\n </div>\n <div class=\"info-value\">\n <span class=\"type-badge\" [class]=\"'type-' + (CurrentUser.Type || 'user').toLowerCase()\">\n {{ CurrentUser.Type || 'User' }}\n </span>\n </div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-calendar-plus\"></i>\n <span>Account Created</span>\n </div>\n <div class=\"info-value\">{{ FormatDate(CurrentUser.__mj_CreatedAt) }}</div>\n </div>\n\n @if (CurrentUser.IsActive !== undefined) {\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Status</span>\n </div>\n <div class=\"info-value\">\n <span class=\"status-badge\" [class.active]=\"CurrentUser.IsActive\" [class.inactive]=\"!CurrentUser.IsActive\">\n {{ CurrentUser.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n }\n </div>\n}\n", styles: [".loading-container {\n display: flex;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-message {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n border-radius: 8px;\n font-size: 0.875rem;\n}\n\n.error-message i {\n font-size: 1rem;\n}\n\n.account-info {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 0;\n border-bottom: 1px solid var(--mj-border-color, #e5e7eb);\n}\n\n.info-row:last-child {\n border-bottom: none;\n}\n\n.info-label {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--mj-text-secondary, #6b7280);\n font-size: 0.875rem;\n}\n\n.info-label i {\n width: 1rem;\n text-align: center;\n color: var(--mj-text-tertiary, #9ca3af);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n text-align: right;\n}\n\n.type-badge {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.type-owner {\n background-color: var(--mj-warning-bg, #fef3c7);\n color: var(--mj-warning-text, #d97706);\n}\n\n.type-admin {\n background-color: var(--mj-info-bg, #dbeafe);\n color: var(--mj-info-text, #2563eb);\n}\n\n.type-user {\n background-color: var(--mj-neutral-bg, #f3f4f6);\n color: var(--mj-neutral-text, #4b5563);\n}\n\n.status-badge {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.status-badge.active {\n background-color: var(--mj-success-bg, #dcfce7);\n color: var(--mj-success-text, #16a34a);\n}\n\n.status-badge.inactive {\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n}\n\n@media (max-width: 480px) {\n .info-row {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.5rem;\n }\n\n .info-value {\n text-align: left;\n padding-left: 1.75rem;\n }\n}\n"] }]
|
|
153
155
|
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
154
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AccountInfoComponent, { className: "AccountInfoComponent", filePath: "src/lib/account-info/account-info.component.ts", lineNumber:
|
|
156
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AccountInfoComponent, { className: "AccountInfoComponent", filePath: "src/lib/account-info/account-info.component.ts", lineNumber: 15 }); })();
|
|
155
157
|
//# sourceMappingURL=account-info.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-info.component.js","sourceRoot":"","sources":["../../../src/lib/account-info/account-info.component.ts","../../../src/lib/account-info/account-info.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6B,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;;;;ICA9C,8BAA+B;IAC7B,gCAAwD;IAC1D,iBAAM;;;IAIN,8BAA2B;IACzB,uBAA8C;IAC9C,4BAAM;IAAA,YAAkB;IAC1B,AAD0B,iBAAO,EAC3B;;;IADE,eAAkB;IAAlB,yCAAkB;;;IA4CpB,AADF,8BAAsB,aACI;IACtB,wBAAwC;IACxC,4BAAM;IAAA,sBAAM;IACd,AADc,iBAAO,EACf;IAEJ,AADF,8BAAwB,eACoF;IACxG,YACF;IAEJ,AADE,AADE,iBAAO,EACH,EACF;;;IAJyB,eAAqC;IAAC,AAAtC,qDAAqC,0CAAyC;IACvG,cACF;IADE,oFACF;;;IA5CJ,AADF,AADF,8BAA0B,aACF,aACI;IACtB,uBAAgC;IAChC,4BAAM;IAAA,yBAAS;IACjB,AADiB,iBAAO,EAClB;IACN,8BAAwB;IAAA,YAAmC;IAC7D,AAD6D,iBAAM,EAC7D;IAGJ,AADF,8BAAsB,aACI;IACtB,wBAAoC;IACpC,6BAAM;IAAA,sBAAK;IACb,AADa,iBAAO,EACd;IACN,+BAAwB;IAAA,aAAoC;IAC9D,AAD8D,iBAAM,EAC9D;IAGJ,AADF,+BAAsB,cACI;IACtB,yBAAyC;IACzC,6BAAM;IAAA,6BAAY;IACpB,AADoB,iBAAO,EACrB;IAEJ,AADF,+BAAwB,gBACkE;IACtF,aACF;IAEJ,AADE,AADE,iBAAO,EACH,EACF;IAGJ,AADF,+BAAsB,cACI;IACtB,yBAAyC;IACzC,6BAAM;IAAA,gCAAe;IACvB,AADuB,iBAAO,EACxB;IACN,+BAAwB;IAAA,aAA4C;IACtE,AADsE,iBAAM,EACtE;IAEN,
|
|
1
|
+
{"version":3,"file":"account-info.component.js","sourceRoot":"","sources":["../../../src/lib/account-info/account-info.component.ts","../../../src/lib/account-info/account-info.component.html"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appearance-settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/appearance-settings/appearance-settings.component.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"appearance-settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/appearance-settings/appearance-settings.component.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,qBAMa,2BAA2B;IAEtC,eAAe;;;;QAgBb;yCAlBS,2BAA2B;2CAA3B,2BAA2B;CAmBvC"}
|