@memberjunction/ng-entity-viewer 0.0.1 → 2.121.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 (42) hide show
  1. package/README.md +224 -43
  2. package/dist/lib/entity-cards/entity-cards.component.d.ts +163 -0
  3. package/dist/lib/entity-cards/entity-cards.component.d.ts.map +1 -0
  4. package/dist/lib/entity-cards/entity-cards.component.js +797 -0
  5. package/dist/lib/entity-cards/entity-cards.component.js.map +1 -0
  6. package/dist/lib/entity-grid/entity-grid.component.d.ts +216 -0
  7. package/dist/lib/entity-grid/entity-grid.component.d.ts.map +1 -0
  8. package/dist/lib/entity-grid/entity-grid.component.js +676 -0
  9. package/dist/lib/entity-grid/entity-grid.component.js.map +1 -0
  10. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +182 -0
  11. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -0
  12. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +787 -0
  13. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -0
  14. package/dist/lib/entity-viewer/entity-viewer.component.d.ts +252 -0
  15. package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -0
  16. package/dist/lib/entity-viewer/entity-viewer.component.js +883 -0
  17. package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -0
  18. package/dist/lib/pagination/pagination.component.d.ts +60 -0
  19. package/dist/lib/pagination/pagination.component.d.ts.map +1 -0
  20. package/dist/lib/pagination/pagination.component.js +199 -0
  21. package/dist/lib/pagination/pagination.component.js.map +1 -0
  22. package/dist/lib/pill/pill.component.d.ts +58 -0
  23. package/dist/lib/pill/pill.component.d.ts.map +1 -0
  24. package/dist/lib/pill/pill.component.js +125 -0
  25. package/dist/lib/pill/pill.component.js.map +1 -0
  26. package/dist/lib/types.d.ts +316 -0
  27. package/dist/lib/types.d.ts.map +1 -0
  28. package/dist/lib/types.js +30 -0
  29. package/dist/lib/types.js.map +1 -0
  30. package/dist/lib/utils/highlight.util.d.ts +69 -0
  31. package/dist/lib/utils/highlight.util.d.ts.map +1 -0
  32. package/dist/lib/utils/highlight.util.js +214 -0
  33. package/dist/lib/utils/highlight.util.js.map +1 -0
  34. package/dist/module.d.ts +38 -0
  35. package/dist/module.d.ts.map +1 -0
  36. package/dist/module.js +83 -0
  37. package/dist/module.js.map +1 -0
  38. package/dist/public-api.d.ts +16 -0
  39. package/dist/public-api.d.ts.map +1 -0
  40. package/dist/public-api.js +20 -0
  41. package/dist/public-api.js.map +1 -0
  42. package/package.json +45 -6
