@memberjunction/ng-list-management 5.43.0 → 5.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js +32 -36
  2. package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -1
  3. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +73 -94
  4. package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -1
  5. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +5 -0
  6. package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +20 -22
  8. package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
  9. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +72 -74
  10. package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -1
  11. package/dist/lib/module.d.ts +1 -1
  12. package/dist/lib/module.d.ts.map +1 -1
  13. package/dist/lib/module.js +7 -1
  14. package/dist/lib/module.js.map +1 -1
  15. package/package.json +12 -11
  16. package/dist/__tests__/index.test.d.ts +0 -2
  17. package/dist/__tests__/index.test.d.ts.map +0 -1
  18. package/dist/__tests__/index.test.js +0 -7
  19. package/dist/__tests__/index.test.js.map +0 -1
  20. package/dist/__tests__/list-models.test.d.ts +0 -2
  21. package/dist/__tests__/list-models.test.d.ts.map +0 -1
  22. package/dist/__tests__/list-models.test.js +0 -86
  23. package/dist/__tests__/list-models.test.js.map +0 -1
  24. package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.d.ts +0 -2
  25. package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.d.ts.map +0 -1
  26. package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.js +0 -145
  27. package/dist/lib/components/list-invitations/__tests__/list-invitations.component.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"list-management-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-management-dialog/list-management-dialog.component.ts","../../../../src/lib/components/list-management-dialog/list-management-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { Metadata } from '@memberjunction/core';\nimport { MJListEntity, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { ListManagementService } from '../../services/list-management.service';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n ListManagementDialogConfig,\n ListManagementResult,\n ListItemViewModel,\n ListFilterTab,\n ListSortOption,\n CreateListConfig,\n ListOperationDetail\n} from '../../models/list-management.models';\n\n/**\n * A gorgeous, responsive dialog for managing list membership.\n * Supports adding/removing records from multiple lists with membership indicators.\n *\n * Features:\n * - Search and filter lists\n * - Visual membership indicators (full/partial/none)\n * - Inline list creation\n * - Mobile-responsive bottom sheet on small screens\n * - Batch operations with progress feedback\n */\n@Component({\n standalone: false,\n selector: 'mj-list-management-dialog',\n templateUrl: './list-management-dialog.component.html',\n styleUrls: ['./list-management-dialog.component.css']\n})\nexport class ListManagementDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Configuration for the dialog\n */\n @Input() config!: ListManagementDialogConfig;\n\n /**\n * Controls dialog visibility\n */\n @Input()\n get visible(): boolean {\n return this._visible;\n }\n set visible(value: boolean) {\n if (value && !this._visible) {\n this.initializeDialog();\n }\n this._visible = value;\n }\n private _visible = false;\n\n /**\n * Emitted when dialog is closed with results\n */\n @Output() complete = new EventEmitter<ListManagementResult>();\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() cancel = new EventEmitter<void>();\n\n // State\n loading = false;\n saving = false;\n searchText = '';\n activeTab: ListFilterTab = 'all';\n sortOption: ListSortOption = 'name';\n showCreateForm = false;\n\n // Data\n allLists: ListItemViewModel[] = [];\n filteredLists: ListItemViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n\n // Create form state\n newListName = '';\n newListDescription = '';\n newListCategoryId: string | null = null;\n\n // Track changes\n private originalMembership = new Map<string, boolean>();\n public addedToLists: Set<string> = new Set();\n public removedFromLists: Set<string> = new Set();\n public newlyCreatedLists: MJListEntity[] = [];\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n constructor(\n private listService: ListManagementService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit(): void {\n this.setupSearchDebounce();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get dialog title based on config\n */\n get dialogTitle(): string {\n if (this.config?.dialogTitle) {\n return this.config.dialogTitle;\n }\n\n const recordCount = this.config?.recordIds?.length || 0;\n const recordText = recordCount === 1 ? '1 record' : `${recordCount} records`;\n\n switch (this.config?.mode) {\n case 'add':\n return `Add ${recordText} to Lists`;\n case 'remove':\n return `Remove ${recordText} from Lists`;\n default:\n return `Manage List Membership`;\n }\n }\n\n /**\n * Get subtitle showing context\n */\n get dialogSubtitle(): string {\n const recordCount = this.config?.recordIds?.length || 0;\n const entityName = this.config?.entityName || 'records';\n\n if (recordCount === 1 && this.config?.recordDisplayNames?.[0]) {\n return `\"${this.config.recordDisplayNames[0]}\" from ${entityName}`;\n }\n\n return `${recordCount} ${entityName} record${recordCount !== 1 ? 's' : ''}`;\n }\n\n /**\n * Check if there are pending changes\n */\n get hasChanges(): boolean {\n return this.addedToLists.size > 0 || this.removedFromLists.size > 0;\n }\n\n /**\n * Get count of lists to add to\n */\n get addCount(): number {\n return this.addedToLists.size;\n }\n\n /**\n * Get count of lists to remove from\n */\n get removeCount(): number {\n return this.removedFromLists.size;\n }\n\n /**\n * Setup search with debounce\n */\n private setupSearchDebounce(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n takeUntil(this.destroy$)\n ).subscribe((searchText: string) => {\n this.searchText = searchText;\n this.applyFilters();\n });\n }\n\n /**\n * Initialize dialog when opened\n */\n private async initializeDialog(): Promise<void> {\n this.resetState();\n await this.loadData();\n }\n\n /**\n * Reset all state\n */\n private resetState(): void {\n this.searchText = '';\n this.activeTab = 'all';\n this.sortOption = 'name';\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n this.addedToLists.clear();\n this.removedFromLists.clear();\n this.newlyCreatedLists = [];\n this.originalMembership.clear();\n }\n\n /**\n * Load lists and membership data\n */\n private async loadData(): Promise<void> {\n if (!this.config) return;\n\n this.loading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n\n // Load lists and membership in parallel\n const [lists, membership, categories] = await Promise.all([\n this.listService.getListsForEntity(\n this.config.entityId,\n md.CurrentUser.ID,\n true // Force refresh\n ),\n this.listService.getRecordMembership(\n this.config.entityId,\n this.config.recordIds\n ),\n this.listService.getListCategories()\n ]);\n\n this.categories = categories;\n\n // Build view models\n this.allLists = await this.listService.buildListViewModels(\n lists,\n this.config.recordIds,\n membership\n );\n\n // Store original membership state\n for (const vm of this.allLists) {\n this.originalMembership.set(vm.list.ID, vm.isFullMember || vm.isPartialMember);\n }\n\n // Pre-select lists if configured\n if (this.config.preSelectedListIds) {\n for (const listId of this.config.preSelectedListIds) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n vm.isSelectedForAdd = true;\n this.addedToLists.add(listId);\n }\n }\n }\n\n this.applyFilters();\n } catch (error) {\n console.error('Error loading list data:', error);\n } finally {\n this.loading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle search input\n */\n onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchSubject.next(value);\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this.searchText = '';\n this.searchSubject.next('');\n }\n\n /**\n * Change active tab\n */\n setActiveTab(tab: ListFilterTab): void {\n this.activeTab = tab;\n this.applyFilters();\n }\n\n /**\n * Change sort option\n */\n setSortOption(option: ListSortOption): void {\n this.sortOption = option;\n this.applyFilters();\n }\n\n /**\n * Apply all filters and sorting\n */\n private applyFilters(): void {\n let result = [...this.allLists];\n\n // Apply search filter\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase();\n result = result.filter(vm =>\n vm.list.Name.toLowerCase().includes(search) ||\n (vm.list.Description?.toLowerCase().includes(search))\n );\n }\n\n // Apply tab filter\n switch (this.activeTab) {\n case 'my-lists':\n // Already filtered by user in loadData\n break;\n case 'recent':\n // Sort by last updated and take top 10\n result = result\n .sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime())\n .slice(0, 10);\n break;\n // 'all' and 'shared' - no additional filtering for now\n }\n\n // Apply sorting\n switch (this.sortOption) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'recent':\n result.sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime());\n break;\n case 'item-count':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n }\n\n this.filteredLists = result;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for adding\n */\n toggleListForAdd(vm: ListItemViewModel): void {\n if (this.config?.mode === 'remove') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForAdd || this.addedToLists.has(listId)) {\n // Deselect\n vm.isSelectedForAdd = false;\n this.addedToLists.delete(listId);\n } else {\n // Select for add\n vm.isSelectedForAdd = true;\n vm.isSelectedForRemove = false;\n this.addedToLists.add(listId);\n this.removedFromLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for removal\n */\n toggleListForRemove(vm: ListItemViewModel): void {\n if (this.config?.mode === 'add') return;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForRemove || this.removedFromLists.has(listId)) {\n // Deselect\n vm.isSelectedForRemove = false;\n this.removedFromLists.delete(listId);\n } else {\n // Select for remove\n vm.isSelectedForRemove = true;\n vm.isSelectedForAdd = false;\n this.removedFromLists.add(listId);\n this.addedToLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Get membership indicator class\n */\n getMembershipClass(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'full-member';\n if (vm.isPartialMember) return 'partial-member';\n return 'not-member';\n }\n\n /**\n * Get membership indicator text\n */\n getMembershipText(vm: ListItemViewModel): string {\n if (vm.isFullMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n if (vm.isPartialMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n return `0/${vm.totalSelectedRecords}`;\n }\n\n /**\n * Get membership icon\n */\n getMembershipIcon(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'fa-solid fa-check-circle';\n if (vm.isPartialMember) return 'fa-solid fa-circle-half-stroke';\n return 'fa-regular fa-circle';\n }\n\n /**\n * Show create list form\n */\n showCreateListForm(): void {\n this.showCreateForm = true;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Cancel create list form\n */\n cancelCreateList(): void {\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Create a new list\n */\n async createList(): Promise<void> {\n if (!this.newListName.trim() || !this.config) return;\n\n this.saving = true;\n\n try {\n const createConfig: CreateListConfig = {\n name: this.newListName.trim(),\n description: this.newListDescription.trim() || undefined,\n categoryId: this.newListCategoryId || undefined,\n entityId: this.config.entityId\n };\n\n const newList = await this.listService.createList(createConfig);\n\n if (newList) {\n this.newlyCreatedLists.push(newList);\n\n // Add to view models and select for add\n const vm: ListItemViewModel = {\n list: newList,\n itemCount: 0,\n membershipCount: 0,\n totalSelectedRecords: this.config.recordIds.length,\n isFullMember: false,\n isPartialMember: false,\n isNotMember: true,\n lastUpdated: new Date(),\n isSelectedForAdd: true,\n isSelectedForRemove: false\n };\n\n this.allLists.unshift(vm);\n this.addedToLists.add(newList.ID);\n\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n\n this.applyFilters();\n }\n } catch (error) {\n console.error('Error creating list:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Apply changes and close dialog\n */\n async applyChanges(): Promise<void> {\n if (!this.config) return;\n\n this.saving = true;\n\n const result: ListManagementResult = {\n action: 'apply',\n added: [],\n removed: [],\n newListsCreated: this.newlyCreatedLists\n };\n\n try {\n // Process additions\n if (this.addedToLists.size > 0) {\n const addResult = await this.listService.addRecordsToLists(\n [...this.addedToLists],\n this.config.recordIds,\n true // Skip duplicates\n );\n\n for (const listId of this.addedToLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.added.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n // Process removals\n if (this.removedFromLists.size > 0) {\n const removeResult = await this.listService.removeRecordsFromLists(\n [...this.removedFromLists],\n this.config.recordIds\n );\n\n for (const listId of this.removedFromLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.removed.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n this.complete.emit(result);\n } catch (error) {\n console.error('Error applying changes:', error);\n } finally {\n this.saving = false;\n this._visible = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close dialog\n */\n onCancel(): void {\n const result: ListManagementResult = {\n action: 'cancel',\n added: [],\n removed: [],\n newListsCreated: []\n };\n\n this._visible = false;\n this.cancel.emit();\n }\n\n /**\n * Format date for display\n */\n formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return date.toLocaleDateString();\n }\n\n /**\n * Check if we should show the add button for a list\n */\n showAddButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'remove') return false;\n return !vm.isFullMember || !this.originalMembership.get(vm.list.ID);\n }\n\n /**\n * Check if we should show the remove button for a list\n */\n showRemoveButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'add') return false;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return false;\n return vm.isFullMember || vm.isPartialMember || this.originalMembership.get(vm.list.ID) === true;\n }\n}\n","@if (visible) {\n <div class=\"dialog-overlay\" (click)=\"onCancel()\">\n <div class=\"dialog-container\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-content\">\n <div class=\"header-icon\">\n <span class=\"fa-solid fa-rectangle-list\"></span>\n </div>\n <div class=\"header-text\">\n <h2 class=\"dialog-title\">{{ dialogTitle }}</h2>\n <p class=\"dialog-subtitle\">{{ dialogSubtitle }}</p>\n </div>\n </div>\n <button class=\"close-button\" (click)=\"onCancel()\" title=\"Close\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n\n <!-- Search and Filters -->\n <div class=\"search-section\">\n <div class=\"search-bar\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search lists...\"\n [value]=\"searchText\"\n (input)=\"onSearchInput($event)\"\n />\n @if (searchText) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <span class=\"fa-solid fa-times-circle\"></span>\n </button>\n }\n </div>\n\n @if (config.allowCreate !== false) {\n <button class=\"create-button\" (click)=\"showCreateListForm()\" [disabled]=\"showCreateForm\">\n <span class=\"fa-solid fa-plus\"></span>\n <span class=\"button-text\">New</span>\n </button>\n }\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <div class=\"tabs-left\">\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'all'\"\n (click)=\"setActiveTab('all')\">\n All\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'my-lists'\"\n (click)=\"setActiveTab('my-lists')\">\n My Lists\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'recent'\"\n (click)=\"setActiveTab('recent')\">\n Recent\n </button>\n </div>\n <div class=\"tabs-right\">\n <select class=\"sort-select\" [value]=\"sortOption\" (change)=\"setSortOption($any($event.target).value)\">\n <option value=\"name\">Sort: Name</option>\n <option value=\"recent\">Sort: Recent</option>\n <option value=\"item-count\">Sort: Items</option>\n </select>\n </div>\n </div>\n\n <!-- Create List Form -->\n @if (showCreateForm) {\n <div class=\"create-form\">\n <div class=\"create-form-header\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n <span>Create New List</span>\n </div>\n <div class=\"create-form-body\">\n <div class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-input\"\n placeholder=\"List name *\"\n [(ngModel)]=\"newListName\"\n [disabled]=\"saving\"\n (keyup.enter)=\"createList()\"\n />\n </div>\n <div class=\"form-group\">\n <textarea\n class=\"form-input form-textarea\"\n placeholder=\"Description (optional)\"\n [(ngModel)]=\"newListDescription\"\n [disabled]=\"saving\"\n rows=\"2\">\n </textarea>\n </div>\n @if (categories.length > 0) {\n <div class=\"form-group\">\n <select class=\"form-input\" [(ngModel)]=\"newListCategoryId\" [disabled]=\"saving\">\n <option [ngValue]=\"null\">No category</option>\n @for (category of categories; track category.ID) {\n <option [ngValue]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n }\n <div class=\"create-form-actions\">\n <button\n class=\"btn btn-primary\"\n (click)=\"createList()\"\n [disabled]=\"!newListName.trim() || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Create List\n </button>\n <button class=\"btn btn-secondary\" (click)=\"cancelCreateList()\" [disabled]=\"saving\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- List Content -->\n <div class=\"list-content\">\n @if (loading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (filteredLists.length === 0) {\n <div class=\"empty-state\">\n @if (searchText) {\n <span class=\"fa-solid fa-search empty-icon\"></span>\n <p class=\"empty-title\">No lists found</p>\n <p class=\"empty-subtitle\">Try a different search term</p>\n } @else {\n <span class=\"fa-solid fa-rectangle-list empty-icon\"></span>\n <p class=\"empty-title\">No lists yet</p>\n <p class=\"empty-subtitle\">Create your first list to get started</p>\n @if (config.allowCreate !== false) {\n <button class=\"btn btn-primary\" (click)=\"showCreateListForm()\">\n <span class=\"fa-solid fa-plus\"></span>\n Create List\n </button>\n }\n }\n </div>\n } @else {\n <div class=\"list-items\">\n @for (vm of filteredLists; track vm.list.ID) {\n <div\n class=\"list-item\"\n [class.selected-add]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n [class.selected-remove]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n [class.is-member]=\"vm.isFullMember || vm.isPartialMember\">\n\n <!-- Checkbox / Selection Area -->\n <div class=\"list-item-select\">\n @if (showAddButton(vm)) {\n <button\n class=\"select-btn add-btn\"\n [class.selected]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n (click)=\"toggleListForAdd(vm)\"\n [title]=\"(vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) ? 'Remove from selection' : 'Add to this list'\">\n @if (vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-check\"></span>\n } @else {\n <span class=\"fa-solid fa-plus\"></span>\n }\n </button>\n }\n @if (showRemoveButton(vm) && (vm.isFullMember || vm.isPartialMember)) {\n <button\n class=\"select-btn remove-btn\"\n [class.selected]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n (click)=\"toggleListForRemove(vm)\"\n [title]=\"(vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) ? 'Cancel removal' : 'Remove from this list'\">\n @if (vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-undo\"></span>\n } @else {\n <span class=\"fa-solid fa-minus\"></span>\n }\n </button>\n }\n </div>\n\n <!-- List Info -->\n <div class=\"list-item-content\">\n <div class=\"list-item-header\">\n <span class=\"fa-solid fa-folder list-icon\"></span>\n <span class=\"list-name\">{{ vm.list.Name }}</span>\n @if (newlyCreatedLists.includes(vm.list)) {\n <span class=\"badge badge-new\">New</span>\n }\n </div>\n <div class=\"list-item-meta\">\n @if (vm.list.Description) {\n <span class=\"list-description\">{{ vm.list.Description }}</span>\n <span class=\"meta-separator\">•</span>\n }\n <span class=\"list-count\">{{ vm.itemCount }} item{{ vm.itemCount !== 1 ? 's' : '' }}</span>\n <span class=\"meta-separator\">•</span>\n <span class=\"list-updated\">{{ formatDate(vm.lastUpdated) }}</span>\n </div>\n </div>\n\n <!-- Membership Indicator -->\n @if (config.showMembership !== false) {\n <div class=\"membership-indicator\" [class]=\"getMembershipClass(vm)\">\n <span [class]=\"getMembershipIcon(vm)\"></span>\n <span class=\"membership-text\">{{ getMembershipText(vm) }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-summary\">\n @if (hasChanges) {\n @if (addCount > 0) {\n <span class=\"summary-item add\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n {{ addCount }} list{{ addCount !== 1 ? 's' : '' }}\n </span>\n }\n @if (removeCount > 0) {\n <span class=\"summary-item remove\">\n <span class=\"fa-solid fa-minus-circle\"></span>\n {{ removeCount }} list{{ removeCount !== 1 ? 's' : '' }}\n </span>\n }\n } @else {\n <span class=\"summary-empty\">No changes</span>\n }\n </div>\n <div class=\"footer-actions\">\n <button class=\"btn btn-secondary\" (click)=\"onCancel()\" [disabled]=\"saving\">\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n (click)=\"applyChanges()\"\n [disabled]=\"!hasChanges || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Apply Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"list-management-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-management-dialog/list-management-dialog.component.ts","../../../../src/lib/components/list-management-dialog/list-management-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { Metadata } from '@memberjunction/core';\nimport { MJListEntity, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { ListManagementService } from '../../services/list-management.service';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n ListManagementDialogConfig,\n ListManagementResult,\n ListItemViewModel,\n ListFilterTab,\n ListSortOption,\n CreateListConfig,\n ListOperationDetail\n} from '../../models/list-management.models';\n\n/**\n * A gorgeous, responsive dialog for managing list membership.\n * Supports adding/removing records from multiple lists with membership indicators.\n *\n * Features:\n * - Search and filter lists\n * - Visual membership indicators (full/partial/none)\n * - Inline list creation\n * - Mobile-responsive bottom sheet on small screens\n * - Batch operations with progress feedback\n */\n@Component({\n standalone: false,\n selector: 'mj-list-management-dialog',\n templateUrl: './list-management-dialog.component.html',\n styleUrls: ['./list-management-dialog.component.css']\n})\nexport class ListManagementDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Configuration for the dialog\n */\n @Input() config!: ListManagementDialogConfig;\n\n /**\n * Controls dialog visibility\n */\n @Input()\n get visible(): boolean {\n return this._visible;\n }\n set visible(value: boolean) {\n if (value && !this._visible) {\n this.initializeDialog();\n }\n this._visible = value;\n }\n private _visible = false;\n\n /**\n * Emitted when dialog is closed with results\n */\n @Output() complete = new EventEmitter<ListManagementResult>();\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() cancel = new EventEmitter<void>();\n\n // State\n loading = false;\n saving = false;\n searchText = '';\n activeTab: ListFilterTab = 'all';\n sortOption: ListSortOption = 'name';\n showCreateForm = false;\n\n // Data\n allLists: ListItemViewModel[] = [];\n filteredLists: ListItemViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n\n // Create form state\n newListName = '';\n newListDescription = '';\n newListCategoryId: string | null = null;\n\n // Track changes\n private originalMembership = new Map<string, boolean>();\n public addedToLists: Set<string> = new Set();\n public removedFromLists: Set<string> = new Set();\n public newlyCreatedLists: MJListEntity[] = [];\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n constructor(\n private listService: ListManagementService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit(): void {\n this.setupSearchDebounce();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get dialog title based on config\n */\n get dialogTitle(): string {\n if (this.config?.dialogTitle) {\n return this.config.dialogTitle;\n }\n\n const recordCount = this.config?.recordIds?.length || 0;\n const recordText = recordCount === 1 ? '1 record' : `${recordCount} records`;\n\n switch (this.config?.mode) {\n case 'add':\n return `Add ${recordText} to Lists`;\n case 'remove':\n return `Remove ${recordText} from Lists`;\n default:\n return `Manage List Membership`;\n }\n }\n\n /**\n * Get subtitle showing context\n */\n get dialogSubtitle(): string {\n const recordCount = this.config?.recordIds?.length || 0;\n const entityName = this.config?.entityName || 'records';\n\n if (recordCount === 1 && this.config?.recordDisplayNames?.[0]) {\n return `\"${this.config.recordDisplayNames[0]}\" from ${entityName}`;\n }\n\n return `${recordCount} ${entityName} record${recordCount !== 1 ? 's' : ''}`;\n }\n\n /**\n * Check if there are pending changes\n */\n get hasChanges(): boolean {\n return this.addedToLists.size > 0 || this.removedFromLists.size > 0;\n }\n\n /**\n * Get count of lists to add to\n */\n get addCount(): number {\n return this.addedToLists.size;\n }\n\n /**\n * Get count of lists to remove from\n */\n get removeCount(): number {\n return this.removedFromLists.size;\n }\n\n /**\n * Setup search with debounce\n */\n private setupSearchDebounce(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n takeUntil(this.destroy$)\n ).subscribe((searchText: string) => {\n this.searchText = searchText;\n this.applyFilters();\n });\n }\n\n /**\n * Initialize dialog when opened\n */\n private async initializeDialog(): Promise<void> {\n this.resetState();\n await this.loadData();\n }\n\n /**\n * Reset all state\n */\n private resetState(): void {\n this.searchText = '';\n this.activeTab = 'all';\n this.sortOption = 'name';\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n this.addedToLists.clear();\n this.removedFromLists.clear();\n this.newlyCreatedLists = [];\n this.originalMembership.clear();\n }\n\n /**\n * Load lists and membership data\n */\n private async loadData(): Promise<void> {\n if (!this.config) return;\n\n this.loading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n\n // Load lists and membership in parallel\n const [lists, membership, categories] = await Promise.all([\n this.listService.getListsForEntity(\n this.config.entityId,\n md.CurrentUser.ID,\n true // Force refresh\n ),\n this.listService.getRecordMembership(\n this.config.entityId,\n this.config.recordIds\n ),\n this.listService.getListCategories()\n ]);\n\n this.categories = categories;\n\n // Build view models\n this.allLists = await this.listService.buildListViewModels(\n lists,\n this.config.recordIds,\n membership\n );\n\n // Store original membership state\n for (const vm of this.allLists) {\n this.originalMembership.set(vm.list.ID, vm.isFullMember || vm.isPartialMember);\n }\n\n // Pre-select lists if configured\n if (this.config.preSelectedListIds) {\n for (const listId of this.config.preSelectedListIds) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n vm.isSelectedForAdd = true;\n this.addedToLists.add(listId);\n }\n }\n }\n\n this.applyFilters();\n } catch (error) {\n console.error('Error loading list data:', error);\n } finally {\n this.loading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle search input\n */\n onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchSubject.next(value);\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this.searchText = '';\n this.searchSubject.next('');\n }\n\n /**\n * Change active tab\n */\n setActiveTab(tab: ListFilterTab): void {\n this.activeTab = tab;\n this.applyFilters();\n }\n\n /**\n * Change sort option\n */\n setSortOption(option: ListSortOption): void {\n this.sortOption = option;\n this.applyFilters();\n }\n\n /**\n * Apply all filters and sorting\n */\n private applyFilters(): void {\n let result = [...this.allLists];\n\n // Apply search filter\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase();\n result = result.filter(vm =>\n vm.list.Name.toLowerCase().includes(search) ||\n (vm.list.Description?.toLowerCase().includes(search))\n );\n }\n\n // Apply tab filter\n switch (this.activeTab) {\n case 'my-lists':\n // Already filtered by user in loadData\n break;\n case 'recent':\n // Sort by last updated and take top 10\n result = result\n .sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime())\n .slice(0, 10);\n break;\n // 'all' and 'shared' - no additional filtering for now\n }\n\n // Apply sorting\n switch (this.sortOption) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'recent':\n result.sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime());\n break;\n case 'item-count':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n }\n\n this.filteredLists = result;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for adding\n */\n toggleListForAdd(vm: ListItemViewModel): void {\n if (this.config?.mode === 'remove') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForAdd || this.addedToLists.has(listId)) {\n // Deselect\n vm.isSelectedForAdd = false;\n this.addedToLists.delete(listId);\n } else {\n // Select for add\n vm.isSelectedForAdd = true;\n vm.isSelectedForRemove = false;\n this.addedToLists.add(listId);\n this.removedFromLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for removal\n */\n toggleListForRemove(vm: ListItemViewModel): void {\n if (this.config?.mode === 'add') return;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForRemove || this.removedFromLists.has(listId)) {\n // Deselect\n vm.isSelectedForRemove = false;\n this.removedFromLists.delete(listId);\n } else {\n // Select for remove\n vm.isSelectedForRemove = true;\n vm.isSelectedForAdd = false;\n this.removedFromLists.add(listId);\n this.addedToLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Get membership indicator class\n */\n getMembershipClass(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'full-member';\n if (vm.isPartialMember) return 'partial-member';\n return 'not-member';\n }\n\n /**\n * Get membership indicator text\n */\n getMembershipText(vm: ListItemViewModel): string {\n if (vm.isFullMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n if (vm.isPartialMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n return `0/${vm.totalSelectedRecords}`;\n }\n\n /**\n * Get membership icon\n */\n getMembershipIcon(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'fa-solid fa-check-circle';\n if (vm.isPartialMember) return 'fa-solid fa-circle-half-stroke';\n return 'fa-regular fa-circle';\n }\n\n /**\n * Show create list form\n */\n showCreateListForm(): void {\n this.showCreateForm = true;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Cancel create list form\n */\n cancelCreateList(): void {\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Create a new list\n */\n async createList(): Promise<void> {\n if (!this.newListName.trim() || !this.config) return;\n\n this.saving = true;\n\n try {\n const createConfig: CreateListConfig = {\n name: this.newListName.trim(),\n description: this.newListDescription.trim() || undefined,\n categoryId: this.newListCategoryId || undefined,\n entityId: this.config.entityId\n };\n\n const newList = await this.listService.createList(createConfig);\n\n if (newList) {\n this.newlyCreatedLists.push(newList);\n\n // Add to view models and select for add\n const vm: ListItemViewModel = {\n list: newList,\n itemCount: 0,\n membershipCount: 0,\n totalSelectedRecords: this.config.recordIds.length,\n isFullMember: false,\n isPartialMember: false,\n isNotMember: true,\n lastUpdated: new Date(),\n isSelectedForAdd: true,\n isSelectedForRemove: false\n };\n\n this.allLists.unshift(vm);\n this.addedToLists.add(newList.ID);\n\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n\n this.applyFilters();\n }\n } catch (error) {\n console.error('Error creating list:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Apply changes and close dialog\n */\n async applyChanges(): Promise<void> {\n if (!this.config) return;\n\n this.saving = true;\n\n const result: ListManagementResult = {\n action: 'apply',\n added: [],\n removed: [],\n newListsCreated: this.newlyCreatedLists\n };\n\n try {\n // Process additions\n if (this.addedToLists.size > 0) {\n const addResult = await this.listService.addRecordsToLists(\n [...this.addedToLists],\n this.config.recordIds,\n true // Skip duplicates\n );\n\n for (const listId of this.addedToLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.added.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n // Process removals\n if (this.removedFromLists.size > 0) {\n const removeResult = await this.listService.removeRecordsFromLists(\n [...this.removedFromLists],\n this.config.recordIds\n );\n\n for (const listId of this.removedFromLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.removed.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n this.complete.emit(result);\n } catch (error) {\n console.error('Error applying changes:', error);\n } finally {\n this.saving = false;\n this._visible = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close dialog\n */\n onCancel(): void {\n const result: ListManagementResult = {\n action: 'cancel',\n added: [],\n removed: [],\n newListsCreated: []\n };\n\n this._visible = false;\n this.cancel.emit();\n }\n\n /**\n * Format date for display\n */\n formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return date.toLocaleDateString();\n }\n\n /**\n * Check if we should show the add button for a list\n */\n showAddButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'remove') return false;\n return !vm.isFullMember || !this.originalMembership.get(vm.list.ID);\n }\n\n /**\n * Check if we should show the remove button for a list\n */\n showRemoveButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'add') return false;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return false;\n return vm.isFullMember || vm.isPartialMember || this.originalMembership.get(vm.list.ID) === true;\n }\n}\n","@if (visible) {\n <div class=\"dialog-overlay\" (click)=\"onCancel()\">\n <div class=\"dialog-container\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-content\">\n <div class=\"header-icon\">\n <span class=\"fa-solid fa-rectangle-list\"></span>\n </div>\n <div class=\"header-text\">\n <h2 class=\"dialog-title\">{{ dialogTitle }}</h2>\n <p class=\"dialog-subtitle\">{{ dialogSubtitle }}</p>\n </div>\n </div>\n <button class=\"close-button\" (click)=\"onCancel()\" title=\"Close\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n\n <!-- Search and Filters -->\n <div class=\"search-section\">\n <div class=\"search-bar\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search lists...\"\n [value]=\"searchText\"\n (input)=\"onSearchInput($event)\"\n />\n @if (searchText) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <span class=\"fa-solid fa-times-circle\"></span>\n </button>\n }\n </div>\n\n @if (config.allowCreate !== false) {\n <button class=\"create-button\" (click)=\"showCreateListForm()\" [disabled]=\"showCreateForm\">\n <span class=\"fa-solid fa-plus\"></span>\n <span class=\"button-text\">New</span>\n </button>\n }\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <div class=\"tabs-left\">\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'all'\"\n (click)=\"setActiveTab('all')\">\n All\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'my-lists'\"\n (click)=\"setActiveTab('my-lists')\">\n My Lists\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'recent'\"\n (click)=\"setActiveTab('recent')\">\n Recent\n </button>\n </div>\n <div class=\"tabs-right\">\n <select class=\"sort-select\" [value]=\"sortOption\" (change)=\"setSortOption($any($event.target).value)\">\n <option value=\"name\">Sort: Name</option>\n <option value=\"recent\">Sort: Recent</option>\n <option value=\"item-count\">Sort: Items</option>\n </select>\n </div>\n </div>\n\n <!-- Create List Form -->\n @if (showCreateForm) {\n <div class=\"create-form\">\n <div class=\"create-form-header\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n <span>Create New List</span>\n </div>\n <div class=\"create-form-body\">\n <div class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-input\"\n placeholder=\"List name *\"\n [(ngModel)]=\"newListName\"\n [disabled]=\"saving\"\n (keyup.enter)=\"createList()\"\n />\n </div>\n <div class=\"form-group\">\n <textarea\n class=\"form-input form-textarea\"\n placeholder=\"Description (optional)\"\n [(ngModel)]=\"newListDescription\"\n [disabled]=\"saving\"\n rows=\"2\">\n </textarea>\n </div>\n @if (categories.length > 0) {\n <div class=\"form-group\">\n <select class=\"form-input\" [(ngModel)]=\"newListCategoryId\" [disabled]=\"saving\">\n <option [ngValue]=\"null\">No category</option>\n @for (category of categories; track category.ID) {\n <option [ngValue]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n }\n <div class=\"create-form-actions\">\n <button\n class=\"btn btn-primary\"\n (click)=\"createList()\"\n [disabled]=\"!newListName.trim() || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Create List\n </button>\n <button class=\"btn btn-secondary\" (click)=\"cancelCreateList()\" [disabled]=\"saving\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- List Content -->\n <div class=\"list-content\">\n @if (loading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (filteredLists.length === 0) {\n @if (searchText) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No lists found\"\n Message=\"Try a different search term\" />\n } @else {\n <mj-empty-state\n Icon=\"fa-solid fa-rectangle-list\"\n Title=\"No lists yet\"\n Message=\"Create your first list to get started\"\n [ActionText]=\"config.allowCreate !== false ? 'Create List' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"showCreateListForm()\" />\n }\n } @else {\n <div class=\"list-items\">\n @for (vm of filteredLists; track vm.list.ID) {\n <div\n class=\"list-item\"\n [class.selected-add]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n [class.selected-remove]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n [class.is-member]=\"vm.isFullMember || vm.isPartialMember\">\n\n <!-- Checkbox / Selection Area -->\n <div class=\"list-item-select\">\n @if (showAddButton(vm)) {\n <button\n class=\"select-btn add-btn\"\n [class.selected]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n (click)=\"toggleListForAdd(vm)\"\n [title]=\"(vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) ? 'Remove from selection' : 'Add to this list'\">\n @if (vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-check\"></span>\n } @else {\n <span class=\"fa-solid fa-plus\"></span>\n }\n </button>\n }\n @if (showRemoveButton(vm) && (vm.isFullMember || vm.isPartialMember)) {\n <button\n class=\"select-btn remove-btn\"\n [class.selected]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n (click)=\"toggleListForRemove(vm)\"\n [title]=\"(vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) ? 'Cancel removal' : 'Remove from this list'\">\n @if (vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-undo\"></span>\n } @else {\n <span class=\"fa-solid fa-minus\"></span>\n }\n </button>\n }\n </div>\n\n <!-- List Info -->\n <div class=\"list-item-content\">\n <div class=\"list-item-header\">\n <span class=\"fa-solid fa-folder list-icon\"></span>\n <span class=\"list-name\">{{ vm.list.Name }}</span>\n @if (newlyCreatedLists.includes(vm.list)) {\n <span class=\"badge badge-new\">New</span>\n }\n </div>\n <div class=\"list-item-meta\">\n @if (vm.list.Description) {\n <span class=\"list-description\">{{ vm.list.Description }}</span>\n <span class=\"meta-separator\">•</span>\n }\n <span class=\"list-count\">{{ vm.itemCount }} item{{ vm.itemCount !== 1 ? 's' : '' }}</span>\n <span class=\"meta-separator\">•</span>\n <span class=\"list-updated\">{{ formatDate(vm.lastUpdated) }}</span>\n </div>\n </div>\n\n <!-- Membership Indicator -->\n @if (config.showMembership !== false) {\n <div class=\"membership-indicator\" [class]=\"getMembershipClass(vm)\">\n <span [class]=\"getMembershipIcon(vm)\"></span>\n <span class=\"membership-text\">{{ getMembershipText(vm) }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-summary\">\n @if (hasChanges) {\n @if (addCount > 0) {\n <span class=\"summary-item add\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n {{ addCount }} list{{ addCount !== 1 ? 's' : '' }}\n </span>\n }\n @if (removeCount > 0) {\n <span class=\"summary-item remove\">\n <span class=\"fa-solid fa-minus-circle\"></span>\n {{ removeCount }} list{{ removeCount !== 1 ? 's' : '' }}\n </span>\n }\n } @else {\n <span class=\"summary-empty\">No changes</span>\n }\n </div>\n <div class=\"footer-actions\">\n <button class=\"btn btn-secondary\" (click)=\"onCancel()\" [disabled]=\"saving\">\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n (click)=\"applyChanges()\"\n [disabled]=\"!hasChanges || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Apply Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n"]}
