@memberjunction/ng-list-management 0.0.1 → 3.0.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 (34) hide show
  1. package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts +170 -0
  2. package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -0
  3. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +943 -0
  4. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -0
  5. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +137 -0
  6. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -0
  7. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +658 -0
  8. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -0
  9. package/dist/lib/models/list-management.models.d.ts +206 -0
  10. package/dist/lib/models/list-management.models.d.ts.map +1 -0
  11. package/dist/lib/models/list-management.models.js +2 -0
  12. package/dist/lib/models/list-management.models.js.map +1 -0
  13. package/dist/lib/models/list-sharing.models.d.ts +193 -0
  14. package/dist/lib/models/list-sharing.models.d.ts.map +1 -0
  15. package/dist/lib/models/list-sharing.models.js +2 -0
  16. package/dist/lib/models/list-sharing.models.js.map +1 -0
  17. package/dist/lib/module.d.ts +44 -0
  18. package/dist/lib/module.d.ts.map +1 -0
  19. package/dist/lib/module.js +101 -0
  20. package/dist/lib/module.js.map +1 -0
  21. package/dist/lib/services/list-management.service.d.ts +69 -0
  22. package/dist/lib/services/list-management.service.d.ts.map +1 -0
  23. package/dist/lib/services/list-management.service.js +411 -0
  24. package/dist/lib/services/list-management.service.js.map +1 -0
  25. package/dist/lib/services/list-sharing.service.d.ts +98 -0
  26. package/dist/lib/services/list-sharing.service.d.ts.map +1 -0
  27. package/dist/lib/services/list-sharing.service.js +483 -0
  28. package/dist/lib/services/list-sharing.service.js.map +1 -0
  29. package/dist/public-api.d.ts +13 -0
  30. package/dist/public-api.d.ts.map +1 -0
  31. package/dist/public-api.js +23 -0
  32. package/dist/public-api.js.map +1 -0
  33. package/package.json +48 -6
  34. package/README.md +0 -45
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-management.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/list-management.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAoB,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAEpB,gBAAgB,EACjB,MAAM,kCAAkC,CAAC;;AAO1C;;;GAGG;AACH,qBAGa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAG9C,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,eAAe,CAAwD;IAG/E,OAAO,CAAC,cAAc,CAAuC;IACtD,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAsC;;IAI1E;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,UAAU,EAAE,CAAC;IA4CxB;;OAEG;IACG,iBAAiB,CAAC,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAuBrF;;;OAGG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAiDjC;;OAEG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC;IA2BxB;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvD;;OAEG;IACG,mBAAmB,CACvB,KAAK,EAAE,UAAU,EAAE,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAChC,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA+C/B;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,cAAc,GAAE,OAAc,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAkGhC;;OAEG;IACG,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,oBAAoB,CAAC;IAiDhC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA6BtE;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAUxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;yCAjdhB,qBAAqB;6CAArB,qBAAqB;CAydjC"}
@@ -0,0 +1,411 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Metadata, RunView } from '@memberjunction/core';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Service for managing list operations including data loading, caching,
7
+ * and batch add/remove operations.
8
+ */
9
+ export class ListManagementService {
10
+ CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
11
+ // Cache storage
12
+ listCache = new Map();
13
+ categoryCache = null;
14
+ membershipCache = new Map();
15
+ // Loading state subjects
16
+ loadingSubject = new BehaviorSubject(false);
17
+ loading$ = this.loadingSubject.asObservable();
18
+ constructor() { }
19
+ /**
20
+ * Get lists for a specific entity, with optional caching
21
+ */
22
+ async getListsForEntity(entityId, userId, forceRefresh = false) {
23
+ const cacheKey = `${entityId}_${userId || 'all'}`;
24
+ // Check cache first
25
+ if (!forceRefresh) {
26
+ const cached = this.listCache.get(cacheKey);
27
+ if (cached && this.isCacheValid(cached)) {
28
+ return cached.data;
29
+ }
30
+ }
31
+ this.loadingSubject.next(true);
32
+ try {
33
+ const rv = new RunView();
34
+ let filter = `EntityID = '${entityId}'`;
35
+ if (userId) {
36
+ filter += ` AND UserID = '${userId}'`;
37
+ }
38
+ const result = await rv.RunView({
39
+ EntityName: 'Lists',
40
+ ExtraFilter: filter,
41
+ OrderBy: 'Name',
42
+ ResultType: 'entity_object'
43
+ });
44
+ if (result.Success) {
45
+ const lists = result.Results || [];
46
+ this.listCache.set(cacheKey, {
47
+ data: lists,
48
+ timestamp: new Date()
49
+ });
50
+ return lists;
51
+ }
52
+ else {
53
+ console.error('Failed to load lists:', result.ErrorMessage);
54
+ return [];
55
+ }
56
+ }
57
+ finally {
58
+ this.loadingSubject.next(false);
59
+ }
60
+ }
61
+ /**
62
+ * Get all list categories
63
+ */
64
+ async getListCategories(forceRefresh = false) {
65
+ if (!forceRefresh && this.categoryCache && this.isCacheValid(this.categoryCache)) {
66
+ return this.categoryCache.data;
67
+ }
68
+ const rv = new RunView();
69
+ const result = await rv.RunView({
70
+ EntityName: 'List Categories',
71
+ OrderBy: 'Name',
72
+ ResultType: 'entity_object'
73
+ });
74
+ if (result.Success) {
75
+ this.categoryCache = {
76
+ data: result.Results || [],
77
+ timestamp: new Date()
78
+ };
79
+ return this.categoryCache.data;
80
+ }
81
+ return [];
82
+ }
83
+ /**
84
+ * Get membership information for a set of records
85
+ * Returns a Map where key is listId and value is array of recordIds that are members
86
+ */
87
+ async getRecordMembership(entityId, recordIds) {
88
+ if (recordIds.length === 0) {
89
+ return new Map();
90
+ }
91
+ const cacheKey = `${entityId}_${recordIds.sort().join(',')}`;
92
+ // Check cache
93
+ const cached = this.membershipCache.get(cacheKey);
94
+ if (cached && this.isCacheValid(cached)) {
95
+ return cached.data;
96
+ }
97
+ this.loadingSubject.next(true);
98
+ try {
99
+ const rv = new RunView();
100
+ // Get all list details for these records
101
+ const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');
102
+ const result = await rv.RunView({
103
+ EntityName: 'List Details',
104
+ ExtraFilter: `RecordID IN (${recordIdFilter})`,
105
+ ResultType: 'entity_object'
106
+ });
107
+ const membership = new Map();
108
+ if (result.Success && result.Results) {
109
+ for (const detail of result.Results) {
110
+ const existingRecords = membership.get(detail.ListID) || [];
111
+ if (!existingRecords.includes(detail.RecordID)) {
112
+ existingRecords.push(detail.RecordID);
113
+ }
114
+ membership.set(detail.ListID, existingRecords);
115
+ }
116
+ }
117
+ this.membershipCache.set(cacheKey, {
118
+ data: membership,
119
+ timestamp: new Date()
120
+ });
121
+ return membership;
122
+ }
123
+ finally {
124
+ this.loadingSubject.next(false);
125
+ }
126
+ }
127
+ /**
128
+ * Get lists that contain a specific record
129
+ */
130
+ async getListsForRecord(entityId, recordId) {
131
+ const rv = new RunView();
132
+ // Get list details for this record
133
+ const detailsResult = await rv.RunView({
134
+ EntityName: 'List Details',
135
+ ExtraFilter: `RecordID = '${recordId}'`,
136
+ ResultType: 'entity_object'
137
+ });
138
+ if (!detailsResult.Success || !detailsResult.Results || detailsResult.Results.length === 0) {
139
+ return [];
140
+ }
141
+ const listIds = [...new Set(detailsResult.Results.map((d) => d.ListID))];
142
+ // Get the lists filtered by entity
143
+ const listIdFilter = listIds.map(id => `'${id}'`).join(',');
144
+ const listsResult = await rv.RunView({
145
+ EntityName: 'Lists',
146
+ ExtraFilter: `ID IN (${listIdFilter}) AND EntityID = '${entityId}'`,
147
+ ResultType: 'entity_object'
148
+ });
149
+ return listsResult.Success ? (listsResult.Results || []) : [];
150
+ }
151
+ /**
152
+ * Get item count for a list
153
+ */
154
+ async getListItemCount(listId) {
155
+ const rv = new RunView();
156
+ const result = await rv.RunView({
157
+ EntityName: 'List Details',
158
+ ExtraFilter: `ListID = '${listId}'`,
159
+ ResultType: 'count_only'
160
+ });
161
+ return result.Success ? result.TotalRowCount : 0;
162
+ }
163
+ /**
164
+ * Build view models for lists with membership information
165
+ */
166
+ async buildListViewModels(lists, recordIds, membership) {
167
+ const viewModels = [];
168
+ const rv = new RunView();
169
+ // Get item counts for all lists in one batch query
170
+ const listIds = lists.map(l => l.ID);
171
+ const listIdFilter = listIds.map(id => `'${id}'`).join(',');
172
+ // Get counts grouped by list - using a regular query since we need aggregation
173
+ const countsResult = await rv.RunView({
174
+ EntityName: 'List Details',
175
+ ExtraFilter: listIds.length > 0 ? `ListID IN (${listIdFilter})` : '1=0',
176
+ ResultType: 'entity_object'
177
+ });
178
+ // Build count map
179
+ const countMap = new Map();
180
+ if (countsResult.Success && countsResult.Results) {
181
+ for (const detail of countsResult.Results) {
182
+ const current = countMap.get(detail.ListID) || 0;
183
+ countMap.set(detail.ListID, current + 1);
184
+ }
185
+ }
186
+ for (const list of lists) {
187
+ const memberRecordIds = membership.get(list.ID) || [];
188
+ const membershipCount = memberRecordIds.length;
189
+ const totalSelected = recordIds.length;
190
+ viewModels.push({
191
+ list,
192
+ itemCount: countMap.get(list.ID) || 0,
193
+ membershipCount,
194
+ totalSelectedRecords: totalSelected,
195
+ isFullMember: membershipCount === totalSelected && totalSelected > 0,
196
+ isPartialMember: membershipCount > 0 && membershipCount < totalSelected,
197
+ isNotMember: membershipCount === 0,
198
+ lastUpdated: list.Get('__mj_UpdatedAt') || new Date(),
199
+ category: undefined, // Can be populated separately if needed
200
+ isSelectedForAdd: false,
201
+ isSelectedForRemove: false
202
+ });
203
+ }
204
+ return viewModels;
205
+ }
206
+ /**
207
+ * Add records to one or more lists
208
+ */
209
+ async addRecordsToLists(listIds, recordIds, skipDuplicates = true) {
210
+ console.log(`[ListManagementService] addRecordsToLists called:`);
211
+ console.log(` - listIds (${listIds.length}):`, listIds);
212
+ console.log(` - recordIds (${recordIds.length}):`, recordIds);
213
+ console.log(` - skipDuplicates:`, skipDuplicates);
214
+ const result = {
215
+ success: 0,
216
+ failed: 0,
217
+ skipped: 0,
218
+ errors: []
219
+ };
220
+ const md = new Metadata();
221
+ // Get existing membership to skip duplicates
222
+ let existingMembership = new Map();
223
+ if (skipDuplicates) {
224
+ const rv = new RunView();
225
+ const listIdFilter = listIds.map(id => `'${id}'`).join(',');
226
+ const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');
227
+ const existing = await rv.RunView({
228
+ EntityName: 'List Details',
229
+ ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,
230
+ ResultType: 'entity_object'
231
+ }, md.CurrentUser);
232
+ if (existing.Success && existing.Results) {
233
+ for (const detail of existing.Results) {
234
+ const recordSet = existingMembership.get(detail.ListID) || new Set();
235
+ recordSet.add(detail.RecordID);
236
+ existingMembership.set(detail.ListID, recordSet);
237
+ }
238
+ }
239
+ }
240
+ // Build list of records to add (excluding duplicates)
241
+ const recordsToAdd = [];
242
+ for (const listId of listIds) {
243
+ const existingRecords = existingMembership.get(listId) || new Set();
244
+ for (const recordId of recordIds) {
245
+ if (skipDuplicates && existingRecords.has(recordId)) {
246
+ result.skipped++;
247
+ }
248
+ else {
249
+ recordsToAdd.push({ listId, recordId });
250
+ }
251
+ }
252
+ }
253
+ if (recordsToAdd.length === 0) {
254
+ console.log(`[ListManagementService] No records to add (all skipped as duplicates)`);
255
+ return result;
256
+ }
257
+ // Use transaction group for bulk insert
258
+ const tg = await md.CreateTransactionGroup();
259
+ for (const { listId, recordId } of recordsToAdd) {
260
+ try {
261
+ const listDetail = await md.GetEntityObject('List Details', md.CurrentUser);
262
+ listDetail.ListID = listId;
263
+ listDetail.RecordID = recordId;
264
+ listDetail.TransactionGroup = tg;
265
+ const saveResult = await listDetail.Save();
266
+ if (!saveResult) {
267
+ console.error(`[ListManagementService] Failed to queue record ${recordId} for list ${listId}:`, listDetail.LatestResult?.Message);
268
+ result.errors.push(`Failed to add record ${recordId} to list ${listId}: ${listDetail.LatestResult?.Message || 'Unknown error'}`);
269
+ }
270
+ }
271
+ catch (error) {
272
+ const errorMessage = error instanceof Error ? error.message : String(error);
273
+ console.error(`[ListManagementService] Exception adding record:`, error);
274
+ result.errors.push(`Error adding record ${recordId} to list ${listId}: ${errorMessage}`);
275
+ }
276
+ }
277
+ // Submit the transaction
278
+ console.log(`[ListManagementService] Submitting transaction with ${recordsToAdd.length} records...`);
279
+ const success = await tg.Submit();
280
+ if (success) {
281
+ result.success = recordsToAdd.length - result.errors.length;
282
+ result.failed = result.errors.length;
283
+ console.log(`[ListManagementService] Transaction succeeded. Added ${result.success} records.`);
284
+ }
285
+ else {
286
+ result.failed = recordsToAdd.length;
287
+ result.success = 0;
288
+ console.error(`[ListManagementService] Transaction failed`);
289
+ result.errors.push('Transaction failed to submit');
290
+ }
291
+ // Invalidate membership cache
292
+ this.membershipCache.clear();
293
+ console.log(`[ListManagementService] addRecordsToLists final result:`, result);
294
+ return result;
295
+ }
296
+ /**
297
+ * Remove records from one or more lists
298
+ */
299
+ async removeRecordsFromLists(listIds, recordIds) {
300
+ const result = {
301
+ success: 0,
302
+ failed: 0,
303
+ skipped: 0,
304
+ errors: []
305
+ };
306
+ const md = new Metadata();
307
+ const rv = new RunView();
308
+ // Find existing list details to delete
309
+ const listIdFilter = listIds.map(id => `'${id}'`).join(',');
310
+ const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');
311
+ const existingResult = await rv.RunView({
312
+ EntityName: 'List Details',
313
+ ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,
314
+ ResultType: 'entity_object'
315
+ });
316
+ if (!existingResult.Success) {
317
+ result.errors.push('Failed to query existing list details');
318
+ return result;
319
+ }
320
+ // Delete each matching detail
321
+ for (const detail of existingResult.Results || []) {
322
+ try {
323
+ const deleteResult = await detail.Delete();
324
+ if (deleteResult) {
325
+ result.success++;
326
+ }
327
+ else {
328
+ result.failed++;
329
+ result.errors.push(`Failed to remove record ${detail.RecordID} from list ${detail.ListID}`);
330
+ }
331
+ }
332
+ catch (error) {
333
+ result.failed++;
334
+ const errorMessage = error instanceof Error ? error.message : String(error);
335
+ result.errors.push(`Error removing record: ${errorMessage}`);
336
+ }
337
+ }
338
+ // Invalidate caches
339
+ this.membershipCache.clear();
340
+ return result;
341
+ }
342
+ /**
343
+ * Create a new list
344
+ */
345
+ async createList(config) {
346
+ const md = new Metadata();
347
+ try {
348
+ const list = await md.GetEntityObject('Lists');
349
+ list.NewRecord();
350
+ list.Name = config.name;
351
+ list.Description = config.description || '';
352
+ list.EntityID = config.entityId;
353
+ list.UserID = md.CurrentUser.ID;
354
+ if (config.categoryId) {
355
+ list.CategoryID = config.categoryId;
356
+ }
357
+ const saveResult = await list.Save();
358
+ if (saveResult) {
359
+ // Invalidate list cache
360
+ this.invalidateListCache(config.entityId);
361
+ return list;
362
+ }
363
+ return null;
364
+ }
365
+ catch (error) {
366
+ console.error('Error creating list:', error);
367
+ return null;
368
+ }
369
+ }
370
+ /**
371
+ * Check if a cache entry is still valid
372
+ */
373
+ isCacheValid(entry) {
374
+ const now = new Date().getTime();
375
+ const entryTime = entry.timestamp.getTime();
376
+ return (now - entryTime) < this.CACHE_TTL_MS;
377
+ }
378
+ /**
379
+ * Invalidate cache for a specific entity or all caches
380
+ */
381
+ invalidateCache(entityId) {
382
+ if (entityId) {
383
+ this.invalidateListCache(entityId);
384
+ }
385
+ else {
386
+ this.listCache.clear();
387
+ this.categoryCache = null;
388
+ this.membershipCache.clear();
389
+ }
390
+ }
391
+ /**
392
+ * Invalidate list cache for a specific entity
393
+ */
394
+ invalidateListCache(entityId) {
395
+ // Remove all cache entries that start with this entityId
396
+ for (const key of this.listCache.keys()) {
397
+ if (key.startsWith(entityId)) {
398
+ this.listCache.delete(key);
399
+ }
400
+ }
401
+ }
402
+ static ɵfac = function ListManagementService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListManagementService)(); };
403
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ListManagementService, factory: ListManagementService.ɵfac, providedIn: 'root' });
404
+ }
405
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListManagementService, [{
406
+ type: Injectable,
407
+ args: [{
408
+ providedIn: 'root'
409
+ }]
410
+ }], () => [], null); })();
411
+ //# sourceMappingURL=list-management.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-management.service.js","sourceRoot":"","sources":["../../../src/lib/services/list-management.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { UserEntity, RoleEntity } from '@memberjunction/core-entities';
2
+ import { Observable } from 'rxjs';
3
+ import { ListShareInfo, ListPermissionLevel, ShareRecipient, ListShareResult } from '../models/list-sharing.models';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Service for managing list sharing using the existing ResourcePermission system.
7
+ * Lists are already registered as a ResourceType, so we use ResourcePermissions
8
+ * to share lists with users and roles.
9
+ */
10
+ export declare class ListSharingService {
11
+ private loadingSubject;
12
+ loading$: Observable<boolean>;
13
+ private usersCache;
14
+ private rolesCache;
15
+ constructor();
16
+ /**
17
+ * Get the ResourceType ID for Lists
18
+ */
19
+ getListResourceTypeId(): string;
20
+ /**
21
+ * Get all shares for a specific list
22
+ */
23
+ getListShares(listId: string): Promise<ListShareInfo[]>;
24
+ /**
25
+ * Get permission level for a specific user on a specific list
26
+ */
27
+ getUserPermissionLevel(listId: string, userId: string): Promise<ListPermissionLevel | null>;
28
+ /**
29
+ * Share a list with a user
30
+ */
31
+ shareListWithUser(listId: string, userId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
32
+ /**
33
+ * Share a list with a role
34
+ */
35
+ shareListWithRole(listId: string, roleId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
36
+ /**
37
+ * Update permission level for an existing share
38
+ */
39
+ updateSharePermission(shareId: string, newPermissionLevel: ListPermissionLevel): Promise<ListShareResult>;
40
+ /**
41
+ * Remove a share (revoke access)
42
+ */
43
+ removeShare(shareId: string): Promise<ListShareResult>;
44
+ /**
45
+ * Get lists shared with the current user (that they don't own)
46
+ */
47
+ getListsSharedWithUser(userId: string): Promise<string[]>;
48
+ /**
49
+ * Get lists that the user has shared with others
50
+ */
51
+ getListsSharedByUser(userId: string): Promise<Map<string, number>>;
52
+ /**
53
+ * Check if user can share a list (must be owner or have Owner permission)
54
+ */
55
+ canUserShareList(listId: string, userId: string): Promise<boolean>;
56
+ /**
57
+ * Search users for sharing autocomplete
58
+ */
59
+ searchUsers(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
60
+ /**
61
+ * Search roles for sharing autocomplete
62
+ */
63
+ searchRoles(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
64
+ /**
65
+ * Get all available users (cached)
66
+ */
67
+ getAllUsers(forceRefresh?: boolean): Promise<UserEntity[]>;
68
+ /**
69
+ * Get all available roles (cached)
70
+ */
71
+ getAllRoles(forceRefresh?: boolean): Promise<RoleEntity[]>;
72
+ /**
73
+ * Helper to find existing share
74
+ */
75
+ private findExistingShare;
76
+ /**
77
+ * Convert ResourcePermissionEntity to ListShareInfo
78
+ */
79
+ private convertToListShareInfo;
80
+ /**
81
+ * Get sharing summary for a single list
82
+ */
83
+ getListSharingSummary(listId: string): Promise<{
84
+ listId: string;
85
+ totalShares: number;
86
+ userShares: number;
87
+ roleShares: number;
88
+ isSharedWithMe: boolean;
89
+ isSharedByMe: boolean;
90
+ }>;
91
+ /**
92
+ * Clear internal caches
93
+ */
94
+ clearCache(): void;
95
+ static ɵfac: i0.ɵɵFactoryDeclaration<ListSharingService, never>;
96
+ static ɵprov: i0.ɵɵInjectableDeclaration<ListSharingService>;
97
+ }
98
+ //# sourceMappingURL=list-sharing.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-sharing.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/list-sharing.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,UAAU,EACV,UAAU,EACX,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAmB,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;;AAOpH;;;;GAIG;AACH,qBAGa,kBAAkB;IAC7B,OAAO,CAAC,cAAc,CAAuC;IACtD,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAsC;IAG1E,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,UAAU,CAA6B;;IAI/C;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA+B7D;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAmBjG;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,CAAC;IA4C3B;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,mBAAmB,EACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,CAAC;IA4C3B;;OAEG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,mBAAmB,GACtC,OAAO,CAAC,eAAe,CAAC;IA8B3B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA4B5D;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB/D;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAuCxE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBxE;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuBpF;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsBpF;;OAEG;IACG,WAAW,CAAC,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAqBvE;;OAEG;IACG,WAAW,CAAC,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoBvE;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,sBAAsB;IAmDpC;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAkCrL;;OAEG;IACH,UAAU,IAAI,IAAI;yCAhiBP,kBAAkB;6CAAlB,kBAAkB;CAoiB9B"}