package/README.md CHANGED
@@ -1,45 +1,226 @@
1
1
  # @memberjunction/ng-entity-viewer
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
4
-
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
6
-
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
8
-
9
- ## Purpose
10
-
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@memberjunction/ng-entity-viewer`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
-
16
- ## What is OIDC Trusted Publishing?
17
-
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
19
-
20
- ## Setup Instructions
21
-
22
- To properly configure OIDC trusted publishing for this package:
23
-
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
42
-
43
- ---
44
-
45
- **Maintained for OIDC setup purposes only**
3
+ Angular components for viewing MemberJunction entity data in multiple formats - grid and card views with filtering, selection, and shared data management.
4
+
5
+ ## Features
6
+
7
+ - **Multiple View Modes**: Switch between grid (AG Grid) and card views
8
+ - **Auto-Generated Layout**: Automatically structures columns/cards based on entity metadata
9
+ - **Client-Side Filtering**: SQL-style wildcard support (`%`) for consistent behavior
10
+ - **Selection Handling**: Configurable selection behavior with events
11
+ - **Shared Data Layer**: Load data once, display in multiple ways
12
+ - **Semantic Pills**: Auto-colored pills for status/type/category fields
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @memberjunction/ng-entity-viewer ag-grid-angular ag-grid-community
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ### Import the Module
23
+
24
+ ```typescript
25
+ import { EntityViewerModule } from '@memberjunction/ng-entity-viewer';
26
+
27
+ @NgModule({
28
+ imports: [EntityViewerModule]
29
+ })
30
+ export class MyModule { }
31
+ ```
32
+
33
+ ### EntityViewerComponent (Composite)
34
+
35
+ The main component that combines grid/cards with built-in filtering and view switching.
36
+
37
+ ```html
38
+ <!-- Basic usage - auto-loads data -->
39
+ <mj-entity-viewer
40
+ [entity]="selectedEntity"
41
+ (recordSelected)="onRecordSelected($event)"
42
+ (recordOpened)="onRecordOpened($event)">
43
+ </mj-entity-viewer>
44
+
45
+ <!-- With pre-loaded data and configuration -->
46
+ <mj-entity-viewer
47
+ [entity]="selectedEntity"
48
+ [records]="myRecords"
49
+ [config]="{
50
+ showFilter: true,
51
+ showViewModeToggle: true,
52
+ defaultViewMode: 'cards',
53
+ pageSize: 500
54
+ }">
55
+ </mj-entity-viewer>
56
+ ```
57
+
58
+ #### Configuration Options
59
+
60
+ | Option | Type | Default | Description |
61
+ |--------|------|---------|-------------|
62
+ | `showFilter` | boolean | true | Show the filter input |
63
+ | `showViewModeToggle` | boolean | true | Show grid/cards toggle |
64
+ | `showRecordCount` | boolean | true | Show record count |
65
+ | `defaultViewMode` | 'grid' \| 'cards' | 'grid' | Initial view mode |
66
+ | `pageSize` | number | 1000 | Max records to load |
67
+ | `filterPlaceholder` | string | 'Filter records...' | Filter input placeholder |
68
+ | `filterDebounceMs` | number | 250 | Filter debounce time |
69
+ | `selectionBehavior` | string | 'emit-only' | Selection behavior |
70
+
71
+ ### EntityGridComponent
72
+
73
+ Standalone AG Grid-based table view.
74
+
75
+ ```html
76
+ <mj-entity-grid
77
+ [entity]="selectedEntity"
78
+ [records]="filteredRecords"
79
+ [selectedRecordId]="selectedId"
80
+ [columns]="customColumns"
81
+ (recordSelected)="onRecordSelected($event)"
82
+ (recordOpened)="onRecordOpened($event)">
83
+ </mj-entity-grid>
84
+ ```
85
+
86
+ #### Inputs
87
+
88
+ | Input | Type | Description |
89
+ |-------|------|-------------|
90
+ | `entity` | EntityInfo | Entity metadata |
91
+ | `records` | BaseEntity[] | Records to display |
92
+ | `selectedRecordId` | string | Selected record's PK |
93
+ | `columns` | GridColumnDef[] | Custom column definitions |
94
+ | `height` | string | Grid height (CSS) |
95
+ | `enableSelection` | boolean | Enable row selection |
96
+
97
+ #### Outputs
98
+
99
+ | Output | Type | Description |
100
+ |--------|------|-------------|
101
+ | `recordSelected` | RecordSelectedEvent | Single click on row |
102
+ | `recordOpened` | RecordOpenedEvent | Double click on row |
103
+
104
+ ### EntityCardsComponent
105
+
106
+ Standalone card-based view with auto-generated layout.
107
+
108
+ ```html
109
+ <mj-entity-cards
110
+ [entity]="selectedEntity"
111
+ [records]="records"
112
+ [filterText]="searchFilter"
113
+ [selectedRecordId]="selectedId"
114
+ (recordSelected)="onRecordSelected($event)"
115
+ (recordOpened)="onRecordOpened($event)"
116
+ (filteredCountChanged)="onFilteredCountChanged($event)">
117
+ </mj-entity-cards>
118
+ ```
119
+
120
+ #### Inputs
121
+
122
+ | Input | Type | Description |
123
+ |-------|------|-------------|
124
+ | `entity` | EntityInfo | Entity metadata |
125
+ | `records` | BaseEntity[] | Records to display |
126
+ | `selectedRecordId` | string | Selected record's PK |
127
+ | `filterText` | string | Filter text (supports `%` wildcards) |
128
+ | `cardTemplate` | CardTemplate | Custom card template |
129
+
130
+ #### Outputs
131
+
132
+ | Output | Type | Description |
133
+ |--------|------|-------------|
134
+ | `recordSelected` | RecordSelectedEvent | Click on card |
135
+ | `recordOpened` | RecordOpenedEvent | Open button click |
136
+ | `filteredCountChanged` | number | Filtered count changed |
137
+
138
+ ### PillComponent
139
+
140
+ Semantic color pill for categorical values.
141
+
142
+ ```html
143
+ <!-- Auto-color based on value -->
144
+ <mj-pill [value]="record.Status"></mj-pill>
145
+
146
+ <!-- Force specific color -->
147
+ <mj-pill [value]="record.Type" color="info"></mj-pill>
148
+ ```
149
+
150
+ Colors are auto-detected based on semantic meaning:
151
+ - **success** (green): active, approved, complete, etc.
152
+ - **warning** (yellow): pending, in progress, draft, etc.
153
+ - **danger** (red): failed, error, rejected, etc.
154
+ - **info** (blue): new, info, created, etc.
155
+ - **neutral** (gray): default
156
+
157
+ ## Events
158
+
159
+ ### RecordSelectedEvent
160
+
161
+ ```typescript
162
+ interface RecordSelectedEvent {
163
+ record: BaseEntity; // The selected record
164
+ entity: EntityInfo; // Entity metadata
165
+ compositeKey: CompositeKey; // Record's composite key
166
+ }
167
+ ```
168
+
169
+ ### RecordOpenedEvent
170
+
171
+ ```typescript
172
+ interface RecordOpenedEvent {
173
+ record: BaseEntity;
174
+ entity: EntityInfo;
175
+ compositeKey: CompositeKey;
176
+ }
177
+ ```
178
+
179
+ ## Filtering
180
+
181
+ The filter supports SQL-style `%` wildcards for consistency with server-side behavior:
182
+
183
+ - `test` - matches "this is a test string"
184
+ - `hub%updat%comp` - matches "hubspot update company"
185
+ - `%comp` - matches "my company"
186
+
187
+ ## Custom Templates
188
+
189
+ ### Grid Columns
190
+
191
+ ```typescript
192
+ const columns: GridColumnDef[] = [
193
+ { field: 'Name', headerName: 'Name', width: 200 },
194
+ { field: 'Status', headerName: 'Status', width: 120 },
195
+ { field: 'Amount', headerName: 'Amount', width: 100 }
196
+ ];
197
+ ```
198
+
199
+ ### Card Template
200
+
201
+ ```typescript
202
+ const template: CardTemplate = {
203
+ titleField: 'Name',
204
+ subtitleField: 'Status',
205
+ descriptionField: 'Notes',
206
+ displayFields: [
207
+ { name: 'Amount', type: 'number', label: 'Amount' },
208
+ { name: 'IsActive', type: 'boolean', label: 'Active' }
209
+ ],
210
+ thumbnailField: 'ImageUrl',
211
+ badgeField: 'Priority'
212
+ };
213
+ ```
214
+
215
+ ## Dependencies
216
+
217
+ - `@angular/core` ^18.0.0
218
+ - `@angular/common` ^18.0.0
219
+ - `@angular/forms` ^18.0.0
220
+ - `ag-grid-angular` ^34.0.0
221
+ - `ag-grid-community` ^34.0.0
222
+ - `@memberjunction/core` ^2.0.0
223
+
224
+ ## License
225
+
226
+ ISC
@@ -0,0 +1,163 @@
1
+ import { EventEmitter, OnChanges, OnInit, SimpleChanges, ElementRef, AfterViewChecked, ChangeDetectorRef } from '@angular/core';
2
+ import { EntityInfo, EntityFieldInfo } from '@memberjunction/core';
3
+ import { BaseEntity } from '@memberjunction/core';
4
+ import { CardTemplate, RecordSelectedEvent, RecordOpenedEvent } from '../types';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * EntityCardsComponent - Card-based view for entity records
8
+ *
9
+ * This component provides an auto-generated card layout for displaying
10
+ * entity records. Cards are automatically structured based on entity metadata.
11
+ *
12
+ * Supports two modes:
13
+ * 1. Parent-managed data: Records are passed in via [records] input
14
+ * 2. Standalone: Component loads its own data with pagination
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <mj-entity-cards
19
+ * [entity]="selectedEntity"
20
+ * [records]="filteredRecords"
21
+ * [selectedRecordId]="selectedId"
22
+ * (recordSelected)="onRecordSelected($event)"
23
+ * (recordOpened)="onRecordOpened($event)">
24
+ * </mj-entity-cards>
25
+ * ```
26
+ */
27
+ export declare class EntityCardsComponent implements OnChanges, OnInit, AfterViewChecked {
28
+ private elementRef;
29
+ private cdr;
30
+ constructor(elementRef: ElementRef, cdr: ChangeDetectorRef);
31
+ /**
32
+ * The entity metadata for the records being displayed
33
+ */
34
+ entity: EntityInfo | null;
35
+ /**
36
+ * The records to display as cards (optional - component can load its own)
37
+ */
38
+ records: BaseEntity[] | null;
39
+ /**
40
+ * The currently selected record's primary key string
41
+ */
42
+ selectedRecordId: string | null;
43
+ /**
44
+ * Custom card template (optional - auto-generated if not provided)
45
+ */
46
+ cardTemplate: CardTemplate | null;
47
+ /**
48
+ * Map of record IDs to hidden field names that matched the filter
49
+ * Used to display an indicator when a match occurred in a non-visible field
50
+ */
51
+ hiddenFieldMatches: Map<string, string>;
52
+ /**
53
+ * Current filter text for highlighting matches
54
+ * Supports SQL-style % wildcards
55
+ */
56
+ filterText: string;
57
+ /**
58
+ * Page size for standalone data loading
59
+ * @default 100
60
+ */
61
+ pageSize: number;
62
+ /**
63
+ * Emitted when a record is selected (single click)
64
+ */
65
+ recordSelected: EventEmitter<RecordSelectedEvent>;
66
+ /**
67
+ * Emitted when a record should be opened (double click or open button)
68
+ */
69
+ recordOpened: EventEmitter<RecordOpenedEvent>;
70
+ /** Auto-generated card template */
71
+ autoCardTemplate: CardTemplate | null;
72
+ /** Internal records when loading standalone */
73
+ private internalRecords;
74
+ /** Track if we're in standalone mode */
75
+ private standaloneMode;
76
+ /** Loading state for standalone mode */
77
+ isLoading: boolean;
78
+ /** Flag to trigger scroll to selected card after view renders */
79
+ private pendingScrollToSelected;
80
+ ngOnInit(): void;
81
+ ngOnChanges(changes: SimpleChanges): void;
82
+ ngAfterViewChecked(): void;
83
+ /**
84
+ * Scroll the selected card into view
85
+ */
86
+ private scrollToSelectedCard;
87
+ /**
88
+ * Get effective records (external or internal)
89
+ */
90
+ get effectiveRecords(): BaseEntity[];
91
+ /**
92
+ * Load data in standalone mode
93
+ */
94
+ private loadData;
95
+ /**
96
+ * Get the effective card template (custom or auto-generated)
97
+ */
98
+ get effectiveTemplate(): CardTemplate | null;
99
+ /**
100
+ * Generate card template from entity metadata
101
+ */
102
+ private generateCardTemplate;
103
+ private findTitleField;
104
+ private findSubtitleField;
105
+ private findDescriptionField;
106
+ private findDisplayFields;
107
+ /**
108
+ * Find all potential thumbnail fields in priority order
109
+ * Returns an array so we can fall back per-record if one is empty
110
+ */
111
+ private findThumbnailFields;
112
+ private findBadgeField;
113
+ private getFieldType;
114
+ getFieldValue(record: BaseEntity, fieldName: string | null): string;
115
+ getNumericValue(record: BaseEntity, fieldName: string): string;
116
+ getBooleanValue(record: BaseEntity, fieldName: string): boolean;
117
+ getTextValue(record: BaseEntity, fieldName: string, maxLength?: number): string;
118
+ getDateValue(record: BaseEntity, fieldName: string): string;
119
+ /**
120
+ * Get display label for a field using EntityFieldInfo's built-in DisplayNameOrName property
121
+ */
122
+ getFieldLabel(field: EntityFieldInfo): string;
123
+ getRecordTrackId(record: BaseEntity, index: number): string;
124
+ isSelected(record: BaseEntity): boolean;
125
+ onCardClick(record: BaseEntity): void;
126
+ onOpenClick(event: Event, record: BaseEntity): void;
127
+ getInitials(record: BaseEntity): string;
128
+ /**
129
+ * Get the thumbnail type for a record, with per-record fallback through thumbnailFields
130
+ */
131
+ getThumbnailType(record: BaseEntity): 'image' | 'icon' | 'none';
132
+ /**
133
+ * Get the thumbnail URL/value for a record, with per-record fallback
134
+ */
135
+ getThumbnailUrl(record: BaseEntity): string;
136
+ /**
137
+ * Find the first thumbnail field that has a value for this record
138
+ * Returns both the field name and value for type determination
139
+ */
140
+ private getEffectiveThumbnailField;
141
+ private isImageValue;
142
+ private isIconClass;
143
+ getRecordColor(record: BaseEntity): string;
144
+ isEnumField(fieldName: string): boolean;
145
+ get subtitleIsPill(): boolean;
146
+ getPillColorType(value: string): string;
147
+ /**
148
+ * Check if a record matched on a hidden field
149
+ */
150
+ hasHiddenFieldMatch(record: BaseEntity): boolean;
151
+ /**
152
+ * Get the display name of the hidden field that matched
153
+ */
154
+ getHiddenMatchFieldName(record: BaseEntity): string;
155
+ /**
156
+ * Highlight matching text in a string based on the filter text
157
+ * Uses HighlightUtil which only highlights if the text actually matches the pattern
158
+ */
159
+ highlightMatch(text: string): string;
160
+ static ɵfac: i0.ɵɵFactoryDeclaration<EntityCardsComponent, never>;
161
+ static ɵcmp: i0.ɵɵComponentDeclaration<EntityCardsComponent, "mj-entity-cards", never, { "entity": { "alias": "entity"; "required": false; }; "records": { "alias": "records"; "required": false; }; "selectedRecordId": { "alias": "selectedRecordId"; "required": false; }; "cardTemplate": { "alias": "cardTemplate"; "required": false; }; "hiddenFieldMatches": { "alias": "hiddenFieldMatches"; "required": false; }; "filterText": { "alias": "filterText"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; }, { "recordSelected": "recordSelected"; "recordOpened": "recordOpened"; }, never, never, false, never>;
162
+ }
163
+ //# sourceMappingURL=entity-cards.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-cards.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-cards/entity-cards.component.ts"],"names":[],"mappings":"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"}