@memberjunction/ng-find-record 5.48.0 → 5.49.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.
@@ -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,EAAiC,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EACL,MAAM,EACN,cAAc,EAId,mBAAmB,EACnB,qBAAqB,EAGrB,KAAK,KAAK,EACX,MAAM,mBAAmB,CAAC;;AAK3B,qBAMa,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACxF;;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,UAAU,EAAE,CAAM;IAE3B,OAAO,UAAS;IAChB,YAAY,EAAE,OAAO,CAAS;IACrC,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,kBAAkB,CAA2B;IAG9C,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,aAAa,EAAE,MAAM,CAI1B;IACK,kBAAkB,EAAE,mBAAmB,CAI5C;IACK,SAAS,EAAE,KAAK,CAA6C;IACpE,OAAO,CAAC,OAAO,CAAwB;IAGvC,QAAQ;IAyCR,WAAW;IAQX,MAAM;IAIN,kBAAkB,CAAC,IAAI,EAAE,MAAM;IAKxB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB;IAO9C,WAAW,CAAC,KAAK,EAAE,cAAc;IAIxC,OAAO,CAAC,eAAe;cAQP,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;yCA7HxD,mBAAmB;2CAAnB,mBAAmB;CA8I/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,EAAiC,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIrE,OAAO,EACL,MAAM,EACN,cAAc,EAId,mBAAmB,EACnB,qBAAqB,EAErB,KAAK,KAAK,EACX,MAAM,mBAAmB,CAAC;;AAK3B,qBAMa,mBAAoB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACxF;;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,UAAU,EAAE,CAAM;IAE3B,OAAO,UAAS;IAChB,YAAY,EAAE,OAAO,CAAS;IACrC,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,kBAAkB,CAA2B;IAG9C,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,aAAa,EAAE,MAAM,CAI1B;IACK,kBAAkB,EAAE,mBAAmB,CAI5C;IAGK,SAAS,EAAE,KAAK,CAAmD;IAC1E,OAAO,CAAC,OAAO,CAAwB;IAGvC,QAAQ;IAyCR,WAAW;IAQX,MAAM;IAIN,kBAAkB,CAAC,IAAI,EAAE,MAAM;IAKxB,iBAAiB,CAAC,KAAK,EAAE,qBAAqB;IAO9C,WAAW,CAAC,KAAK,EAAE,cAAc;IAIxC,OAAO,CAAC,eAAe;cAQP,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;yCA/HxD,mBAAmB;2CAAnB,mBAAmB;CAgJ/B"}
@@ -1,9 +1,10 @@
1
1
  import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import { LogError, RunView } from '@memberjunction/core';
3
3
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
+ import { MJ_AG_GRID_THEME_PARAMS } from '@memberjunction/ng-shared-generic';
4
5
  import { Subject } from 'rxjs';
5
6
  import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
6
- import { ModuleRegistry, AllCommunityModule, themeAlpine, colorSchemeVariable } from 'ag-grid-community';
7
+ import { ModuleRegistry, AllCommunityModule, themeAlpine } from 'ag-grid-community';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/forms";
9
10
  import * as i2 from "ag-grid-angular";
@@ -66,7 +67,9 @@ export class FindRecordComponent extends BaseAngularComponent {
66
67
  checkboxes: false,
67
68
  enableClickSelection: true
68
69
  };
69
- GridTheme = themeAlpine.withPart(colorSchemeVariable);
70
+ // Themed from the shared --mj-* token params so this grid follows light/dark and
71
+ // the org brand overlay, matching the main entity/query grids.
72
+ GridTheme = themeAlpine.withParams(MJ_AG_GRID_THEME_PARAMS);
70
73
  gridApi = null;
