@memberjunction/ng-entity-viewer 5.40.1 → 5.41.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":"entity-cards.component.js","sourceRoot":"","sources":["../../../src/lib/entity-cards/entity-cards.component.ts","../../../src/lib/entity-cards/entity-cards.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, OnInit, SimpleChanges, ElementRef, AfterViewChecked, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityInfo, EntityFieldInfo, EntityFieldValueListType, RunView } from '@memberjunction/core';\nimport { CardTemplate, CardDisplayField, CardFieldType, RecordSelectedEvent, RecordOpenedEvent } from '../types';\nimport { buildCompositeKey, buildPkString, computeFieldsList } from '../utils/record.util';\nimport { PillColorUtil } from '../pill/pill.component';\nimport { HighlightUtil } from '../utils/highlight.util';\n\n/**\n * EntityCardsComponent - Card-based view for entity records\n *\n * This component provides an auto-generated card layout for displaying\n * entity records. Cards are automatically structured based on entity metadata.\n *\n * Supports two modes:\n * 1. Parent-managed data: Records are passed in via [records] input\n * 2. Standalone: Component loads its own data with pagination\n *\n * @example\n * ```html\n * <mj-entity-cards\n * [entity]=\"selectedEntity\"\n * [records]=\"filteredRecords\"\n * [selectedRecordId]=\"selectedId\"\n * (recordSelected)=\"onRecordSelected($event)\"\n * (recordOpened)=\"onRecordOpened($event)\">\n * </mj-entity-cards>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-cards',\n templateUrl: './entity-cards.component.html',\n styleUrls: ['./entity-cards.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class EntityCardsComponent extends BaseAngularComponent implements OnChanges, OnInit, AfterViewChecked {\n constructor(\n private elementRef: ElementRef,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n /**\n * The entity metadata for the records being displayed\n */\n @Input() entity: EntityInfo | null = null;\n\n /**\n * The records to display as cards (optional - component can load its own)\n */\n @Input() records: Record<string, unknown>[] | null = null;\n\n /**\n * The currently selected record's primary key string\n */\n @Input() selectedRecordId: string | null = null;\n\n /**\n * Custom card template (optional - auto-generated if not provided)\n */\n @Input() cardTemplate: CardTemplate | null = null;\n\n /**\n * Map of record IDs to hidden field names that matched the filter\n * Used to display an indicator when a match occurred in a non-visible field\n */\n @Input() hiddenFieldMatches: Map<string, string> = new Map();\n\n /**\n * Current filter text for highlighting matches\n * Supports SQL-style % wildcards\n */\n @Input() filterText: string = '';\n\n /**\n * Page size for standalone data loading\n * @default 100\n */\n @Input() pageSize: number = 100;\n\n /**\n * Emitted when a record is selected (single click)\n */\n @Output() recordSelected = new EventEmitter<RecordSelectedEvent>();\n\n /**\n * Emitted when a record should be opened (double click or open button)\n */\n @Output() recordOpened = new EventEmitter<RecordOpenedEvent>();\n\n /** Auto-generated card template */\n public autoCardTemplate: CardTemplate | null = null;\n\n /** Internal records when loading standalone */\n private internalRecords: Record<string, unknown>[] = [];\n\n /** Track if we're in standalone mode */\n private standaloneMode: boolean = false;\n\n /** Loading state for standalone mode */\n public isLoading: boolean = false;\n\n /** Flag to trigger scroll to selected card after view renders */\n private pendingScrollToSelected: boolean = false;\n\n ngOnInit(): void {\n this.standaloneMode = this.records === null;\n\n if (this.entity?.Fields && !this.effectiveTemplate) {\n this.autoCardTemplate = this.generateCardTemplate(this.entity);\n }\n\n if (this.standaloneMode && this.entity) {\n this.loadData();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['entity'] && this.entity?.Fields) {\n this.autoCardTemplate = this.generateCardTemplate(this.entity);\n } else if (changes['entity'] && !this.entity) {\n this.autoCardTemplate = null;\n }\n\n if (changes['entity'] && this.standaloneMode && this.entity) {\n this.loadData();\n }\n\n if (changes['records']) {\n this.standaloneMode = this.records === null;\n // When records change and we have a selection, scroll to it\n if (this.selectedRecordId) {\n this.pendingScrollToSelected = true;\n }\n }\n\n // When selectedRecordId changes programmatically, scroll to the selected card\n if (changes['selectedRecordId'] && this.selectedRecordId) {\n this.pendingScrollToSelected = true;\n }\n }\n\n ngAfterViewChecked(): void {\n if (this.pendingScrollToSelected && this.selectedRecordId) {\n this.pendingScrollToSelected = false;\n // Delay scroll to allow detail panel animation to complete and layout to stabilize\n // This ensures the scroll happens after the viewport width has adjusted\n setTimeout(() => this.scrollToSelectedCard(), 350);\n }\n }\n\n /**\n * Scroll the selected card into view\n */\n private scrollToSelectedCard(): void {\n if (!this.selectedRecordId) return;\n\n // Find the selected card element using the CSS class\n const selectedCard = this.elementRef.nativeElement.querySelector('.data-card.selected') as HTMLElement;\n if (selectedCard) {\n selectedCard.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n }\n }\n\n /**\n * Get effective records (external or internal)\n */\n get effectiveRecords(): Record<string, unknown>[] {\n return this.records ?? this.internalRecords;\n }\n\n /**\n * Load data in standalone mode\n */\n private async loadData(): Promise<void> {\n if (!this.entity) return;\n\n this.isLoading = true;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: this.entity.Name,\n ResultType: 'simple',\n Fields: computeFieldsList(this.entity),\n MaxRows: this.pageSize\n });\n\n if (result.Success) {\n this.internalRecords = result.Results;\n }\n } catch (error) {\n console.error('Error loading cards data:', error);\n } finally {\n this.isLoading = false;\n }\n }\n\n /**\n * Get the effective card template (custom or auto-generated)\n */\n get effectiveTemplate(): CardTemplate | null {\n return this.cardTemplate || this.autoCardTemplate;\n }\n\n // ========================================\n // TEMPLATE GENERATION\n // ========================================\n\n /**\n * Generate card template from entity metadata\n */\n private generateCardTemplate(entity: EntityInfo): CardTemplate | null {\n const fields = entity.Fields;\n if (!fields || fields.length === 0) return null;\n\n return {\n titleFields: this.findTitleFields(entity, fields),\n subtitleField: this.findSubtitleField(fields),\n descriptionField: this.findDescriptionField(fields),\n displayFields: this.findDisplayFields(fields),\n thumbnailFields: this.findThumbnailFields(fields),\n badgeField: this.findBadgeField(fields)\n };\n }\n\n /**\n * Find all fields that form the record title, in display order.\n * Supports multiple IsNameField fields (e.g., FirstName + LastName → \"Elizabeth Rodriguez\").\n */\n private findTitleFields(entity: EntityInfo, fields: EntityFieldInfo[]): string[] {\n // 1. All IsNameField fields, sorted by Sequence\n const nameFields = fields\n .filter(f => f.IsNameField)\n .sort((a, b) => (a.Sequence ?? 9999) - (b.Sequence ?? 9999));\n if (nameFields.length > 0) return nameFields.map(f => f.Name);\n\n // 2. Single NameField from entity\n if (entity.NameField) return [entity.NameField.Name];\n\n // 3. Heuristic: field named \"Name\" or \"Title\"\n const heuristic = fields.find(f =>\n (f.Name.toLowerCase() === 'name' || f.Name.toLowerCase() === 'title') &&\n f.TSType === 'string' && !f.IsPrimaryKey\n );\n if (heuristic) return [heuristic.Name];\n\n // 4. Field ending with \"Name\"\n const endsWithName = fields.find(f =>\n f.Name.toLowerCase().endsWith('name') && f.TSType === 'string' &&\n !f.IsPrimaryKey && !f.Name.toLowerCase().includes('file')\n );\n if (endsWithName) return [endsWithName.Name];\n\n // 5. First string field\n const firstString = fields.find(f =>\n f.TSType === 'string' && !f.IsPrimaryKey && !f.Name.toLowerCase().includes('id')\n );\n if (firstString) return [firstString.Name];\n\n const pk = fields.find(f => f.IsPrimaryKey);\n return [pk?.Name || 'ID'];\n }\n\n private findSubtitleField(fields: EntityFieldInfo[]): string | null {\n const keywords = ['status', 'type', 'category', 'state', 'stage'];\n for (const keyword of keywords) {\n const field = fields.find(f =>\n f.Name.toLowerCase().includes(keyword) && f.TSType === 'string' && !f.IsPrimaryKey\n );\n if (field) return field.Name;\n }\n return null;\n }\n\n private findDescriptionField(fields: EntityFieldInfo[]): string | null {\n const keywords = ['description', 'desc', 'summary', 'notes', 'comments'];\n for (const keyword of keywords) {\n const field = fields.find(f => f.Name.toLowerCase().includes(keyword) && f.TSType === 'string');\n if (field) return field.Name;\n }\n return null;\n }\n\n private findDisplayFields(fields: EntityFieldInfo[]): CardDisplayField[] {\n const displayFields: CardDisplayField[] = [];\n const excludePatterns = ['id', 'name', 'title', 'description', 'desc', 'summary', 'notes',\n 'status', 'type', 'category', 'state', 'stage', 'password', 'secret',\n '__mj_', 'createdat', 'updatedat', 'createdby', 'updatedby'];\n\n const defaultInViewFields = fields.filter(f =>\n f.DefaultInView === true && !f.IsPrimaryKey &&\n !excludePatterns.some(p => f.Name.toLowerCase().includes(p))\n );\n\n for (const field of defaultInViewFields) {\n if (displayFields.length >= 4) break;\n displayFields.push({\n name: field.Name,\n type: this.getFieldType(field),\n label: this.getFieldLabel(field)\n });\n }\n\n if (displayFields.length >= 2) return displayFields;\n\n const metricKeywords = ['amount', 'total', 'count', 'value', 'price', 'cost', 'quantity', 'qty', 'balance', 'revenue', 'score'];\n for (const field of fields) {\n if (displayFields.length >= 4) break;\n if (displayFields.some(df => df.name === field.Name)) continue;\n\n if (metricKeywords.some(kw => field.Name.toLowerCase().includes(kw))) {\n displayFields.push({\n name: field.Name,\n type: this.getFieldType(field),\n label: this.getFieldLabel(field)\n });\n }\n }\n\n return displayFields;\n }\n\n /**\n * Find all potential thumbnail fields in priority order\n * Returns an array so we can fall back per-record if one is empty\n */\n private findThumbnailFields(fields: EntityFieldInfo[]): string[] {\n const imageKeywords = ['image', 'photo', 'picture', 'thumbnail', 'avatar', 'logo', 'icon'];\n const foundFields: string[] = [];\n const foundFieldNames = new Set<string>();\n\n for (const keyword of imageKeywords) {\n const matchingFields = fields.filter(f =>\n f.Name.toLowerCase().includes(keyword) &&\n f.TSType === 'string' &&\n !foundFieldNames.has(f.Name)\n );\n for (const field of matchingFields) {\n foundFields.push(field.Name);\n foundFieldNames.add(field.Name);\n }\n }\n return foundFields;\n }\n\n private findBadgeField(fields: EntityFieldInfo[]): string | null {\n const keywords = ['priority', 'severity', 'importance', 'rating', 'rank', 'level'];\n for (const keyword of keywords) {\n const field = fields.find(f => f.Name.toLowerCase().includes(keyword));\n if (field) return field.Name;\n }\n return null;\n }\n\n private getFieldType(field: EntityFieldInfo): CardFieldType {\n if (field.TSType === 'boolean' || field.Type?.toLowerCase() === 'bit') return 'boolean';\n if (field.TSType === 'number') return 'number';\n if (field.TSType === 'Date' || field.Type?.toLowerCase().includes('date')) return 'date';\n return 'text';\n }\n\n // ========================================\n // VALUE FORMATTING\n // ========================================\n\n getFieldValue(record: Record<string, unknown>, fieldName: string | null): string {\n if (!fieldName) return '';\n const value = record[fieldName];\n if (value === null || value === undefined) return '';\n return String(value);\n }\n\n getNumericValue(record: Record<string, unknown>, fieldName: string): string {\n const value = record[fieldName];\n if (value === null || value === undefined) return '-';\n\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;\n if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;\n\n const fieldNameLower = fieldName.toLowerCase();\n if (['amount', 'price', 'cost', 'value', 'revenue', 'total'].some(k => fieldNameLower.includes(k))) {\n return `$${num.toLocaleString()}`;\n }\n\n return num.toLocaleString();\n }\n\n getBooleanValue(record: Record<string, unknown>, fieldName: string): boolean {\n const value = record[fieldName];\n if (value === null || value === undefined) return false;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value !== 0;\n if (typeof value === 'string') return value.toLowerCase() === 'true' || value === '1';\n return Boolean(value);\n }\n\n getTextValue(record: Record<string, unknown>, fieldName: string, maxLength: number = 50): string {\n const value = this.getFieldValue(record, fieldName);\n if (!value) return '-';\n if (value.length <= maxLength) return value;\n return value.substring(0, maxLength) + '...';\n }\n\n getDateValue(record: Record<string, unknown>, fieldName: string): string {\n const value = record[fieldName];\n if (value === null || value === undefined) return '-';\n\n try {\n const date = value instanceof Date ? value : new Date(value as string | number);\n if (isNaN(date.getTime())) return String(value);\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });\n } catch {\n return String(value);\n }\n }\n\n /**\n * Get display label for a field using EntityFieldInfo's built-in DisplayNameOrName property\n */\n getFieldLabel(field: EntityFieldInfo): string {\n return field.DisplayNameOrName;\n }\n\n // ========================================\n // CARD DISPLAY HELPERS\n // ========================================\n\n getRecordTrackId(record: Record<string, unknown>, index: number): string {\n if (!this.entity) return `record_${index}`;\n try {\n const pk = buildPkString(record, this.entity);\n if (pk && pk.trim().length > 0) return pk;\n } catch { /* ignore */ }\n return `record_${index}`;\n }\n\n isSelected(record: Record<string, unknown>): boolean {\n if (!this.entity) return false;\n return buildPkString(record, this.entity) === this.selectedRecordId;\n }\n\n onCardClick(record: Record<string, unknown>): void {\n if (!this.entity) return;\n this.recordSelected.emit({\n record,\n entity: this.entity,\n compositeKey: buildCompositeKey(record, this.entity)\n });\n }\n\n onOpenClick(event: Event, record: Record<string, unknown>): void {\n event.stopPropagation();\n if (!this.entity) return;\n this.recordOpened.emit({\n record,\n entity: this.entity,\n compositeKey: buildCompositeKey(record, this.entity)\n });\n }\n\n /**\n * Get the combined title from all title fields for a record.\n * Joins multiple IsNameField values with spaces (e.g., \"Elizabeth Rodriguez\").\n */\n getCombinedTitle(record: Record<string, unknown>): string {\n const template = this.effectiveTemplate;\n if (!template?.titleFields || template.titleFields.length === 0) return '';\n const parts = template.titleFields\n .map(f => this.getFieldValue(record, f))\n .filter(v => v && v.trim().length > 0);\n return parts.length > 0 ? parts.join(' ') : '';\n }\n\n getInitials(record: Record<string, unknown>): string {\n const title = this.getCombinedTitle(record);\n if (!title) return '?';\n\n const words = title.split(/\\s+/).filter(w => w.length > 0);\n if (words.length === 1) return words[0].substring(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n }\n\n /**\n * Get the thumbnail type for a record, with per-record fallback through thumbnailFields\n */\n getThumbnailType(record: Record<string, unknown>): 'image' | 'icon' | 'none' {\n const fieldInfo = this.getEffectiveThumbnailField(record);\n if (!fieldInfo) return 'none';\n\n const { fieldName, value } = fieldInfo;\n\n // Check if value is an image URL\n if (this.isImageValue(value)) return 'image';\n\n // Check if value looks like an icon class\n if (this.isIconClass(value)) return 'icon';\n\n // If field name suggests it's an icon field, treat non-URL values as icon classes\n const fieldNameLower = fieldName.toLowerCase();\n if (fieldNameLower.includes('icon') || fieldNameLower.includes('class')) {\n return 'icon';\n }\n\n return 'none';\n }\n\n /**\n * Get the thumbnail URL/value for a record, with per-record fallback\n */\n getThumbnailUrl(record: Record<string, unknown>): string {\n const fieldInfo = this.getEffectiveThumbnailField(record);\n return fieldInfo?.value || '';\n }\n\n /**\n * Find the first thumbnail field that has a value for this record\n * Returns both the field name and value for type determination\n */\n private getEffectiveThumbnailField(record: Record<string, unknown>): { fieldName: string; value: string } | null {\n const template = this.effectiveTemplate;\n if (!template?.thumbnailFields || template.thumbnailFields.length === 0) return null;\n\n // Try each field in priority order until we find one with a value\n for (const fieldName of template.thumbnailFields) {\n const value = this.getFieldValue(record, fieldName);\n if (value && value.trim() !== '') {\n return { fieldName, value };\n }\n }\n\n return null;\n }\n\n private isImageValue(value: string): boolean {\n if (!value) return false;\n const trimmed = value.trim();\n if (trimmed.startsWith('data:image/')) return true;\n if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) return true;\n return false;\n }\n\n private isIconClass(value: string): boolean {\n if (!value) return false;\n const trimmed = value.trim().toLowerCase();\n if (trimmed.startsWith('fa-') || trimmed.startsWith('fa ') ||\n trimmed.startsWith('fas ') || trimmed.startsWith('far ') ||\n trimmed.startsWith('fal ') || trimmed.startsWith('fab ')) return true;\n if (trimmed.includes('material-icons') || trimmed.startsWith('mat-icon')) return true;\n if (trimmed.startsWith('bi-') || trimmed.startsWith('bi ')) return true;\n return false;\n }\n\n getRecordColor(record: Record<string, unknown>): string {\n if (!this.entity) return 'var(--mj-brand-primary)';\n const colors = ['var(--mj-brand-primary)', 'var(--mj-status-success)', 'var(--mj-status-warning)', 'var(--mj-brand-primary)', 'var(--mj-status-error)', 'var(--mj-brand-primary)', 'var(--mj-text-muted)', 'var(--mj-text-secondary)'];\n const pk = buildPkString(record, this.entity);\n let hash = 0;\n for (let i = 0; i < pk.length; i++) {\n hash = pk.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n\n isEnumField(fieldName: string): boolean {\n if (!this.entity) return false;\n const field = this.entity.Fields.find(f => f.Name === fieldName);\n if (!field) return false;\n return field.ValueListTypeEnum !== EntityFieldValueListType.None && field.EntityFieldValues.length > 0;\n }\n\n get subtitleIsPill(): boolean {\n const template = this.effectiveTemplate;\n if (!template?.subtitleField || !this.entity) return false;\n return this.isEnumField(template.subtitleField);\n }\n\n getPillColorType(value: string): string {\n return PillColorUtil.getColorType(value);\n }\n\n /**\n * Check if a record matched on a hidden field\n */\n hasHiddenFieldMatch(record: Record<string, unknown>): boolean {\n if (!this.entity) return false;\n return this.hiddenFieldMatches.has(buildPkString(record, this.entity));\n }\n\n /**\n * Get the display name of the hidden field that matched\n */\n getHiddenMatchFieldName(record: Record<string, unknown>): string {\n if (!this.entity) return '';\n const fieldName = this.hiddenFieldMatches.get(buildPkString(record, this.entity));\n if (!fieldName || !this.entity) return '';\n // Look up the field in entity metadata and use DisplayNameOrName\n const field = this.entity.Fields.find(f => f.Name === fieldName);\n return field ? field.DisplayNameOrName : fieldName;\n }\n\n /**\n * Highlight matching text in a string based on the filter text\n * Uses HighlightUtil which only highlights if the text actually matches the pattern\n */\n highlightMatch(text: string): string {\n return HighlightUtil.highlight(text, this.filterText, false);\n }\n}\n","<div class=\"cards-view-wrapper\">\n @if (isLoading && effectiveRecords.length === 0) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading records...\"></mj-loading>\n </div>\n } @else {\n <div class=\"cards-container\">\n @for (record of effectiveRecords; track getRecordTrackId(record, $index)) {\n <div\n class=\"data-card\"\n [class.selected]=\"isSelected(record)\"\n (click)=\"onCardClick(record)\">\n\n <!-- Card Header with Avatar/Icon -->\n <div class=\"card-header\">\n @switch (getThumbnailType(record)) {\n @case ('image') {\n <div class=\"card-thumbnail\">\n <img [src]=\"getThumbnailUrl(record)\" alt=\"\" />\n </div>\n }\n @case ('icon') {\n <div class=\"card-avatar\" [style.background-color]=\"getRecordColor(record)\">\n <i [class]=\"getThumbnailUrl(record)\"></i>\n </div>\n }\n @default {\n <div class=\"card-avatar\" [style.background-color]=\"getRecordColor(record)\">\n {{ getInitials(record) }}\n </div>\n }\n }\n\n <div class=\"card-header-content\">\n <h3 class=\"card-title\" [innerHTML]=\"highlightMatch(getCombinedTitle(record))\"></h3>\n @if (effectiveTemplate?.subtitleField; as subField) {\n @if (subtitleIsPill) {\n <mj-pill [value]=\"getFieldValue(record, subField)\"></mj-pill>\n } @else {\n <span class=\"card-subtitle\" [innerHTML]=\"highlightMatch(getFieldValue(record, subField))\"></span>\n }\n }\n </div>\n\n <button class=\"card-open-btn\" (click)=\"onOpenClick($event, record)\" title=\"Open Record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (effectiveTemplate?.descriptionField; as descField) {\n <p class=\"card-description\" [innerHTML]=\"highlightMatch(getTextValue(record, descField, 100))\"></p>\n }\n\n <!-- Display Fields -->\n @if (effectiveTemplate && effectiveTemplate.displayFields.length > 0) {\n <div class=\"card-fields\">\n @for (field of effectiveTemplate.displayFields; track field.name) {\n <div class=\"field-item\" [class.field-boolean]=\"field.type === 'boolean'\" [class.field-text]=\"field.type === 'text'\">\n @switch (field.type) {\n @case ('boolean') {\n <i class=\"field-icon\" [class.fa-solid]=\"true\"\n [class.fa-check]=\"getBooleanValue(record, field.name)\"\n [class.fa-minus]=\"!getBooleanValue(record, field.name)\"\n [class.bool-true]=\"getBooleanValue(record, field.name)\"\n [class.bool-false]=\"!getBooleanValue(record, field.name)\"></i>\n <span class=\"field-label\">{{ field.label }}</span>\n }\n @case ('number') {\n <span class=\"field-value\">{{ getNumericValue(record, field.name) }}</span>\n <span class=\"field-label\">{{ field.label }}</span>\n }\n @case ('date') {\n <span class=\"field-value field-date\">{{ getDateValue(record, field.name) }}</span>\n <span class=\"field-label\">{{ field.label }}</span>\n }\n @default {\n <span class=\"field-label\">{{ field.label }}</span>\n <span class=\"field-text-value\" [innerHTML]=\"highlightMatch(getTextValue(record, field.name, 40))\"></span>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Card Footer with Badge -->\n @if (effectiveTemplate?.badgeField; as badgeField) {\n <div class=\"card-footer\">\n <mj-pill [value]=\"getFieldValue(record, badgeField)\"></mj-pill>\n </div>\n }\n\n <!-- Hidden field match indicator -->\n @if (hasHiddenFieldMatch(record)) {\n <div class=\"hidden-match-indicator\" [title]=\"'Matched in: ' + getHiddenMatchFieldName(record)\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>{{ getHiddenMatchFieldName(record) }}</span>\n </div>\n }\n </div>\n }\n\n @if (effectiveRecords.length === 0) {\n <div class=\"no-results\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No records to display</p>\n </div>\n }\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"entity-cards.component.js","sourceRoot":"","sources":["../../../src/lib/entity-cards/entity-cards.component.ts","../../../src/lib/entity-cards/entity-cards.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, OnInit, SimpleChanges, ElementRef, AfterViewChecked, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityInfo, EntityFieldInfo, EntityFieldValueListType, RunView } from '@memberjunction/core';\nimport { CardTemplate, CardDisplayField, CardFieldType, RecordSelectedEvent, RecordOpenedEvent } from '../types';\nimport { buildCompositeKey, buildPkString, computeFieldsList } from '../utils/record.util';\nimport { PillColorUtil } from '../pill/pill.component';\nimport { HighlightUtil } from '../utils/highlight.util';\n\n/**\n * Precomputed display field value for a card, resolved once per record per\n * (records/filter/template) change rather than via per-CD method calls.\n */\ninterface CardDisplayFieldVM {\n /** The underlying display field definition (name/type/label). */\n field: CardDisplayField;\n /** Boolean value (used when field.type === 'boolean'). */\n booleanValue: boolean;\n /** Numeric display string (used when field.type === 'number'). */\n numericValue: string;\n /** Date display string (used when field.type === 'date'). */\n dateValue: string;\n /** Highlighted text HTML (used for default/text fields). */\n highlightedText: string;\n}\n\n/**\n * Precomputed, per-record view-model backing a single card. Built once whenever\n * the source records, filter text, or template change — NOT on every Angular\n * change-detection cycle. Mirrors the canonical precompute pattern used by\n * conversations' MessageItemComponent (`_messageClasses` / `buildMessageClasses`).\n */\ninterface CardViewModel {\n /** The original record (passed through to event emitters). */\n record: Record<string, unknown>;\n /** Stable PK concatenated string — computed ONCE here instead of 4-5x/CD. */\n pkString: string;\n /** Stable track id for @for (falls back to record_<index> when no PK). */\n trackId: string;\n /** Whether this card is the currently selected record. */\n isSelected: boolean;\n /** Avatar/background color derived from the PK hash. */\n color: string;\n /** How to render the thumbnail (image/icon/none). */\n thumbnailType: 'image' | 'icon' | 'none';\n /** Thumbnail URL/value (image src or icon class). */\n thumbnailUrl: string;\n /** Two-letter initials shown when there is no thumbnail. */\n initials: string;\n /** Highlighted combined title HTML. */\n highlightedTitle: string;\n /** Raw subtitle value (used for the pill rendering path). */\n subtitleValue: string;\n /** Highlighted subtitle HTML (used for the non-pill rendering path). */\n highlightedSubtitle: string;\n /** Highlighted description HTML (empty when no description field). */\n highlightedDescription: string;\n /** Precomputed display field VMs in template order. */\n displayFields: CardDisplayFieldVM[];\n /** Raw badge value (used for the footer pill). */\n badgeValue: string;\n /** Whether this record matched on a hidden (non-visible) field. */\n hasHiddenFieldMatch: boolean;\n /** Display name of the hidden field that matched ('' when none). */\n hiddenMatchFieldName: string;\n}\n\n/**\n * EntityCardsComponent - Card-based view for entity records\n *\n * This component provides an auto-generated card layout for displaying\n * entity records. Cards are automatically structured based on entity metadata.\n *\n * Supports two modes:\n * 1. Parent-managed data: Records are passed in via [records] input\n * 2. Standalone: Component loads its own data with pagination\n *\n * @example\n * ```html\n * <mj-entity-cards\n * [entity]=\"selectedEntity\"\n * [records]=\"filteredRecords\"\n * [selectedRecordId]=\"selectedId\"\n * (recordSelected)=\"onRecordSelected($event)\"\n * (recordOpened)=\"onRecordOpened($event)\">\n * </mj-entity-cards>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-entity-cards',\n templateUrl: './entity-cards.component.html',\n styleUrls: ['./entity-cards.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class EntityCardsComponent extends BaseAngularComponent implements OnChanges, OnInit, AfterViewChecked {\n constructor(\n private elementRef: ElementRef,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n /**\n * The entity metadata for the records being displayed\n */\n @Input() entity: EntityInfo | null = null;\n\n /**\n * The records to display as cards (optional - component can load its own)\n */\n @Input() records: Record<string, unknown>[] | null = null;\n\n /**\n * The currently selected record's primary key string\n */\n @Input() selectedRecordId: string | null = null;\n\n /**\n * Custom card template (optional - auto-generated if not provided)\n */\n @Input() cardTemplate: CardTemplate | null = null;\n\n /**\n * Map of record IDs to hidden field names that matched the filter\n * Used to display an indicator when a match occurred in a non-visible field\n */\n @Input() hiddenFieldMatches: Map<string, string> = new Map();\n\n /**\n * Current filter text for highlighting matches\n * Supports SQL-style % wildcards\n */\n @Input() filterText: string = '';\n\n /**\n * Page size for standalone data loading\n * @default 100\n */\n @Input() pageSize: number = 100;\n\n /**\n * Emitted when a record is selected (single click)\n */\n @Output() recordSelected = new EventEmitter<RecordSelectedEvent>();\n\n /**\n * Emitted when a record should be opened (double click or open button)\n */\n @Output() recordOpened = new EventEmitter<RecordOpenedEvent>();\n\n /** Auto-generated card template */\n public autoCardTemplate: CardTemplate | null = null;\n\n /** Internal records when loading standalone */\n private internalRecords: Record<string, unknown>[] = [];\n\n /** Track if we're in standalone mode */\n private standaloneMode: boolean = false;\n\n /** Loading state for standalone mode */\n public isLoading: boolean = false;\n\n /** Flag to trigger scroll to selected card after view renders */\n private pendingScrollToSelected: boolean = false;\n\n /**\n * Precomputed per-record view-models bound by the template's @for. Rebuilt\n * only when the source records, filter, selection, hidden matches, or template\n * change — never per change-detection cycle. This eliminates the 4-5\n * buildPkString() allocations + 4 RegExp-building highlight calls that the\n * previous per-card-per-CD method bindings incurred.\n */\n public cardViewModels: CardViewModel[] = [];\n\n ngOnInit(): void {\n this.standaloneMode = this.records === null;\n\n if (this.entity?.Fields && !this.effectiveTemplate) {\n this.autoCardTemplate = this.generateCardTemplate(this.entity);\n }\n\n if (this.standaloneMode && this.entity) {\n this.loadData();\n }\n\n this.buildCardViewModels();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['entity'] && this.entity?.Fields) {\n this.autoCardTemplate = this.generateCardTemplate(this.entity);\n } else if (changes['entity'] && !this.entity) {\n this.autoCardTemplate = null;\n }\n\n if (changes['entity'] && this.standaloneMode && this.entity) {\n this.loadData();\n }\n\n if (changes['records']) {\n this.standaloneMode = this.records === null;\n // When records change and we have a selection, scroll to it\n if (this.selectedRecordId) {\n this.pendingScrollToSelected = true;\n }\n }\n\n // When selectedRecordId changes programmatically, scroll to the selected card\n if (changes['selectedRecordId'] && this.selectedRecordId) {\n this.pendingScrollToSelected = true;\n }\n\n // Rebuild the precomputed VMs whenever any input that affects card *content*\n // changes. cardTemplate is included because effectiveTemplate derives from it.\n // A selection-only change must NOT trigger a full rebuild — that would re-run\n // the expensive per-card buildPkString()/CompositeKey allocations and the 4\n // RegExp-building highlightMatch() calls for every card on every selection\n // click (O(n) heavy work). Instead we only flip the cheap isSelected flags.\n const contentChanged = !!(changes['records'] || changes['filterText'] ||\n changes['hiddenFieldMatches'] || changes['entity'] || changes['cardTemplate']);\n if (contentChanged) {\n // Full rebuild also recomputes isSelected correctly (buildCardViewModel does).\n this.buildCardViewModels();\n } else if (changes['selectedRecordId']) {\n // Selection-only change: just update the isSelected flags on the existing\n // VMs (string compare per card — no rebuild, no regex, no allocation).\n this.updateSelectionFlags();\n }\n }\n\n ngAfterViewChecked(): void {\n if (this.pendingScrollToSelected && this.selectedRecordId) {\n this.pendingScrollToSelected = false;\n // Delay scroll to allow detail panel animation to complete and layout to stabilize\n // This ensures the scroll happens after the viewport width has adjusted\n setTimeout(() => this.scrollToSelectedCard(), 350);\n }\n }\n\n /**\n * Scroll the selected card into view\n */\n private scrollToSelectedCard(): void {\n if (!this.selectedRecordId) return;\n\n // Find the selected card element using the CSS class\n const selectedCard = this.elementRef.nativeElement.querySelector('.data-card.selected') as HTMLElement;\n if (selectedCard) {\n selectedCard.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n }\n }\n\n /**\n * Get effective records (external or internal)\n */\n get effectiveRecords(): Record<string, unknown>[] {\n return this.records ?? this.internalRecords;\n }\n\n /**\n * Load data in standalone mode\n */\n private async loadData(): Promise<void> {\n if (!this.entity) return;\n\n this.isLoading = true;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: this.entity.Name,\n ResultType: 'simple',\n Fields: computeFieldsList(this.entity),\n MaxRows: this.pageSize\n });\n\n if (result.Success) {\n this.internalRecords = result.Results;\n this.buildCardViewModels();\n }\n } catch (error) {\n console.error('Error loading cards data:', error);\n } finally {\n this.isLoading = false;\n }\n }\n\n /**\n * Get the effective card template (custom or auto-generated)\n */\n get effectiveTemplate(): CardTemplate | null {\n return this.cardTemplate || this.autoCardTemplate;\n }\n\n // ========================================\n // TEMPLATE GENERATION\n // ========================================\n\n /**\n * Generate card template from entity metadata\n */\n private generateCardTemplate(entity: EntityInfo): CardTemplate | null {\n const fields = entity.Fields;\n if (!fields || fields.length === 0) return null;\n\n return {\n titleFields: this.findTitleFields(entity, fields),\n subtitleField: this.findSubtitleField(fields),\n descriptionField: this.findDescriptionField(fields),\n displayFields: this.findDisplayFields(fields),\n thumbnailFields: this.findThumbnailFields(fields),\n badgeField: this.findBadgeField(fields)\n };\n }\n\n /**\n * Find all fields that form the record title, in display order.\n * Supports multiple IsNameField fields (e.g., FirstName + LastName → \"Elizabeth Rodriguez\").\n */\n private findTitleFields(entity: EntityInfo, fields: EntityFieldInfo[]): string[] {\n // 1. All IsNameField fields, sorted by Sequence\n const nameFields = fields\n .filter(f => f.IsNameField)\n .sort((a, b) => (a.Sequence ?? 9999) - (b.Sequence ?? 9999));\n if (nameFields.length > 0) return nameFields.map(f => f.Name);\n\n // 2. Single NameField from entity\n if (entity.NameField) return [entity.NameField.Name];\n\n // 3. Heuristic: field named \"Name\" or \"Title\"\n const heuristic = fields.find(f =>\n (f.Name.toLowerCase() === 'name' || f.Name.toLowerCase() === 'title') &&\n f.TSType === 'string' && !f.IsPrimaryKey\n );\n if (heuristic) return [heuristic.Name];\n\n // 4. Field ending with \"Name\"\n const endsWithName = fields.find(f =>\n f.Name.toLowerCase().endsWith('name') && f.TSType === 'string' &&\n !f.IsPrimaryKey && !f.Name.toLowerCase().includes('file')\n );\n if (endsWithName) return [endsWithName.Name];\n\n // 5. First string field\n const firstString = fields.find(f =>\n f.TSType === 'string' && !f.IsPrimaryKey && !f.Name.toLowerCase().includes('id')\n );\n if (firstString) return [firstString.Name];\n\n const pk = fields.find(f => f.IsPrimaryKey);\n return [pk?.Name || 'ID'];\n }\n\n private findSubtitleField(fields: EntityFieldInfo[]): string | null {\n const keywords = ['status', 'type', 'category', 'state', 'stage'];\n for (const keyword of keywords) {\n const field = fields.find(f =>\n f.Name.toLowerCase().includes(keyword) && f.TSType === 'string' && !f.IsPrimaryKey\n );\n if (field) return field.Name;\n }\n return null;\n }\n\n private findDescriptionField(fields: EntityFieldInfo[]): string | null {\n const keywords = ['description', 'desc', 'summary', 'notes', 'comments'];\n for (const keyword of keywords) {\n const field = fields.find(f => f.Name.toLowerCase().includes(keyword) && f.TSType === 'string');\n if (field) return field.Name;\n }\n return null;\n }\n\n private findDisplayFields(fields: EntityFieldInfo[]): CardDisplayField[] {\n const displayFields: CardDisplayField[] = [];\n const excludePatterns = ['id', 'name', 'title', 'description', 'desc', 'summary', 'notes',\n 'status', 'type', 'category', 'state', 'stage', 'password', 'secret',\n '__mj_', 'createdat', 'updatedat', 'createdby', 'updatedby'];\n\n const defaultInViewFields = fields.filter(f =>\n f.DefaultInView === true && !f.IsPrimaryKey &&\n !excludePatterns.some(p => f.Name.toLowerCase().includes(p))\n );\n\n for (const field of defaultInViewFields) {\n if (displayFields.length >= 4) break;\n displayFields.push({\n name: field.Name,\n type: this.getFieldType(field),\n label: this.getFieldLabel(field)\n });\n }\n\n if (displayFields.length >= 2) return displayFields;\n\n const metricKeywords = ['amount', 'total', 'count', 'value', 'price', 'cost', 'quantity', 'qty', 'balance', 'revenue', 'score'];\n for (const field of fields) {\n if (displayFields.length >= 4) break;\n if (displayFields.some(df => df.name === field.Name)) continue;\n\n if (metricKeywords.some(kw => field.Name.toLowerCase().includes(kw))) {\n displayFields.push({\n name: field.Name,\n type: this.getFieldType(field),\n label: this.getFieldLabel(field)\n });\n }\n }\n\n return displayFields;\n }\n\n /**\n * Find all potential thumbnail fields in priority order\n * Returns an array so we can fall back per-record if one is empty\n */\n private findThumbnailFields(fields: EntityFieldInfo[]): string[] {\n const imageKeywords = ['image', 'photo', 'picture', 'thumbnail', 'avatar', 'logo', 'icon'];\n const foundFields: string[] = [];\n const foundFieldNames = new Set<string>();\n\n for (const keyword of imageKeywords) {\n const matchingFields = fields.filter(f =>\n f.Name.toLowerCase().includes(keyword) &&\n f.TSType === 'string' &&\n !foundFieldNames.has(f.Name)\n );\n for (const field of matchingFields) {\n foundFields.push(field.Name);\n foundFieldNames.add(field.Name);\n }\n }\n return foundFields;\n }\n\n private findBadgeField(fields: EntityFieldInfo[]): string | null {\n const keywords = ['priority', 'severity', 'importance', 'rating', 'rank', 'level'];\n for (const keyword of keywords) {\n const field = fields.find(f => f.Name.toLowerCase().includes(keyword));\n if (field) return field.Name;\n }\n return null;\n }\n\n private getFieldType(field: EntityFieldInfo): CardFieldType {\n if (field.TSType === 'boolean' || field.Type?.toLowerCase() === 'bit') return 'boolean';\n if (field.TSType === 'number') return 'number';\n if (field.TSType === 'Date' || field.Type?.toLowerCase().includes('date')) return 'date';\n return 'text';\n }\n\n // ========================================\n // VALUE FORMATTING\n // ========================================\n\n getFieldValue(record: Record<string, unknown>, fieldName: string | null): string {\n if (!fieldName) return '';\n const value = record[fieldName];\n if (value === null || value === undefined) return '';\n return String(value);\n }\n\n getNumericValue(record: Record<string, unknown>, fieldName: string): string {\n const value = record[fieldName];\n if (value === null || value === undefined) return '-';\n\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;\n if (num >= 1000) return `${(num / 1000).toFixed(1)}K`;\n\n const fieldNameLower = fieldName.toLowerCase();\n if (['amount', 'price', 'cost', 'value', 'revenue', 'total'].some(k => fieldNameLower.includes(k))) {\n return `$${num.toLocaleString()}`;\n }\n\n return num.toLocaleString();\n }\n\n getBooleanValue(record: Record<string, unknown>, fieldName: string): boolean {\n const value = record[fieldName];\n if (value === null || value === undefined) return false;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'number') return value !== 0;\n if (typeof value === 'string') return value.toLowerCase() === 'true' || value === '1';\n return Boolean(value);\n }\n\n getTextValue(record: Record<string, unknown>, fieldName: string, maxLength: number = 50): string {\n const value = this.getFieldValue(record, fieldName);\n if (!value) return '-';\n if (value.length <= maxLength) return value;\n return value.substring(0, maxLength) + '...';\n }\n\n getDateValue(record: Record<string, unknown>, fieldName: string): string {\n const value = record[fieldName];\n if (value === null || value === undefined) return '-';\n\n try {\n const date = value instanceof Date ? value : new Date(value as string | number);\n if (isNaN(date.getTime())) return String(value);\n return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });\n } catch {\n return String(value);\n }\n }\n\n /**\n * Get display label for a field using EntityFieldInfo's built-in DisplayNameOrName property\n */\n getFieldLabel(field: EntityFieldInfo): string {\n return field.DisplayNameOrName;\n }\n\n // ========================================\n // CARD DISPLAY HELPERS\n // ========================================\n\n getRecordTrackId(record: Record<string, unknown>, index: number): string {\n if (!this.entity) return `record_${index}`;\n try {\n const pk = buildPkString(record, this.entity);\n if (pk && pk.trim().length > 0) return pk;\n } catch { /* ignore */ }\n return `record_${index}`;\n }\n\n isSelected(record: Record<string, unknown>): boolean {\n if (!this.entity) return false;\n return buildPkString(record, this.entity) === this.selectedRecordId;\n }\n\n onCardClick(record: Record<string, unknown>): void {\n if (!this.entity) return;\n this.recordSelected.emit({\n record,\n entity: this.entity,\n compositeKey: buildCompositeKey(record, this.entity)\n });\n }\n\n onOpenClick(event: Event, record: Record<string, unknown>): void {\n event.stopPropagation();\n if (!this.entity) return;\n this.recordOpened.emit({\n record,\n entity: this.entity,\n compositeKey: buildCompositeKey(record, this.entity)\n });\n }\n\n // ========================================\n // PRECOMPUTED VIEW-MODELS (perf)\n // ========================================\n\n /**\n * Rebuild the precomputed per-record view-models. Called from ngOnInit,\n * ngOnChanges (on any render-affecting input), and after standalone loadData.\n * Doing this work here — once per data/filter/selection change — instead of via\n * template method bindings avoids re-running it on every Angular CD cycle.\n */\n private buildCardViewModels(): void {\n const records = this.effectiveRecords;\n this.cardViewModels = records.map((record, index) => this.buildCardViewModel(record, index));\n }\n\n /**\n * Cheaply update the isSelected flag on the EXISTING card view-models in place,\n * preserving the array and every VM object reference. Called when ONLY\n * selectedRecordId changes — avoids a full buildCardViewModels() rebuild (which\n * re-runs buildPkString() allocations + RegExp-building highlightMatch() calls\n * per card). Uses the already-computed vm.pkString, so this is a plain string\n * compare per card with zero allocation or regex work.\n */\n private updateSelectionFlags(): void {\n for (const vm of this.cardViewModels) {\n vm.isSelected = vm.pkString.length > 0 && vm.pkString === this.selectedRecordId;\n }\n }\n\n /**\n * Build a single card view-model, computing the PK string exactly once and\n * reusing it for selection, color, hidden-match, and track-id derivation.\n */\n private buildCardViewModel(record: Record<string, unknown>, index: number): CardViewModel {\n const pkString = this.computePkString(record);\n const trackId = pkString && pkString.trim().length > 0 ? pkString : `record_${index}`;\n const template = this.effectiveTemplate;\n\n const subtitleField = template?.subtitleField ?? null;\n const subtitleValue = subtitleField ? this.getFieldValue(record, subtitleField) : '';\n const descriptionField = template?.descriptionField ?? null;\n\n return {\n record,\n pkString,\n trackId,\n isSelected: pkString.length > 0 && pkString === this.selectedRecordId,\n color: this.computeRecordColor(pkString),\n thumbnailType: this.getThumbnailType(record),\n thumbnailUrl: this.getThumbnailUrl(record),\n initials: this.getInitials(record),\n highlightedTitle: this.highlightMatch(this.getCombinedTitle(record)),\n subtitleValue,\n highlightedSubtitle: this.highlightMatch(subtitleValue),\n highlightedDescription: descriptionField\n ? this.highlightMatch(this.getTextValue(record, descriptionField, 100))\n : '',\n displayFields: this.buildDisplayFieldVMs(record, template),\n badgeValue: template?.badgeField ? this.getFieldValue(record, template.badgeField) : '',\n hasHiddenFieldMatch: this.computeHasHiddenFieldMatch(pkString),\n hiddenMatchFieldName: this.computeHiddenMatchFieldName(pkString)\n };\n }\n\n /**\n * Precompute the display-field VMs for a record, in template order.\n */\n private buildDisplayFieldVMs(record: Record<string, unknown>, template: CardTemplate | null): CardDisplayFieldVM[] {\n if (!template || template.displayFields.length === 0) return [];\n return template.displayFields.map(field => ({\n field,\n booleanValue: this.getBooleanValue(record, field.name),\n numericValue: this.getNumericValue(record, field.name),\n dateValue: this.getDateValue(record, field.name),\n highlightedText: this.highlightMatch(this.getTextValue(record, field.name, 40))\n }));\n }\n\n /**\n * Compute the PK concatenated string for a record. Returns '' when no entity\n * or on error, so callers can treat it as \"no stable key\".\n */\n private computePkString(record: Record<string, unknown>): string {\n if (!this.entity) return '';\n try {\n return buildPkString(record, this.entity);\n } catch {\n return '';\n }\n }\n\n /**\n * Derive the avatar/background color from an already-computed PK string.\n */\n private computeRecordColor(pkString: string): string {\n if (!this.entity || !pkString) return 'var(--mj-brand-primary)';\n const colors = ['var(--mj-brand-primary)', 'var(--mj-status-success)', 'var(--mj-status-warning)', 'var(--mj-brand-primary)', 'var(--mj-status-error)', 'var(--mj-brand-primary)', 'var(--mj-text-muted)', 'var(--mj-text-secondary)'];\n let hash = 0;\n for (let i = 0; i < pkString.length; i++) {\n hash = pkString.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n }\n\n /**\n * Whether the record (by PK string) matched on a hidden field.\n */\n private computeHasHiddenFieldMatch(pkString: string): boolean {\n if (!this.entity || !pkString) return false;\n return this.hiddenFieldMatches.has(pkString);\n }\n\n /**\n * Resolve the display name of the hidden field that matched, from a PK string.\n */\n private computeHiddenMatchFieldName(pkString: string): string {\n if (!this.entity || !pkString) return '';\n const fieldName = this.hiddenFieldMatches.get(pkString);\n if (!fieldName) return '';\n const field = this.entity.Fields.find(f => f.Name === fieldName);\n return field ? field.DisplayNameOrName : fieldName;\n }\n\n /**\n * Get the combined title from all title fields for a record.\n * Joins multiple IsNameField values with spaces (e.g., \"Elizabeth Rodriguez\").\n */\n getCombinedTitle(record: Record<string, unknown>): string {\n const template = this.effectiveTemplate;\n if (!template?.titleFields || template.titleFields.length === 0) return '';\n const parts = template.titleFields\n .map(f => this.getFieldValue(record, f))\n .filter(v => v && v.trim().length > 0);\n return parts.length > 0 ? parts.join(' ') : '';\n }\n\n getInitials(record: Record<string, unknown>): string {\n const title = this.getCombinedTitle(record);\n if (!title) return '?';\n\n const words = title.split(/\\s+/).filter(w => w.length > 0);\n if (words.length === 1) return words[0].substring(0, 2).toUpperCase();\n return (words[0][0] + words[words.length - 1][0]).toUpperCase();\n }\n\n /**\n * Get the thumbnail type for a record, with per-record fallback through thumbnailFields\n */\n getThumbnailType(record: Record<string, unknown>): 'image' | 'icon' | 'none' {\n const fieldInfo = this.getEffectiveThumbnailField(record);\n if (!fieldInfo) return 'none';\n\n const { fieldName, value } = fieldInfo;\n\n // Check if value is an image URL\n if (this.isImageValue(value)) return 'image';\n\n // Check if value looks like an icon class\n if (this.isIconClass(value)) return 'icon';\n\n // If field name suggests it's an icon field, treat non-URL values as icon classes\n const fieldNameLower = fieldName.toLowerCase();\n if (fieldNameLower.includes('icon') || fieldNameLower.includes('class')) {\n return 'icon';\n }\n\n return 'none';\n }\n\n /**\n * Get the thumbnail URL/value for a record, with per-record fallback\n */\n getThumbnailUrl(record: Record<string, unknown>): string {\n const fieldInfo = this.getEffectiveThumbnailField(record);\n return fieldInfo?.value || '';\n }\n\n /**\n * Find the first thumbnail field that has a value for this record\n * Returns both the field name and value for type determination\n */\n private getEffectiveThumbnailField(record: Record<string, unknown>): { fieldName: string; value: string } | null {\n const template = this.effectiveTemplate;\n if (!template?.thumbnailFields || template.thumbnailFields.length === 0) return null;\n\n // Try each field in priority order until we find one with a value\n for (const fieldName of template.thumbnailFields) {\n const value = this.getFieldValue(record, fieldName);\n if (value && value.trim() !== '') {\n return { fieldName, value };\n }\n }\n\n return null;\n }\n\n private isImageValue(value: string): boolean {\n if (!value) return false;\n const trimmed = value.trim();\n if (trimmed.startsWith('data:image/')) return true;\n if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) return true;\n return false;\n }\n\n private isIconClass(value: string): boolean {\n if (!value) return false;\n const trimmed = value.trim().toLowerCase();\n if (trimmed.startsWith('fa-') || trimmed.startsWith('fa ') ||\n trimmed.startsWith('fas ') || trimmed.startsWith('far ') ||\n trimmed.startsWith('fal ') || trimmed.startsWith('fab ')) return true;\n if (trimmed.includes('material-icons') || trimmed.startsWith('mat-icon')) return true;\n if (trimmed.startsWith('bi-') || trimmed.startsWith('bi ')) return true;\n return false;\n }\n\n getRecordColor(record: Record<string, unknown>): string {\n return this.computeRecordColor(this.computePkString(record));\n }\n\n isEnumField(fieldName: string): boolean {\n if (!this.entity) return false;\n const field = this.entity.Fields.find(f => f.Name === fieldName);\n if (!field) return false;\n return field.ValueListTypeEnum !== EntityFieldValueListType.None && field.EntityFieldValues.length > 0;\n }\n\n get subtitleIsPill(): boolean {\n const template = this.effectiveTemplate;\n if (!template?.subtitleField || !this.entity) return false;\n return this.isEnumField(template.subtitleField);\n }\n\n getPillColorType(value: string): string {\n return PillColorUtil.getColorType(value);\n }\n\n /**\n * Check if a record matched on a hidden field\n */\n hasHiddenFieldMatch(record: Record<string, unknown>): boolean {\n if (!this.entity) return false;\n return this.hiddenFieldMatches.has(buildPkString(record, this.entity));\n }\n\n /**\n * Get the display name of the hidden field that matched\n */\n getHiddenMatchFieldName(record: Record<string, unknown>): string {\n if (!this.entity) return '';\n const fieldName = this.hiddenFieldMatches.get(buildPkString(record, this.entity));\n if (!fieldName || !this.entity) return '';\n // Look up the field in entity metadata and use DisplayNameOrName\n const field = this.entity.Fields.find(f => f.Name === fieldName);\n return field ? field.DisplayNameOrName : fieldName;\n }\n\n /**\n * Highlight matching text in a string based on the filter text\n * Uses HighlightUtil which only highlights if the text actually matches the pattern\n */\n highlightMatch(text: string): string {\n return HighlightUtil.highlight(text, this.filterText, false);\n }\n}\n","<div class=\"cards-view-wrapper\">\n @if (isLoading && effectiveRecords.length === 0) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading records...\"></mj-loading>\n </div>\n } @else {\n <div class=\"cards-container\">\n @for (vm of cardViewModels; track vm.trackId) {\n <div\n class=\"data-card\"\n [class.selected]=\"vm.isSelected\"\n (click)=\"onCardClick(vm.record)\">\n\n <!-- Card Header with Avatar/Icon -->\n <div class=\"card-header\">\n @switch (vm.thumbnailType) {\n @case ('image') {\n <div class=\"card-thumbnail\">\n <img [src]=\"vm.thumbnailUrl\" alt=\"\" />\n </div>\n }\n @case ('icon') {\n <div class=\"card-avatar\" [style.background-color]=\"vm.color\">\n <i [class]=\"vm.thumbnailUrl\"></i>\n </div>\n }\n @default {\n <div class=\"card-avatar\" [style.background-color]=\"vm.color\">\n {{ vm.initials }}\n </div>\n }\n }\n\n <div class=\"card-header-content\">\n <h3 class=\"card-title\" [innerHTML]=\"vm.highlightedTitle\"></h3>\n @if (effectiveTemplate?.subtitleField) {\n @if (subtitleIsPill) {\n <mj-pill [value]=\"vm.subtitleValue\"></mj-pill>\n } @else {\n <span class=\"card-subtitle\" [innerHTML]=\"vm.highlightedSubtitle\"></span>\n }\n }\n </div>\n\n <button class=\"card-open-btn\" (click)=\"onOpenClick($event, vm.record)\" title=\"Open Record\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (effectiveTemplate?.descriptionField) {\n <p class=\"card-description\" [innerHTML]=\"vm.highlightedDescription\"></p>\n }\n\n <!-- Display Fields -->\n @if (vm.displayFields.length > 0) {\n <div class=\"card-fields\">\n @for (df of vm.displayFields; track df.field.name) {\n <div class=\"field-item\" [class.field-boolean]=\"df.field.type === 'boolean'\" [class.field-text]=\"df.field.type === 'text'\">\n @switch (df.field.type) {\n @case ('boolean') {\n <i class=\"field-icon\" [class.fa-solid]=\"true\"\n [class.fa-check]=\"df.booleanValue\"\n [class.fa-minus]=\"!df.booleanValue\"\n [class.bool-true]=\"df.booleanValue\"\n [class.bool-false]=\"!df.booleanValue\"></i>\n <span class=\"field-label\">{{ df.field.label }}</span>\n }\n @case ('number') {\n <span class=\"field-value\">{{ df.numericValue }}</span>\n <span class=\"field-label\">{{ df.field.label }}</span>\n }\n @case ('date') {\n <span class=\"field-value field-date\">{{ df.dateValue }}</span>\n <span class=\"field-label\">{{ df.field.label }}</span>\n }\n @default {\n <span class=\"field-label\">{{ df.field.label }}</span>\n <span class=\"field-text-value\" [innerHTML]=\"df.highlightedText\"></span>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Card Footer with Badge -->\n @if (effectiveTemplate?.badgeField) {\n <div class=\"card-footer\">\n <mj-pill [value]=\"vm.badgeValue\"></mj-pill>\n </div>\n }\n\n <!-- Hidden field match indicator -->\n @if (vm.hasHiddenFieldMatch) {\n <div class=\"hidden-match-indicator\" [title]=\"'Matched in: ' + vm.hiddenMatchFieldName\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>{{ vm.hiddenMatchFieldName }}</span>\n </div>\n }\n </div>\n }\n\n @if (effectiveRecords.length === 0) {\n <div class=\"no-results\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No records to display</p>\n </div>\n }\n </div>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-entity-viewer",
3
- "version": "5.40.1",
3
+ "version": "5.41.0",
4
4
  "description": "MemberJunction: Angular components for viewing entity data in multiple formats (grid, cards) with filtering, selection, and shared data management",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -37,20 +37,20 @@
37
37
  "ag-grid-community": "^35.0.1"
38
38
  },
39
39
  "dependencies": {
40
- "@memberjunction/core": "5.40.1",
41
- "@memberjunction/core-entities": "5.40.1",
42
- "@memberjunction/export-engine": "5.40.1",
43
- "@memberjunction/global": "5.40.1",
44
- "@memberjunction/ng-base-types": "5.40.1",
45
- "@memberjunction/ng-export-service": "5.40.1",
46
- "@memberjunction/ng-filter-builder": "5.40.1",
47
- "@memberjunction/ng-list-management": "5.40.1",
48
- "@memberjunction/ng-map-view": "5.40.1",
49
- "@memberjunction/ng-pagination": "5.40.1",
50
- "@memberjunction/ng-record-changes": "5.40.1",
51
- "@memberjunction/ng-shared-generic": "5.40.1",
52
- "@memberjunction/ng-timeline": "5.40.1",
53
- "@memberjunction/ng-ui-components": "5.40.1",
40
+ "@memberjunction/core": "5.41.0",
41
+ "@memberjunction/core-entities": "5.41.0",
42
+ "@memberjunction/export-engine": "5.41.0",
43
+ "@memberjunction/global": "5.41.0",
44
+ "@memberjunction/ng-base-types": "5.41.0",
45
+ "@memberjunction/ng-export-service": "5.41.0",
46
+ "@memberjunction/ng-filter-builder": "5.41.0",
47
+ "@memberjunction/ng-list-management": "5.41.0",
48
+ "@memberjunction/ng-map-view": "5.41.0",
49
+ "@memberjunction/ng-pagination": "5.41.0",
50
+ "@memberjunction/ng-record-changes": "5.41.0",
51
+ "@memberjunction/ng-shared-generic": "5.41.0",
52
+ "@memberjunction/ng-timeline": "5.41.0",
53
+ "@memberjunction/ng-ui-components": "5.41.0",
54
54
  "rxjs": "^7.8.2",
55
55
  "tslib": "^2.8.1"
56
56
  },