@memberjunction/ng-find-record 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 CHANGED
@@ -1,22 +1,6 @@
1
1
  # @memberjunction/ng-find-record
2
2
 
3
- An Angular component library for searching and selecting records from any MemberJunction entity. This package provides both a standalone search component and a dialog wrapper component for easy integration into Angular applications.
4
-
5
- ## Purpose and Overview
6
-
7
- The `@memberjunction/ng-find-record` package simplifies the process of implementing entity record search functionality in MemberJunction-based Angular applications. It provides a reusable component that can search any entity using the MemberJunction metadata system and RunView API, displaying results in a Kendo UI grid for easy selection.
8
-
9
- ## Features
10
-
11
- - **Entity-Agnostic**: Works with any MemberJunction entity without modification
12
- - **Debounced Search**: Real-time search with configurable debounce time (default: 300ms)
13
- - **Grid Display**: Results displayed in a searchable, sortable Kendo UI grid
14
- - **Customizable Fields**: Configure which fields to display in the results grid
15
- - **Dialog Integration**: Optional dialog wrapper for modal usage scenarios
16
- - **Event Handling**: Events for record selection and dialog closure
17
- - **Loading States**: Visual feedback during search operations
18
- - **TypeScript Support**: Full TypeScript support with proper typing
19
- - **MemberJunction Integration**: Seamlessly integrates with MemberJunction's metadata and entity systems
3
+ An Angular component library for searching and selecting records from any MemberJunction entity. Provides both a standalone search component and a dialog wrapper for modal usage.
20
4
 
21
5
  ## Installation
22
6
 
@@ -24,27 +8,45 @@ The `@memberjunction/ng-find-record` package simplifies the process of implement
24
8
  npm install @memberjunction/ng-find-record
25
9
  ```
26
10
 
11
+ ## Overview
12
+
13
+ The Find Record package provides a reusable search interface that works with any entity registered in the MemberJunction metadata system. It uses debounced search input with the RunView API and displays results in a Kendo UI grid for easy selection.
14
+
15
+ ```mermaid
16
+ flowchart LR
17
+ subgraph Input["User Input"]
18
+ A["Search Text"] --> B["Debounce (300ms)"]
19
+ end
20
+ subgraph API["MJ Data Layer"]
21
+ B --> C["RunView + UserSearchString"]
22
+ C --> D["BaseEntity Results"]
23
+ end
24
+ subgraph Display["UI Components"]
25
+ D --> E["Kendo Grid"]
26
+ E --> F["OnRecordSelected"]
27
+ end
28
+
29
+ style Input fill:#2d6a9f,stroke:#1a4971,color:#fff
30
+ style API fill:#7c5295,stroke:#563a6b,color:#fff
31
+ style Display fill:#2d8659,stroke:#1a5c3a,color:#fff
32
+ ```
33
+
27
34
  ## Usage
28
35
 
29
- ### Import the Module
36
+ ### Module Import
30
37
 
31
38
  ```typescript
32
39
  import { FindRecordModule } from '@memberjunction/ng-find-record';
33
40
 
34
41
  @NgModule({
35
- imports: [
36
- FindRecordModule,
37
- // other imports
38
- ],
39
- // ...
42
+ imports: [FindRecordModule]
40
43
  })
41
- export class YourModule { }
44
+ export class YourModule {}
42
45
  ```
43
46
 
44
- ### Basic Component Usage
47
+ ### Standalone Search Component
45
48
 
46
49
  ```html
47
- <!-- Standalone search component -->
48
50
  <mj-find-record
49
51
  [EntityName]="'Users'"
50
52
  [SearchDebounceTime]="500"
@@ -52,16 +54,10 @@ export class YourModule { }
52
54
  </mj-find-record>
53
55
  ```
54
56
 
55
- ### Dialog Component Usage
57
+ ### Dialog Wrapper
56
58
 
57
59
  ```html
58
- <!-- Search component in a dialog -->
59
- <button kendoButton (click)="showFindDialog = true">
60
- Find User
61
- </button>
62
-
63
60
  <mj-find-record-dialog
64
- *ngIf="showFindDialog"
65
61
  [EntityName]="'Users'"
66
62
  [DialogTitle]="'Find User'"
67
63
  [DialogVisible]="showFindDialog"
@@ -70,277 +66,60 @@ export class YourModule { }
70
66
  </mj-find-record-dialog>