@@ -20,6 +20,11 @@ export declare class ListShareDialogComponent extends BaseAngularComponent imple
20
20
  * Configuration for the dialog
21
21
  */
22
22
  config: ListShareDialogConfig;
23
+ /**
24
+ * Supporting message for the empty-state shown when a list has no shares.
25
+ * Appends a usage hint when the current user can manage shares.
26
+ */
27
+ get EmptyShareMessage(): string;
23
28
  /**
24
29
  * Controls dialog visibility
25
30
  */
@@ -1 +1 @@
1
- {"version":3,"file":"list-share-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-share-dialog/list-share-dialog.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"list-share-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-share-dialog/list-share-dialog.component.ts"],"names":[],"mappings":"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"}
@@ -225,27 +225,15 @@ function ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_2_Temp
225
225
  i0.ɵɵadvance(4);
226
226
  i0.ɵɵrepeater(ctx_r1.currentShares);
227
227
  } }
228
- function ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
229
- i0.ɵɵelementStart(0, "p", 59);
230
- i0.ɵɵtext(1, " Use the search above to find users or roles to share with. ");
231
- i0.ɵɵelementEnd();
232
- } }
233
228
  function ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
234
- i0.ɵɵelementStart(0, "div", 16);
235
- i0.ɵɵelement(1, "i", 58);
236
- i0.ɵɵelementStart(2, "p");
237
- i0.ɵɵtext(3, "This list hasn't been shared with anyone yet.");
238
- i0.ɵɵelementEnd();
239
- i0.ɵɵconditionalCreate(4, ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_3_Conditional_4_Template, 2, 0, "p", 59);
240
- i0.ɵɵelementEnd();
229
+ i0.ɵɵelement(0, "mj-empty-state", 16);
241
230
  } if (rf & 2) {
242
231
  const ctx_r1 = i0.ɵɵnextContext(3);
243
- i0.ɵɵadvance(4);
244
- i0.ɵɵconditional(ctx_r1.canModifyShares ? 4 : -1);
232
+ i0.ɵɵproperty("Message", ctx_r1.EmptyShareMessage);
245
233
  } }
