@memberjunction/ng-entity-viewer 5.43.0 → 5.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts +5 -0
  2. package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts.map +1 -1
  3. package/dist/lib/aggregate-panel/aggregate-panel.component.js +45 -47
  4. package/dist/lib/aggregate-panel/aggregate-panel.component.js.map +1 -1
  5. package/dist/lib/entity-cards/entity-cards.component.js +7 -10
  6. package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
  7. package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +10 -1
  8. package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts.map +1 -1
  9. package/dist/lib/entity-data-grid/entity-data-grid.component.js +35 -34
  10. package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
  11. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +0 -4
  12. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -1
  13. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +166 -207
  14. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -1
  15. package/dist/lib/entity-viewer/entity-viewer.component.d.ts +109 -5
  16. package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
  17. package/dist/lib/entity-viewer/entity-viewer.component.js +287 -42
  18. package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
  19. package/dist/lib/recycle-bin/recycle-bin.component.js +21 -44
  20. package/dist/lib/recycle-bin/recycle-bin.component.js.map +1 -1
  21. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js +19 -20
  22. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js.map +1 -1
  23. package/dist/lib/view-config-panel/view-config-panel.component.js +268 -301
  24. package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
  25. package/dist/lib/view-selector/view-selector.component.d.ts +26 -1
  26. package/dist/lib/view-selector/view-selector.component.d.ts.map +1 -1
  27. package/dist/lib/view-selector/view-selector.component.js +118 -76
  28. package/dist/lib/view-selector/view-selector.component.js.map +1 -1
  29. package/dist/lib/view-types/descriptors/grid-view-type.d.ts +7 -0
  30. package/dist/lib/view-types/descriptors/grid-view-type.d.ts.map +1 -1
  31. package/dist/lib/view-types/descriptors/grid-view-type.js +7 -0
  32. package/dist/lib/view-types/descriptors/grid-view-type.js.map +1 -1
  33. package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts +18 -1
  34. package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts.map +1 -1
  35. package/dist/lib/view-types/renderers/grid-view-renderer.component.js +29 -3
  36. package/dist/lib/view-types/renderers/grid-view-renderer.component.js.map +1 -1
  37. package/dist/lib/view-types/renderers/map-view-renderer.component.d.ts.map +1 -1
  38. package/dist/lib/view-types/renderers/map-view-renderer.component.js +11 -14
  39. package/dist/lib/view-types/renderers/map-view-renderer.component.js.map +1 -1
  40. package/dist/lib/view-types/renderers/timeline-view-renderer.component.d.ts.map +1 -1
  41. package/dist/lib/view-types/renderers/timeline-view-renderer.component.js +12 -14
  42. package/dist/lib/view-types/renderers/timeline-view-renderer.component.js.map +1 -1
  43. package/dist/lib/view-types/view-type.contracts.d.ts +44 -0
  44. package/dist/lib/view-types/view-type.contracts.d.ts.map +1 -1
  45. package/dist/lib/view-types/view-type.contracts.js +6 -0
  46. package/dist/lib/view-types/view-type.contracts.js.map +1 -1
  47. package/dist/lib/view-workspace/view-workspace.component.d.ts +32 -1
  48. package/dist/lib/view-workspace/view-workspace.component.d.ts.map +1 -1
  49. package/dist/lib/view-workspace/view-workspace.component.js +68 -7
  50. package/dist/lib/view-workspace/view-workspace.component.js.map +1 -1
  51. package/dist/module.d.ts +1 -1
  52. package/dist/module.d.ts.map +1 -1
  53. package/dist/module.js +10 -1
  54. package/dist/module.js.map +1 -1
  55. package/package.json +18 -17
  56. package/dist/__tests__/entity-cards-selection.test.d.ts +0 -2
  57. package/dist/__tests__/entity-cards-selection.test.d.ts.map +0 -1
  58. package/dist/__tests__/entity-cards-selection.test.js +0 -149
  59. package/dist/__tests__/entity-cards-selection.test.js.map +0 -1
  60. package/dist/__tests__/entity-cards-viewmodel.test.d.ts +0 -2
  61. package/dist/__tests__/entity-cards-viewmodel.test.d.ts.map +0 -1
  62. package/dist/__tests__/entity-cards-viewmodel.test.js +0 -208
  63. package/dist/__tests__/entity-cards-viewmodel.test.js.map +0 -1
  64. package/dist/__tests__/highlight.test.d.ts +0 -2
  65. package/dist/__tests__/highlight.test.d.ts.map +0 -1
  66. package/dist/__tests__/highlight.test.js +0 -67
  67. package/dist/__tests__/highlight.test.js.map +0 -1
  68. package/dist/__tests__/index.test.d.ts +0 -2
  69. package/dist/__tests__/index.test.d.ts.map +0 -1
  70. package/dist/__tests__/index.test.js +0 -7
  71. package/dist/__tests__/index.test.js.map +0 -1
  72. package/dist/__tests__/view-types.test.d.ts +0 -2
  73. package/dist/__tests__/view-types.test.d.ts.map +0 -1
  74. package/dist/__tests__/view-types.test.js +0 -102
  75. package/dist/__tests__/view-types.test.js.map +0 -1