71
67
  ```
72
68
 
73
- ### TypeScript Component Example
69
+ ## Components
74
70
 
75
- ```typescript
76
- import { Component, OnInit } from '@angular/core';
77
- import { BaseEntity, EntityFieldInfo, Metadata } from '@memberjunction/core';
78
-
79
- @Component({
80
- selector: 'app-user-finder',
81
- template: `
82
- <h3>Find User</h3>
83
- <button kendoButton (click)="showDialog()">Open User Finder</button>
84
-
85
- <div *ngIf="selectedUser">
86
- <h4>Selected User:</h4>
87
- <p>{{ selectedUser.Get('UserName') }}</p>
88
- <p>{{ selectedUser.Get('Email') }}</p>
89
- </div>
90
-
91
- <mj-find-record-dialog
92
- *ngIf="dialogVisible"
93
- [EntityName]="'Users'"
94
- [DisplayFields]="displayFields"
95
- [DialogTitle]="'Find User'"
96
- [DialogVisible]="dialogVisible"
97
- [DialogWidth]="'800px'"
98
- [DialogHeight]="'500px'"
99
- (DialogClosed)="onDialogClosed($event)"
100
- (OnRecordSelected)="onUserSelected($event)">
101
- </mj-find-record-dialog>
102
- `
103
- })
104
- export class UserFinderComponent implements OnInit {
105
- dialogVisible = false;
106
- selectedUser: BaseEntity | null = null;
107
- displayFields: EntityFieldInfo[] = [];
108
-
109
- constructor(private metadata: Metadata) {}
110
-
111
- ngOnInit() {
112
- // Get specific fields to display in the grid
113
- const userEntity = this.metadata.EntityByName('Users');
114
- if (userEntity) {
115
- this.displayFields = [
116
- userEntity.Fields.find(f => f.Name === 'UserName')!,
117
- userEntity.Fields.find(f => f.Name === 'Email')!,
118
- userEntity.Fields.find(f => f.Name === 'FirstName')!,
119
- userEntity.Fields.find(f => f.Name === 'LastName')!
120
- ];
121
- }
122
- }
123
-
124
- showDialog() {
125
- this.dialogVisible = true;
126
- }
127
-
128
- onUserSelected(user: BaseEntity) {
129
- this.selectedUser = user;
130
- console.log('Selected user:', user);
131
- }
132
-
133
- onDialogClosed(confirmed: boolean) {
134
- this.dialogVisible = false;
135
-
136
- if (confirmed && this.selectedUser) {
137
- console.log('User selection confirmed:', this.selectedUser);
138
- // Do something with the selected user
139
- } else {
140
- console.log('User selection cancelled');
141
- }
142
- }
143
- }
144
- ```
145
-
146
- ## API Reference
71
+ | Component | Selector | Purpose |
72
+ |-----------|----------|---------|
73
+ | `FindRecordComponent` | `mj-find-record` | Standalone search with results grid |
74
+ | `FindRecordDialogComponent` | `mj-find-record-dialog` | Modal dialog wrapper around the search component |
147
75
 
148
76
  ### FindRecordComponent
149
77
 
150
- Standalone component for searching and selecting records. This component provides a search input with a grid display of results.
151
-
152
- #### Selector
153
- `mj-find-record`
154
-
155
78
  #### Inputs
156
79
 
157
80
  | Property | Type | Default | Description |
158
81
  |----------|------|---------|-------------|
159
- | `EntityName` | `string` | `''` | **Required.** The name of the MemberJunction entity to search |
160
- | `DisplayFields` | `EntityFieldInfo[]` | `[]` | Optional. Fields to display in the results grid. If not specified, defaults to fields marked as `DefaultInView`, `IsPrimaryKey`, `IsNameField`, or `IncludeInUserSearchAPI` |
161
- | `SearchDebounceTime` | `number` | `300` | Optional. Debounce time in milliseconds for search input |
82
+ | `EntityName` | `string` | `''` | Name of the MemberJunction entity to search |
83
+ | `DisplayFields` | `EntityFieldInfo[]` | `[]` | Fields to display in the results grid. Defaults to fields marked as `DefaultInView`, `IsPrimaryKey`, `IsNameField`, or `IncludeInUserSearchAPI` |
84
+ | `SearchDebounceTime` | `number` | `300` | Debounce time in milliseconds for search input |
162
85
 
163
86
  #### Outputs
164
87
 
165
88
  | Event | Type | Description |
166
89
  |-------|------|-------------|
167
- | `OnRecordSelected` | `EventEmitter<BaseEntity>` | Emitted when a user selects a record from the search results grid |
90
+ | `OnRecordSelected` | `EventEmitter<BaseEntity>` | Emitted when a user selects a record from the grid |
168
91
 
169
92
  ### FindRecordDialogComponent
170
93
 
171
- Dialog wrapper for the FindRecordComponent. Provides a modal dialog containing the search functionality.
172
-
173
- #### Selector
174
- `mj-find-record-dialog`
175
-
176
- #### Inputs
94
+ Inherits all inputs from `FindRecordComponent`, plus:
177
95
 
178
96
  | Property | Type | Default | Description |
179
97
  |----------|------|---------|-------------|
180
- | `EntityName` | `string` | `''` | **Required.** The name of the MemberJunction entity to search |
181
- | `DisplayFields` | `EntityFieldInfo[]` | `[]` | Optional. Fields to display in the results grid |
182
- | `DialogTitle` | `string` | `'Find Record'` | Optional. Title displayed in the dialog header |
183
- | `DialogWidth` | `string` | `'700px'` | Optional. Width of the dialog |
184
- | `DialogHeight` | `string` | `'450px'` | Optional. Height of the dialog |
185
- | `DialogVisible` | `boolean` | `false` | **Required.** Controls the visibility of the dialog |
186
- | `SelectedRecord` | `BaseEntity \| null` | `null` | Optional. Currently selected record. Can be set to pre-select a record |
187
-
188
- #### Outputs
98
+ | `DialogTitle` | `string` | `'Find Record'` | Title displayed in the dialog header |
99
+ | `DialogWidth` | `string` | `'700px'` | Width of the dialog |
100
+ | `DialogHeight` | `string` | `'450px'` | Height of the dialog |
101
+ | `DialogVisible` | `boolean` | `false` | Controls dialog visibility |
102
+ | `SelectedRecord` | `BaseEntity \| null` | `null` | Pre-selected record |
189
103
 
190
104
  | Event | Type | Description |
191
105
  |-------|------|-------------|
192
- | `DialogClosed` | `EventEmitter<boolean>` | Emitted when the dialog is closed. `true` if OK was clicked, `false` if cancelled |
193
- | `OnRecordSelected` | `EventEmitter<BaseEntity>` | Emitted when a user selects a record from the search results |
106
+ | `DialogClosed` | `EventEmitter<boolean>` | `true` if OK was clicked, `false` if cancelled |
194
107
 
195
108
  ## Search Behavior
196
109
 
197
- The component uses the MemberJunction RunView functionality with the following behavior:
198
-
199
- 1. As the user types in the search input, the input is debounced (default 300ms) to prevent excessive API calls
200
- 2. After the debounce period, a search is executed using `RunView` with the `UserSearchString` parameter
201
- 3. The search leverages MemberJunction's entity metadata to search across appropriate fields
202
- 4. Results are displayed in a Kendo UI grid with the specified or default fields
203
- 5. Users can select a record by clicking on a row in the grid
204
- 6. The selected record (as a `BaseEntity` instance) is emitted via the `OnRecordSelected` event
205
-
206
- ### Search Implementation Details
207
-
208
- The component uses the following RunView configuration:
209
- ```typescript
210
- {
211
- EntityName: this.EntityName,
212
- UserSearchString: searchTerm,
213
- ResultType: 'entity_object' // Returns BaseEntity instances
214
- }
215
- ```
216
-
217
- ## Styling
218
-
219
- The component includes basic CSS styling with the following classes:
220
- - `.find-textbox` - Styles the search input field
221
- - `.find-button` - Styles the Find button
222
-
223
- You can override these styles in your application's global styles or component-specific stylesheets.
110
+ 1. User types in the search input; input is debounced (default 300ms)
111
+ 2. A search executes via `RunView` with `UserSearchString` and `ResultType: 'entity_object'`
112
+ 3. Results display in a Kendo UI grid with the configured display fields
113
+ 4. Clicking a row emits the selected `BaseEntity` instance via `OnRecordSelected`
224
114
 
225
115
  ## Dependencies
226
116
 
227
- ### Production Dependencies
228
- - `@memberjunction/core`: ^2.43.0 - Core MemberJunction functionality including metadata, RunView, and BaseEntity
229
- - `@memberjunction/core-entities`: ^2.43.0 - Entity type definitions
230
- - `@memberjunction/global`: ^2.43.0 - Global utilities and helpers
231
- - `@memberjunction/ng-container-directives`: ^2.43.0 - Angular container directives
232
- - `@memberjunction/ng-shared`: ^2.43.0 - Shared Angular utilities
233
- - `rxjs`: ^7.8.1 - Reactive programming support for debouncing and search handling
234
- - `tslib`: ^2.3.0 - TypeScript runtime library
235
-
236
- ### Peer Dependencies (must be installed in your application)
237
- - `@angular/common`: 18.0.2
238
- - `@angular/core`: 18.0.2
239
- - `@angular/forms`: 18.0.2
240
- - `@angular/router`: 18.0.2
241
- - `@progress/kendo-angular-grid`: 16.2.0
242
- - `@progress/kendo-angular-buttons`: 16.2.0
243
- - `@progress/kendo-angular-inputs`: 16.2.0
244
- - `@progress/kendo-angular-dialog`: 16.2.0
245
- - `@progress/kendo-angular-listbox`: 16.2.0
246
-
247
- ## Integration with MemberJunction
248
-
249
- This package is designed to work seamlessly with the MemberJunction ecosystem:
250
-
251
- 1. **Metadata Integration**: Uses MemberJunction's Metadata class to retrieve entity information and field definitions
252
- 2. **Entity System**: Works with any entity registered in the MemberJunction metadata system
253
- 3. **RunView API**: Leverages the powerful RunView API for searching, which respects entity permissions and field-level security
254
- 4. **BaseEntity**: Returns actual BaseEntity instances, allowing full access to entity methods and properties
255
-
256
- ## Build and Development
257
-
258
- This package is part of the MemberJunction monorepo. To build:
259
-
260
- ```bash
261
- # From the package directory
262
- npm run build
263
-
264
- # Or from the monorepo root
265
- turbo build --filter="@memberjunction/ng-find-record"
266
- ```
267
-
268
- The package uses Angular's `ngc` compiler for building Angular libraries.
269
-
270
- ## Module Configuration
271
-
272
- The package exports a `FindRecordModule` that includes both components. Import this module in your Angular application:
273
-
274
- ```typescript
275
- import { FindRecordModule } from '@memberjunction/ng-find-record';
276
-
277
- @NgModule({
278
- imports: [
279
- FindRecordModule,
280
- // ... other imports
281
- ]
282
- })
283
- export class YourFeatureModule { }
284
- ```
285
-
286
- ## Advanced Usage
287
-
288
- ### Custom Field Selection
289
-
290
- You can programmatically select which fields to display based on your requirements:
291
-
292
- ```typescript
293
- // Display only specific fields
294
- const entity = this.metadata.EntityByName('Products');
295
- this.displayFields = entity.Fields.filter(f =>
296
- ['Name', 'SKU', 'Price', 'Category'].includes(f.Name)
297
- );
298
- ```
299
-
300
- ### Pre-selecting Records
301
-
302
- You can pre-select a record in the dialog component:
303
-
304
- ```typescript
305
- // Load a record and pre-select it
306
- const md = new Metadata();
307
- const user = await md.GetEntityObject<UserEntity>('Users');
308
- await user.Load(userId);
309
- this.selectedRecord = user;
310
- ```
311
-
312
- ### Handling Selection Events
313
-
314
- Process selected records with full type safety:
315
-
316
- ```typescript
317
- onRecordSelected(record: BaseEntity) {
318
- // Cast to specific entity type if needed
319
- if (record.EntityInfo.Name === 'Users') {
320
- const user = record as UserEntity;
321
- console.log('Selected user email:', user.Email);
322
- }
323
-
324
- // Or use generic BaseEntity methods
325
- console.log('Selected record ID:', record.Get('ID'));
326
- console.log('Selected record name:', record.Get(record.EntityInfo.NameField));
327
- }
328
- ```
329
-
330
- ## Error Handling
331
-
332
- The component includes built-in error handling:
333
-
334
- - Failed searches will log errors using MemberJunction's `LogError` function
335
- - Loading states provide visual feedback during searches
336
- - Empty search results display a user-friendly message
337
-
338
- ## Performance Considerations
339
-
340
- - **Debouncing**: The default 300ms debounce prevents excessive API calls during typing
341
- - **Entity Objects**: Using `ResultType: 'entity_object'` in RunView ensures efficient object creation
342
- - **Grid Virtualization**: The Kendo Grid component provides built-in virtualization for large result sets
117
+ - [@memberjunction/core](../../MJCore/README.md) -- Metadata, RunView, BaseEntity
118
+ - [@memberjunction/core-entities](../../MJCoreEntities/README.md) -- Entity type definitions
119
+ - [@memberjunction/ng-shared](../shared/README.md) -- Shared Angular utilities
120
+ - `@progress/kendo-angular-grid` -- Grid display
343
121
 
344
- ## License
122
+ ## Related Packages
345
123
 
346
- This package is part of the MemberJunction open-source project. See the root repository for license information.
124
+ - [@memberjunction/ng-record-selector](../record-selector/README.md) -- Dual-listbox record selection
125
+ - [@memberjunction/ng-generic-dialog](../generic-dialog/README.md) -- Reusable dialog component
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAU,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;;AAGnE,qBAKa,yBAAyB;IAC3B,WAAW,EAAE,MAAM,CAAiB;IACpC,WAAW,EAAE,MAAM,CAAW;IAC9B,YAAY,EAAE,MAAM,CAAW;IAExC;;OAEG;IACM,cAAc,EAAE,UAAU,GAAG,IAAI,CAAQ;IAElD,IAAa,aAAa,IAAI,OAAO,CAEpC;IACD,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,EAK/B;IACD,OAAO,CAAC,cAAc,CAAkB;IACxC;;OAEG;IACO,YAAY,wBAA+B;IAGrD;;OAEG;IACM,UAAU,EAAE,MAAM,CAAM;IAEjC;;OAEG;IACM,aAAa,EAAE,eAAe,EAAE,CAAM;IAI9C;;OAEG;IACM,gBAAgB,oCAAkC;IAErD,QAAQ;IAKR,sBAAsB,CAAC,MAAM,EAAE,GAAG;IAKlC,IAAI;yCArDA,yBAAyB;2CAAzB,yBAAyB;CAyDrC"}
1
+ {"version":3,"file":"dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAU,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;;AAGnE,qBAMa,yBAAyB;IAC3B,WAAW,EAAE,MAAM,CAAiB;IACpC,WAAW,EAAE,MAAM,CAAW;IAC9B,YAAY,EAAE,MAAM,CAAW;IAExC;;OAEG;IACM,cAAc,EAAE,UAAU,GAAG,IAAI,CAAQ;IAElD,IAAa,aAAa,IAAI,OAAO,CAEpC;IACD,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,EAK/B;IACD,OAAO,CAAC,cAAc,CAAkB;IACxC;;OAEG;IACO,YAAY,wBAA+B;IAGrD;;OAEG;IACM,UAAU,EAAE,MAAM,CAAM;IAEjC;;OAEG;IACM,aAAa,EAAE,eAAe,EAAE,CAAM;IAI9C;;OAEG;IACM,gBAAgB,oCAAkC;IAErD,QAAQ;IAKR,sBAAsB,CAAC,MAAM,EAAE,GAAG;IAKlC,IAAI;yCArDA,yBAAyB;2CAAzB,yBAAyB;CAyDrC"}
@@ -72,15 +72,15 @@ export class FindRecordDialogComponent {
72
72
  this.DialogClosed.emit(true);
73
73
  }
74
74
  static ɵfac = function FindRecordDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FindRecordDialogComponent)(); };
75
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FindRecordDialogComponent, selectors: [["mj-find-record-dialog"]], inputs: { DialogTitle: "DialogTitle", DialogWidth: "DialogWidth", DialogHeight: "DialogHeight", SelectedRecord: "SelectedRecord", DialogVisible: "DialogVisible", EntityName: "EntityName", DisplayFields: "DisplayFields" }, outputs: { DialogClosed: "DialogClosed", OnRecordSelected: "OnRecordSelected" }, decls: 1, vars: 1, consts: [[3, "width", "height", "title"], [3, "close", "width", "height", "title"], [3, "OnRecordSelected", "EntityName", "DisplayFields"], ["kendoButton", "", "themeColor", "primary", 3, "click"], ["kendoButton", "", 3, "click"]], template: function FindRecordDialogComponent_Template(rf, ctx) { if (rf & 1) {
76
- i0.ɵɵtemplate(0, FindRecordDialogComponent_Conditional_0_Template, 7, 5, "kendo-dialog", 0);
75
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FindRecordDialogComponent, selectors: [["mj-find-record-dialog"]], inputs: { DialogTitle: "DialogTitle", DialogWidth: "DialogWidth", DialogHeight: "DialogHeight", SelectedRecord: "SelectedRecord", DialogVisible: "DialogVisible", EntityName: "EntityName", DisplayFields: "DisplayFields" }, outputs: { DialogClosed: "DialogClosed", OnRecordSelected: "OnRecordSelected" }, standalone: false, decls: 1, vars: 1, consts: [[3, "width", "height", "title"], [3, "close", "width", "height", "title"], [3, "OnRecordSelected", "EntityName", "DisplayFields"], ["kendoButton", "", "themeColor", "primary", 3, "click"], ["kendoButton", "", 3, "click"]], template: function FindRecordDialogComponent_Template(rf, ctx) { if (rf & 1) {
76
+ i0.ɵɵconditionalCreate(0, FindRecordDialogComponent_Conditional_0_Template, 7, 5, "kendo-dialog", 0);
77
77
  } if (rf & 2) {
78
78
  i0.ɵɵconditional(ctx.DialogVisible ? 0 : -1);
79
- } }, dependencies: [i1.DialogComponent, i1.DialogActionsComponent, i2.ButtonComponent, i3.FindRecordComponent] });
79
+ } }, dependencies: [i1.DialogComponent, i1.DialogActionsComponent, i2.ButtonComponent, i3.FindRecordComponent], encapsulation: 2 });
80
80
  }
81
81
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FindRecordDialogComponent, [{
82
82
  type: Component,
83
- args: [{ selector: 'mj-find-record-dialog', template: "@if (DialogVisible) {\n <kendo-dialog\n [width]=\"DialogWidth\"\n [height]=\"DialogHeight\"\n [title]=\"DialogTitle\" \n (close)=\"OnCancel()\"\n >\n <mj-find-record\n [EntityName]=\"EntityName\"\n [DisplayFields]=\"DisplayFields\"\n (OnRecordSelected)=\"BubbleOnRecordSelected($event)\"\n >\n </mj-find-record>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"OnOK()\" themeColor=\"primary\">OK</button>\n <button kendoButton (click)=\"OnCancel()\">Cancel</button>\n </kendo-dialog-actions> \n </kendo-dialog> \n}" }]
83
+ args: [{ standalone: false, selector: 'mj-find-record-dialog', template: "@if (DialogVisible) {\n <kendo-dialog\n [width]=\"DialogWidth\"\n [height]=\"DialogHeight\"\n [title]=\"DialogTitle\" \n (close)=\"OnCancel()\"\n >\n <mj-find-record\n [EntityName]=\"EntityName\"\n [DisplayFields]=\"DisplayFields\"\n (OnRecordSelected)=\"BubbleOnRecordSelected($event)\"\n >\n </mj-find-record>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"OnOK()\" themeColor=\"primary\">OK</button>\n <button kendoButton (click)=\"OnCancel()\">Cancel</button>\n </kendo-dialog-actions> \n </kendo-dialog> \n}" }]
84
84
  }], null, { DialogTitle: [{
85
85
  type: Input
86
86
  }], DialogWidth: [{
@@ -100,5 +100,5 @@ export class FindRecordDialogComponent {
100
100
  }], OnRecordSelected: [{
101
101
  type: Output
102
102
  }] }); })();
103
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FindRecordDialogComponent, { className: "FindRecordDialogComponent", filePath: "src/lib/dialog.component.ts", lineNumber: 11 }); })();
103
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FindRecordDialogComponent, { className: "FindRecordDialogComponent", filePath: "src/lib/dialog.component.ts", lineNumber: 12 }); })();
104
104
  //# sourceMappingURL=dialog.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.component.js","sourceRoot":"","sources":["../../src/lib/dialog.component.ts","../../src/lib/dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAG,MAAM,eAAe,CAAC;;;;;;;ICCpE,uCAKC;IADG,mMAAS,iBAAU,KAAC;IAEpB,yCAIC;IADG,iOAAoB,qCAA8B,KAAC;IAEvD,iBAAiB;IAEb,AADJ,4CAAsB,gBACwC;IAAtC,6LAAS,aAAM,KAAC;IAAsB,kBAAE;IAAA,iBAAS;IACrE,iCAAyC;IAArB,6LAAS,iBAAU,KAAC;IAAC,sBAAM;IAEvD,AADI,AADmD,iBAAS,EACrC,EACZ;;;IAbX,AADA,AADA,0CAAqB,+BACE,6BACF;IAIjB,cAAyB;IACzB,AADA,8CAAyB,uCACM;;ADC3C,MAAM,OAAO,yBAAyB;IAC3B,WAAW,GAAW,aAAa,CAAC;IACpC,WAAW,GAAW,OAAO,CAAC;IAC9B,YAAY,GAAW,OAAO,CAAC;IAExC;;OAEG;IACM,cAAc,GAAsB,IAAI,CAAC;IAElD,IAAa,aAAa;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,IAAI,aAAa,CAAC,KAAc;QAC9B,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc,IAAI,KAAK,EAAE,CAAC;YAC3C,+BAA+B;QACjC,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IACO,cAAc,GAAY,KAAK,CAAC;IACxC;;OAEG;IACO,YAAY,GAAG,IAAI,YAAY,EAAW,CAAC;IAErD,gFAAgF;IAChF;;OAEG;IACM,UAAU,GAAW,EAAE,CAAC;IAEjC;;OAEG;IACM,aAAa,GAAsB,EAAE,CAAC,CAAC,gCAAgC;IAI/E;;OAEG;IACM,gBAAgB,GAAG,IAAI,YAAY,EAAc,CAAC;IAErD,QAAQ;QACb,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAEM,sBAAsB,CAAC,MAAW;QACvC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;mHAxDU,yBAAyB;6DAAzB,yBAAyB;YCVtC,2FAAqB;;YAArB,4CAkBC;;;iFDRY,yBAAyB;cALrC,SAAS;2BACE,uBAAuB;gBAKxB,WAAW;kBAAnB,KAAK;YACG,WAAW;kBAAnB,KAAK;YACG,YAAY;kBAApB,KAAK;YAKG,cAAc;kBAAtB,KAAK;YAEO,aAAa;kBAAzB,KAAK;YAaI,YAAY;kBAArB,MAAM;YAME,UAAU;kBAAlB,KAAK;YAKG,aAAa;kBAArB,KAAK;YAOI,gBAAgB;kBAAzB,MAAM;;kFAzCI,yBAAyB"}
1
+ {"version":3,"file":"dialog.component.js","sourceRoot":"","sources":["../../src/lib/dialog.component.ts","../../src/lib/dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAG,MAAM,eAAe,CAAC;;;;;;;ICCpE,uCAKC;IADG,mMAAS,iBAAU,KAAC;IAEpB,yCAIC;IADG,iOAAoB,qCAA8B,KAAC;IAEvD,iBAAiB;IAEb,AADJ,4CAAsB,gBACwC;IAAtC,6LAAS,aAAM,KAAC;IAAsB,kBAAE;IAAA,iBAAS;IACrE,iCAAyC;IAArB,6LAAS,iBAAU,KAAC;IAAC,sBAAM;IAEvD,AADI,AADmD,iBAAS,EACrC,EACZ;;;IAbX,AADA,AADA,0CAAqB,+BACE,6BACF;IAIjB,cAAyB;IACzB,AADA,8CAAyB,uCACM;;ADE3C,MAAM,OAAO,yBAAyB;IAC3B,WAAW,GAAW,aAAa,CAAC;IACpC,WAAW,GAAW,OAAO,CAAC;IAC9B,YAAY,GAAW,OAAO,CAAC;IAExC;;OAEG;IACM,cAAc,GAAsB,IAAI,CAAC;IAElD,IAAa,aAAa;QACxB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,IAAI,aAAa,CAAC,KAAc;QAC9B,IAAI,KAAK,KAAK,IAAI,CAAC,cAAc,IAAI,KAAK,EAAE,CAAC;YAC3C,+BAA+B;QACjC,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IACO,cAAc,GAAY,KAAK,CAAC;IACxC;;OAEG;IACO,YAAY,GAAG,IAAI,YAAY,EAAW,CAAC;IAErD,gFAAgF;IAChF;;OAEG;IACM,UAAU,GAAW,EAAE,CAAC;IAEjC;;OAEG;IACM,aAAa,GAAsB,EAAE,CAAC,CAAC,gCAAgC;IAI/E;;OAEG;IACM,gBAAgB,GAAG,IAAI,YAAY,EAAc,CAAC;IAErD,QAAQ;QACb,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAEM,sBAAsB,CAAC,MAAW;QACvC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;mHAxDU,yBAAyB;6DAAzB,yBAAyB;YCXtC,oGAAqB;;YAArB,4CAkBC;;;iFDPY,yBAAyB;cANrC,SAAS;6BACI,KAAK,YACP,uBAAuB;;kBAKhC,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAKL,KAAK;;kBAEL,KAAK;;kBAaL,MAAM;;kBAMN,KAAK;;kBAKL,KAAK;;kBAOL,MAAM;;kFAzCI,yBAAyB"}
@@ -1 +1 @@
1
- {"version":3,"file":"find-record.component.d.ts","sourceRoot":"","sources":["../../src/lib/find-record.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAU,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,eAAe,EAA2C,MAAM,sBAAsB,CAAC;;AAI5G,qBAKa,mBAAoB,YAAW,MAAM,EAAE,SAAS;IAC3D;;OAEG;IACM,UAAU,EAAE,MAAM,CAAM;IAEjC;;OAEG;IACa,aAAa,EAAE,eAAe,EAAE,CAAM;IAEtD;;OAEG;IACa,kBAAkB,EAAE,MAAM,CAAO;IAGjD;;OAEG;IACO,gBAAgB,oCAAkC;IAErD,UAAU,EAAE,MAAM,CAAM;IACxB,OAAO,EAAE,GAAG,EAAE,CAAM;IAEpB,OAAO,UAAS;IAChB,YAAY,EAAE,OAAO,CAAS;IACrC,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,kBAAkB,CAAM;IAGhC,QAAQ;IAsCR,WAAW;IAQX,MAAM;IAIN,kBAAkB,CAAC,IAAI,EAAE,MAAM;IAKxB,iBAAiB,CAAC,KAAK,EAAE,GAAG;cAMnB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;yCA9FxD,mBAAmB;2CAAnB,mBAAmB;CA+G/B"}
1
+ {"version":3,"file":"find-record.component.d.ts","sourceRoot":"","sources":["../../src/lib/find-record.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAU,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,eAAe,EAA2C,MAAM,sBAAsB,CAAC;;AAI5G,qBAMa,mBAAoB,YAAW,MAAM,EAAE,SAAS;IAC3D;;OAEG;IACM,UAAU,EAAE,MAAM,CAAM;IAEjC;;OAEG;IACa,aAAa,EAAE,eAAe,EAAE,CAAM;IAEtD;;OAEG;IACa,kBAAkB,EAAE,MAAM,CAAO;IAGjD;;OAEG;IACO,gBAAgB,oCAAkC;IAErD,UAAU,EAAE,MAAM,CAAM;IACxB,OAAO,EAAE,GAAG,EAAE,CAAM;IAEpB,OAAO,UAAS;IAChB,YAAY,EAAE,OAAO,CAAS;IACrC,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,kBAAkB,CAAM;IAGhC,QAAQ;IAsCR,WAAW;IAQX,MAAM;IAIN,kBAAkB,CAAC,IAAI,EAAE,MAAM;IAKxB,iBAAiB,CAAC,KAAK,EAAE,GAAG;cAMnB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;yCA9FxD,mBAAmB;2CAAnB,mBAAmB;CA+G/B"}
@@ -3,37 +3,36 @@ import { LogError, Metadata, RunView } from '@memberjunction/core';
3
3
  import { Subject } from 'rxjs';
4
4
  import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
5
5
  import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/forms";
8
- import * as i3 from "@progress/kendo-angular-grid";
9
- import * as i4 from "@progress/kendo-angular-buttons";
10
- import * as i5 from "@progress/kendo-angular-inputs";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@progress/kendo-angular-grid";
8
+ import * as i3 from "@progress/kendo-angular-buttons";
9
+ import * as i4 from "@progress/kendo-angular-inputs";
11
10
  const _c0 = () => ({ mode: "single" });
12
- function FindRecordComponent_div_4_Template(rf, ctx) { if (rf & 1) {
11
+ function FindRecordComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
13
12
  i0.ɵɵelementStart(0, "div");
14
13
  i0.ɵɵtext(1, "Searching...");
15
14
  i0.ɵɵelementEnd();
16
15
  } }
17
- function FindRecordComponent_div_5_kendo_grid_column_2_Template(rf, ctx) { if (rf & 1) {
18
- i0.ɵɵelement(0, "kendo-grid-column", 5);
16
+ function FindRecordComponent_Conditional_5_For_3_Template(rf, ctx) { if (rf & 1) {
17
+ i0.ɵɵelement(0, "kendo-grid-column", 3);
19
18
  } if (rf & 2) {
20
19
  const field_r3 = ctx.$implicit;
21
20
  i0.ɵɵproperty("field", field_r3.Name)("title", field_r3.DisplayNameOrName);
22
21
  } }
23
- function FindRecordComponent_div_5_Template(rf, ctx) { if (rf & 1) {
22
+ function FindRecordComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
24
23
  const _r1 = i0.ɵɵgetCurrentView();
25
- i0.ɵɵelementStart(0, "div")(1, "kendo-grid", 3);
26
- i0.ɵɵlistener("selectionChange", function FindRecordComponent_div_5_Template_kendo_grid_selectionChange_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSelectionChange($event)); });
27
- i0.ɵɵtemplate(2, FindRecordComponent_div_5_kendo_grid_column_2_Template, 1, 2, "kendo-grid-column", 4);
24
+ i0.ɵɵelementStart(0, "div")(1, "kendo-grid", 2);
25
+ i0.ɵɵlistener("selectionChange", function FindRecordComponent_Conditional_5_Template_kendo_grid_selectionChange_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSelectionChange($event)); });
26
+ i0.ɵɵrepeaterCreate(2, FindRecordComponent_Conditional_5_For_3_Template, 1, 2, "kendo-grid-column", 3, i0.ɵɵrepeaterTrackByIdentity);
28
27
  i0.ɵɵelementEnd()();
29
28
  } if (rf & 2) {
30
29
  const ctx_r1 = i0.ɵɵnextContext();
31
30
  i0.ɵɵadvance();
32
- i0.ɵɵproperty("data", ctx_r1.records)("height", 280)("selectable", i0.ɵɵpureFunction0(4, _c0));
31
+ i0.ɵɵproperty("data", ctx_r1.records)("height", 280)("selectable", i0.ɵɵpureFunction0(3, _c0));
33
32
  i0.ɵɵadvance();
34
- i0.ɵɵproperty("ngForOf", ctx_r1.DisplayFields);
33
+ i0.ɵɵrepeater(ctx_r1.DisplayFields);
35
34
  } }
36
- function FindRecordComponent_div_6_Template(rf, ctx) { if (rf & 1) {
35
+ function FindRecordComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
37
36
  i0.ɵɵelementStart(0, "div");
38
37
  i0.ɵɵtext(1, "No records found.");
39
38
  i0.ɵɵelementEnd();
@@ -129,7 +128,7 @@ export class FindRecordComponent {
129
128
  }
130
129
  }
131
130
  static ɵfac = function FindRecordComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FindRecordComponent)(); };
132
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FindRecordComponent, selectors: [["mj-find-record"]], inputs: { EntityName: "EntityName", DisplayFields: "DisplayFields", SearchDebounceTime: "SearchDebounceTime" }, outputs: { OnRecordSelected: "OnRecordSelected" }, decls: 7, vars: 4, consts: [["type", "text", "placeholder", "Start typing to search...", 1, "find-textbox", 3, "ngModelChange", "ngModel"], ["kendoButton", "", 1, "find-button", 3, "click"], [4, "ngIf"], [3, "selectionChange", "data", "height", "selectable"], [3, "field", "title", 4, "ngFor", "ngForOf"], [3, "field", "title"]], template: function FindRecordComponent_Template(rf, ctx) { if (rf & 1) {
131
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FindRecordComponent, selectors: [["mj-find-record"]], inputs: { EntityName: "EntityName", DisplayFields: "DisplayFields", SearchDebounceTime: "SearchDebounceTime" }, outputs: { OnRecordSelected: "OnRecordSelected" }, standalone: false, decls: 7, vars: 4, consts: [["type", "text", "placeholder", "Start typing to search...", 1, "find-textbox", 3, "ngModelChange", "ngModel"], ["kendoButton", "", 1, "find-button", 3, "click"], [3, "selectionChange", "data", "height", "selectable"], [3, "field", "title"]], template: function FindRecordComponent_Template(rf, ctx) { if (rf & 1) {
133
132
  i0.ɵɵelementStart(0, "div")(1, "kendo-textbox", 0);
134
133
  i0.ɵɵtwoWayListener("ngModelChange", function FindRecordComponent_Template_kendo_textbox_ngModelChange_1_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.searchTerm, $event) || (ctx.searchTerm = $event); return $event; });
135
134
  i0.ɵɵlistener("ngModelChange", function FindRecordComponent_Template_kendo_textbox_ngModelChange_1_listener($event) { return ctx.onSearchTermChange($event); });
@@ -138,22 +137,24 @@ export class FindRecordComponent {
138
137
  i0.ɵɵlistener("click", function FindRecordComponent_Template_button_click_2_listener() { return ctx.onFind(); });
139
138
  i0.ɵɵtext(3, "Find");
140
139
  i0.ɵɵelementEnd();
141
- i0.ɵɵtemplate(4, FindRecordComponent_div_4_Template, 2, 0, "div", 2)(5, FindRecordComponent_div_5_Template, 3, 5, "div", 2)(6, FindRecordComponent_div_6_Template, 2, 0, "div", 2);
140
+ i0.ɵɵconditionalCreate(4, FindRecordComponent_Conditional_4_Template, 2, 0, "div");
141
+ i0.ɵɵconditionalCreate(5, FindRecordComponent_Conditional_5_Template, 4, 4, "div");
142
+ i0.ɵɵconditionalCreate(6, FindRecordComponent_Conditional_6_Template, 2, 0, "div");
142
143
  i0.ɵɵelementEnd();
143
144
  } if (rf & 2) {
144
145
  i0.ɵɵadvance();
145
146
  i0.ɵɵtwoWayProperty("ngModel", ctx.searchTerm);
146
147
  i0.ɵɵadvance(3);
147
- i0.ɵɵproperty("ngIf", ctx.loading);
148
+ i0.ɵɵconditional(ctx.loading ? 4 : -1);
148
149
  i0.ɵɵadvance();
149
- i0.ɵɵproperty("ngIf", !ctx.loading && ctx.records.length > 0);
150
+ i0.ɵɵconditional(!ctx.loading && ctx.records.length > 0 ? 5 : -1);
150
151
  i0.ɵɵadvance();
151
- i0.ɵɵproperty("ngIf", !ctx.loading && ctx.records.length === 0 && ctx.searchHasRun);
152
- } }, dependencies: [i1.NgForOf, i1.NgIf, i2.NgControlStatus, i2.NgModel, i3.GridComponent, i3.ColumnComponent, i4.ButtonComponent, i5.TextBoxComponent], styles: [".list-box[_ngcontent-%COMP%] {\n width: 320px;\n height: 300px;\n}\n\n.k-listbox-actions-right[_ngcontent-%COMP%] {\n margin-left: 10px;\n}\n\n.item-icon[_ngcontent-%COMP%] {\n font-size: 16px;\n width: 25px;\n margin-right: 5px;\n}\n\n.find-textbox[_ngcontent-%COMP%] {\n width: 500px;\n margin-right: 10px;\n margin-bottom: 10px;\n}\n\n.find-button[_ngcontent-%COMP%] {\n width: 75px;\n margin-bottom: 10px;\n}"] });
152
+ i0.ɵɵconditional(!ctx.loading && ctx.records.length === 0 && ctx.searchHasRun ? 6 : -1);
153
+ } }, dependencies: [i1.NgControlStatus, i1.NgModel, i2.GridComponent, i2.ColumnComponent, i3.ButtonComponent, i4.TextBoxComponent], styles: [".list-box[_ngcontent-%COMP%] {\n width: 320px;\n height: 300px;\n}\n\n.k-listbox-actions-right[_ngcontent-%COMP%] {\n margin-left: 10px;\n}\n\n.item-icon[_ngcontent-%COMP%] {\n font-size: 16px;\n width: 25px;\n margin-right: 5px;\n}\n\n.find-textbox[_ngcontent-%COMP%] {\n width: 500px;\n margin-right: 10px;\n margin-bottom: 10px;\n}\n\n.find-button[_ngcontent-%COMP%] {\n width: 75px;\n margin-bottom: 10px;\n}"] });
153
154
  }
154
155
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FindRecordComponent, [{
155
156
  type: Component,
156
- args: [{ selector: 'mj-find-record', template: "<div>\n <kendo-textbox\n class=\"find-textbox\"\n type=\"text\"\n placeholder=\"Start typing to search...\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n >\n </kendo-textbox>\n <button class=\"find-button\" kendoButton (click)=\"onFind()\">Find</button>\n \n <div *ngIf=\"loading\">Searching...</div>\n <div *ngIf=\"!loading && records.length > 0\">\n <kendo-grid \n [data]=\"records\" \n [height]=\"280\" \n [selectable]=\"{ mode: 'single' }\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n <kendo-grid-column *ngFor=\"let field of DisplayFields\" [field]=\"field.Name\" [title]=\"field.DisplayNameOrName\"></kendo-grid-column>\n </kendo-grid>\n </div>\n <div *ngIf=\"!loading && records.length === 0 && searchHasRun\">No records found.</div>\n</div>\n ", styles: [".list-box {\n width: 320px;\n height: 300px;\n}\n\n.k-listbox-actions-right {\n margin-left: 10px;\n}\n\n.item-icon {\n font-size: 16px;\n width: 25px;\n margin-right: 5px;\n}\n\n.find-textbox {\n width: 500px;\n margin-right: 10px;\n margin-bottom: 10px;\n}\n\n.find-button {\n width: 75px;\n margin-bottom: 10px;\n}"] }]
157
+ args: [{ standalone: false, selector: 'mj-find-record', template: "<div>\n <kendo-textbox\n class=\"find-textbox\"\n type=\"text\"\n placeholder=\"Start typing to search...\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n >\n </kendo-textbox>\n <button class=\"find-button\" kendoButton (click)=\"onFind()\">Find</button>\n\n @if (loading) {\n <div>Searching...</div>\n }\n @if (!loading && records.length > 0) {\n <div>\n <kendo-grid\n [data]=\"records\"\n [height]=\"280\"\n [selectable]=\"{ mode: 'single' }\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n @for (field of DisplayFields; track field) {\n <kendo-grid-column [field]=\"field.Name\" [title]=\"field.DisplayNameOrName\"></kendo-grid-column>\n }\n </kendo-grid>\n </div>\n }\n @if (!loading && records.length === 0 && searchHasRun) {\n <div>No records found.</div>\n }\n</div>\n", styles: [".list-box {\n width: 320px;\n height: 300px;\n}\n\n.k-listbox-actions-right {\n margin-left: 10px;\n}\n\n.item-icon {\n font-size: 16px;\n width: 25px;\n margin-right: 5px;\n}\n\n.find-textbox {\n width: 500px;\n margin-right: 10px;\n margin-bottom: 10px;\n}\n\n.find-button {\n width: 75px;\n margin-bottom: 10px;\n}"] }]
157
158
  }], null, { EntityName: [{
158
159
  type: Input
159
160
  }], DisplayFields: [{
@@ -163,5 +164,5 @@ export class FindRecordComponent {
163
164
  }], OnRecordSelected: [{
164
165
  type: Output
165
166
  }] }); })();
166
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FindRecordComponent, { className: "FindRecordComponent", filePath: "src/lib/find-record.component.ts", lineNumber: 11 }); })();
167
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FindRecordComponent, { className: "FindRecordComponent", filePath: "src/lib/find-record.component.ts", lineNumber: 12 }); })();
167
168
  //# sourceMappingURL=find-record.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"find-record.component.js","sourceRoot":"","sources":["../../src/lib/find-record.component.ts","../../src/lib/find-record.component.html"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-record.component.js","sourceRoot":"","sources":["../../src/lib/find-record.component.ts","../../src/lib/find-record.component.html"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-find-record",
3
- "version": "3.4.0",
3
+ "version": "4.1.0",
4
4
  "description": "MemberJunction: Angular Component to allow a user to find a single record in any entity",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -15,28 +15,28 @@
15
15
  "author": "",
16
16
  "license": "ISC",
17
17
  "devDependencies": {
18
- "@angular/compiler": "18.2.14",
19
- "@angular/compiler-cli": "18.2.14"
18
+ "@angular/compiler": "21.1.3",
19
+ "@angular/compiler-cli": "21.1.3"
20
20
  },
21
21
  "peerDependencies": {
22
- "@angular/common": "18.2.14",
23
- "@angular/core": "18.2.14",
24
- "@angular/forms": "18.2.14",
25
- "@angular/router": "18.2.14",
26
- "@progress/kendo-angular-grid": "16.2.0",
27
- "@progress/kendo-angular-buttons": "16.2.0",
28
- "@progress/kendo-angular-inputs": "16.2.0",
29
- "@progress/kendo-angular-dialog": "16.2.0",
30
- "@progress/kendo-angular-listbox": "16.2.0"
22
+ "@angular/common": "21.1.3",
23
+ "@angular/core": "21.1.3",
24
+ "@angular/forms": "21.1.3",
25
+ "@angular/router": "21.1.3",
26
+ "@progress/kendo-angular-grid": "22.0.1",
27
+ "@progress/kendo-angular-buttons": "22.0.1",
28
+ "@progress/kendo-angular-inputs": "22.0.1",
29
+ "@progress/kendo-angular-dialog": "22.0.1",
30
+ "@progress/kendo-angular-listbox": "22.0.1"
31
31
  },
32
32
  "dependencies": {
33
- "@memberjunction/core-entities": "3.4.0",
34
- "@memberjunction/global": "3.4.0",
35
- "@memberjunction/core": "3.4.0",
36
- "@memberjunction/ng-container-directives": "3.4.0",
37
- "@memberjunction/ng-shared": "3.4.0",
38
- "rxjs": "^7.8.1",
39
- "tslib": "^2.3.0"
33
+ "@memberjunction/core-entities": "4.1.0",
34
+ "@memberjunction/global": "4.1.0",
35
+ "@memberjunction/core": "4.1.0",
36
+ "@memberjunction/ng-container-directives": "4.1.0",
37
+ "@memberjunction/ng-shared": "4.1.0",
38
+ "rxjs": "^7.8.2",
39
+ "tslib": "^2.8.1"
40
40
  },
41
41
  "sideEffects": false,
42
42
  "repository": {