246
234
  function ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
247
235
  i0.ɵɵelementStart(0, "div", 17);
248
- i0.ɵɵelement(1, "i", 60);
236
+ i0.ɵɵelement(1, "i", 58);
249
237
  i0.ɵɵelementStart(2, "span");
250
238
  i0.ɵɵtext(3, "Only the list owner can manage sharing.");
251
239
  i0.ɵɵelementEnd()();
@@ -254,7 +242,7 @@ function ListShareDialogComponent_Conditional_0_Conditional_3_Template(rf, ctx)
254
242
  i0.ɵɵconditionalCreate(0, ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_0_Template, 16, 6, "div", 13);
255
243
  i0.ɵɵconditionalCreate(1, ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_1_Template, 1, 0, "hr", 14);
256
244
  i0.ɵɵconditionalCreate(2, ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_2_Template, 6, 0, "div", 15);
257
- i0.ɵɵconditionalCreate(3, ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_3_Template, 5, 1, "div", 16);
245
+ i0.ɵɵconditionalCreate(3, ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_3_Template, 1, 1, "mj-empty-state", 16);
258
246
  i0.ɵɵconditionalCreate(4, ListShareDialogComponent_Conditional_0_Conditional_3_Conditional_4_Template, 4, 0, "div", 17);
259
247
  } if (rf & 2) {
260
248
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -270,11 +258,11 @@ function ListShareDialogComponent_Conditional_0_Conditional_3_Template(rf, ctx)
270
258
  } }