71
74
  ngOnInit() {
72
75
  // Fetch the entity metadata based on EntityName
@@ -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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","sourcesContent":["import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { BaseEntity, EntityFieldInfo, EntityInfo, LogError, RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';\nimport {\n ColDef,\n GridReadyEvent,\n GridApi,\n ModuleRegistry,\n AllCommunityModule,\n RowSelectionOptions,\n SelectionChangedEvent,\n themeAlpine,\n colorSchemeVariable,\n type Theme\n} from 'ag-grid-community';\n\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n \n@Component({\n standalone: false,\n selector: 'mj-find-record',\n templateUrl: './find-record.component.html',\n styleUrls: ['./find-record.component.css']\n})\nexport class FindRecordComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * The name of the entity to show records for.\n */\n @Input() EntityName: string = '';\n\n /**\n * Optional, list of fields to be displayed in the grid of search results, if not specified, the default fields will be displayed\n */\n @Input() public DisplayFields: EntityFieldInfo[] = []; // Fields to display in the grid\n\n /**\n * Optional, the number of milliseconds to wait after the last keypress before triggering a search. Default is 300ms\n */\n @Input() public SearchDebounceTime: number = 300; // Debounce time for search\n\n\n /**\n * When a record is selected, this event is emitted with the selected record\n */\n @Output() OnRecordSelected = new EventEmitter<BaseEntity>();\n\n public searchTerm: string = ''; // User search term\n public records: BaseEntity[] = []; // Store search results\n\n public loading = false; // Loading state for search\n public searchHasRun: boolean = false; // has a search been run\n private entityInfo: EntityInfo | undefined; // Entity metadata\n\n private searchSubject = new Subject<string>(); // Subject to emit search term changes\n private searchSubscription: Subscription | undefined;\n\n // AG Grid configuration\n public ColumnDefs: ColDef[] = [];\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n filter: false\n };\n public RowSelectionConfig: RowSelectionOptions = {\n mode: 'singleRow',\n checkboxes: false,\n enableClickSelection: true\n };\n public GridTheme: Theme = themeAlpine.withPart(colorSchemeVariable);\n private gridApi: GridApi | null = null;\n\n \n ngOnInit() {\n // Fetch the entity metadata based on EntityName\n const md = this.ProviderToUse;\n this.entityInfo = md.EntityByName(this.EntityName);\n if (!this.entityInfo) {\n LogError(`Entity ${this.EntityName} not found`);\n return;\n }\n\n // Set display fields (you can adjust the logic based on your entity structure)\n if (this.DisplayFields.length === 0) {\n this.DisplayFields = this.entityInfo.Fields.filter(\n (field: EntityFieldInfo) => field.DefaultInView || field.IsPrimaryKey || field.IsNameField || field.IncludeInUserSearchAPI\n );\n }\n\n // Build AG Grid column definitions from display fields\n this.ColumnDefs = this.buildColumnDefs();\n\n // Subscribe to the searchSubject with debounce\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.SearchDebounceTime), // Delay search execution by 300ms\n distinctUntilChanged(), // Only proceed if the search term has changed\n switchMap(term => {\n this.loading = true;\n return this.doSearch(term);\n })\n ).subscribe({\n next: (results: BaseEntity[]) => {\n this.records = results;\n this.loading = false;\n this.searchHasRun = true;\n },\n error: (error) => {\n LogError(error.message);\n this.loading = false;\n this.searchHasRun = true;\n }\n }); \n }\n\n ngOnDestroy() {\n // Cleanup the subscription\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n }\n\n\n onFind() {\n this.searchSubject.next(this.searchTerm); // Trigger the debounced search\n } \n\n onSearchTermChange(term: string) {\n this.searchTerm = term;\n this.searchSubject.next(term); // Emit the new search term\n }\n\n public onSelectionChange(event: SelectionChangedEvent) {\n const selectedRows = event.api.getSelectedRows();\n if (selectedRows.length > 0) {\n this.OnRecordSelected.emit(selectedRows[0]);\n }\n }\n\n public onGridReady(event: GridReadyEvent) {\n this.gridApi = event.api;\n }\n\n private buildColumnDefs(): ColDef[] {\n return this.DisplayFields.map((field: EntityFieldInfo) => ({\n field: field.Name,\n headerName: field.DisplayNameOrName\n }));\n }\n\n // Stub function for simulating a database search (replace with actual search logic)\n protected async doSearch(searchTerm: string): Promise<BaseEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: this.EntityName, \n UserSearchString: searchTerm, \n ResultType: 'entity_object'\n });\n if (result && result.Success) {\n return result.Results;\n this.searchHasRun = true;\n }\n else {\n const errorMessage = `Error searching for ${this.EntityName}: ${result.ErrorMessage}`;\n LogError(errorMessage);\n throw new Error(errorMessage);\n }\n } \n}\n","<div>\n <input\n type=\"text\"\n class=\"mj-input find-textbox\"\n placeholder=\"Start typing to search...\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchTermChange($event)\" />\n <button mjButton variant=\"primary\" class=\"find-button\" (click)=\"onFind()\">Find</button>\n\n @if (loading) {\n <div>Searching...</div>\n }\n @if (!loading && records.length > 0) {\n <div class=\"find-grid-wrapper\">\n <ag-grid-angular\n class=\"find-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"records\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [rowSelection]=\"RowSelectionConfig\"\n (selectionChanged)=\"onSelectionChange($event)\"\n (gridReady)=\"onGridReady($event)\">\n </ag-grid-angular>\n </div>\n }\n @if (!loading && records.length === 0 && searchHasRun) {\n <div>No records found.</div>\n }\n</div>\n"]}
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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","sourcesContent":["import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { BaseEntity, EntityFieldInfo, EntityInfo, LogError, RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJ_AG_GRID_THEME_PARAMS } from '@memberjunction/ng-shared-generic';\nimport { Subject, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';\nimport {\n ColDef,\n GridReadyEvent,\n GridApi,\n ModuleRegistry,\n AllCommunityModule,\n RowSelectionOptions,\n SelectionChangedEvent,\n themeAlpine,\n type Theme\n} from 'ag-grid-community';\n\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n \n@Component({\n standalone: false,\n selector: 'mj-find-record',\n templateUrl: './find-record.component.html',\n styleUrls: ['./find-record.component.css']\n})\nexport class FindRecordComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * The name of the entity to show records for.\n */\n @Input() EntityName: string = '';\n\n /**\n * Optional, list of fields to be displayed in the grid of search results, if not specified, the default fields will be displayed\n */\n @Input() public DisplayFields: EntityFieldInfo[] = []; // Fields to display in the grid\n\n /**\n * Optional, the number of milliseconds to wait after the last keypress before triggering a search. Default is 300ms\n */\n @Input() public SearchDebounceTime: number = 300; // Debounce time for search\n\n\n /**\n * When a record is selected, this event is emitted with the selected record\n */\n @Output() OnRecordSelected = new EventEmitter<BaseEntity>();\n\n public searchTerm: string = ''; // User search term\n public records: BaseEntity[] = []; // Store search results\n\n public loading = false; // Loading state for search\n public searchHasRun: boolean = false; // has a search been run\n private entityInfo: EntityInfo | undefined; // Entity metadata\n\n private searchSubject = new Subject<string>(); // Subject to emit search term changes\n private searchSubscription: Subscription | undefined;\n\n // AG Grid configuration\n public ColumnDefs: ColDef[] = [];\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n filter: false\n };\n public RowSelectionConfig: RowSelectionOptions = {\n mode: 'singleRow',\n checkboxes: false,\n enableClickSelection: true\n };\n // Themed from the shared --mj-* token params so this grid follows light/dark and\n // the org brand overlay, matching the main entity/query grids.\n public GridTheme: Theme = themeAlpine.withParams(MJ_AG_GRID_THEME_PARAMS);\n private gridApi: GridApi | null = null;\n\n \n ngOnInit() {\n // Fetch the entity metadata based on EntityName\n const md = this.ProviderToUse;\n this.entityInfo = md.EntityByName(this.EntityName);\n if (!this.entityInfo) {\n LogError(`Entity ${this.EntityName} not found`);\n return;\n }\n\n // Set display fields (you can adjust the logic based on your entity structure)\n if (this.DisplayFields.length === 0) {\n this.DisplayFields = this.entityInfo.Fields.filter(\n (field: EntityFieldInfo) => field.DefaultInView || field.IsPrimaryKey || field.IsNameField || field.IncludeInUserSearchAPI\n );\n }\n\n // Build AG Grid column definitions from display fields\n this.ColumnDefs = this.buildColumnDefs();\n\n // Subscribe to the searchSubject with debounce\n this.searchSubscription = this.searchSubject.pipe(\n debounceTime(this.SearchDebounceTime), // Delay search execution by 300ms\n distinctUntilChanged(), // Only proceed if the search term has changed\n switchMap(term => {\n this.loading = true;\n return this.doSearch(term);\n })\n ).subscribe({\n next: (results: BaseEntity[]) => {\n this.records = results;\n this.loading = false;\n this.searchHasRun = true;\n },\n error: (error) => {\n LogError(error.message);\n this.loading = false;\n this.searchHasRun = true;\n }\n }); \n }\n\n ngOnDestroy() {\n // Cleanup the subscription\n if (this.searchSubscription) {\n this.searchSubscription.unsubscribe();\n }\n }\n\n\n onFind() {\n this.searchSubject.next(this.searchTerm); // Trigger the debounced search\n } \n\n onSearchTermChange(term: string) {\n this.searchTerm = term;\n this.searchSubject.next(term); // Emit the new search term\n }\n\n public onSelectionChange(event: SelectionChangedEvent) {\n const selectedRows = event.api.getSelectedRows();\n if (selectedRows.length > 0) {\n this.OnRecordSelected.emit(selectedRows[0]);\n }\n }\n\n public onGridReady(event: GridReadyEvent) {\n this.gridApi = event.api;\n }\n\n private buildColumnDefs(): ColDef[] {\n return this.DisplayFields.map((field: EntityFieldInfo) => ({\n field: field.Name,\n headerName: field.DisplayNameOrName\n }));\n }\n\n // Stub function for simulating a database search (replace with actual search logic)\n protected async doSearch(searchTerm: string): Promise<BaseEntity[]> {\n const rv = new RunView();\n const result = await rv.RunView({\n EntityName: this.EntityName, \n UserSearchString: searchTerm, \n ResultType: 'entity_object'\n });\n if (result && result.Success) {\n return result.Results;\n this.searchHasRun = true;\n }\n else {\n const errorMessage = `Error searching for ${this.EntityName}: ${result.ErrorMessage}`;\n LogError(errorMessage);\n throw new Error(errorMessage);\n }\n } \n}\n","<div>\n <input\n type=\"text\"\n class=\"mj-input find-textbox\"\n placeholder=\"Start typing to search...\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchTermChange($event)\" />\n <button mjButton variant=\"primary\" class=\"find-button\" (click)=\"onFind()\">Find</button>\n\n @if (loading) {\n <div>Searching...</div>\n }\n @if (!loading && records.length > 0) {\n <div class=\"find-grid-wrapper\">\n <ag-grid-angular\n class=\"find-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"records\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [rowSelection]=\"RowSelectionConfig\"\n (selectionChanged)=\"onSelectionChange($event)\"\n (gridReady)=\"onGridReady($event)\">\n </ag-grid-angular>\n </div>\n }\n @if (!loading && records.length === 0 && searchHasRun) {\n <div>No records found.</div>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-find-record",
3
- "version": "5.48.0",
3
+ "version": "5.49.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",
@@ -18,7 +18,7 @@
18
18
  "devDependencies": {
19
19
  "@angular/compiler": "21.1.3",
20
20
  "@angular/compiler-cli": "21.1.3",
21
- "@memberjunction/ng-test-utils": "5.48.0",
21
+ "@memberjunction/ng-test-utils": "5.49.0",
22
22
  "vitest": "^4.0.18"
23
23
  },
24
24
  "peerDependencies": {
@@ -30,13 +30,14 @@
30
30
  "ag-grid-community": "^35.0.1"
31
31
  },
32
32
  "dependencies": {
33
- "@memberjunction/core": "5.48.0",
34
- "@memberjunction/ng-base-types": "5.48.0",
35
- "@memberjunction/core-entities": "5.48.0",
36
- "@memberjunction/global": "5.48.0",
37
- "@memberjunction/ng-container-directives": "5.48.0",
38
- "@memberjunction/ng-shared": "5.48.0",
39
- "@memberjunction/ng-ui-components": "5.48.0",
33
+ "@memberjunction/core": "5.49.0",
34
+ "@memberjunction/ng-base-types": "5.49.0",
35
+ "@memberjunction/core-entities": "5.49.0",
36
+ "@memberjunction/global": "5.49.0",
37
+ "@memberjunction/ng-container-directives": "5.49.0",
38
+ "@memberjunction/ng-shared": "5.49.0",
39
+ "@memberjunction/ng-shared-generic": "5.49.0",
40
+ "@memberjunction/ng-ui-components": "5.49.0",
40
41
  "rxjs": "^7.8.2",
41
42
  "tslib": "^2.8.1"
42
43
  },