@@ -1,102 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { describe, it, expect, beforeEach } from 'vitest';
8
- import { RegisterClass } from '@memberjunction/global';
9
- import { BaseViewTypeDescriptor } from '../lib/view-types/view-type.contracts';
10
- import { ViewTypeEngine } from '../lib/view-types/view-type.engine';
11
- // NOTE: We test the framework (base descriptor + engine) with an in-test descriptor rather than
12
- // importing the four built-in descriptors — those pull the Angular component graph (grid/cards/
13
- // timeline/map) which needs the JIT compiler in a unit-test env. The built-in renderers + the
14
- // dynamic-mount host are exercised by the live Playwright pass.
15
- // Module-level hooks so the test can observe the descriptor the ClassFactory instantiates.
16
- let availableFlag = true;
17
- let ensureCalls = 0;
18
- let TestAvailViewType = class TestAvailViewType extends BaseViewTypeDescriptor {
19
- Name = 'TestAvailViewType';
20
- DisplayName = 'Test';
21
- Icon = 'fa-solid fa-flask';
22
- RendererComponent = class {
23
- };
24
- IsAvailableFor() {
25
- return availableFlag;
26
- }
27
- async EnsureAvailabilityData() {
28
- ensureCalls++;
29
- }
30
- };
31
- TestAvailViewType = __decorate([
32
- RegisterClass(BaseViewTypeDescriptor, 'TestAvailViewType')
33
- ], TestAvailViewType);
34
- function entity() {
35
- return { ID: 'E1', Name: 'Test Entity' };
36
- }
37
- function seedViewTypes(rows) {
38
- ViewTypeEngine.Instance._viewTypes =
39
- rows;
40
- }
41
- describe('BaseViewTypeDescriptor defaults', () => {
42
- class PlainViewType extends BaseViewTypeDescriptor {
43
- Name = 'PlainViewType';
44
- DisplayName = 'Plain';
45
- Icon = 'fa-solid fa-shapes';
46
- RendererComponent = class {
47
- };
48
- }
49
- it('defaults IsAvailableFor to true', () => {
50
- expect(new PlainViewType().IsAvailableFor(entity())).toBe(true);
51
- });
52
- it('defaults EnsureAvailabilityData to a resolved no-op', async () => {
53
- await expect(new PlainViewType().EnsureAvailabilityData()).resolves.toBeUndefined();
54
- });
55
- });
56
- describe('ViewTypeEngine', () => {
57
- beforeEach(() => {
58
- availableFlag = true;
59
- ensureCalls = 0;
60
- seedViewTypes([{ ID: 'VT1', DriverClass: 'TestAvailViewType', Name: 'Test' }]);
61
- });
62
- it('GetDescriptor resolves a registered descriptor by DriverClass', () => {
63
- const d = ViewTypeEngine.Instance.GetDescriptor('TestAvailViewType');
64
- expect(d).toBeTruthy();
65
- expect(d?.Name).toBe('TestAvailViewType');
66
- });
67
- it('GetDescriptor returns null for an unregistered DriverClass (no blank-item fallback)', () => {
68
- // A seeded MJ: View Types row whose descriptor class was never built (e.g. TagCloudViewType)
69
- // must NOT resolve to the abstract base fallback — that would render a blank switcher item.
70
- expect(ViewTypeEngine.Instance.GetDescriptor('TotallyUnregisteredViewType')).toBeNull();
71
- });
72
- it('GetAvailableViewTypeRows omits rows whose descriptor is unregistered', () => {
73
- seedViewTypes([
74
- { ID: 'VT1', DriverClass: 'TestAvailViewType', Name: 'Test' },
75
- { ID: 'VT2', DriverClass: 'TotallyUnregisteredViewType', Name: 'Ghost' },
76
- ]);
77
- const rows = ViewTypeEngine.Instance.GetAvailableViewTypeRows(entity());
78
- expect(rows.map(r => r.ViewType.ID)).toEqual(['VT1']);
79
- });
80
- it('GetAvailableViewTypeRows pairs the row with its descriptor when available', () => {
81
- const rows = ViewTypeEngine.Instance.GetAvailableViewTypeRows(entity());
82
- expect(rows).toHaveLength(1);
83
- expect(rows[0].ViewType.ID).toBe('VT1');
84
- expect(rows[0].Descriptor.Name).toBe('TestAvailViewType');
85
- });
86
- it('GetAvailableViewTypeRows excludes view types whose predicate is false', () => {
87
- availableFlag = false;
88
- expect(ViewTypeEngine.Instance.GetAvailableViewTypeRows(entity())).toHaveLength(0);
89
- });
90
- it('GetAvailableViewTypes returns just the descriptors', () => {
91
- const descriptors = ViewTypeEngine.Instance.GetAvailableViewTypes(entity());
92
- expect(descriptors.map(d => d.Name)).toEqual(['TestAvailViewType']);
93
- });
94
- it('EnsureAvailabilityData invokes each descriptor hook once', async () => {
95
- await ViewTypeEngine.Instance.EnsureAvailabilityData();
96
- expect(ensureCalls).toBe(1);
97
- });
98
- it('returns nothing for a null entity', () => {
99
- expect(ViewTypeEngine.Instance.GetAvailableViewTypeRows(null)).toHaveLength(0);
100
- });
101
- });
102
- //# sourceMappingURL=view-types.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"view-types.test.js","sourceRoot":"","sources":["../../src/__tests__/view-types.test.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,gGAAgG;AAChG,gGAAgG;AAChG,8FAA8F;AAC9F,gEAAgE;AAEhE,2FAA2F;AAC3F,IAAI,aAAa,GAAG,IAAI,CAAC;AACzB,IAAI,WAAW,GAAG,CAAC,CAAC;AAGpB,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,sBAAsB;IAC3C,IAAI,GAAG,mBAAmB,CAAC;IAC3B,WAAW,GAAG,MAAM,CAAC;IACrB,IAAI,GAAG,mBAAmB,CAAC;IAC3B,iBAAiB,GAAG;KAAQ,CAAC;IAC7B,cAAc;QACrB,OAAO,aAAa,CAAC;IACvB,CAAC;IACQ,KAAK,CAAC,sBAAsB;QACnC,WAAW,EAAE,CAAC;IAChB,CAAC;CACF,CAAA;AAXK,iBAAiB;IADtB,aAAa,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;GACrD,iBAAiB,CAWtB;AAED,SAAS,MAAM;IACb,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAA2B,CAAC;AACpE,CAAC;AAED,SAAS,aAAa,CAAC,IAA8D;IAClF,cAAc,CAAC,QAA0D,CAAC,UAAU;QACnF,IAAqC,CAAC;AAC1C,CAAC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,MAAM,aAAc,SAAQ,sBAAsB;QACvC,IAAI,GAAG,eAAe,CAAC;QACvB,WAAW,GAAG,OAAO,CAAC;QACtB,IAAI,GAAG,oBAAoB,CAAC;QAC5B,iBAAiB,GAAG;SAAQ,CAAC;KACvC;IAED,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,IAAI,CAAC;QACrB,WAAW,GAAG,CAAC,CAAC;QAChB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC;QACrE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,6FAA6F;QAC7F,4FAA4F;QAC5F,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,aAAa,CAAC;YACZ,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE;YAC7D,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,6BAA6B,EAAE,IAAI,EAAE,OAAO,EAAE;SACzE,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,aAAa,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,cAAc,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAA6B,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1G,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it, expect, beforeEach } from 'vitest';\nimport { RegisterClass } from '@memberjunction/global';\nimport type { EntityInfo } from '@memberjunction/core';\nimport type { MJViewTypeEntity } from '@memberjunction/core-entities';\nimport { BaseViewTypeDescriptor } from '../lib/view-types/view-type.contracts';\nimport { ViewTypeEngine } from '../lib/view-types/view-type.engine';\n\n// NOTE: We test the framework (base descriptor + engine) with an in-test descriptor rather than\n// importing the four built-in descriptors — those pull the Angular component graph (grid/cards/\n// timeline/map) which needs the JIT compiler in a unit-test env. The built-in renderers + the\n// dynamic-mount host are exercised by the live Playwright pass.\n\n// Module-level hooks so the test can observe the descriptor the ClassFactory instantiates.\nlet availableFlag = true;\nlet ensureCalls = 0;\n\n@RegisterClass(BaseViewTypeDescriptor, 'TestAvailViewType')\nclass TestAvailViewType extends BaseViewTypeDescriptor {\n readonly Name = 'TestAvailViewType';\n readonly DisplayName = 'Test';\n readonly Icon = 'fa-solid fa-flask';\n readonly RendererComponent = class {};\n override IsAvailableFor(): boolean {\n return availableFlag;\n }\n override async EnsureAvailabilityData(): Promise<void> {\n ensureCalls++;\n }\n}\n\nfunction entity(): EntityInfo {\n return { ID: 'E1', Name: 'Test Entity' } as unknown as EntityInfo;\n}\n\nfunction seedViewTypes(rows: Array<{ ID: string; DriverClass: string; Name: string }>): void {\n (ViewTypeEngine.Instance as unknown as { _viewTypes: MJViewTypeEntity[] })._viewTypes =\n rows as unknown as MJViewTypeEntity[];\n}\n\ndescribe('BaseViewTypeDescriptor defaults', () => {\n class PlainViewType extends BaseViewTypeDescriptor {\n readonly Name = 'PlainViewType';\n readonly DisplayName = 'Plain';\n readonly Icon = 'fa-solid fa-shapes';\n readonly RendererComponent = class {};\n }\n\n it('defaults IsAvailableFor to true', () => {\n expect(new PlainViewType().IsAvailableFor(entity())).toBe(true);\n });\n\n it('defaults EnsureAvailabilityData to a resolved no-op', async () => {\n await expect(new PlainViewType().EnsureAvailabilityData()).resolves.toBeUndefined();\n });\n});\n\ndescribe('ViewTypeEngine', () => {\n beforeEach(() => {\n availableFlag = true;\n ensureCalls = 0;\n seedViewTypes([{ ID: 'VT1', DriverClass: 'TestAvailViewType', Name: 'Test' }]);\n });\n\n it('GetDescriptor resolves a registered descriptor by DriverClass', () => {\n const d = ViewTypeEngine.Instance.GetDescriptor('TestAvailViewType');\n expect(d).toBeTruthy();\n expect(d?.Name).toBe('TestAvailViewType');\n });\n\n it('GetDescriptor returns null for an unregistered DriverClass (no blank-item fallback)', () => {\n // A seeded MJ: View Types row whose descriptor class was never built (e.g. TagCloudViewType)\n // must NOT resolve to the abstract base fallback — that would render a blank switcher item.\n expect(ViewTypeEngine.Instance.GetDescriptor('TotallyUnregisteredViewType')).toBeNull();\n });\n\n it('GetAvailableViewTypeRows omits rows whose descriptor is unregistered', () => {\n seedViewTypes([\n { ID: 'VT1', DriverClass: 'TestAvailViewType', Name: 'Test' },\n { ID: 'VT2', DriverClass: 'TotallyUnregisteredViewType', Name: 'Ghost' },\n ]);\n const rows = ViewTypeEngine.Instance.GetAvailableViewTypeRows(entity());\n expect(rows.map(r => r.ViewType.ID)).toEqual(['VT1']);\n });\n\n it('GetAvailableViewTypeRows pairs the row with its descriptor when available', () => {\n const rows = ViewTypeEngine.Instance.GetAvailableViewTypeRows(entity());\n expect(rows).toHaveLength(1);\n expect(rows[0].ViewType.ID).toBe('VT1');\n expect(rows[0].Descriptor.Name).toBe('TestAvailViewType');\n });\n\n it('GetAvailableViewTypeRows excludes view types whose predicate is false', () => {\n availableFlag = false;\n expect(ViewTypeEngine.Instance.GetAvailableViewTypeRows(entity())).toHaveLength(0);\n });\n\n it('GetAvailableViewTypes returns just the descriptors', () => {\n const descriptors = ViewTypeEngine.Instance.GetAvailableViewTypes(entity());\n expect(descriptors.map(d => d.Name)).toEqual(['TestAvailViewType']);\n });\n\n it('EnsureAvailabilityData invokes each descriptor hook once', async () => {\n await ViewTypeEngine.Instance.EnsureAvailabilityData();\n expect(ensureCalls).toBe(1);\n });\n\n it('returns nothing for a null entity', () => {\n expect(ViewTypeEngine.Instance.GetAvailableViewTypeRows(null as unknown as EntityInfo)).toHaveLength(0);\n });\n});\n"]}