271
259
  function ListShareDialogComponent_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
272
260
  const _r11 = i0.ɵɵgetCurrentView();
273
- i0.ɵɵelementStart(0, "div", 5)(1, "input", 61);
261
+ i0.ɵɵelementStart(0, "div", 5)(1, "input", 59);
274
262
  i0.ɵɵtwoWayListener("ngModelChange", function ListShareDialogComponent_Conditional_0_Conditional_4_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.notifyByEmail, $event) || (ctx_r1.notifyByEmail = $event); return i0.ɵɵresetView($event); });
275
263
  i0.ɵɵelementEnd();
276
- i0.ɵɵelementStart(2, "label", 62);
277
- i0.ɵɵelement(3, "i", 63);
264
+ i0.ɵɵelementStart(2, "label", 60);
265
+ i0.ɵɵelement(3, "i", 61);
278
266
  i0.ɵɵtext(4, " Send email notification to new shares ");
279
267
  i0.ɵɵelementEnd()();
280
268
  } if (rf & 2) {
@@ -336,6 +324,16 @@ export class ListShareDialogComponent extends BaseAngularComponent {
336
324
  * Configuration for the dialog
337
325
  */
338
326
  config;
327
+ /**
328
+ * Supporting message for the empty-state shown when a list has no shares.
329
+ * Appends a usage hint when the current user can manage shares.
330
+ */
331
+ get EmptyShareMessage() {
332
+ const base = "This list hasn't been shared with anyone yet.";
333
+ return this.canModifyShares
334
+ ? `${base} Use the search above to find users or roles to share with.`
335
+ : base;
336
+ }
339
337
  /**
340
338
  * Controls dialog visibility
341
339
  */
@@ -681,15 +679,15 @@ export class ListShareDialogComponent extends BaseAngularComponent {
681
679
  return this.config?.isOwner === true;
682
680
  }
683
681
  static ɵfac = function ListShareDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ListShareDialogComponent)(i0.ɵɵdirectiveInject(i1.ListSharingService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
684
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListShareDialogComponent, selectors: [["mj-list-share-dialog"]], inputs: { config: "config", visible: "visible" }, outputs: { complete: "complete", cancel: "cancel", manageInvitations: "manageInvitations", viewAuditLog: "viewAuditLog" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["mjDropdownItem", ""], [3, "Visible", "Title", "Width"], [3, "Close", "Visible", "Title", "Width"], [1, "share-dialog-content"], [1, "loading-container"], [1, "notify-toggle"], ["mjButton", "", "variant", "primary", 3, "click"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "fa-solid", "fa-envelope-open-text"], ["mjButton", "", 3, "click"], ["href", "#", 1, "audit-log-link", 3, "click"], [1, "fa-solid", "fa-clock-rotate-left"], ["text", "Loading shares..."], [1, "add-share-section"], [1, "section-divider"], [1, "current-shares-section"], [1, "empty-state"], [1, "readonly-notice"], [1, "section-title"], [1, "search-type-toggle"], ["mjButton", "", 3, "click", "variant"], [1, "fa-solid", "fa-user"], [1, "fa-solid", "fa-users"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", 1, "mj-input", 3, "input", "blur", "value", "placeholder"], [1, "search-results"], [1, "selected-recipient"], [1, "search-result-item"], [1, "search-result-item", 3, "mousedown"], [1, "recipient-info"], [1, "recipient-name"], [1, "recipient-email"], [1, "recipient-chip"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "fa-solid", "fa-times"], ["TextField", "label", "ValueField", "value", 1, "permission-dropdown", 3, "ngModelChange", "Data", "ngModel", "ValuePrimitive"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], [1, "permission-option"], [1, "permission-label"], [1, "permission-desc"], [1, "share-list"], [1, "share-item"], [1, "share-info"], [1, "share-type-icon"], [1, "share-details"], [1, "share-name"], [1, "share-email"], [1, "share-type-label"], [1, "share-actions"], ["TextField", "label", "ValueField", "value", 1, "permission-dropdown-small", 3, "Data", "ngModel", "ValuePrimitive", "Disabled"], [1, "permission-badge"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Remove access", 3, "disabled"], ["TextField", "label", "ValueField", "value", 1, "permission-dropdown-small", 3, "ValueChange", "Data", "ngModel", "ValuePrimitive", "Disabled"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Remove access", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-share-nodes", "empty-icon"], [1, "empty-hint"], [1, "fa-solid", "fa-info-circle"], ["id", "share-notify", "type", "checkbox", 3, "ngModelChange", "ngModel"], ["for", "share-notify"], [1, "fa-solid", "fa-envelope"]], template: function ListShareDialogComponent_Template(rf, ctx) { if (rf & 1) {
682
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListShareDialogComponent, selectors: [["mj-list-share-dialog"]], inputs: { config: "config", visible: "visible" }, outputs: { complete: "complete", cancel: "cancel", manageInvitations: "manageInvitations", viewAuditLog: "viewAuditLog" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["mjDropdownItem", ""], [3, "Visible", "Title", "Width"], [3, "Close", "Visible", "Title", "Width"], [1, "share-dialog-content"], [1, "loading-container"], [1, "notify-toggle"], ["mjButton", "", "variant", "primary", 3, "click"], ["mjButton", "", "variant", "outline", 3, "click"], [1, "fa-solid", "fa-envelope-open-text"], ["mjButton", "", 3, "click"], ["href", "#", 1, "audit-log-link", 3, "click"], [1, "fa-solid", "fa-clock-rotate-left"], ["text", "Loading shares..."], [1, "add-share-section"], [1, "section-divider"], [1, "current-shares-section"], ["Icon", "fa-solid fa-share-nodes", "Title", "Not shared yet", "Size", "compact", 3, "Message"], [1, "readonly-notice"], [1, "section-title"], [1, "search-type-toggle"], ["mjButton", "", 3, "click", "variant"], [1, "fa-solid", "fa-user"], [1, "fa-solid", "fa-users"], [1, "search-container"], [1, "search-input-wrapper"], [1, "fa-solid", "fa-search", "search-icon"], ["type", "text", 1, "mj-input", 3, "input", "blur", "value", "placeholder"], [1, "search-results"], [1, "selected-recipient"], [1, "search-result-item"], [1, "search-result-item", 3, "mousedown"], [1, "recipient-info"], [1, "recipient-name"], [1, "recipient-email"], [1, "recipient-chip"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click"], [1, "fa-solid", "fa-times"], ["TextField", "label", "ValueField", "value", 1, "permission-dropdown", 3, "ngModelChange", "Data", "ngModel", "ValuePrimitive"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], [1, "permission-option"], [1, "permission-label"], [1, "permission-desc"], [1, "share-list"], [1, "share-item"], [1, "share-info"], [1, "share-type-icon"], [1, "share-details"], [1, "share-name"], [1, "share-email"], [1, "share-type-label"], [1, "share-actions"], ["TextField", "label", "ValueField", "value", 1, "permission-dropdown-small", 3, "Data", "ngModel", "ValuePrimitive", "Disabled"], [1, "permission-badge"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Remove access", 3, "disabled"], ["TextField", "label", "ValueField", "value", 1, "permission-dropdown-small", 3, "ValueChange", "Data", "ngModel", "ValuePrimitive", "Disabled"], ["mjButton", "", "variant", "danger", "size", "sm", "title", "Remove access", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"], [1, "fa-solid", "fa-info-circle"], ["id", "share-notify", "type", "checkbox", 3, "ngModelChange", "ngModel"], ["for", "share-notify"], [1, "fa-solid", "fa-envelope"]], template: function ListShareDialogComponent_Template(rf, ctx) { if (rf & 1) {
685
683
  i0.ɵɵconditionalCreate(0, ListShareDialogComponent_Conditional_0_Template, 16, 6, "mj-dialog", 1);
686
684
  } if (rf & 2) {
687
685
  i0.ɵɵconditional(ctx.visible ? 0 : -1);
688
- } }, dependencies: [i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i3.MJDialogComponent, i3.MJDialogActionsComponent, i3.MJDropdownComponent, i4.LoadingComponent], styles: [".share-dialog-content[_ngcontent-%COMP%] {\n padding: 0;\n min-height: 200px;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-divider[_ngcontent-%COMP%] {\n margin: 16px 0;\n border: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n\n\n.add-share-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding-left: 36px;\n}\n\n.search-results[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n z-index: 1000;\n}\n\n.search-result-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.search-result-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.search-result-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n width: 20px;\n text-align: center;\n}\n\n.recipient-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recipient-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.recipient-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.selected-recipient[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.recipient-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n flex: 1;\n}\n\n.recipient-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.recipient-chip[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.permission-dropdown[_ngcontent-%COMP%] {\n width: 150px;\n}\n\n\n\n.permission-option[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n}\n\n.permission-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.permission-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.current-shares-section[_ngcontent-%COMP%] {\n margin-top: 16px;\n}\n\n.share-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.share-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n transition: background-color 0.15s;\n}\n\n.share-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.share-type-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.share-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.share-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.share-type-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 3px;\n display: inline-block;\n width: fit-content;\n}\n\n.share-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.permission-dropdown-small[_ngcontent-%COMP%] {\n width: 110px;\n}\n\n.permission-badge[_ngcontent-%COMP%] {\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-secondary);\n}\n\n.empty-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n margin-top: 8px !important;\n}\n\n\n\n.readonly-notice[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n margin-top: 16px;\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.readonly-notice[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.notify-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n.notify-toggle[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.notify-toggle[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n\n\n.audit-log-link[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 12px;\n color: var(--mj-text-link);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n}\n\n.audit-log-link[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}"] });
686
+ } }, dependencies: [i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i3.MJDialogComponent, i3.MJDialogActionsComponent, i3.MJDropdownComponent, i3.MJEmptyStateComponent, i4.LoadingComponent], styles: [".share-dialog-content[_ngcontent-%COMP%] {\n padding: 0;\n min-height: 200px;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-divider[_ngcontent-%COMP%] {\n margin: 16px 0;\n border: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n\n\n.add-share-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding-left: 36px;\n}\n\n.search-results[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n z-index: 1000;\n}\n\n.search-result-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.search-result-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.search-result-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n width: 20px;\n text-align: center;\n}\n\n.recipient-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recipient-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.recipient-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.selected-recipient[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.recipient-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n flex: 1;\n}\n\n.recipient-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.recipient-chip[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.permission-dropdown[_ngcontent-%COMP%] {\n width: 150px;\n}\n\n\n\n.permission-option[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n}\n\n.permission-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.permission-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n\n\n.current-shares-section[_ngcontent-%COMP%] {\n margin-top: 16px;\n}\n\n.share-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.share-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n transition: background-color 0.15s;\n}\n\n.share-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.share-type-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.share-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.share-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.share-type-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 3px;\n display: inline-block;\n width: fit-content;\n}\n\n.share-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.permission-dropdown-small[_ngcontent-%COMP%] {\n width: 110px;\n}\n\n.permission-badge[_ngcontent-%COMP%] {\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n}\n\n\n\n.readonly-notice[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n margin-top: 16px;\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.readonly-notice[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.notify-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n.notify-toggle[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.notify-toggle[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n\n\n.audit-log-link[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 12px;\n color: var(--mj-text-link);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n}\n\n.audit-log-link[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}"] });
689
687
  }
