@memberjunction/ng-dashboards 5.23.0 → 5.24.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/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +677 -5
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +6879 -1873
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +46 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +758 -491
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +19 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +410 -208
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +1 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +1 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +35 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +186 -13
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +188 -165
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +2 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +2 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +18 -14
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +25 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/package.json +47 -46
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Metadata } from '@memberjunction/core';
|
|
2
|
+
/** Fields that should never appear in display cards/panels */
|
|
3
|
+
const INTERNAL_METADATA_KEYS = new Set([
|
|
4
|
+
'Entity', 'EntityIcon', 'RecordID', 'TemplateID',
|
|
5
|
+
'__mj_UpdatedAt', '__mj_CreatedAt', 'Name',
|
|
6
|
+
]);
|
|
7
|
+
/**
|
|
8
|
+
* Sorts and prioritizes metadata fields for display using MJ entity field metadata.
|
|
9
|
+
*
|
|
10
|
+
* Priority order:
|
|
11
|
+
* 1. IsNameField fields first (the record's display name)
|
|
12
|
+
* 2. DefaultInView fields next, sorted by Sequence
|
|
13
|
+
* 3. All other fields, sorted by Sequence
|
|
14
|
+
*
|
|
15
|
+
* Internal/system fields (Entity, EntityIcon, RecordID, TemplateID, timestamps) are excluded.
|
|
16
|
+
* Empty/null values are excluded.
|
|
17
|
+
*
|
|
18
|
+
* @param entityName - The entity name (e.g., "Members") for metadata lookup
|
|
19
|
+
* @param metadata - The raw metadata object (Record<string, unknown>) from vector DB or similar
|
|
20
|
+
* @returns Sorted array of DisplayFieldEntry objects ready for rendering
|
|
21
|
+
*/
|
|
22
|
+
export function PrioritizeFieldsForDisplay(entityName, metadata) {
|
|
23
|
+
const entityInfo = FindEntityInfo(entityName);
|
|
24
|
+
const fieldMap = BuildFieldMap(entityInfo);
|
|
25
|
+
const entries = [];
|
|
26
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
27
|
+
if (INTERNAL_METADATA_KEYS.has(key))
|
|
28
|
+
continue;
|
|
29
|
+
if (value == null || String(value).trim() === '')
|
|
30
|
+
continue;
|
|
31
|
+
const fieldInfo = fieldMap.get(key);
|
|
32
|
+
entries.push({
|
|
33
|
+
Key: key,
|
|
34
|
+
DisplayName: fieldInfo?.DisplayNameOrName ?? FormatFieldName(key),
|
|
35
|
+
Value: value,
|
|
36
|
+
IsDefaultInView: fieldInfo?.DefaultInView ?? false,
|
|
37
|
+
IsNameField: fieldInfo?.IsNameField ?? false,
|
|
38
|
+
Sequence: fieldInfo?.Sequence ?? 9999,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return entries.sort(CompareFields);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns only the DefaultInView fields (the "important" fields for compact cards).
|
|
45
|
+
* Falls back to first 4 fields if no DefaultInView fields exist.
|
|
46
|
+
*/
|
|
47
|
+
export function GetPrimaryDisplayFields(entityName, metadata, maxFields = 4) {
|
|
48
|
+
const all = PrioritizeFieldsForDisplay(entityName, metadata);
|
|
49
|
+
const defaultInView = all.filter(f => f.IsDefaultInView);
|
|
50
|
+
if (defaultInView.length > 0) {
|
|
51
|
+
return defaultInView.slice(0, maxFields);
|
|
52
|
+
}
|
|
53
|
+
// Fallback: return first N non-name fields
|
|
54
|
+
return all.filter(f => !f.IsNameField).slice(0, maxFields);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns the record's display name from metadata using IsNameField.
|
|
58
|
+
* Falls back to the 'Name' key or first non-empty string value.
|
|
59
|
+
*/
|
|
60
|
+
export function GetRecordDisplayName(entityName, metadata) {
|
|
61
|
+
const entityInfo = FindEntityInfo(entityName);
|
|
62
|
+
if (entityInfo) {
|
|
63
|
+
const nameField = entityInfo.Fields.find(f => f.IsNameField);
|
|
64
|
+
if (nameField && metadata[nameField.Name] != null) {
|
|
65
|
+
return String(metadata[nameField.Name]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Fallbacks
|
|
69
|
+
if (metadata['Name'] != null)
|
|
70
|
+
return String(metadata['Name']);
|
|
71
|
+
// Return first non-empty string value
|
|
72
|
+
for (const value of Object.values(metadata)) {
|
|
73
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return 'Unknown';
|
|
78
|
+
}
|
|
79
|
+
// ─── Internal Helpers ─────────────────────────────────────────────────────
|
|
80
|
+
function FindEntityInfo(entityName) {
|
|
81
|
+
try {
|
|
82
|
+
const md = new Metadata();
|
|
83
|
+
return md.Entities.find(e => e.Name === entityName) ?? null;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function BuildFieldMap(entityInfo) {
|
|
90
|
+
const map = new Map();
|
|
91
|
+
if (!entityInfo)
|
|
92
|
+
return map;
|
|
93
|
+
for (const field of entityInfo.Fields) {
|
|
94
|
+
map.set(field.Name, field);
|
|
95
|
+
}
|
|
96
|
+
return map;
|
|
97
|
+
}
|
|
98
|
+
function CompareFields(a, b) {
|
|
99
|
+
// 1. Name fields first
|
|
100
|
+
if (a.IsNameField !== b.IsNameField)
|
|
101
|
+
return a.IsNameField ? -1 : 1;
|
|
102
|
+
// 2. DefaultInView fields before non-default
|
|
103
|
+
if (a.IsDefaultInView !== b.IsDefaultInView)
|
|
104
|
+
return a.IsDefaultInView ? -1 : 1;
|
|
105
|
+
// 3. Sort by Sequence within each group
|
|
106
|
+
return a.Sequence - b.Sequence;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Convert a PascalCase or camelCase field name to a human-readable display name.
|
|
110
|
+
* E.g., "FirstName" -> "First Name", "contentTypeID" -> "Content Type ID"
|
|
111
|
+
*/
|
|
112
|
+
function FormatFieldName(key) {
|
|
113
|
+
return key
|
|
114
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
115
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
116
|
+
.replace(/^./, c => c.toUpperCase());
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=entity-field-display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-field-display.js","sourceRoot":"","sources":["../../src/shared/entity-field-display.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAA+B,MAAM,sBAAsB,CAAC;AAoB7E,8DAA8D;AAC9D,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACnC,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY;IAChD,gBAAgB,EAAE,gBAAgB,EAAE,MAAM;CAC7C,CAAC,CAAC;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CACtC,UAAkB,EAClB,QAAiC;IAEjC,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9C,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QAE3D,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,SAAS,EAAE,iBAAiB,IAAI,eAAe,CAAC,GAAG,CAAC;YACjE,KAAK,EAAE,KAAK;YACZ,eAAe,EAAE,SAAS,EAAE,aAAa,IAAI,KAAK;YAClD,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,KAAK;YAC5C,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI;SACxC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACnC,UAAkB,EAClB,QAAiC,EACjC,YAAoB,CAAC;IAErB,MAAM,GAAG,GAAG,0BAA0B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACzD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IACD,2CAA2C;IAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAChC,UAAkB,EAClB,QAAiC;IAEjC,MAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;IACD,YAAY;IACZ,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,sCAAsC;IACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,6EAA6E;AAE7E,SAAS,cAAc,CAAC,UAAkB;IACtC,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,IAAI,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,UAA6B;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,GAAG,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,CAAoB,EAAE,CAAoB;IAC7D,uBAAuB;IACvB,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;QAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,6CAA6C;IAC7C,IAAI,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,eAAe;QAAE,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,wCAAwC;IACxC,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,GAAW;IAChC,OAAO,GAAG;SACL,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["import { Metadata, EntityFieldInfo, EntityInfo } from '@memberjunction/core';\n\n/**\n * A single field entry prepared for display in cards, tooltips, and detail panels.\n */\nexport interface DisplayFieldEntry {\n /** The raw field name from metadata (e.g., \"FirstName\") */\n Key: string;\n /** The human-readable display name (e.g., \"First Name\") */\n DisplayName: string;\n /** The field value */\n Value: unknown;\n /** Whether this field is marked DefaultInView on the entity */\n IsDefaultInView: boolean;\n /** Whether this is the entity's name field */\n IsNameField: boolean;\n /** The field's display sequence from entity metadata */\n Sequence: number;\n}\n\n/** Fields that should never appear in display cards/panels */\nconst INTERNAL_METADATA_KEYS = new Set([\n 'Entity', 'EntityIcon', 'RecordID', 'TemplateID',\n '__mj_UpdatedAt', '__mj_CreatedAt', 'Name',\n]);\n\n/**\n * Sorts and prioritizes metadata fields for display using MJ entity field metadata.\n *\n * Priority order:\n * 1. IsNameField fields first (the record's display name)\n * 2. DefaultInView fields next, sorted by Sequence\n * 3. All other fields, sorted by Sequence\n *\n * Internal/system fields (Entity, EntityIcon, RecordID, TemplateID, timestamps) are excluded.\n * Empty/null values are excluded.\n *\n * @param entityName - The entity name (e.g., \"Members\") for metadata lookup\n * @param metadata - The raw metadata object (Record<string, unknown>) from vector DB or similar\n * @returns Sorted array of DisplayFieldEntry objects ready for rendering\n */\nexport function PrioritizeFieldsForDisplay(\n entityName: string,\n metadata: Record<string, unknown>\n): DisplayFieldEntry[] {\n const entityInfo = FindEntityInfo(entityName);\n const fieldMap = BuildFieldMap(entityInfo);\n\n const entries: DisplayFieldEntry[] = [];\n for (const [key, value] of Object.entries(metadata)) {\n if (INTERNAL_METADATA_KEYS.has(key)) continue;\n if (value == null || String(value).trim() === '') continue;\n\n const fieldInfo = fieldMap.get(key);\n entries.push({\n Key: key,\n DisplayName: fieldInfo?.DisplayNameOrName ?? FormatFieldName(key),\n Value: value,\n IsDefaultInView: fieldInfo?.DefaultInView ?? false,\n IsNameField: fieldInfo?.IsNameField ?? false,\n Sequence: fieldInfo?.Sequence ?? 9999,\n });\n }\n\n return entries.sort(CompareFields);\n}\n\n/**\n * Returns only the DefaultInView fields (the \"important\" fields for compact cards).\n * Falls back to first 4 fields if no DefaultInView fields exist.\n */\nexport function GetPrimaryDisplayFields(\n entityName: string,\n metadata: Record<string, unknown>,\n maxFields: number = 4\n): DisplayFieldEntry[] {\n const all = PrioritizeFieldsForDisplay(entityName, metadata);\n const defaultInView = all.filter(f => f.IsDefaultInView);\n if (defaultInView.length > 0) {\n return defaultInView.slice(0, maxFields);\n }\n // Fallback: return first N non-name fields\n return all.filter(f => !f.IsNameField).slice(0, maxFields);\n}\n\n/**\n * Returns the record's display name from metadata using IsNameField.\n * Falls back to the 'Name' key or first non-empty string value.\n */\nexport function GetRecordDisplayName(\n entityName: string,\n metadata: Record<string, unknown>\n): string {\n const entityInfo = FindEntityInfo(entityName);\n if (entityInfo) {\n const nameField = entityInfo.Fields.find(f => f.IsNameField);\n if (nameField && metadata[nameField.Name] != null) {\n return String(metadata[nameField.Name]);\n }\n }\n // Fallbacks\n if (metadata['Name'] != null) return String(metadata['Name']);\n // Return first non-empty string value\n for (const value of Object.values(metadata)) {\n if (typeof value === 'string' && value.trim().length > 0) {\n return value;\n }\n }\n return 'Unknown';\n}\n\n// ─── Internal Helpers ─────────────────────────────────────────────────────\n\nfunction FindEntityInfo(entityName: string): EntityInfo | null {\n try {\n const md = new Metadata();\n return md.Entities.find(e => e.Name === entityName) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction BuildFieldMap(entityInfo: EntityInfo | null): Map<string, EntityFieldInfo> {\n const map = new Map<string, EntityFieldInfo>();\n if (!entityInfo) return map;\n for (const field of entityInfo.Fields) {\n map.set(field.Name, field);\n }\n return map;\n}\n\nfunction CompareFields(a: DisplayFieldEntry, b: DisplayFieldEntry): number {\n // 1. Name fields first\n if (a.IsNameField !== b.IsNameField) return a.IsNameField ? -1 : 1;\n // 2. DefaultInView fields before non-default\n if (a.IsDefaultInView !== b.IsDefaultInView) return a.IsDefaultInView ? -1 : 1;\n // 3. Sort by Sequence within each group\n return a.Sequence - b.Sequence;\n}\n\n/**\n * Convert a PascalCase or camelCase field name to a human-readable display name.\n * E.g., \"FirstName\" -> \"First Name\", \"contentTypeID\" -> \"Content Type ID\"\n */\nfunction FormatFieldName(key: string): string {\n return key\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/^./, c => c.toUpperCase());\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-dashboards",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.24.0",
|
|
4
4
|
"description": "MemberJunction Dashboards",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -92,51 +92,52 @@
|
|
|
92
92
|
"@codemirror/merge": "^6.11.2",
|
|
93
93
|
"@codemirror/state": "^6.5.4",
|
|
94
94
|
"@codemirror/view": "^6.39.12",
|
|
95
|
-
"@memberjunction/ng-clustering": "5.
|
|
96
|
-
"@memberjunction/
|
|
97
|
-
"@memberjunction/
|
|
98
|
-
"@memberjunction/ai-
|
|
99
|
-
"@memberjunction/
|
|
100
|
-
"@memberjunction/
|
|
101
|
-
"@memberjunction/core
|
|
102
|
-
"@memberjunction/
|
|
103
|
-
"@memberjunction/
|
|
104
|
-
"@memberjunction/
|
|
105
|
-
"@memberjunction/
|
|
106
|
-
"@memberjunction/
|
|
107
|
-
"@memberjunction/
|
|
108
|
-
"@memberjunction/ng-
|
|
109
|
-
"@memberjunction/ng-
|
|
110
|
-
"@memberjunction/ng-
|
|
111
|
-
"@memberjunction/ng-
|
|
112
|
-
"@memberjunction/ng-
|
|
113
|
-
"@memberjunction/ng-
|
|
114
|
-
"@memberjunction/ng-
|
|
115
|
-
"@memberjunction/ng-
|
|
116
|
-
"@memberjunction/ng-
|
|
117
|
-
"@memberjunction/ng-
|
|
118
|
-
"@memberjunction/ng-
|
|
119
|
-
"@memberjunction/ng-
|
|
120
|
-
"@memberjunction/ng-entity-
|
|
121
|
-
"@memberjunction/ng-
|
|
122
|
-
"@memberjunction/ng-
|
|
123
|
-
"@memberjunction/ng-
|
|
124
|
-
"@memberjunction/ng-
|
|
125
|
-
"@memberjunction/ng-
|
|
126
|
-
"@memberjunction/ng-
|
|
127
|
-
"@memberjunction/ng-
|
|
128
|
-
"@memberjunction/ng-
|
|
129
|
-
"@memberjunction/ng-
|
|
130
|
-
"@memberjunction/ng-
|
|
131
|
-
"@memberjunction/ng-
|
|
132
|
-
"@memberjunction/ng-shared
|
|
133
|
-
"@memberjunction/ng-
|
|
134
|
-
"@memberjunction/ng-
|
|
135
|
-
"@memberjunction/ng-
|
|
136
|
-
"@memberjunction/ng-
|
|
137
|
-
"@memberjunction/
|
|
138
|
-
"@memberjunction/
|
|
139
|
-
"@memberjunction/
|
|
95
|
+
"@memberjunction/ng-clustering": "5.24.0",
|
|
96
|
+
"@memberjunction/ng-word-cloud": "5.24.0",
|
|
97
|
+
"@memberjunction/actions-base": "5.24.0",
|
|
98
|
+
"@memberjunction/ai-core-plus": "5.24.0",
|
|
99
|
+
"@memberjunction/ai-engine-base": "5.24.0",
|
|
100
|
+
"@memberjunction/api-keys-base": "5.24.0",
|
|
101
|
+
"@memberjunction/core": "5.24.0",
|
|
102
|
+
"@memberjunction/core-entities": "5.24.0",
|
|
103
|
+
"@memberjunction/export-engine": "5.24.0",
|
|
104
|
+
"@memberjunction/global": "5.24.0",
|
|
105
|
+
"@memberjunction/graphql-dataprovider": "5.24.0",
|
|
106
|
+
"@memberjunction/integration-engine-base": "5.24.0",
|
|
107
|
+
"@memberjunction/interactive-component-types": "5.24.0",
|
|
108
|
+
"@memberjunction/ng-action-gallery": "5.24.0",
|
|
109
|
+
"@memberjunction/ng-actions": "5.24.0",
|
|
110
|
+
"@memberjunction/ng-agent-requests": "5.24.0",
|
|
111
|
+
"@memberjunction/ng-agents": "5.24.0",
|
|
112
|
+
"@memberjunction/ng-ai-test-harness": "5.24.0",
|
|
113
|
+
"@memberjunction/ng-base-application": "5.24.0",
|
|
114
|
+
"@memberjunction/ng-code-editor": "5.24.0",
|
|
115
|
+
"@memberjunction/ng-container-directives": "5.24.0",
|
|
116
|
+
"@memberjunction/ng-conversations": "5.24.0",
|
|
117
|
+
"@memberjunction/ng-core-entity-forms": "5.24.0",
|
|
118
|
+
"@memberjunction/ng-credentials": "5.24.0",
|
|
119
|
+
"@memberjunction/ng-dashboard-viewer": "5.24.0",
|
|
120
|
+
"@memberjunction/ng-entity-relationship-diagram": "5.24.0",
|
|
121
|
+
"@memberjunction/ng-entity-viewer": "5.24.0",
|
|
122
|
+
"@memberjunction/ng-explorer-settings": "5.24.0",
|
|
123
|
+
"@memberjunction/ng-export-service": "5.24.0",
|
|
124
|
+
"@memberjunction/ng-filter-builder": "5.24.0",
|
|
125
|
+
"@memberjunction/ng-list-management": "5.24.0",
|
|
126
|
+
"@memberjunction/ng-markdown": "5.24.0",
|
|
127
|
+
"@memberjunction/ng-notifications": "5.24.0",
|
|
128
|
+
"@memberjunction/ng-query-viewer": "5.24.0",
|
|
129
|
+
"@memberjunction/ng-react": "5.24.0",
|
|
130
|
+
"@memberjunction/ng-scheduling": "5.24.0",
|
|
131
|
+
"@memberjunction/ng-search": "5.24.0",
|
|
132
|
+
"@memberjunction/ng-shared": "5.24.0",
|
|
133
|
+
"@memberjunction/ng-shared-generic": "5.24.0",
|
|
134
|
+
"@memberjunction/ng-testing": "5.24.0",
|
|
135
|
+
"@memberjunction/ng-trees": "5.24.0",
|
|
136
|
+
"@memberjunction/ng-ui-components": "5.24.0",
|
|
137
|
+
"@memberjunction/ng-versions": "5.24.0",
|
|
138
|
+
"@memberjunction/skip-types": "5.24.0",
|
|
139
|
+
"@memberjunction/templates-base-types": "5.24.0",
|
|
140
|
+
"@memberjunction/testing-engine-base": "5.24.0",
|
|
140
141
|
"angular-split": "^20.0.0",
|
|
141
142
|
"codemirror": "^6.0.2",
|
|
142
143
|
"d3": "^7.8.5",
|