@memberjunction/ng-conversations 5.24.0 → 5.26.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/__tests__/collections-full-view.test.d.ts +2 -0
- package/dist/__tests__/collections-full-view.test.d.ts.map +1 -0
- package/dist/__tests__/collections-full-view.test.js +225 -0
- package/dist/__tests__/collections-full-view.test.js.map +1 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts +17 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +408 -173
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +38 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +178 -17
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +5 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +15 -3
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.d.ts +3 -1
- package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.js +10 -1
- package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts +19 -2
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.js +26 -2
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts +16 -1
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +29 -7
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +6 -1
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +12 -3
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +2 -0
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +1 -1
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +1 -1
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +4 -0
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +64 -1
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/package.json +21 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collections-full-view.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/collections-full-view.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
/**
|
|
3
|
+
* Reproduces the template binding logic:
|
|
4
|
+
* [parentCollection]="editingCollection ? undefined : (currentCollection || undefined)"
|
|
5
|
+
*/
|
|
6
|
+
function resolveParentCollection(editingCollection, currentCollection) {
|
|
7
|
+
return editingCollection ? undefined : (currentCollection || undefined);
|
|
8
|
+
}
|
|
9
|
+
describe('Bug 1: parentCollection binding logic', () => {
|
|
10
|
+
const rootCollection = {
|
|
11
|
+
ID: 'root-1',
|
|
12
|
+
Name: 'Root Collection',
|
|
13
|
+
ParentID: null
|
|
14
|
+
};
|
|
15
|
+
const childCollection = {
|
|
16
|
+
ID: 'child-1',
|
|
17
|
+
Name: 'Child Collection',
|
|
18
|
+
ParentID: 'root-1'
|
|
19
|
+
};
|
|
20
|
+
describe('when creating a new collection', () => {
|
|
21
|
+
it('should pass currentCollection as parentCollection at root level', () => {
|
|
22
|
+
// At root level, currentCollection is null
|
|
23
|
+
const parent = resolveParentCollection(undefined, null);
|
|
24
|
+
expect(parent).toBeUndefined();
|
|
25
|
+
});
|
|
26
|
+
it('should pass currentCollection as parentCollection when inside a collection', () => {
|
|
27
|
+
// Inside rootCollection, creating a new sub-collection
|
|
28
|
+
const parent = resolveParentCollection(undefined, rootCollection);
|
|
29
|
+
expect(parent).toBe(rootCollection);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('when editing an existing collection', () => {
|
|
33
|
+
it('should NOT pass parentCollection when editing the current collection', () => {
|
|
34
|
+
// Inside rootCollection, editing rootCollection itself
|
|
35
|
+
// Before fix: parentCollection = rootCollection (the collection being edited!)
|
|
36
|
+
// After fix: parentCollection = undefined
|
|
37
|
+
const parent = resolveParentCollection(rootCollection, rootCollection);
|
|
38
|
+
expect(parent).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
it('should NOT pass parentCollection when editing a child collection from the list', () => {
|
|
41
|
+
// Inside rootCollection, editing childCollection from the grid
|
|
42
|
+
const parent = resolveParentCollection(childCollection, rootCollection);
|
|
43
|
+
expect(parent).toBeUndefined();
|
|
44
|
+
});
|
|
45
|
+
it('should NOT pass parentCollection when editing at root level', () => {
|
|
46
|
+
// At root level, editing rootCollection
|
|
47
|
+
const parent = resolveParentCollection(rootCollection, null);
|
|
48
|
+
expect(parent).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Reproduces the form-modal save logic for ParentID:
|
|
54
|
+
*
|
|
55
|
+
* if (!this.collection) {
|
|
56
|
+
* // creating new — set ParentID from parentCollection
|
|
57
|
+
* } else if (this.parentCollection) {
|
|
58
|
+
* collection.ParentID = this.parentCollection.ID;
|
|
59
|
+
* }
|
|
60
|
+
*/
|
|
61
|
+
function simulateSave(existingCollection, parentCollection) {
|
|
62
|
+
if (!existingCollection) {
|
|
63
|
+
// Creating new collection — parentCollection sets ParentID (expected)
|
|
64
|
+
return {
|
|
65
|
+
parentIdOverwritten: !!parentCollection,
|
|
66
|
+
newParentId: parentCollection?.ID ?? null
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
else if (parentCollection) {
|
|
70
|
+
// Editing existing — parentCollection would overwrite ParentID
|
|
71
|
+
return {
|
|
72
|
+
parentIdOverwritten: true,
|
|
73
|
+
newParentId: parentCollection.ID
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Editing existing, no parentCollection — ParentID unchanged
|
|
77
|
+
return {
|
|
78
|
+
parentIdOverwritten: false,
|
|
79
|
+
newParentId: existingCollection.ParentID
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
describe('Bug 1: form-modal save logic for ParentID', () => {
|
|
83
|
+
const collection = {
|
|
84
|
+
ID: 'col-1',
|
|
85
|
+
Name: 'My Collection',
|
|
86
|
+
ParentID: 'parent-1'
|
|
87
|
+
};
|
|
88
|
+
it('should not overwrite ParentID when editing with no parentCollection (the fix)', () => {
|
|
89
|
+
// After fix: parentCollection is undefined when editing
|
|
90
|
+
const result = simulateSave(collection, undefined);
|
|
91
|
+
expect(result.parentIdOverwritten).toBe(false);
|
|
92
|
+
expect(result.newParentId).toBe('parent-1'); // Preserved
|
|
93
|
+
});
|
|
94
|
+
it('would overwrite ParentID if parentCollection were passed during edit (the bug)', () => {
|
|
95
|
+
// Before fix: parentCollection = the collection itself
|
|
96
|
+
const result = simulateSave(collection, collection);
|
|
97
|
+
expect(result.parentIdOverwritten).toBe(true);
|
|
98
|
+
expect(result.newParentId).toBe('col-1'); // Self-referencing — the bug!
|
|
99
|
+
});
|
|
100
|
+
it('should set ParentID when creating a new child collection', () => {
|
|
101
|
+
const parent = { ID: 'parent-1', Name: 'Parent', ParentID: null };
|
|
102
|
+
const result = simulateSave(undefined, parent);
|
|
103
|
+
expect(result.parentIdOverwritten).toBe(true);
|
|
104
|
+
expect(result.newParentId).toBe('parent-1');
|
|
105
|
+
});
|
|
106
|
+
it('should leave ParentID null when creating a new root collection', () => {
|
|
107
|
+
const result = simulateSave(undefined, undefined);
|
|
108
|
+
expect(result.parentIdOverwritten).toBe(false);
|
|
109
|
+
expect(result.newParentId).toBeNull();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
// ============================================================
|
|
113
|
+
// Bug 2: Item counts always showing "Empty"
|
|
114
|
+
// ============================================================
|
|
115
|
+
/**
|
|
116
|
+
* Reproduces the getItemCountText display logic
|
|
117
|
+
*/
|
|
118
|
+
function getItemCountText(itemCount) {
|
|
119
|
+
if (itemCount !== undefined) {
|
|
120
|
+
if (itemCount === 0)
|
|
121
|
+
return 'Empty';
|
|
122
|
+
if (itemCount === 1)
|
|
123
|
+
return '1 item';
|
|
124
|
+
return `${itemCount} items`;
|
|
125
|
+
}
|
|
126
|
+
return '';
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Reproduces the item count calculation from loadItemCounts:
|
|
130
|
+
* counts child collections + collection artifacts per parent collection
|
|
131
|
+
*/
|
|
132
|
+
function buildItemCountMap(childCollections, collectionArtifacts) {
|
|
133
|
+
const map = new Map();
|
|
134
|
+
for (const child of childCollections) {
|
|
135
|
+
map.set(child.ParentID, (map.get(child.ParentID) || 0) + 1);
|
|
136
|
+
}
|
|
137
|
+
for (const ca of collectionArtifacts) {
|
|
138
|
+
map.set(ca.CollectionID, (map.get(ca.CollectionID) || 0) + 1);
|
|
139
|
+
}
|
|
140
|
+
return map;
|
|
141
|
+
}
|
|
142
|
+
describe('Bug 2: item count display', () => {
|
|
143
|
+
describe('getItemCountText', () => {
|
|
144
|
+
it('should return "Empty" for count 0', () => {
|
|
145
|
+
expect(getItemCountText(0)).toBe('Empty');
|
|
146
|
+
});
|
|
147
|
+
it('should return "1 item" for count 1', () => {
|
|
148
|
+
expect(getItemCountText(1)).toBe('1 item');
|
|
149
|
+
});
|
|
150
|
+
it('should return "N items" for count > 1', () => {
|
|
151
|
+
expect(getItemCountText(5)).toBe('5 items');
|
|
152
|
+
});
|
|
153
|
+
it('should return empty string for undefined', () => {
|
|
154
|
+
expect(getItemCountText(undefined)).toBe('');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe('buildItemCountMap', () => {
|
|
158
|
+
it('should count child collections per parent', () => {
|
|
159
|
+
const children = [
|
|
160
|
+
{ ParentID: 'col-1' },
|
|
161
|
+
{ ParentID: 'col-1' },
|
|
162
|
+
{ ParentID: 'col-2' }
|
|
163
|
+
];
|
|
164
|
+
const map = buildItemCountMap(children, []);
|
|
165
|
+
expect(map.get('col-1')).toBe(2);
|
|
166
|
+
expect(map.get('col-2')).toBe(1);
|
|
167
|
+
});
|
|
168
|
+
it('should count artifacts per collection', () => {
|
|
169
|
+
const artifacts = [
|
|
170
|
+
{ CollectionID: 'col-1' },
|
|
171
|
+
{ CollectionID: 'col-1' },
|
|
172
|
+
{ CollectionID: 'col-1' }
|
|
173
|
+
];
|
|
174
|
+
const map = buildItemCountMap([], artifacts);
|
|
175
|
+
expect(map.get('col-1')).toBe(3);
|
|
176
|
+
});
|
|
177
|
+
it('should sum child collections and artifacts together', () => {
|
|
178
|
+
const children = [
|
|
179
|
+
{ ParentID: 'col-1' },
|
|
180
|
+
{ ParentID: 'col-1' }
|
|
181
|
+
];
|
|
182
|
+
const artifacts = [
|
|
183
|
+
{ CollectionID: 'col-1' },
|
|
184
|
+
{ CollectionID: 'col-1' },
|
|
185
|
+
{ CollectionID: 'col-1' }
|
|
186
|
+
];
|
|
187
|
+
const map = buildItemCountMap(children, artifacts);
|
|
188
|
+
// 2 children + 3 artifacts = 5 items
|
|
189
|
+
expect(map.get('col-1')).toBe(5);
|
|
190
|
+
});
|
|
191
|
+
it('should return 0 (via map miss) for collections with no items', () => {
|
|
192
|
+
const map = buildItemCountMap([], []);
|
|
193
|
+
expect(map.get('col-1') || 0).toBe(0);
|
|
194
|
+
});
|
|
195
|
+
it('should handle multiple collections independently', () => {
|
|
196
|
+
const children = [
|
|
197
|
+
{ ParentID: 'col-1' },
|
|
198
|
+
{ ParentID: 'col-2' },
|
|
199
|
+
{ ParentID: 'col-2' }
|
|
200
|
+
];
|
|
201
|
+
const artifacts = [
|
|
202
|
+
{ CollectionID: 'col-1' },
|
|
203
|
+
{ CollectionID: 'col-3' }
|
|
204
|
+
];
|
|
205
|
+
const map = buildItemCountMap(children, artifacts);
|
|
206
|
+
expect(map.get('col-1')).toBe(2); // 1 child + 1 artifact
|
|
207
|
+
expect(map.get('col-2')).toBe(2); // 2 children
|
|
208
|
+
expect(map.get('col-3')).toBe(1); // 1 artifact
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
describe('end-to-end: count map feeds display text', () => {
|
|
212
|
+
it('should show correct text from calculated counts', () => {
|
|
213
|
+
const children = [{ ParentID: 'col-1' }];
|
|
214
|
+
const artifacts = [
|
|
215
|
+
{ CollectionID: 'col-1' },
|
|
216
|
+
{ CollectionID: 'col-2' }
|
|
217
|
+
];
|
|
218
|
+
const map = buildItemCountMap(children, artifacts);
|
|
219
|
+
expect(getItemCountText(map.get('col-1') || 0)).toBe('2 items');
|
|
220
|
+
expect(getItemCountText(map.get('col-2') || 0)).toBe('1 item');
|
|
221
|
+
expect(getItemCountText(map.get('col-3') || 0)).toBe('Empty');
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=collections-full-view.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collections-full-view.test.js","sourceRoot":"","sources":["../../src/__tests__/collections-full-view.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect, beforeEach } from 'vitest';\n\n/**\n * Tests for collections-full-view logic — extracted from the component\n * to verify bug fixes without Angular DI.\n *\n * Bug 1: Renaming a collection set ParentID to itself (self-referencing)\n * Bug 2: All collections showed \"Empty\" because itemCount was hardcoded to 0\n */\n\n// ============================================================\n// Bug 1: parentCollection binding when editing vs creating\n// ============================================================\n\ninterface MockCollection {\n ID: string;\n Name: string;\n ParentID: string | null;\n}\n\n/**\n * Reproduces the template binding logic:\n * [parentCollection]=\"editingCollection ? undefined : (currentCollection || undefined)\"\n */\nfunction resolveParentCollection(\n editingCollection: MockCollection | undefined,\n currentCollection: MockCollection | null\n): MockCollection | undefined {\n return editingCollection ? undefined : (currentCollection || undefined);\n}\n\ndescribe('Bug 1: parentCollection binding logic', () => {\n const rootCollection: MockCollection = {\n ID: 'root-1',\n Name: 'Root Collection',\n ParentID: null\n };\n\n const childCollection: MockCollection = {\n ID: 'child-1',\n Name: 'Child Collection',\n ParentID: 'root-1'\n };\n\n describe('when creating a new collection', () => {\n it('should pass currentCollection as parentCollection at root level', () => {\n // At root level, currentCollection is null\n const parent = resolveParentCollection(undefined, null);\n expect(parent).toBeUndefined();\n });\n\n it('should pass currentCollection as parentCollection when inside a collection', () => {\n // Inside rootCollection, creating a new sub-collection\n const parent = resolveParentCollection(undefined, rootCollection);\n expect(parent).toBe(rootCollection);\n });\n });\n\n describe('when editing an existing collection', () => {\n it('should NOT pass parentCollection when editing the current collection', () => {\n // Inside rootCollection, editing rootCollection itself\n // Before fix: parentCollection = rootCollection (the collection being edited!)\n // After fix: parentCollection = undefined\n const parent = resolveParentCollection(rootCollection, rootCollection);\n expect(parent).toBeUndefined();\n });\n\n it('should NOT pass parentCollection when editing a child collection from the list', () => {\n // Inside rootCollection, editing childCollection from the grid\n const parent = resolveParentCollection(childCollection, rootCollection);\n expect(parent).toBeUndefined();\n });\n\n it('should NOT pass parentCollection when editing at root level', () => {\n // At root level, editing rootCollection\n const parent = resolveParentCollection(rootCollection, null);\n expect(parent).toBeUndefined();\n });\n });\n});\n\n/**\n * Reproduces the form-modal save logic for ParentID:\n *\n * if (!this.collection) {\n * // creating new — set ParentID from parentCollection\n * } else if (this.parentCollection) {\n * collection.ParentID = this.parentCollection.ID;\n * }\n */\nfunction simulateSave(\n existingCollection: MockCollection | undefined,\n parentCollection: MockCollection | undefined\n): { parentIdOverwritten: boolean; newParentId: string | null } {\n if (!existingCollection) {\n // Creating new collection — parentCollection sets ParentID (expected)\n return {\n parentIdOverwritten: !!parentCollection,\n newParentId: parentCollection?.ID ?? null\n };\n } else if (parentCollection) {\n // Editing existing — parentCollection would overwrite ParentID\n return {\n parentIdOverwritten: true,\n newParentId: parentCollection.ID\n };\n }\n // Editing existing, no parentCollection — ParentID unchanged\n return {\n parentIdOverwritten: false,\n newParentId: existingCollection.ParentID\n };\n}\n\ndescribe('Bug 1: form-modal save logic for ParentID', () => {\n const collection: MockCollection = {\n ID: 'col-1',\n Name: 'My Collection',\n ParentID: 'parent-1'\n };\n\n it('should not overwrite ParentID when editing with no parentCollection (the fix)', () => {\n // After fix: parentCollection is undefined when editing\n const result = simulateSave(collection, undefined);\n expect(result.parentIdOverwritten).toBe(false);\n expect(result.newParentId).toBe('parent-1'); // Preserved\n });\n\n it('would overwrite ParentID if parentCollection were passed during edit (the bug)', () => {\n // Before fix: parentCollection = the collection itself\n const result = simulateSave(collection, collection);\n expect(result.parentIdOverwritten).toBe(true);\n expect(result.newParentId).toBe('col-1'); // Self-referencing — the bug!\n });\n\n it('should set ParentID when creating a new child collection', () => {\n const parent: MockCollection = { ID: 'parent-1', Name: 'Parent', ParentID: null };\n const result = simulateSave(undefined, parent);\n expect(result.parentIdOverwritten).toBe(true);\n expect(result.newParentId).toBe('parent-1');\n });\n\n it('should leave ParentID null when creating a new root collection', () => {\n const result = simulateSave(undefined, undefined);\n expect(result.parentIdOverwritten).toBe(false);\n expect(result.newParentId).toBeNull();\n });\n});\n\n// ============================================================\n// Bug 2: Item counts always showing \"Empty\"\n// ============================================================\n\n/**\n * Reproduces the getItemCountText display logic\n */\nfunction getItemCountText(itemCount?: number): string {\n if (itemCount !== undefined) {\n if (itemCount === 0) return 'Empty';\n if (itemCount === 1) return '1 item';\n return `${itemCount} items`;\n }\n return '';\n}\n\n/**\n * Reproduces the item count calculation from loadItemCounts:\n * counts child collections + collection artifacts per parent collection\n */\nfunction buildItemCountMap(\n childCollections: Array<{ ParentID: string }>,\n collectionArtifacts: Array<{ CollectionID: string }>\n): Map<string, number> {\n const map = new Map<string, number>();\n\n for (const child of childCollections) {\n map.set(child.ParentID, (map.get(child.ParentID) || 0) + 1);\n }\n\n for (const ca of collectionArtifacts) {\n map.set(ca.CollectionID, (map.get(ca.CollectionID) || 0) + 1);\n }\n\n return map;\n}\n\ndescribe('Bug 2: item count display', () => {\n describe('getItemCountText', () => {\n it('should return \"Empty\" for count 0', () => {\n expect(getItemCountText(0)).toBe('Empty');\n });\n\n it('should return \"1 item\" for count 1', () => {\n expect(getItemCountText(1)).toBe('1 item');\n });\n\n it('should return \"N items\" for count > 1', () => {\n expect(getItemCountText(5)).toBe('5 items');\n });\n\n it('should return empty string for undefined', () => {\n expect(getItemCountText(undefined)).toBe('');\n });\n });\n\n describe('buildItemCountMap', () => {\n it('should count child collections per parent', () => {\n const children = [\n { ParentID: 'col-1' },\n { ParentID: 'col-1' },\n { ParentID: 'col-2' }\n ];\n const map = buildItemCountMap(children, []);\n\n expect(map.get('col-1')).toBe(2);\n expect(map.get('col-2')).toBe(1);\n });\n\n it('should count artifacts per collection', () => {\n const artifacts = [\n { CollectionID: 'col-1' },\n { CollectionID: 'col-1' },\n { CollectionID: 'col-1' }\n ];\n const map = buildItemCountMap([], artifacts);\n\n expect(map.get('col-1')).toBe(3);\n });\n\n it('should sum child collections and artifacts together', () => {\n const children = [\n { ParentID: 'col-1' },\n { ParentID: 'col-1' }\n ];\n const artifacts = [\n { CollectionID: 'col-1' },\n { CollectionID: 'col-1' },\n { CollectionID: 'col-1' }\n ];\n const map = buildItemCountMap(children, artifacts);\n\n // 2 children + 3 artifacts = 5 items\n expect(map.get('col-1')).toBe(5);\n });\n\n it('should return 0 (via map miss) for collections with no items', () => {\n const map = buildItemCountMap([], []);\n expect(map.get('col-1') || 0).toBe(0);\n });\n\n it('should handle multiple collections independently', () => {\n const children = [\n { ParentID: 'col-1' },\n { ParentID: 'col-2' },\n { ParentID: 'col-2' }\n ];\n const artifacts = [\n { CollectionID: 'col-1' },\n { CollectionID: 'col-3' }\n ];\n const map = buildItemCountMap(children, artifacts);\n\n expect(map.get('col-1')).toBe(2); // 1 child + 1 artifact\n expect(map.get('col-2')).toBe(2); // 2 children\n expect(map.get('col-3')).toBe(1); // 1 artifact\n });\n });\n\n describe('end-to-end: count map feeds display text', () => {\n it('should show correct text from calculated counts', () => {\n const children = [{ ParentID: 'col-1' }];\n const artifacts = [\n { CollectionID: 'col-1' },\n { CollectionID: 'col-2' }\n ];\n const map = buildItemCountMap(children, artifacts);\n\n expect(getItemCountText(map.get('col-1') || 0)).toBe('2 items');\n expect(getItemCountText(map.get('col-2') || 0)).toBe('1 item');\n expect(getItemCountText(map.get('col-3') || 0)).toBe('Empty');\n });\n });\n});\n"]}
|
|
@@ -57,7 +57,16 @@ export declare class CollectionsFullViewComponent implements OnInit, OnDestroy {
|
|
|
57
57
|
showNewDropdown: boolean;
|
|
58
58
|
showSortDropdown: boolean;
|
|
59
59
|
activeArtifactId: string | null;
|
|
60
|
+
private itemCountMap;
|
|
60
61
|
isSelectMode: boolean;
|
|
62
|
+
PageSize: number;
|
|
63
|
+
CurrentPage: number;
|
|
64
|
+
/** Total number of pages based on current items and page size */
|
|
65
|
+
get TotalPages(): number;
|
|
66
|
+
/** Items for the current page */
|
|
67
|
+
get PagedItems(): CollectionViewItem[];
|
|
68
|
+
/** Navigate to a specific page */
|
|
69
|
+
GoToPage(page: number): void;
|
|
61
70
|
IsArtifactActive(item: CollectionViewItem): boolean;
|
|
62
71
|
showContextMenu: boolean;
|
|
63
72
|
contextMenuPosition: {
|
|
@@ -80,6 +89,10 @@ export declare class CollectionsFullViewComponent implements OnInit, OnDestroy {
|
|
|
80
89
|
private subscribeToArtifactState;
|
|
81
90
|
loadData(): Promise<void>;
|
|
82
91
|
private loadCollections;
|
|
92
|
+
/**
|
|
93
|
+
* Load item counts (child collections + artifacts) for all visible collections
|
|
94
|
+
*/
|
|
95
|
+
private loadItemCounts;
|
|
83
96
|
private loadUserPermissions;
|
|
84
97
|
private loadCurrentCollectionPermission;
|
|
85
98
|
private loadArtifacts;
|
|
@@ -89,6 +102,10 @@ export declare class CollectionsFullViewComponent implements OnInit, OnDestroy {
|
|
|
89
102
|
name: string;
|
|
90
103
|
}): Promise<void>;
|
|
91
104
|
navigateToRoot(): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Update a breadcrumb entry's name in place (e.g., after rename)
|
|
107
|
+
*/
|
|
108
|
+
private updateBreadcrumbName;
|
|
92
109
|
/**
|
|
93
110
|
* Navigate to a collection by ID, building the breadcrumb trail
|
|
94
111
|
* Used for deep linking from search results or URL parameters
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collections-full-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAgB,MAAM,eAAe,CAAC;AAC3H,OAAO,EAAE,QAAQ,EAAqB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAA8B,MAAM,+BAA+B,CAAC;AAC1I,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACjH,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;;AAGnI;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"collections-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/collection/collections-full-view.component.ts"],"names":[],"mappings":"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"}
|