690
688
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListShareDialogComponent, [{
691
689
  type: Component,
692
- args: [{ standalone: false, selector: 'mj-list-share-dialog', template: "@if (visible) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"dialogTitle\"\n [Width]=\"500\"\n (Close)=\"onCancel()\">\n <div class=\"share-dialog-content\">\n <!-- Loading state -->\n @if (loading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading shares...\"></mj-loading>\n </div>\n }\n @if (!loading) {\n <!-- Add new share section -->\n @if (canModifyShares) {\n <div class=\"add-share-section\">\n <h4 class=\"section-title\">Add people or roles</h4>\n <!-- Search type toggle -->\n <div class=\"search-type-toggle\">\n <button mjButton\n [variant]=\"searchType === 'User' ? 'primary' : 'outline'\"\n (click)=\"setSearchType('User')\">\n <i class=\"fa-solid fa-user\"></i> Users\n </button>\n <button mjButton\n [variant]=\"searchType === 'Role' ? 'primary' : 'outline'\"\n (click)=\"setSearchType('Role')\">\n <i class=\"fa-solid fa-users\"></i> Roles\n </button>\n </div>\n <!-- Search input -->\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"mj-input\"\n [value]=\"searchText\"\n (input)=\"onSearchInput($any($event.target).value)\"\n [placeholder]=\"'Search for ' + (searchType === 'User' ? 'users' : 'roles') + '...'\"\n (blur)=\"showSearchResults = false\" />\n </div>\n <!-- Search results dropdown -->\n @if (showSearchResults && searchResults.length > 0) {\n <div class=\"search-results\">\n @for (recipient of searchResults; track recipient) {\n <div class=\"search-result-item\"\n (mousedown)=\"selectRecipient(recipient)\">\n <i [class]=\"getShareTypeIcon(recipient.type)\"></i>\n <div class=\"recipient-info\">\n <span class=\"recipient-name\">{{ recipient.name }}</span>\n @if (recipient.email) {\n <span class=\"recipient-email\">{{ recipient.email }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n <!-- Selected recipient and permission -->\n @if (selectedRecipient) {\n <div class=\"selected-recipient\">\n <div class=\"recipient-chip\">\n <i [class]=\"getShareTypeIcon(selectedRecipient.type)\"></i>\n <span>{{ selectedRecipient.name }}</span>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <mj-dropdown\n [Data]=\"permissionOptions\"\n TextField=\"label\"\n ValueField=\"value\"\n [(ngModel)]=\"selectedPermission\"\n [ValuePrimitive]=\"true\"\n class=\"permission-dropdown\">\n <ng-template #mjDropdownItem let-dataItem>\n <div class=\"permission-option\">\n <span class=\"permission-label\">{{ dataItem.label }}</span>\n <span class=\"permission-desc\">{{ dataItem.description }}</span>\n </div>\n </ng-template>\n </mj-dropdown>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"saving\"\n (click)=\"addShare()\">\n <i class=\"fa-solid fa-plus\"></i> Add\n </button>\n </div>\n }\n </div>\n }\n <!-- Divider -->\n @if (currentShares.length > 0 && canModifyShares) {\n <hr class=\"section-divider\">\n }\n <!-- Current shares section -->\n @if (currentShares.length > 0) {\n <div class=\"current-shares-section\">\n <h4 class=\"section-title\">People with access</h4>\n <div class=\"share-list\">\n @for (share of currentShares; track share) {\n <div class=\"share-item\">\n <div class=\"share-info\">\n <i [class]=\"getShareTypeIcon(share.type)\" class=\"share-type-icon\"></i>\n <div class=\"share-details\">\n <span class=\"share-name\">{{ share.recipientName }}</span>\n @if (share.recipientEmail) {\n <span class=\"share-email\">{{ share.recipientEmail }}</span>\n }\n @if (share.type === 'Role') {\n <span class=\"share-type-label\">Role</span>\n }\n </div>\n </div>\n <div class=\"share-actions\">\n @if (canModifyShares) {\n <mj-dropdown\n [Data]=\"permissionOptions\"\n TextField=\"label\"\n ValueField=\"value\"\n [ngModel]=\"share.permissionLevel\"\n [ValuePrimitive]=\"true\"\n (ValueChange)=\"updateSharePermission(share, $any($event))\"\n [Disabled]=\"saving\"\n class=\"permission-dropdown-small\">\n </mj-dropdown>\n }\n @if (!canModifyShares) {\n <span class=\"permission-badge\">\n {{ getPermissionLabel(share.permissionLevel) }}\n </span>\n }\n @if (canModifyShares) {\n <button mjButton\n variant=\"danger\"\n size=\"sm\"\n title=\"Remove access\"\n [disabled]=\"saving\"\n (click)=\"removeShare(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty state -->\n @if (currentShares.length === 0 && !loading) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-share-nodes empty-icon\"></i>\n <p>This list hasn't been shared with anyone yet.</p>\n @if (canModifyShares) {\n <p class=\"empty-hint\">\n Use the search above to find users or roles to share with.\n </p>\n }\n </div>\n }\n <!-- Read-only notice -->\n @if (!canModifyShares) {\n <div class=\"readonly-notice\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Only the list owner can manage sharing.</span>\n </div>\n }\n }\n </div>\n <!-- Notify-by-email toggle (mockup 15). Sits above the action footer so\n the user can flip it after adding shares but before clicking Done. -->\n @if (canModifyShares) {\n <div class=\"notify-toggle\">\n <input id=\"share-notify\" type=\"checkbox\" [(ngModel)]=\"notifyByEmail\" />\n <label for=\"share-notify\">\n <i class=\"fa-solid fa-envelope\"></i>\n Send email notification to new shares\n </label>\n </div>\n }\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"onDone()\">Done</button>\n <button mjButton variant=\"outline\" (click)=\"manageInvitations.emit()\">\n <i class=\"fa-solid fa-envelope-open-text\"></i>\n Manage Invitations\n </button>\n <button mjButton (click)=\"onCancel()\">Cancel</button>\n <a class=\"audit-log-link\" (click)=\"viewAuditLog.emit(); $event.preventDefault()\" href=\"#\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n View audit log\n </a>\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [".share-dialog-content {\n padding: 0;\n min-height: 200px;\n}\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n/* Section styling */\n.section-title {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-divider {\n margin: 16px 0;\n border: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* Add share section */\n.add-share-section {\n margin-bottom: 16px;\n}\n\n.search-type-toggle {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.search-type-toggle button {\n flex: 1;\n}\n\n.search-type-toggle i {\n margin-right: 6px;\n}\n\n/* Search container */\n.search-container {\n position: relative;\n}\n\n.search-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-input-wrapper .search-icon {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.search-input-wrapper .mj-input {\n padding-left: 36px;\n}\n\n.search-results {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n z-index: 1000;\n}\n\n.search-result-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.search-result-item:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.search-result-item i {\n color: var(--mj-text-secondary);\n width: 20px;\n text-align: center;\n}\n\n.recipient-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recipient-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.recipient-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n/* Selected recipient */\n.selected-recipient {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.recipient-chip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n flex: 1;\n}\n\n.recipient-chip i {\n color: var(--mj-brand-primary);\n}\n\n.recipient-chip span {\n flex: 1;\n font-weight: 500;\n}\n\n.permission-dropdown {\n width: 150px;\n}\n\n/* Permission option template */\n.permission-option {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n}\n\n.permission-label {\n font-weight: 500;\n}\n\n.permission-desc {\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n/* Current shares section */\n.current-shares-section {\n margin-top: 16px;\n}\n\n.share-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.share-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n transition: background-color 0.15s;\n}\n\n.share-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.share-type-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.share-details {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.share-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.share-type-label {\n font-size: 11px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 3px;\n display: inline-block;\n width: fit-content;\n}\n\n.share-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.permission-dropdown-small {\n width: 110px;\n}\n\n.permission-badge {\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* Empty state */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 0;\n color: var(--mj-text-secondary);\n}\n\n.empty-hint {\n font-size: 13px;\n margin-top: 8px !important;\n}\n\n/* Read-only notice */\n.readonly-notice {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n margin-top: 16px;\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.readonly-notice i {\n color: var(--mj-status-warning);\n}\n\n/* Notify-by-email toggle (Phase 2 \u2014 mockup 15) */\n.notify-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n.notify-toggle input {\n cursor: pointer;\n}\n\n.notify-toggle label {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n/* Footer audit-log link \u2014 sits on the far right of the dialog footer */\n.audit-log-link {\n margin-left: auto;\n font-size: 12px;\n color: var(--mj-text-link);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n}\n\n.audit-log-link:hover {\n text-decoration: underline;\n}\n\n"] }]
690
+ args: [{ standalone: false, selector: 'mj-list-share-dialog', template: "@if (visible) {\n <mj-dialog\n [Visible]=\"true\"\n [Title]=\"dialogTitle\"\n [Width]=\"500\"\n (Close)=\"onCancel()\">\n <div class=\"share-dialog-content\">\n <!-- Loading state -->\n @if (loading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading shares...\"></mj-loading>\n </div>\n }\n @if (!loading) {\n <!-- Add new share section -->\n @if (canModifyShares) {\n <div class=\"add-share-section\">\n <h4 class=\"section-title\">Add people or roles</h4>\n <!-- Search type toggle -->\n <div class=\"search-type-toggle\">\n <button mjButton\n [variant]=\"searchType === 'User' ? 'primary' : 'outline'\"\n (click)=\"setSearchType('User')\">\n <i class=\"fa-solid fa-user\"></i> Users\n </button>\n <button mjButton\n [variant]=\"searchType === 'Role' ? 'primary' : 'outline'\"\n (click)=\"setSearchType('Role')\">\n <i class=\"fa-solid fa-users\"></i> Roles\n </button>\n </div>\n <!-- Search input -->\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-search search-icon\"></i>\n <input type=\"text\"\n class=\"mj-input\"\n [value]=\"searchText\"\n (input)=\"onSearchInput($any($event.target).value)\"\n [placeholder]=\"'Search for ' + (searchType === 'User' ? 'users' : 'roles') + '...'\"\n (blur)=\"showSearchResults = false\" />\n </div>\n <!-- Search results dropdown -->\n @if (showSearchResults && searchResults.length > 0) {\n <div class=\"search-results\">\n @for (recipient of searchResults; track recipient) {\n <div class=\"search-result-item\"\n (mousedown)=\"selectRecipient(recipient)\">\n <i [class]=\"getShareTypeIcon(recipient.type)\"></i>\n <div class=\"recipient-info\">\n <span class=\"recipient-name\">{{ recipient.name }}</span>\n @if (recipient.email) {\n <span class=\"recipient-email\">{{ recipient.email }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n <!-- Selected recipient and permission -->\n @if (selectedRecipient) {\n <div class=\"selected-recipient\">\n <div class=\"recipient-chip\">\n <i [class]=\"getShareTypeIcon(selectedRecipient.type)\"></i>\n <span>{{ selectedRecipient.name }}</span>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"clearSearch()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <mj-dropdown\n [Data]=\"permissionOptions\"\n TextField=\"label\"\n ValueField=\"value\"\n [(ngModel)]=\"selectedPermission\"\n [ValuePrimitive]=\"true\"\n class=\"permission-dropdown\">\n <ng-template #mjDropdownItem let-dataItem>\n <div class=\"permission-option\">\n <span class=\"permission-label\">{{ dataItem.label }}</span>\n <span class=\"permission-desc\">{{ dataItem.description }}</span>\n </div>\n </ng-template>\n </mj-dropdown>\n <button mjButton\n variant=\"primary\"\n [disabled]=\"saving\"\n (click)=\"addShare()\">\n <i class=\"fa-solid fa-plus\"></i> Add\n </button>\n </div>\n }\n </div>\n }\n <!-- Divider -->\n @if (currentShares.length > 0 && canModifyShares) {\n <hr class=\"section-divider\">\n }\n <!-- Current shares section -->\n @if (currentShares.length > 0) {\n <div class=\"current-shares-section\">\n <h4 class=\"section-title\">People with access</h4>\n <div class=\"share-list\">\n @for (share of currentShares; track share) {\n <div class=\"share-item\">\n <div class=\"share-info\">\n <i [class]=\"getShareTypeIcon(share.type)\" class=\"share-type-icon\"></i>\n <div class=\"share-details\">\n <span class=\"share-name\">{{ share.recipientName }}</span>\n @if (share.recipientEmail) {\n <span class=\"share-email\">{{ share.recipientEmail }}</span>\n }\n @if (share.type === 'Role') {\n <span class=\"share-type-label\">Role</span>\n }\n </div>\n </div>\n <div class=\"share-actions\">\n @if (canModifyShares) {\n <mj-dropdown\n [Data]=\"permissionOptions\"\n TextField=\"label\"\n ValueField=\"value\"\n [ngModel]=\"share.permissionLevel\"\n [ValuePrimitive]=\"true\"\n (ValueChange)=\"updateSharePermission(share, $any($event))\"\n [Disabled]=\"saving\"\n class=\"permission-dropdown-small\">\n </mj-dropdown>\n }\n @if (!canModifyShares) {\n <span class=\"permission-badge\">\n {{ getPermissionLabel(share.permissionLevel) }}\n </span>\n }\n @if (canModifyShares) {\n <button mjButton\n variant=\"danger\"\n size=\"sm\"\n title=\"Remove access\"\n [disabled]=\"saving\"\n (click)=\"removeShare(share)\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty state -->\n @if (currentShares.length === 0 && !loading) {\n <mj-empty-state\n Icon=\"fa-solid fa-share-nodes\"\n Title=\"Not shared yet\"\n [Message]=\"EmptyShareMessage\"\n Size=\"compact\" />\n }\n <!-- Read-only notice -->\n @if (!canModifyShares) {\n <div class=\"readonly-notice\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Only the list owner can manage sharing.</span>\n </div>\n }\n }\n </div>\n <!-- Notify-by-email toggle (mockup 15). Sits above the action footer so\n the user can flip it after adding shares but before clicking Done. -->\n @if (canModifyShares) {\n <div class=\"notify-toggle\">\n <input id=\"share-notify\" type=\"checkbox\" [(ngModel)]=\"notifyByEmail\" />\n <label for=\"share-notify\">\n <i class=\"fa-solid fa-envelope\"></i>\n Send email notification to new shares\n </label>\n </div>\n }\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"onDone()\">Done</button>\n <button mjButton variant=\"outline\" (click)=\"manageInvitations.emit()\">\n <i class=\"fa-solid fa-envelope-open-text\"></i>\n Manage Invitations\n </button>\n <button mjButton (click)=\"onCancel()\">Cancel</button>\n <a class=\"audit-log-link\" (click)=\"viewAuditLog.emit(); $event.preventDefault()\" href=\"#\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n View audit log\n </a>\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [".share-dialog-content {\n padding: 0;\n min-height: 200px;\n}\n\n.loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n/* Section styling */\n.section-title {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-divider {\n margin: 16px 0;\n border: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n/* Add share section */\n.add-share-section {\n margin-bottom: 16px;\n}\n\n.search-type-toggle {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.search-type-toggle button {\n flex: 1;\n}\n\n.search-type-toggle i {\n margin-right: 6px;\n}\n\n/* Search container */\n.search-container {\n position: relative;\n}\n\n.search-input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-input-wrapper .search-icon {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.search-input-wrapper .mj-input {\n padding-left: 36px;\n}\n\n.search-results {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n z-index: 1000;\n}\n\n.search-result-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.search-result-item:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.search-result-item i {\n color: var(--mj-text-secondary);\n width: 20px;\n text-align: center;\n}\n\n.recipient-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recipient-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.recipient-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n/* Selected recipient */\n.selected-recipient {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.recipient-chip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n flex: 1;\n}\n\n.recipient-chip i {\n color: var(--mj-brand-primary);\n}\n\n.recipient-chip span {\n flex: 1;\n font-weight: 500;\n}\n\n.permission-dropdown {\n width: 150px;\n}\n\n/* Permission option template */\n.permission-option {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n}\n\n.permission-label {\n font-weight: 500;\n}\n\n.permission-desc {\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n/* Current shares section */\n.current-shares-section {\n margin-top: 16px;\n}\n\n.share-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.share-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n transition: background-color 0.15s;\n}\n\n.share-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.share-type-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.share-details {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.share-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-email {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.share-type-label {\n font-size: 11px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 3px;\n display: inline-block;\n width: fit-content;\n}\n\n.share-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.permission-dropdown-small {\n width: 110px;\n}\n\n.permission-badge {\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* Read-only notice */\n.readonly-notice {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n margin-top: 16px;\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.readonly-notice i {\n color: var(--mj-status-warning);\n}\n\n/* Notify-by-email toggle (Phase 2 \u2014 mockup 15) */\n.notify-toggle {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n.notify-toggle input {\n cursor: pointer;\n}\n\n.notify-toggle label {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n/* Footer audit-log link \u2014 sits on the far right of the dialog footer */\n.audit-log-link {\n margin-left: auto;\n font-size: 12px;\n color: var(--mj-text-link);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n}\n\n.audit-log-link:hover {\n text-decoration: underline;\n}\n\n"] }]
693
691
  }], () => [{ type: i1.ListSharingService }, { type: i0.ChangeDetectorRef }], { config: [{
694
692
  type: Input
695
693
  }], visible: [{