@memberjunction/ng-list-management 6.1.4 → 6.2.0-edge.1

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 (53) hide show
  1. package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts +74 -14
  2. package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts.map +1 -1
  3. package/dist/lib/components/audience-source-picker/audience-source-picker.component.js +177 -57
  4. package/dist/lib/components/audience-source-picker/audience-source-picker.component.js.map +1 -1
  5. package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts +7 -1
  6. package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts.map +1 -1
  7. package/dist/lib/components/audience-source-summary/audience-source-summary.component.js +17 -5
  8. package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map +1 -1
  9. package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts +30 -4
  10. package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts.map +1 -1
  11. package/dist/lib/components/list-audit-log/list-audit-log.component.js +54 -14
  12. package/dist/lib/components/list-audit-log/list-audit-log.component.js.map +1 -1
  13. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts +17 -1
  14. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts.map +1 -1
  15. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js +45 -13
  16. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -1
  17. package/dist/lib/components/list-invitations/list-invitations.component.d.ts +48 -8
  18. package/dist/lib/components/list-invitations/list-invitations.component.d.ts.map +1 -1
  19. package/dist/lib/components/list-invitations/list-invitations.component.js +108 -28
  20. package/dist/lib/components/list-invitations/list-invitations.component.js.map +1 -1
  21. package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts +123 -15
  22. package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +312 -100
  24. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -1
  25. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +128 -14
  26. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -1
  27. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +288 -92
  28. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
  29. package/dist/lib/components/list-stats/list-stats.component.d.ts +32 -6
  30. package/dist/lib/components/list-stats/list-stats.component.d.ts.map +1 -1
  31. package/dist/lib/components/list-stats/list-stats.component.js +67 -15
  32. package/dist/lib/components/list-stats/list-stats.component.js.map +1 -1
  33. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts +44 -8
  34. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts.map +1 -1
  35. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +100 -28
  36. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -1
  37. package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts +18 -2
  38. package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts.map +1 -1
  39. package/dist/lib/components/shared-with-me/shared-with-me.component.js +41 -9
  40. package/dist/lib/components/shared-with-me/shared-with-me.component.js.map +1 -1
  41. package/dist/lib/components/tag-chips/tag-chips.component.d.ts +30 -6
  42. package/dist/lib/components/tag-chips/tag-chips.component.d.ts.map +1 -1
  43. package/dist/lib/components/tag-chips/tag-chips.component.js +76 -28
  44. package/dist/lib/components/tag-chips/tag-chips.component.js.map +1 -1
  45. package/dist/lib/services/list-management.service.d.ts +25 -1
  46. package/dist/lib/services/list-management.service.d.ts.map +1 -1
  47. package/dist/lib/services/list-management.service.js +59 -11
  48. package/dist/lib/services/list-management.service.js.map +1 -1
  49. package/dist/lib/services/list-sharing.service.d.ts +42 -1
  50. package/dist/lib/services/list-sharing.service.d.ts.map +1 -1
  51. package/dist/lib/services/list-sharing.service.js +85 -17
  52. package/dist/lib/services/list-sharing.service.js.map +1 -1
  53. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"list-management.service.js","sourceRoot":"","sources":["../../../src/lib/services/list-management.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { IMetadataProvider, Metadata, RunView, UserInfo } from '@memberjunction/core';\nimport { MJListEntity, MJListDetailEntity, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport {\n ListItemViewModel,\n BatchOperationResult,\n RecordMembershipInfo,\n CreateListConfig\n} from '../models/list-management.models';\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: Date;\n}\n\n/**\n * Service for managing list operations including data loading, caching,\n * and batch add/remove operations.\n *\n * Multi-provider note: callers under a non-default provider should set\n * `service.Provider = component.ProviderToUse` before invoking any methods.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ListManagementService {\n private readonly CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n // Cache storage\n private listCache = new Map<string, CacheEntry<MJListEntity[]>>();\n private categoryCache: CacheEntry<MJListCategoryEntity[]> | null = null;\n private membershipCache = new Map<string, CacheEntry<Map<string, string[]>>>();\n\n // Loading state subjects\n private loadingSubject = new BehaviorSubject<boolean>(false);\n public loading$: Observable<boolean> = this.loadingSubject.asObservable();\n\n private _provider: IMetadataProvider | null = null;\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n constructor() {}\n\n /**\n * Get lists for a specific entity, with optional caching\n */\n async getListsForEntity(\n entityId: string,\n userId?: string,\n forceRefresh: boolean = false\n ): Promise<MJListEntity[]> {\n const cacheKey = `${entityId}_${userId || 'all'}`;\n\n // Check cache first\n if (!forceRefresh) {\n const cached = this.listCache.get(cacheKey);\n if (cached && this.isCacheValid(cached)) {\n return cached.data;\n }\n }\n\n this.loadingSubject.next(true);\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n let filter = `EntityID = '${entityId}'`;\n\n if (userId) {\n filter += ` AND UserID = '${userId}'`;\n }\n\n const result = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: filter,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n const lists = result.Results || [];\n this.listCache.set(cacheKey, {\n data: lists,\n timestamp: new Date()\n });\n return lists;\n } else {\n console.error('Failed to load lists:', result.ErrorMessage);\n return [];\n }\n } finally {\n this.loadingSubject.next(false);\n }\n }\n\n /**\n * Get all list categories\n */\n async getListCategories(forceRefresh: boolean = false): Promise<MJListCategoryEntity[]> {\n if (!forceRefresh && this.categoryCache && this.isCacheValid(this.categoryCache)) {\n return this.categoryCache.data;\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJListCategoryEntity>({\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.categoryCache = {\n data: result.Results || [],\n timestamp: new Date()\n };\n return this.categoryCache.data;\n }\n\n return [];\n }\n\n /**\n * Get membership information for a set of records\n * Returns a Map where key is listId and value is array of recordIds that are members\n */\n async getRecordMembership(\n entityId: string,\n recordIds: string[]\n ): Promise<Map<string, string[]>> {\n if (recordIds.length === 0) {\n return new Map();\n }\n\n const cacheKey = `${entityId}_${recordIds.sort().join(',')}`;\n\n // Check cache\n const cached = this.membershipCache.get(cacheKey);\n if (cached && this.isCacheValid(cached)) {\n return cached.data;\n }\n\n this.loadingSubject.next(true);\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get all list details for these records — read-only lookup, so\n // 'simple' with narrow Fields (no BaseEntity instantiation overhead)\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n const result = await rv.RunView<{ ListID: string; RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `RecordID IN (${recordIdFilter})`,\n Fields: ['ListID', 'RecordID'],\n ResultType: 'simple'\n });\n\n const membership = new Map<string, string[]>();\n\n if (result.Success && result.Results) {\n for (const detail of result.Results) {\n const existingRecords = membership.get(detail.ListID) || [];\n if (!existingRecords.includes(detail.RecordID)) {\n existingRecords.push(detail.RecordID);\n }\n membership.set(detail.ListID, existingRecords);\n }\n }\n\n this.membershipCache.set(cacheKey, {\n data: membership,\n timestamp: new Date()\n });\n\n return membership;\n } finally {\n this.loadingSubject.next(false);\n }\n }\n\n /**\n * Get lists that contain a specific record\n */\n async getListsForRecord(\n entityId: string,\n recordId: string\n ): Promise<MJListEntity[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get list details for this record — read-only lookup\n const detailsResult = await rv.RunView<{ ListID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `RecordID = '${recordId}'`,\n Fields: ['ListID'],\n ResultType: 'simple'\n });\n\n if (!detailsResult.Success || !detailsResult.Results || detailsResult.Results.length === 0) {\n return [];\n }\n\n const listIds = [...new Set(detailsResult.Results.map(d => d.ListID))];\n\n // Get the lists filtered by entity\n const listIdFilter = listIds.map(id => `'${id}'`).join(',');\n const listsResult = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `ID IN (${listIdFilter}) AND EntityID = '${entityId}'`,\n ResultType: 'entity_object'\n });\n\n return listsResult.Success ? (listsResult.Results || []) : [];\n }\n\n /**\n * Get item count for a list\n */\n async getListItemCount(listId: string): Promise<number> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listId}'`,\n ResultType: 'count_only'\n });\n\n return result.Success ? result.TotalRowCount : 0;\n }\n\n /**\n * Build view models for lists with membership information\n */\n async buildListViewModels(\n lists: MJListEntity[],\n recordIds: string[],\n membership: Map<string, string[]>\n ): Promise<ListItemViewModel[]> {\n const viewModels: ListItemViewModel[] = [];\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get item counts for all lists in one batched round trip of count_only\n // queries — each an index-seek COUNT server-side. Never download the\n // membership rows just to count them.\n const countMap = new Map<string, number>();\n if (lists.length > 0) {\n const countResults = await rv.RunViews(lists.map(list => ({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${list.ID}'`,\n ResultType: 'count_only' as const\n })));\n countResults.forEach((res, idx) => {\n countMap.set(lists[idx].ID, res.Success ? res.TotalRowCount : 0);\n });\n }\n\n for (const list of lists) {\n const memberRecordIds = membership.get(list.ID) || [];\n const membershipCount = memberRecordIds.length;\n const totalSelected = recordIds.length;\n\n viewModels.push({\n list,\n itemCount: countMap.get(list.ID) || 0,\n membershipCount,\n totalSelectedRecords: totalSelected,\n isFullMember: membershipCount === totalSelected && totalSelected > 0,\n isPartialMember: membershipCount > 0 && membershipCount < totalSelected,\n isNotMember: membershipCount === 0,\n lastUpdated: list.Get('__mj_UpdatedAt') as Date || new Date(),\n category: undefined, // Can be populated separately if needed\n isSelectedForAdd: false,\n isSelectedForRemove: false\n });\n }\n\n return viewModels;\n }\n\n /**\n * Add records to one or more lists\n */\n async addRecordsToLists(\n listIds: string[],\n recordIds: string[],\n skipDuplicates: boolean = true\n ): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n success: 0,\n failed: 0,\n skipped: 0,\n errors: []\n };\n\n const md = this.Provider;\n\n // Get existing membership to skip duplicates\n let existingMembership = new Map<string, Set<string>>();\n if (skipDuplicates) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const listIdFilter = listIds.map(id => `'${id}'`).join(',');\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const existing = await rv.RunView<{ ListID: string; RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,\n Fields: ['ListID', 'RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (existing.Success && existing.Results) {\n for (const detail of existing.Results) {\n const recordSet = existingMembership.get(detail.ListID) || new Set();\n recordSet.add(detail.RecordID);\n existingMembership.set(detail.ListID, recordSet);\n }\n }\n }\n\n // Build list of records to add (excluding duplicates)\n const recordsToAdd: Array<{listId: string, recordId: string}> = [];\n for (const listId of listIds) {\n const existingRecords = existingMembership.get(listId) || new Set();\n for (const recordId of recordIds) {\n if (skipDuplicates && existingRecords.has(recordId)) {\n result.skipped++;\n } else {\n recordsToAdd.push({ listId, recordId });\n }\n }\n }\n\n if (recordsToAdd.length === 0) {\n return result;\n }\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (const { listId, recordId } of recordsToAdd) {\n try {\n const listDetail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n listDetail.ListID = listId;\n listDetail.RecordID = recordId;\n listDetail.TransactionGroup = tg;\n const saveResult = await listDetail.Save();\n if (!saveResult) {\n console.error(`[ListManagementService] Failed to queue record ${recordId} for list ${listId}:`, listDetail.LatestResult?.Message);\n result.errors.push(`Failed to add record ${recordId} to list ${listId}: ${listDetail.LatestResult?.Message || 'Unknown error'}`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[ListManagementService] Exception adding record:`, error);\n result.errors.push(`Error adding record ${recordId} to list ${listId}: ${errorMessage}`);\n }\n }\n\n // Submit the transaction\n const success = await tg.Submit();\n\n if (success) {\n result.success = recordsToAdd.length - result.errors.length;\n result.failed = result.errors.length;\n } else {\n result.failed = recordsToAdd.length;\n result.success = 0;\n result.errors.push('Transaction failed to submit');\n }\n\n // Invalidate membership cache\n this.membershipCache.clear();\n\n return result;\n }\n\n /**\n * Remove records from one or more lists\n */\n async removeRecordsFromLists(\n listIds: string[],\n recordIds: string[]\n ): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n success: 0,\n failed: 0,\n skipped: 0,\n errors: []\n };\n\n const md = this.Provider;\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Find existing list details to delete\n const listIdFilter = listIds.map(id => `'${id}'`).join(',');\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const existingResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,\n ResultType: 'entity_object'\n });\n\n if (!existingResult.Success) {\n result.errors.push('Failed to query existing list details');\n return result;\n }\n\n const toDelete = existingResult.Results || [];\n if (toDelete.length === 0) {\n return result;\n }\n\n // Queue all deletes in one TransactionGroup — a single round trip\n // instead of one per removed membership row. Deliberately atomic (unlike\n // the server-side bulk paths, which trade atomicity for per-record error\n // isolation): if Submit() fails, the transaction rolled back and no rows\n // were removed.\n const tg = await md.CreateTransactionGroup();\n let queued = 0;\n for (const detail of toDelete) {\n try {\n detail.TransactionGroup = tg;\n // With a TransactionGroup set, Delete() returns true once enqueued;\n // false means a pre-enqueue failure (validation/permission) and the\n // row never joined the transaction.\n if (await detail.Delete()) {\n queued++;\n } else {\n result.failed++;\n result.errors.push(`Failed to queue removal of record ${detail.RecordID} from list ${detail.ListID}: ${detail.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n }\n } catch (error) {\n result.failed++;\n const errorMessage = error instanceof Error ? error.message : String(error);\n result.errors.push(`Error removing record: ${errorMessage}`);\n }\n }\n\n const submitted = queued === 0 || await tg.Submit();\n if (submitted) {\n result.success = queued;\n } else {\n result.failed += queued;\n result.errors.push('Transaction failed to submit');\n }\n\n // Invalidate caches\n this.membershipCache.clear();\n\n return result;\n }\n\n /**\n * Create a new list\n */\n async createList(config: CreateListConfig): Promise<MJListEntity | null> {\n const md = this.Provider;\n\n try {\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.NewRecord();\n list.Name = config.name;\n list.Description = config.description || '';\n list.EntityID = config.entityId;\n list.UserID = md.CurrentUser.ID;\n\n if (config.categoryId) {\n list.CategoryID = config.categoryId;\n }\n\n const saveResult = await list.Save();\n if (saveResult) {\n // Invalidate list cache\n this.invalidateListCache(config.entityId);\n return list;\n }\n\n return null;\n } catch (error) {\n console.error('Error creating list:', error);\n return null;\n }\n }\n\n /**\n * Check if a cache entry is still valid\n */\n private isCacheValid<T>(entry: CacheEntry<T>): boolean {\n const now = new Date().getTime();\n const entryTime = entry.timestamp.getTime();\n return (now - entryTime) < this.CACHE_TTL_MS;\n }\n\n /**\n * Invalidate cache for a specific entity or all caches\n */\n invalidateCache(entityId?: string): void {\n if (entityId) {\n this.invalidateListCache(entityId);\n } else {\n this.listCache.clear();\n this.categoryCache = null;\n this.membershipCache.clear();\n }\n }\n\n /**\n * Invalidate list cache for a specific entity\n */\n private invalidateListCache(entityId: string): void {\n // Remove all cache entries that start with this entityId\n for (const key of this.listCache.keys()) {\n if (key.startsWith(entityId)) {\n this.listCache.delete(key);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"list-management.service.js","sourceRoot":"","sources":["../../../src/lib/services/list-management.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { IMetadataProvider, Metadata, RunView, UserInfo } from '@memberjunction/core';\nimport { MJListEntity, MJListDetailEntity, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport {\n ListItemViewModel,\n BatchOperationResult,\n RecordMembershipInfo,\n CreateListConfig\n} from '../models/list-management.models';\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: Date;\n}\n\n/**\n * Service for managing list operations including data loading, caching,\n * and batch add/remove operations.\n *\n * Multi-provider note: callers under a non-default provider should set\n * `service.Provider = component.ProviderToUse` before invoking any methods.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ListManagementService {\n private readonly CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\n // Cache storage\n private listCache = new Map<string, CacheEntry<MJListEntity[]>>();\n private categoryCache: CacheEntry<MJListCategoryEntity[]> | null = null;\n private membershipCache = new Map<string, CacheEntry<Map<string, string[]>>>();\n\n // Loading state subjects\n private loadingSubject = new BehaviorSubject<boolean>(false);\n public Loading$: Observable<boolean> = this.loadingSubject.asObservable();\n\n /** @deprecated Use {@link Loading$}. */\n public get loading$(): Observable<boolean> {\n return this.Loading$;\n }\n /** @deprecated Use {@link Loading$}. */\n public set loading$(value: Observable<boolean>) {\n this.Loading$ = value;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n constructor() {}\n\n /**\n * Get lists for a specific entity, with optional caching\n */\n async GetListsForEntity(\n entityId: string,\n userId?: string,\n forceRefresh: boolean = false\n ): Promise<MJListEntity[]> {\n const cacheKey = `${entityId}_${userId || 'all'}`;\n\n // Check cache first\n if (!forceRefresh) {\n const cached = this.listCache.get(cacheKey);\n if (cached && this.isCacheValid(cached)) {\n return cached.data;\n }\n }\n\n this.loadingSubject.next(true);\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n let filter = `EntityID = '${entityId}'`;\n\n if (userId) {\n filter += ` AND UserID = '${userId}'`;\n }\n\n const result = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: filter,\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n const lists = result.Results || [];\n this.listCache.set(cacheKey, {\n data: lists,\n timestamp: new Date()\n });\n return lists;\n } else {\n console.error('Failed to load lists:', result.ErrorMessage);\n return [];\n }\n } finally {\n this.loadingSubject.next(false);\n }\n }\n\n /** @deprecated Use {@link GetListsForEntity}. */\n async getListsForEntity(\n entityId: string,\n userId?: string,\n forceRefresh: boolean = false\n ): Promise<MJListEntity[]> {\n return this.GetListsForEntity(entityId, userId, forceRefresh);\n }\n\n /**\n * Get all list categories\n */\n async GetListCategories(forceRefresh: boolean = false): Promise<MJListCategoryEntity[]> {\n if (!forceRefresh && this.categoryCache && this.isCacheValid(this.categoryCache)) {\n return this.categoryCache.data;\n }\n\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJListCategoryEntity>({\n EntityName: 'MJ: List Categories',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n\n if (result.Success) {\n this.categoryCache = {\n data: result.Results || [],\n timestamp: new Date()\n };\n return this.categoryCache.data;\n }\n\n return [];\n }\n\n /** @deprecated Use {@link GetListCategories}. */\n async getListCategories(forceRefresh: boolean = false): Promise<MJListCategoryEntity[]> {\n return this.GetListCategories(forceRefresh);\n }\n\n /**\n * Get membership information for a set of records\n * Returns a Map where key is listId and value is array of recordIds that are members\n */\n async GetRecordMembership(\n entityId: string,\n recordIds: string[]\n ): Promise<Map<string, string[]>> {\n if (recordIds.length === 0) {\n return new Map();\n }\n\n const cacheKey = `${entityId}_${recordIds.sort().join(',')}`;\n\n // Check cache\n const cached = this.membershipCache.get(cacheKey);\n if (cached && this.isCacheValid(cached)) {\n return cached.data;\n }\n\n this.loadingSubject.next(true);\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get all list details for these records — read-only lookup, so\n // 'simple' with narrow Fields (no BaseEntity instantiation overhead)\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n const result = await rv.RunView<{ ListID: string; RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `RecordID IN (${recordIdFilter})`,\n Fields: ['ListID', 'RecordID'],\n ResultType: 'simple'\n });\n\n const membership = new Map<string, string[]>();\n\n if (result.Success && result.Results) {\n for (const detail of result.Results) {\n const existingRecords = membership.get(detail.ListID) || [];\n if (!existingRecords.includes(detail.RecordID)) {\n existingRecords.push(detail.RecordID);\n }\n membership.set(detail.ListID, existingRecords);\n }\n }\n\n this.membershipCache.set(cacheKey, {\n data: membership,\n timestamp: new Date()\n });\n\n return membership;\n } finally {\n this.loadingSubject.next(false);\n }\n }\n\n /** @deprecated Use {@link GetRecordMembership}. */\n async getRecordMembership(\n entityId: string,\n recordIds: string[]\n ): Promise<Map<string, string[]>> {\n return this.GetRecordMembership(entityId, recordIds);\n }\n\n /**\n * Get lists that contain a specific record\n */\n async GetListsForRecord(\n entityId: string,\n recordId: string\n ): Promise<MJListEntity[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get list details for this record — read-only lookup\n const detailsResult = await rv.RunView<{ ListID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `RecordID = '${recordId}'`,\n Fields: ['ListID'],\n ResultType: 'simple'\n });\n\n if (!detailsResult.Success || !detailsResult.Results || detailsResult.Results.length === 0) {\n return [];\n }\n\n const listIds = [...new Set(detailsResult.Results.map(d => d.ListID))];\n\n // Get the lists filtered by entity\n const listIdFilter = listIds.map(id => `'${id}'`).join(',');\n const listsResult = await rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `ID IN (${listIdFilter}) AND EntityID = '${entityId}'`,\n ResultType: 'entity_object'\n });\n\n return listsResult.Success ? (listsResult.Results || []) : [];\n }\n\n /** @deprecated Use {@link GetListsForRecord}. */\n async getListsForRecord(\n entityId: string,\n recordId: string\n ): Promise<MJListEntity[]> {\n return this.GetListsForRecord(entityId, recordId);\n }\n\n /**\n * Get item count for a list\n */\n async GetListItemCount(listId: string): Promise<number> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${listId}'`,\n ResultType: 'count_only'\n });\n\n return result.Success ? result.TotalRowCount : 0;\n }\n\n /** @deprecated Use {@link GetListItemCount}. */\n async getListItemCount(listId: string): Promise<number> {\n return this.GetListItemCount(listId);\n }\n\n /**\n * Build view models for lists with membership information\n */\n async BuildListViewModels(\n lists: MJListEntity[],\n recordIds: string[],\n membership: Map<string, string[]>\n ): Promise<ListItemViewModel[]> {\n const viewModels: ListItemViewModel[] = [];\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Get item counts for all lists in one batched round trip of count_only\n // queries — each an index-seek COUNT server-side. Never download the\n // membership rows just to count them.\n const countMap = new Map<string, number>();\n if (lists.length > 0) {\n const countResults = await rv.RunViews(lists.map(list => ({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID = '${list.ID}'`,\n ResultType: 'count_only' as const\n })));\n countResults.forEach((res, idx) => {\n countMap.set(lists[idx].ID, res.Success ? res.TotalRowCount : 0);\n });\n }\n\n for (const list of lists) {\n const memberRecordIds = membership.get(list.ID) || [];\n const membershipCount = memberRecordIds.length;\n const totalSelected = recordIds.length;\n\n viewModels.push({\n list,\n itemCount: countMap.get(list.ID) || 0,\n membershipCount,\n totalSelectedRecords: totalSelected,\n isFullMember: membershipCount === totalSelected && totalSelected > 0,\n isPartialMember: membershipCount > 0 && membershipCount < totalSelected,\n isNotMember: membershipCount === 0,\n lastUpdated: list.Get('__mj_UpdatedAt') as Date || new Date(),\n category: undefined, // Can be populated separately if needed\n isSelectedForAdd: false,\n isSelectedForRemove: false\n });\n }\n\n return viewModels;\n }\n\n /** @deprecated Use {@link BuildListViewModels}. */\n async buildListViewModels(\n lists: MJListEntity[],\n recordIds: string[],\n membership: Map<string, string[]>\n ): Promise<ListItemViewModel[]> {\n return this.BuildListViewModels(lists, recordIds, membership);\n }\n\n /**\n * Add records to one or more lists\n */\n async AddRecordsToLists(\n listIds: string[],\n recordIds: string[],\n skipDuplicates: boolean = true\n ): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n success: 0,\n failed: 0,\n skipped: 0,\n errors: []\n };\n\n const md = this.Provider;\n\n // Get existing membership to skip duplicates\n let existingMembership = new Map<string, Set<string>>();\n if (skipDuplicates) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const listIdFilter = listIds.map(id => `'${id}'`).join(',');\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const existing = await rv.RunView<{ ListID: string; RecordID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,\n Fields: ['ListID', 'RecordID'],\n ResultType: 'simple'\n }, md.CurrentUser);\n\n if (existing.Success && existing.Results) {\n for (const detail of existing.Results) {\n const recordSet = existingMembership.get(detail.ListID) || new Set();\n recordSet.add(detail.RecordID);\n existingMembership.set(detail.ListID, recordSet);\n }\n }\n }\n\n // Build list of records to add (excluding duplicates)\n const recordsToAdd: Array<{listId: string, recordId: string}> = [];\n for (const listId of listIds) {\n const existingRecords = existingMembership.get(listId) || new Set();\n for (const recordId of recordIds) {\n if (skipDuplicates && existingRecords.has(recordId)) {\n result.skipped++;\n } else {\n recordsToAdd.push({ listId, recordId });\n }\n }\n }\n\n if (recordsToAdd.length === 0) {\n return result;\n }\n\n // Use transaction group for bulk insert\n const tg = await md.CreateTransactionGroup();\n\n for (const { listId, recordId } of recordsToAdd) {\n try {\n const listDetail = await md.GetEntityObject<MJListDetailEntity>('MJ: List Details', md.CurrentUser);\n listDetail.ListID = listId;\n listDetail.RecordID = recordId;\n listDetail.TransactionGroup = tg;\n const saveResult = await listDetail.Save();\n if (!saveResult) {\n console.error(`[ListManagementService] Failed to queue record ${recordId} for list ${listId}:`, listDetail.LatestResult?.Message);\n result.errors.push(`Failed to add record ${recordId} to list ${listId}: ${listDetail.LatestResult?.Message || 'Unknown error'}`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[ListManagementService] Exception adding record:`, error);\n result.errors.push(`Error adding record ${recordId} to list ${listId}: ${errorMessage}`);\n }\n }\n\n // Submit the transaction\n const success = await tg.Submit();\n\n if (success) {\n result.success = recordsToAdd.length - result.errors.length;\n result.failed = result.errors.length;\n } else {\n result.failed = recordsToAdd.length;\n result.success = 0;\n result.errors.push('Transaction failed to submit');\n }\n\n // Invalidate membership cache\n this.membershipCache.clear();\n\n return result;\n }\n\n /** @deprecated Use {@link AddRecordsToLists}. */\n async addRecordsToLists(\n listIds: string[],\n recordIds: string[],\n skipDuplicates: boolean = true\n ): Promise<BatchOperationResult> {\n return this.AddRecordsToLists(listIds, recordIds, skipDuplicates);\n }\n\n /**\n * Remove records from one or more lists\n */\n async RemoveRecordsFromLists(\n listIds: string[],\n recordIds: string[]\n ): Promise<BatchOperationResult> {\n const result: BatchOperationResult = {\n success: 0,\n failed: 0,\n skipped: 0,\n errors: []\n };\n\n const md = this.Provider;\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Find existing list details to delete\n const listIdFilter = listIds.map(id => `'${id}'`).join(',');\n const recordIdFilter = recordIds.map(id => `'${id}'`).join(',');\n\n const existingResult = await rv.RunView<MJListDetailEntity>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID IN (${listIdFilter}) AND RecordID IN (${recordIdFilter})`,\n ResultType: 'entity_object'\n });\n\n if (!existingResult.Success) {\n result.errors.push('Failed to query existing list details');\n return result;\n }\n\n const toDelete = existingResult.Results || [];\n if (toDelete.length === 0) {\n return result;\n }\n\n // Queue all deletes in one TransactionGroup — a single round trip\n // instead of one per removed membership row. Deliberately atomic (unlike\n // the server-side bulk paths, which trade atomicity for per-record error\n // isolation): if Submit() fails, the transaction rolled back and no rows\n // were removed.\n const tg = await md.CreateTransactionGroup();\n let queued = 0;\n for (const detail of toDelete) {\n try {\n detail.TransactionGroup = tg;\n // With a TransactionGroup set, Delete() returns true once enqueued;\n // false means a pre-enqueue failure (validation/permission) and the\n // row never joined the transaction.\n if (await detail.Delete()) {\n queued++;\n } else {\n result.failed++;\n result.errors.push(`Failed to queue removal of record ${detail.RecordID} from list ${detail.ListID}: ${detail.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n }\n } catch (error) {\n result.failed++;\n const errorMessage = error instanceof Error ? error.message : String(error);\n result.errors.push(`Error removing record: ${errorMessage}`);\n }\n }\n\n const submitted = queued === 0 || await tg.Submit();\n if (submitted) {\n result.success = queued;\n } else {\n result.failed += queued;\n result.errors.push('Transaction failed to submit');\n }\n\n // Invalidate caches\n this.membershipCache.clear();\n\n return result;\n }\n\n /** @deprecated Use {@link RemoveRecordsFromLists}. */\n async removeRecordsFromLists(\n listIds: string[],\n recordIds: string[]\n ): Promise<BatchOperationResult> {\n return this.RemoveRecordsFromLists(listIds, recordIds);\n }\n\n /**\n * Create a new list\n */\n async CreateList(config: CreateListConfig): Promise<MJListEntity | null> {\n const md = this.Provider;\n\n try {\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', md.CurrentUser);\n list.NewRecord();\n list.Name = config.name;\n list.Description = config.description || '';\n list.EntityID = config.entityId;\n list.UserID = md.CurrentUser.ID;\n\n if (config.categoryId) {\n list.CategoryID = config.categoryId;\n }\n\n const saveResult = await list.Save();\n if (saveResult) {\n // Invalidate list cache\n this.invalidateListCache(config.entityId);\n return list;\n }\n\n return null;\n } catch (error) {\n console.error('Error creating list:', error);\n return null;\n }\n }\n\n /** @deprecated Use {@link CreateList}. */\n async createList(config: CreateListConfig): Promise<MJListEntity | null> {\n return this.CreateList(config);\n }\n\n /**\n * Check if a cache entry is still valid\n */\n private isCacheValid<T>(entry: CacheEntry<T>): boolean {\n const now = new Date().getTime();\n const entryTime = entry.timestamp.getTime();\n return (now - entryTime) < this.CACHE_TTL_MS;\n }\n\n /**\n * Invalidate cache for a specific entity or all caches\n */\n InvalidateCache(entityId?: string): void {\n if (entityId) {\n this.invalidateListCache(entityId);\n } else {\n this.listCache.clear();\n this.categoryCache = null;\n this.membershipCache.clear();\n }\n }\n\n /** @deprecated Use {@link InvalidateCache}. */\n invalidateCache(entityId?: string): void {\n return this.InvalidateCache(entityId);\n }\n\n /**\n * Invalidate list cache for a specific entity\n */\n private invalidateListCache(entityId: string): void {\n // Remove all cache entries that start with this entityId\n for (const key of this.listCache.keys()) {\n if (key.startsWith(entityId)) {\n this.listCache.delete(key);\n }\n }\n }\n}\n"]}
@@ -13,7 +13,11 @@ import * as i0 from "@angular/core";
13
13
  */
14
14
  export declare class ListSharingService {
15
15
  private loadingSubject;
16
- loading$: Observable<boolean>;
16
+ Loading$: Observable<boolean>;
17
+ /** @deprecated Use {@link Loading$}. */
18
+ get loading$(): Observable<boolean>;
19
+ /** @deprecated Use {@link Loading$}. */
20
+ set loading$(value: Observable<boolean>);
17
21
  private usersCache;
18
22
  private rolesCache;
19
23
  private _provider;
@@ -32,54 +36,80 @@ export declare class ListSharingService {
32
36
  /**
33
37
  * Get all shares for a specific list
34
38
  */
39
+ GetListShares(listId: string): Promise<ListShareInfo[]>;
40
+ /** @deprecated Use {@link GetListShares}. */
35
41
  getListShares(listId: string): Promise<ListShareInfo[]>;
36
42
  /**
37
43
  * Get permission level for a specific user on a specific list
38
44
  */
45
+ GetUserPermissionLevel(listId: string, userId: string): Promise<ListPermissionLevel | null>;
46
+ /** @deprecated Use {@link GetUserPermissionLevel}. */
39
47
  getUserPermissionLevel(listId: string, userId: string): Promise<ListPermissionLevel | null>;
40
48
  /**
41
49
  * Share a list with a user
42
50
  */
51
+ ShareListWithUser(listId: string, userId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
52
+ /** @deprecated Use {@link ShareListWithUser}. */
43
53
  shareListWithUser(listId: string, userId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
44
54
  /**
45
55
  * Share a list with a role
46
56
  */
57
+ ShareListWithRole(listId: string, roleId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
58
+ /** @deprecated Use {@link ShareListWithRole}. */
47
59
  shareListWithRole(listId: string, roleId: string, permissionLevel: ListPermissionLevel, sharedByUserId: string): Promise<ListShareResult>;
48
60
  /**
49
61
  * Update permission level for an existing share
50
62
  */
63
+ UpdateSharePermission(shareId: string, newPermissionLevel: ListPermissionLevel): Promise<ListShareResult>;
64
+ /** @deprecated Use {@link UpdateSharePermission}. */
51
65
  updateSharePermission(shareId: string, newPermissionLevel: ListPermissionLevel): Promise<ListShareResult>;
52
66
  /**
53
67
  * Remove a share (revoke access)
54
68
  */
69
+ RemoveShare(shareId: string): Promise<ListShareResult>;
70
+ /** @deprecated Use {@link RemoveShare}. */
55
71
  removeShare(shareId: string): Promise<ListShareResult>;
56
72
  /**
57
73
  * Get lists shared with the current user (that they don't own)
58
74
  */
75
+ GetListsSharedWithUser(userId: string): Promise<string[]>;
76
+ /** @deprecated Use {@link GetListsSharedWithUser}. */
59
77
  getListsSharedWithUser(userId: string): Promise<string[]>;
60
78
  /**
61
79
  * Get lists that the user has shared with others
62
80
  */
81
+ GetListsSharedByUser(userId: string): Promise<Map<string, number>>;
82
+ /** @deprecated Use {@link GetListsSharedByUser}. */
63
83
  getListsSharedByUser(userId: string): Promise<Map<string, number>>;
64
84
  /**
65
85
  * Check if user can share a list (must be owner or have Owner permission)
66
86
  */
87
+ CanUserShareList(listId: string, userId: string): Promise<boolean>;
88
+ /** @deprecated Use {@link CanUserShareList}. */
67
89
  canUserShareList(listId: string, userId: string): Promise<boolean>;
68
90
  /**
69
91
  * Search users for sharing autocomplete
70
92
  */
93
+ SearchUsers(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
94
+ /** @deprecated Use {@link SearchUsers}. */
71
95
  searchUsers(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
72
96
  /**
73
97
  * Search roles for sharing autocomplete
74
98
  */
99
+ SearchRoles(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
100
+ /** @deprecated Use {@link SearchRoles}. */
75
101
  searchRoles(searchTerm: string, limit?: number): Promise<ShareRecipient[]>;
76
102
  /**
77
103
  * Get all available users (cached)
78
104
  */
105
+ GetAllUsers(forceRefresh?: boolean): Promise<MJUserEntity[]>;
106
+ /** @deprecated Use {@link GetAllUsers}. */
79
107
  getAllUsers(forceRefresh?: boolean): Promise<MJUserEntity[]>;
80
108
  /**
81
109
  * Get all available roles (cached)
82
110
  */
111
+ GetAllRoles(forceRefresh?: boolean): Promise<MJRoleEntity[]>;
112
+ /** @deprecated Use {@link GetAllRoles}. */
83
113
  getAllRoles(forceRefresh?: boolean): Promise<MJRoleEntity[]>;
84
114
  /**
85
115
  * Helper to find existing share
@@ -92,6 +122,15 @@ export declare class ListSharingService {
92
122
  /**
93
123
  * Get sharing summary for a single list
94
124
  */
125
+ GetListSharingSummary(listId: string): Promise<{
126
+ listId: string;
127
+ totalShares: number;
128
+ userShares: number;
129
+ roleShares: number;
130
+ isSharedWithMe: boolean;
131
+ isSharedByMe: boolean;
132
+ }>;
133
+ /** @deprecated Use {@link GetListSharingSummary}. */
95
134
  getListSharingSummary(listId: string): Promise<{
96
135
  listId: string;
97
136
  totalShares: number;
@@ -103,6 +142,8 @@ export declare class ListSharingService {
103
142
  /**
104
143
  * Clear internal caches
105
144
  */
145
+ ClearCache(): void;
146
+ /** @deprecated Use {@link ClearCache}. */
106
147
  clearCache(): void;
107
148
  static ɵfac: i0.ɵɵFactoryDeclaration<ListSharingService, never>;
108
149
  static ɵprov: i0.ɵɵInjectableDeclaration<ListSharingService>;
@@ -1 +1 @@
1
- {"version":3,"file":"list-sharing.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/list-sharing.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list-sharing.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/list-sharing.service.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,15 @@ const LIST_RESOURCE_TYPE_NAME = 'Lists';
15
15
  */
16
16
  export class ListSharingService {
17
17
  loadingSubject = new BehaviorSubject(false);
18
- loading$ = this.loadingSubject.asObservable();
18
+ Loading$ = this.loadingSubject.asObservable();
19
+ /** @deprecated Use {@link Loading$}. */
20
+ get loading$() {
21
+ return this.Loading$;
22
+ }
23
+ /** @deprecated Use {@link Loading$}. */
24
+ set loading$(value) {
25
+ this.Loading$ = value;
26
+ }
19
27
  // Cache for users and roles (for autocomplete)
20
28
  usersCache = null;
21
29
  rolesCache = null;
@@ -47,7 +55,7 @@ export class ListSharingService {
47
55
  /**
48
56
  * Get all shares for a specific list
49
57
  */
50
- async getListShares(listId) {
58
+ async GetListShares(listId) {
51
59
  this.loadingSubject.next(true);
52
60
  try {
53
61
  const resourceTypeId = await this.resolveListResourceTypeId();
@@ -74,10 +82,14 @@ export class ListSharingService {
74
82
  this.loadingSubject.next(false);
75
83
  }
76
84
  }
85
+ /** @deprecated Use {@link GetListShares}. */
86
+ async getListShares(listId) {
87
+ return this.GetListShares(listId);
88
+ }
77
89
  /**
78
90
  * Get permission level for a specific user on a specific list
79
91
  */
80
- async getUserPermissionLevel(listId, userId) {
92
+ async GetUserPermissionLevel(listId, userId) {
81
93
  const resourceTypeId = await this.resolveListResourceTypeId();
82
94
  const rv = RunView.FromMetadataProvider(this.Provider);
83
95
  // Check direct user permission
@@ -93,10 +105,14 @@ export class ListSharingService {
93
105
  // For now, return null
94
106
  return null;
95
107
  }
108
+ /** @deprecated Use {@link GetUserPermissionLevel}. */
109
+ async getUserPermissionLevel(listId, userId) {
110
+ return this.GetUserPermissionLevel(listId, userId);
111
+ }
96
112
  /**
97
113
  * Share a list with a user
98
114
  */
99
- async shareListWithUser(listId, userId, permissionLevel, sharedByUserId) {
115
+ async ShareListWithUser(listId, userId, permissionLevel, sharedByUserId) {
100
116
  try {
101
117
  const md = this.Provider;
102
118
  // Check if share already exists
@@ -137,10 +153,14 @@ export class ListSharingService {
137
153
  };
138
154
  }
139
155
  }
156
+ /** @deprecated Use {@link ShareListWithUser}. */
157
+ async shareListWithUser(listId, userId, permissionLevel, sharedByUserId) {
158
+ return this.ShareListWithUser(listId, userId, permissionLevel, sharedByUserId);
159
+ }
140
160
  /**
141
161
  * Share a list with a role
142
162
  */
143
- async shareListWithRole(listId, roleId, permissionLevel, sharedByUserId) {
163
+ async ShareListWithRole(listId, roleId, permissionLevel, sharedByUserId) {
144
164
  try {
145
165
  const md = this.Provider;
146
166
  // Check if share already exists
@@ -181,10 +201,14 @@ export class ListSharingService {
181
201
  };
182
202
  }
183
203
  }
204
+ /** @deprecated Use {@link ShareListWithRole}. */
205
+ async shareListWithRole(listId, roleId, permissionLevel, sharedByUserId) {
206
+ return this.ShareListWithRole(listId, roleId, permissionLevel, sharedByUserId);
207
+ }
184
208
  /**
185
209
  * Update permission level for an existing share
186
210
  */
187
- async updateSharePermission(shareId, newPermissionLevel) {
211
+ async UpdateSharePermission(shareId, newPermissionLevel) {
188
212
  try {
189
213
  const md = this.Provider;
190
214
  const permission = await md.GetEntityObject('MJ: Resource Permissions');
@@ -211,10 +235,14 @@ export class ListSharingService {
211
235
  };
212
236
  }
213
237
  }
238
+ /** @deprecated Use {@link UpdateSharePermission}. */
239
+ async updateSharePermission(shareId, newPermissionLevel) {
240
+ return this.UpdateSharePermission(shareId, newPermissionLevel);
241
+ }
214
242
  /**
215
243
  * Remove a share (revoke access)
216
244
  */
217
- async removeShare(shareId) {
245
+ async RemoveShare(shareId) {
218
246
  try {
219
247
  const md = this.Provider;
220
248
  const permission = await md.GetEntityObject('MJ: Resource Permissions');
@@ -239,10 +267,14 @@ export class ListSharingService {
239
267
  };
240
268
  }
241
269
  }
270
+ /** @deprecated Use {@link RemoveShare}. */
271
+ async removeShare(shareId) {
272
+ return this.RemoveShare(shareId);
273
+ }
242
274
  /**
243
275
  * Get lists shared with the current user (that they don't own)
244
276
  */
245
- async getListsSharedWithUser(userId) {
277
+ async GetListsSharedWithUser(userId) {
246
278
  const resourceTypeId = await this.resolveListResourceTypeId();
247
279
  const rv = RunView.FromMetadataProvider(this.Provider);
248
280
  const result = await rv.RunView({
@@ -256,10 +288,14 @@ export class ListSharingService {
256
288
  }
257
289
  return result.Results.map((r) => r.ResourceRecordID);
258
290
  }
291
+ /** @deprecated Use {@link GetListsSharedWithUser}. */
292
+ async getListsSharedWithUser(userId) {
293
+ return this.GetListsSharedWithUser(userId);
294
+ }
259
295
  /**
260
296
  * Get lists that the user has shared with others
261
297
  */
262
- async getListsSharedByUser(userId) {
298
+ async GetListsSharedByUser(userId) {
263
299
  // First get all lists owned by the user
264
300
  const rv = RunView.FromMetadataProvider(this.Provider);
265
301
  const listsResult = await rv.RunView({
@@ -291,10 +327,14 @@ export class ListSharingService {
291
327
  }
292
328
  return shareCountMap;
293
329
  }
330
+ /** @deprecated Use {@link GetListsSharedByUser}. */
331
+ async getListsSharedByUser(userId) {
332
+ return this.GetListsSharedByUser(userId);
333
+ }
294
334
  /**
295
335
  * Check if user can share a list (must be owner or have Owner permission)
296
336
  */
297
- async canUserShareList(listId, userId) {
337
+ async CanUserShareList(listId, userId) {
298
338
  const rv = RunView.FromMetadataProvider(this.Provider);
299
339
  // Check if user is the owner
300
340
  const listResult = await rv.RunView({
@@ -306,13 +346,17 @@ export class ListSharingService {
306
346
  return true;
307
347
  }
308
348
  // Check if user has Owner permission
309
- const permissionLevel = await this.getUserPermissionLevel(listId, userId);
349
+ const permissionLevel = await this.GetUserPermissionLevel(listId, userId);
310
350
  return permissionLevel === 'Owner';
311
351
  }
352
+ /** @deprecated Use {@link CanUserShareList}. */
353
+ async canUserShareList(listId, userId) {
354
+ return this.CanUserShareList(listId, userId);
355
+ }
312
356
  /**
313
357
  * Search users for sharing autocomplete
314
358
  */
315
- async searchUsers(searchTerm, limit = 10) {
359
+ async SearchUsers(searchTerm, limit = 10) {
316
360
  const rv = RunView.FromMetadataProvider(this.Provider);
317
361
  const result = await rv.RunView({
318
362
  EntityName: 'MJ: Users',
@@ -331,10 +375,14 @@ export class ListSharingService {
331
375
  type: 'User'
332
376
  }));
333
377
  }
378
+ /** @deprecated Use {@link SearchUsers}. */
379
+ async searchUsers(searchTerm, limit = 10) {
380
+ return this.SearchUsers(searchTerm, limit);
381
+ }
334
382
  /**
335
383
  * Search roles for sharing autocomplete
336
384
  */
337
- async searchRoles(searchTerm, limit = 10) {
385
+ async SearchRoles(searchTerm, limit = 10) {
338
386
  const rv = RunView.FromMetadataProvider(this.Provider);
339
387
  const result = await rv.RunView({
340
388
  EntityName: 'MJ: Roles',
@@ -352,10 +400,14 @@ export class ListSharingService {
352
400
  type: 'Role'
353
401
  }));
354
402
  }
403
+ /** @deprecated Use {@link SearchRoles}. */
404
+ async searchRoles(searchTerm, limit = 10) {
405
+ return this.SearchRoles(searchTerm, limit);
406
+ }
355
407
  /**
356
408
  * Get all available users (cached)
357
409
  */
358
- async getAllUsers(forceRefresh = false) {
410
+ async GetAllUsers(forceRefresh = false) {
359
411
  if (!forceRefresh && this.usersCache) {
360
412
  return this.usersCache;
361
413
  }
@@ -372,10 +424,14 @@ export class ListSharingService {
372
424
  }
373
425
  return [];
374
426
  }
427
+ /** @deprecated Use {@link GetAllUsers}. */
428
+ async getAllUsers(forceRefresh = false) {
429
+ return this.GetAllUsers(forceRefresh);
430
+ }
375
431
  /**
376
432
  * Get all available roles (cached)
377
433
  */
378
- async getAllRoles(forceRefresh = false) {
434
+ async GetAllRoles(forceRefresh = false) {
379
435
  if (!forceRefresh && this.rolesCache) {
380
436
  return this.rolesCache;
381
437
  }
@@ -391,6 +447,10 @@ export class ListSharingService {
391
447
  }
392
448
  return [];
393
449
  }
450
+ /** @deprecated Use {@link GetAllRoles}. */
451
+ async getAllRoles(forceRefresh = false) {
452
+ return this.GetAllRoles(forceRefresh);
453
+ }
394
454
  /**
395
455
  * Helper to find existing share
396
456
  */
@@ -461,7 +521,7 @@ export class ListSharingService {
461
521
  /**
462
522
  * Get sharing summary for a single list
463
523
  */
464
- async getListSharingSummary(listId) {
524
+ async GetListSharingSummary(listId) {
465
525
  const resourceTypeId = await this.resolveListResourceTypeId();
466
526
  const rv = RunView.FromMetadataProvider(this.Provider);
467
527
  const result = await rv.RunView({
@@ -492,13 +552,21 @@ export class ListSharingService {
492
552
  isSharedByMe: userShares + roleShares > 0
493
553
  };
494
554
  }
555
+ /** @deprecated Use {@link GetListSharingSummary}. */
556
+ async getListSharingSummary(listId) {
557
+ return this.GetListSharingSummary(listId);
558
+ }
495
559
  /**
496
560
  * Clear internal caches
497
561
  */
498
- clearCache() {
562
+ ClearCache() {
499
563
  this.usersCache = null;
500
564
  this.rolesCache = null;
501
565
  }
566
+ /** @deprecated Use {@link ClearCache}. */
567
+ clearCache() {
568
+ return this.ClearCache();
569
+ }
502
570
  static ɵfac = function ListSharingService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListSharingService)(); };
503
571
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ListSharingService, factory: ListSharingService.ɵfac, providedIn: 'root' });
504
572
  }