@memberjunction/ng-list-management 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts +74 -14
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts.map +1 -1
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.js +177 -57
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.js.map +1 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts +7 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts.map +1 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.js +17 -5
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map +1 -1
- package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts +30 -4
- package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts.map +1 -1
- package/dist/lib/components/list-audit-log/list-audit-log.component.js +54 -14
- package/dist/lib/components/list-audit-log/list-audit-log.component.js.map +1 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts +17 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts.map +1 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js +45 -13
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -1
- package/dist/lib/components/list-invitations/list-invitations.component.d.ts +48 -8
- package/dist/lib/components/list-invitations/list-invitations.component.d.ts.map +1 -1
- package/dist/lib/components/list-invitations/list-invitations.component.js +108 -28
- package/dist/lib/components/list-invitations/list-invitations.component.js.map +1 -1
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts +123 -15
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +312 -100
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -1
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts +128 -14
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +288 -92
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
- package/dist/lib/components/list-stats/list-stats.component.d.ts +32 -6
- package/dist/lib/components/list-stats/list-stats.component.d.ts.map +1 -1
- package/dist/lib/components/list-stats/list-stats.component.js +67 -15
- package/dist/lib/components/list-stats/list-stats.component.js.map +1 -1
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts +44 -8
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +100 -28
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -1
- package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts +18 -2
- package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts.map +1 -1
- package/dist/lib/components/shared-with-me/shared-with-me.component.js +41 -9
- package/dist/lib/components/shared-with-me/shared-with-me.component.js.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.d.ts +30 -6
- package/dist/lib/components/tag-chips/tag-chips.component.d.ts.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.js +76 -28
- package/dist/lib/components/tag-chips/tag-chips.component.js.map +1 -1
- package/dist/lib/services/list-management.service.d.ts +25 -1
- package/dist/lib/services/list-management.service.d.ts.map +1 -1
- package/dist/lib/services/list-management.service.js +59 -11
- package/dist/lib/services/list-management.service.js.map +1 -1
- package/dist/lib/services/list-sharing.service.d.ts +42 -1
- package/dist/lib/services/list-sharing.service.d.ts.map +1 -1
- package/dist/lib/services/list-sharing.service.js +85 -17
- package/dist/lib/services/list-sharing.service.js.map +1 -1
- package/package.json +11 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-share-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-share-dialog/list-share-dialog.component.ts","../../../../src/lib/components/list-share-dialog/list-share-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 { ListSharingService } from '../../services/list-sharing.service';\nimport {\n ListShareDialogConfig,\n ListShareDialogResult,\n ListShareInfo,\n ListPermissionLevel,\n ShareRecipient\n} from '../../models/list-sharing.models';\n\n/**\n * Dialog component for managing list sharing.\n * Allows users to share lists with other users or roles with different permission levels.\n *\n * Features:\n * - User/role search with autocomplete\n * - Permission level selection (View, Edit, Owner)\n * - Current shares management\n * - Remove access functionality\n */\n@Component({\n standalone: false,\n selector: 'mj-list-share-dialog',\n templateUrl: './list-share-dialog.component.html',\n styleUrls: ['./list-share-dialog.component.css']\n})\nexport class ListShareDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Configuration for the dialog\n */\n @Input() config!: ListShareDialogConfig;\n\n /**\n * Supporting message for the empty-state shown when a list has no shares.\n * Appends a usage hint when the current user can manage shares.\n */\n public get EmptyShareMessage(): string {\n const base = \"This list hasn't been shared with anyone yet.\";\n return this.canModifyShares\n ? `${base} Use the search above to find users or roles to share with.`\n : base;\n }\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<ListShareDialogResult>();\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() cancel = new EventEmitter<void>();\n\n /**\n * Emitted when the user clicks \"Manage Invitations\" in the footer.\n * Phase 2: opens the invitations management UI for this list.\n */\n @Output() manageInvitations = new EventEmitter<void>();\n\n /**\n * Emitted when the user clicks \"View audit log\" in the footer.\n * Phase 2: opens the per-list audit log view.\n */\n @Output() viewAuditLog = new EventEmitter<void>();\n\n /**\n * When true (the default), newly-added shares fan out as notifications\n * to the recipient (email + in-app, depending on user preferences).\n * The state is captured on the dialog so consumers can read it back\n * via `ListShareDialogResult.notifyByEmail`.\n */\n public notifyByEmail = true;\n\n // State\n loading = false;\n saving = false;\n searchText = '';\n searchType: 'User' | 'Role' = 'User';\n showSearchResults = false;\n\n // Data\n currentShares: ListShareInfo[] = [];\n searchResults: ShareRecipient[] = [];\n selectedRecipient: ShareRecipient | null = null;\n selectedPermission: ListPermissionLevel = 'View';\n\n // Track changes\n sharesAdded: ListShareInfo[] = [];\n sharesUpdated: ListShareInfo[] = [];\n sharesRemoved: string[] = [];\n\n // Permission options\n permissionOptions: { value: ListPermissionLevel; label: string; description: string }[] = [\n { value: 'View', label: 'Viewer', description: 'Can view list contents' },\n { value: 'Edit', label: 'Editor', description: 'Can add/remove items' },\n { value: 'Owner', label: 'Co-owner', description: 'Full control including sharing' }\n ];\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n constructor(\n private sharingService: ListSharingService,\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\n */\n get dialogTitle(): string {\n return `Share \"${this.config?.listName || 'List'}\"`;\n }\n\n /**\n * Check if there are pending changes\n */\n get hasChanges(): boolean {\n return this.sharesAdded.length > 0 ||\n this.sharesUpdated.length > 0 ||\n this.sharesRemoved.length > 0;\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(async (searchText: string) => {\n if (searchText.trim().length >= 2) {\n await this.performSearch(searchText);\n } else {\n this.searchResults = [];\n this.showSearchResults = false;\n }\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Initialize dialog when opened\n */\n private async initializeDialog(): Promise<void> {\n this.resetState();\n await this.loadCurrentShares();\n }\n\n /**\n * Reset all state\n */\n private resetState(): void {\n this.searchText = '';\n this.searchType = 'User';\n this.showSearchResults = false;\n this.searchResults = [];\n this.selectedRecipient = null;\n this.selectedPermission = 'View';\n this.sharesAdded = [];\n this.sharesUpdated = [];\n this.sharesRemoved = [];\n }\n\n /**\n * Load current shares for the list\n */\n private async loadCurrentShares(): Promise<void> {\n if (!this.config) return;\n\n this.loading = true;\n this.cdr.detectChanges();\n\n try {\n this.currentShares = await this.sharingService.getListShares(this.config.listId);\n } catch (error) {\n console.error('Error loading shares:', error);\n this.currentShares = [];\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.searchText = value;\n this.searchSubject.next(value);\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this.searchText = '';\n this.searchResults = [];\n this.showSearchResults = false;\n this.selectedRecipient = null;\n }\n\n /**\n * Switch search type\n */\n setSearchType(type: 'User' | 'Role'): void {\n this.searchType = type;\n if (this.searchText.trim().length >= 2) {\n this.searchSubject.next(this.searchText);\n }\n }\n\n /**\n * Perform search\n */\n private async performSearch(searchText: string): Promise<void> {\n try {\n if (this.searchType === 'User') {\n this.searchResults = await this.sharingService.searchUsers(searchText);\n } else {\n this.searchResults = await this.sharingService.searchRoles(searchText);\n }\n\n // Filter out recipients that already have access\n const existingIds = new Set(this.currentShares.map(s => s.recipientId));\n this.searchResults = this.searchResults.filter(r => !existingIds.has(r.id));\n\n // Also filter out the list owner\n this.searchResults = this.searchResults.filter(r => r.id !== this.config?.currentUserId);\n\n this.showSearchResults = this.searchResults.length > 0;\n } catch (error) {\n console.error('Error searching:', error);\n this.searchResults = [];\n }\n }\n\n /**\n * Select a recipient from search results\n */\n selectRecipient(recipient: ShareRecipient): void {\n this.selectedRecipient = recipient;\n this.searchText = recipient.name;\n this.showSearchResults = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Add the selected recipient as a share\n */\n async addShare(): Promise<void> {\n if (!this.selectedRecipient || !this.config) return;\n\n this.saving = true;\n\n try {\n const md = this.ProviderToUse;\n let result;\n\n if (this.selectedRecipient.type === 'User') {\n result = await this.sharingService.shareListWithUser(\n this.config.listId,\n this.selectedRecipient.id,\n this.selectedPermission,\n this.config.currentUserId\n );\n } else {\n result = await this.sharingService.shareListWithRole(\n this.config.listId,\n this.selectedRecipient.id,\n this.selectedPermission,\n this.config.currentUserId\n );\n }\n\n if (result.success && result.shareId) {\n // Create a ListShareInfo for tracking\n const newShare: ListShareInfo = {\n shareId: result.shareId,\n listId: this.config.listId,\n type: this.selectedRecipient.type,\n recipientId: this.selectedRecipient.id,\n recipientName: this.selectedRecipient.name,\n recipientEmail: this.selectedRecipient.email,\n permissionLevel: this.selectedPermission,\n status: 'Approved'\n };\n\n this.currentShares.push(newShare);\n this.sharesAdded.push(newShare);\n\n // Clear selection\n this.clearSearch();\n this.selectedPermission = 'View';\n } else {\n console.error('Failed to add share:', result.message);\n }\n } catch (error) {\n console.error('Error adding share:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Update permission level for an existing share\n */\n async updateSharePermission(share: ListShareInfo, newLevel: ListPermissionLevel): Promise<void> {\n if (share.permissionLevel === newLevel) return;\n\n this.saving = true;\n\n try {\n const result = await this.sharingService.updateSharePermission(share.shareId, newLevel);\n\n if (result.success) {\n share.permissionLevel = newLevel;\n\n // Track the update if not already tracked\n const existingUpdate = this.sharesUpdated.find(s => s.shareId === share.shareId);\n if (!existingUpdate) {\n this.sharesUpdated.push({ ...share });\n }\n } else {\n console.error('Failed to update permission:', result.message);\n }\n } catch (error) {\n console.error('Error updating permission:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Remove a share\n */\n async removeShare(share: ListShareInfo): Promise<void> {\n this.saving = true;\n\n try {\n const result = await this.sharingService.removeShare(share.shareId);\n\n if (result.success) {\n // Remove from current shares\n this.currentShares = this.currentShares.filter(s => s.shareId !== share.shareId);\n\n // Track the removal\n this.sharesRemoved.push(share.shareId);\n\n // Remove from added if it was just added in this session\n this.sharesAdded = this.sharesAdded.filter(s => s.shareId !== share.shareId);\n } else {\n console.error('Failed to remove share:', result.message);\n }\n } catch (error) {\n console.error('Error removing share:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get icon for share type\n */\n getShareTypeIcon(type: 'User' | 'Role'): string {\n return type === 'User' ? 'fa-solid fa-user' : 'fa-solid fa-users';\n }\n\n /**\n * Get permission label\n */\n getPermissionLabel(level: ListPermissionLevel): string {\n const option = this.permissionOptions.find(o => o.value === level);\n return option?.label || level;\n }\n\n /**\n * Close dialog with results\n */\n onDone(): void {\n const result: ListShareDialogResult = {\n action: 'apply',\n sharesAdded: this.sharesAdded,\n sharesUpdated: this.sharesUpdated,\n sharesRemoved: this.sharesRemoved,\n notifyByEmail: this.notifyByEmail\n };\n\n this._visible = false;\n this.complete.emit(result);\n }\n\n /**\n * Cancel and close dialog\n */\n onCancel(): void {\n this._visible = false;\n this.cancel.emit();\n }\n\n /**\n * Check if current user can modify shares\n */\n get canModifyShares(): boolean {\n return this.config?.isOwner === true;\n }\n}\n","@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"]}
|
|
1
|
+
{"version":3,"file":"list-share-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-share-dialog/list-share-dialog.component.ts","../../../../src/lib/components/list-share-dialog/list-share-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 { ListSharingService } from '../../services/list-sharing.service';\nimport {\n ListShareDialogConfig,\n ListShareDialogResult,\n ListShareInfo,\n ListPermissionLevel,\n ShareRecipient\n} from '../../models/list-sharing.models';\n\n/**\n * Dialog component for managing list sharing.\n * Allows users to share lists with other users or roles with different permission levels.\n *\n * Features:\n * - User/role search with autocomplete\n * - Permission level selection (View, Edit, Owner)\n * - Current shares management\n * - Remove access functionality\n */\n@Component({\n standalone: false,\n selector: 'mj-list-share-dialog',\n templateUrl: './list-share-dialog.component.html',\n styleUrls: ['./list-share-dialog.component.css']\n})\nexport class ListShareDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Configuration for the dialog\n */\n @Input() config!: ListShareDialogConfig;\n\n /**\n * Supporting message for the empty-state shown when a list has no shares.\n * Appends a usage hint when the current user can manage shares.\n */\n public get EmptyShareMessage(): string {\n const base = \"This list hasn't been shared with anyone yet.\";\n return this.CanModifyShares\n ? `${base} Use the search above to find users or roles to share with.`\n : base;\n }\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\n /** @deprecated Use {@link Visible}. */\n get visible(): boolean {\n return this.Visible;\n }\n /** @deprecated Use {@link Visible}. */\n @Input() set visible(value: boolean) {\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<ListShareDialogResult>();\n\n /**\n * @deprecated Use {@link Complete}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (complete) keeps working. Must stay AFTER Complete: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() complete = this.Complete;\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() cancel = new EventEmitter<void>();\n\n /**\n * Emitted when the user clicks \"Manage Invitations\" in the footer.\n * Phase 2: opens the invitations management UI for this list.\n */\n @Output() ManageInvitations = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link ManageInvitations}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (manageInvitations) keeps working. Must stay AFTER ManageInvitations: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() manageInvitations = this.ManageInvitations;\n\n /**\n * Emitted when the user clicks \"View audit log\" in the footer.\n * Phase 2: opens the per-list audit log view.\n */\n @Output() ViewAuditLog = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link ViewAuditLog}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (viewAuditLog) keeps working. Must stay AFTER ViewAuditLog: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() viewAuditLog = this.ViewAuditLog;\n\n /**\n * When true (the default), newly-added shares fan out as notifications\n * to the recipient (email + in-app, depending on user preferences).\n * The state is captured on the dialog so consumers can read it back\n * via `ListShareDialogResult.notifyByEmail`.\n */\n public NotifyByEmail = true;\n\n /** @deprecated Use {@link NotifyByEmail}. */\n public get notifyByEmail() {\n return this.NotifyByEmail;\n }\n /** @deprecated Use {@link NotifyByEmail}. */\n public set notifyByEmail(value) {\n this.NotifyByEmail = value;\n }\n\n // State\n Loading = false;\n\n /** @deprecated Use {@link Loading}. */\n get loading() {\n return this.Loading;\n }\n /** @deprecated Use {@link Loading}. */\n set loading(value) {\n this.Loading = value;\n }\n saving = false;\n SearchText = '';\n\n /** @deprecated Use {@link SearchText}. */\n get searchText() {\n return this.SearchText;\n }\n /** @deprecated Use {@link SearchText}. */\n set searchText(value) {\n this.SearchText = value;\n }\n SearchType: 'User' | 'Role' = 'User';\n\n /** @deprecated Use {@link SearchType}. */\n get searchType(): 'User' | 'Role' {\n return this.SearchType;\n }\n /** @deprecated Use {@link SearchType}. */\n set searchType(value: 'User' | 'Role') {\n this.SearchType = value;\n }\n ShowSearchResults = false;\n\n /** @deprecated Use {@link ShowSearchResults}. */\n get showSearchResults() {\n return this.ShowSearchResults;\n }\n /** @deprecated Use {@link ShowSearchResults}. */\n set showSearchResults(value) {\n this.ShowSearchResults = value;\n }\n\n // Data\n CurrentShares: ListShareInfo[] = [];\n\n /** @deprecated Use {@link CurrentShares}. */\n get currentShares(): ListShareInfo[] {\n return this.CurrentShares;\n }\n /** @deprecated Use {@link CurrentShares}. */\n set currentShares(value: ListShareInfo[]) {\n this.CurrentShares = value;\n }\n SearchResults: ShareRecipient[] = [];\n\n /** @deprecated Use {@link SearchResults}. */\n get searchResults(): ShareRecipient[] {\n return this.SearchResults;\n }\n /** @deprecated Use {@link SearchResults}. */\n set searchResults(value: ShareRecipient[]) {\n this.SearchResults = value;\n }\n SelectedRecipient: ShareRecipient | null = null;\n\n /** @deprecated Use {@link SelectedRecipient}. */\n get selectedRecipient(): ShareRecipient | null {\n return this.SelectedRecipient;\n }\n /** @deprecated Use {@link SelectedRecipient}. */\n set selectedRecipient(value: ShareRecipient | null) {\n this.SelectedRecipient = value;\n }\n SelectedPermission: ListPermissionLevel = 'View';\n\n /** @deprecated Use {@link SelectedPermission}. */\n get selectedPermission(): ListPermissionLevel {\n return this.SelectedPermission;\n }\n /** @deprecated Use {@link SelectedPermission}. */\n set selectedPermission(value: ListPermissionLevel) {\n this.SelectedPermission = value;\n }\n\n // Track changes\n SharesAdded: ListShareInfo[] = [];\n\n /** @deprecated Use {@link SharesAdded}. */\n get sharesAdded(): ListShareInfo[] {\n return this.SharesAdded;\n }\n /** @deprecated Use {@link SharesAdded}. */\n set sharesAdded(value: ListShareInfo[]) {\n this.SharesAdded = value;\n }\n SharesUpdated: ListShareInfo[] = [];\n\n /** @deprecated Use {@link SharesUpdated}. */\n get sharesUpdated(): ListShareInfo[] {\n return this.SharesUpdated;\n }\n /** @deprecated Use {@link SharesUpdated}. */\n set sharesUpdated(value: ListShareInfo[]) {\n this.SharesUpdated = value;\n }\n SharesRemoved: string[] = [];\n\n /** @deprecated Use {@link SharesRemoved}. */\n get sharesRemoved(): string[] {\n return this.SharesRemoved;\n }\n /** @deprecated Use {@link SharesRemoved}. */\n set sharesRemoved(value: string[]) {\n this.SharesRemoved = value;\n }\n\n // Permission options\n PermissionOptions: { value: ListPermissionLevel; label: string; description: string }[] = [\n { value: 'View', label: 'Viewer', description: 'Can view list contents' },\n { value: 'Edit', label: 'Editor', description: 'Can add/remove items' },\n { value: 'Owner', label: 'Co-owner', description: 'Full control including sharing' }\n ];\n\n /** @deprecated Use {@link PermissionOptions}. */\n get permissionOptions(): { value: ListPermissionLevel; label: string; description: string }[] {\n return this.PermissionOptions;\n }\n /** @deprecated Use {@link PermissionOptions}. */\n set permissionOptions(value: { value: ListPermissionLevel; label: string; description: string }[]) {\n this.PermissionOptions = value;\n }\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n constructor(\n private sharingService: ListSharingService,\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\n */\n get DialogTitle(): string {\n return `Share \"${this.config?.listName || 'List'}\"`;\n }\n\n /** @deprecated Use {@link DialogTitle}. */\n get dialogTitle(): string {\n return this.DialogTitle;\n }\n\n /**\n * Check if there are pending changes\n */\n get HasChanges(): boolean {\n return this.SharesAdded.length > 0 ||\n this.SharesUpdated.length > 0 ||\n this.SharesRemoved.length > 0;\n }\n\n /** @deprecated Use {@link HasChanges}. */\n get hasChanges(): boolean {\n return this.HasChanges;\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(async (searchText: string) => {\n if (searchText.trim().length >= 2) {\n await this.performSearch(searchText);\n } else {\n this.SearchResults = [];\n this.ShowSearchResults = false;\n }\n this.cdr.detectChanges();\n });\n }\n\n /**\n * Initialize dialog when opened\n */\n private async initializeDialog(): Promise<void> {\n this.resetState();\n await this.loadCurrentShares();\n }\n\n /**\n * Reset all state\n */\n private resetState(): void {\n this.SearchText = '';\n this.SearchType = 'User';\n this.ShowSearchResults = false;\n this.SearchResults = [];\n this.SelectedRecipient = null;\n this.SelectedPermission = 'View';\n this.SharesAdded = [];\n this.SharesUpdated = [];\n this.SharesRemoved = [];\n }\n\n /**\n * Load current shares for the list\n */\n private async loadCurrentShares(): Promise<void> {\n if (!this.config) return;\n\n this.Loading = true;\n this.cdr.detectChanges();\n\n try {\n this.CurrentShares = await this.sharingService.getListShares(this.config.listId);\n } catch (error) {\n console.error('Error loading shares:', error);\n this.CurrentShares = [];\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.SearchText = value;\n this.searchSubject.next(value);\n }\n\n /** @deprecated Use {@link OnSearchInput}. */\n onSearchInput(event: Event): void {\n return this.OnSearchInput(event);\n }\n\n /**\n * Clear search\n */\n ClearSearch(): void {\n this.SearchText = '';\n this.SearchResults = [];\n this.ShowSearchResults = false;\n this.SelectedRecipient = null;\n }\n\n /** @deprecated Use {@link ClearSearch}. */\n clearSearch(): void {\n return this.ClearSearch();\n }\n\n /**\n * Switch search type\n */\n SetSearchType(type: 'User' | 'Role'): void {\n this.SearchType = type;\n if (this.SearchText.trim().length >= 2) {\n this.searchSubject.next(this.SearchText);\n }\n }\n\n /** @deprecated Use {@link SetSearchType}. */\n setSearchType(type: 'User' | 'Role'): void {\n return this.SetSearchType(type);\n }\n\n /**\n * Perform search\n */\n private async performSearch(searchText: string): Promise<void> {\n try {\n if (this.SearchType === 'User') {\n this.SearchResults = await this.sharingService.searchUsers(searchText);\n } else {\n this.SearchResults = await this.sharingService.searchRoles(searchText);\n }\n\n // Filter out recipients that already have access\n const existingIds = new Set(this.CurrentShares.map(s => s.recipientId));\n this.SearchResults = this.SearchResults.filter(r => !existingIds.has(r.id));\n\n // Also filter out the list owner\n this.SearchResults = this.SearchResults.filter(r => r.id !== this.config?.currentUserId);\n\n this.ShowSearchResults = this.SearchResults.length > 0;\n } catch (error) {\n console.error('Error searching:', error);\n this.SearchResults = [];\n }\n }\n\n /**\n * Select a recipient from search results\n */\n SelectRecipient(recipient: ShareRecipient): void {\n this.SelectedRecipient = recipient;\n this.SearchText = recipient.name;\n this.ShowSearchResults = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link SelectRecipient}. */\n selectRecipient(recipient: ShareRecipient): void {\n return this.SelectRecipient(recipient);\n }\n\n /**\n * Add the selected recipient as a share\n */\n async AddShare(): Promise<void> {\n if (!this.SelectedRecipient || !this.config) return;\n\n this.saving = true;\n\n try {\n const md = this.ProviderToUse;\n let result;\n\n if (this.SelectedRecipient.type === 'User') {\n result = await this.sharingService.shareListWithUser(\n this.config.listId,\n this.SelectedRecipient.id,\n this.SelectedPermission,\n this.config.currentUserId\n );\n } else {\n result = await this.sharingService.shareListWithRole(\n this.config.listId,\n this.SelectedRecipient.id,\n this.SelectedPermission,\n this.config.currentUserId\n );\n }\n\n if (result.success && result.shareId) {\n // Create a ListShareInfo for tracking\n const newShare: ListShareInfo = {\n shareId: result.shareId,\n listId: this.config.listId,\n type: this.SelectedRecipient.type,\n recipientId: this.SelectedRecipient.id,\n recipientName: this.SelectedRecipient.name,\n recipientEmail: this.SelectedRecipient.email,\n permissionLevel: this.SelectedPermission,\n status: 'Approved'\n };\n\n this.CurrentShares.push(newShare);\n this.SharesAdded.push(newShare);\n\n // Clear selection\n this.ClearSearch();\n this.SelectedPermission = 'View';\n } else {\n console.error('Failed to add share:', result.message);\n }\n } catch (error) {\n console.error('Error adding share:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link AddShare}. */\n async addShare(): Promise<void> {\n return this.AddShare();\n }\n\n /**\n * Update permission level for an existing share\n */\n async UpdateSharePermission(share: ListShareInfo, newLevel: ListPermissionLevel): Promise<void> {\n if (share.permissionLevel === newLevel) return;\n\n this.saving = true;\n\n try {\n const result = await this.sharingService.updateSharePermission(share.shareId, newLevel);\n\n if (result.success) {\n share.permissionLevel = newLevel;\n\n // Track the update if not already tracked\n const existingUpdate = this.SharesUpdated.find(s => s.shareId === share.shareId);\n if (!existingUpdate) {\n this.SharesUpdated.push({ ...share });\n }\n } else {\n console.error('Failed to update permission:', result.message);\n }\n } catch (error) {\n console.error('Error updating permission:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link UpdateSharePermission}. */\n async updateSharePermission(share: ListShareInfo, newLevel: ListPermissionLevel): Promise<void> {\n return this.UpdateSharePermission(share, newLevel);\n }\n\n /**\n * Remove a share\n */\n async RemoveShare(share: ListShareInfo): Promise<void> {\n this.saving = true;\n\n try {\n const result = await this.sharingService.removeShare(share.shareId);\n\n if (result.success) {\n // Remove from current shares\n this.CurrentShares = this.CurrentShares.filter(s => s.shareId !== share.shareId);\n\n // Track the removal\n this.SharesRemoved.push(share.shareId);\n\n // Remove from added if it was just added in this session\n this.SharesAdded = this.SharesAdded.filter(s => s.shareId !== share.shareId);\n } else {\n console.error('Failed to remove share:', result.message);\n }\n } catch (error) {\n console.error('Error removing share:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link RemoveShare}. */\n async removeShare(share: ListShareInfo): Promise<void> {\n return this.RemoveShare(share);\n }\n\n /**\n * Get icon for share type\n */\n GetShareTypeIcon(type: 'User' | 'Role'): string {\n return type === 'User' ? 'fa-solid fa-user' : 'fa-solid fa-users';\n }\n\n /** @deprecated Use {@link GetShareTypeIcon}. */\n getShareTypeIcon(type: 'User' | 'Role'): string {\n return this.GetShareTypeIcon(type);\n }\n\n /**\n * Get permission label\n */\n GetPermissionLabel(level: ListPermissionLevel): string {\n const option = this.PermissionOptions.find(o => o.value === level);\n return option?.label || level;\n }\n\n /** @deprecated Use {@link GetPermissionLabel}. */\n getPermissionLabel(level: ListPermissionLevel): string {\n return this.GetPermissionLabel(level);\n }\n\n /**\n * Close dialog with results\n */\n OnDone(): void {\n const result: ListShareDialogResult = {\n action: 'apply',\n sharesAdded: this.SharesAdded,\n sharesUpdated: this.SharesUpdated,\n sharesRemoved: this.SharesRemoved,\n notifyByEmail: this.NotifyByEmail\n };\n\n this._visible = false;\n this.Complete.emit(result);\n }\n\n /** @deprecated Use {@link OnDone}. */\n onDone(): void {\n return this.OnDone();\n }\n\n /**\n * Cancel and close dialog\n */\n onCancel(): void {\n this._visible = false;\n this.cancel.emit();\n }\n\n /**\n * Check if current user can modify shares\n */\n get CanModifyShares(): boolean {\n return this.config?.isOwner === true;\n }\n\n /** @deprecated Use {@link CanModifyShares}. */\n get canModifyShares(): boolean {\n return this.CanModifyShares;\n }\n}\n","@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"]}
|
|
@@ -35,14 +35,40 @@ export declare class ListStatsComponent extends BaseAngularComponent implements
|
|
|
35
35
|
set RefreshTrigger(value: number);
|
|
36
36
|
get RefreshTrigger(): number;
|
|
37
37
|
private _refreshTrigger;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
38
|
+
MemberCount: number;
|
|
39
|
+
/** @deprecated Use {@link MemberCount}. */
|
|
40
|
+
get memberCount(): number;
|
|
41
|
+
/** @deprecated Use {@link MemberCount}. */
|
|
42
|
+
set memberCount(value: number);
|
|
43
|
+
ActiveShareCount: number;
|
|
44
|
+
/** @deprecated Use {@link ActiveShareCount}. */
|
|
45
|
+
get activeShareCount(): number;
|
|
46
|
+
/** @deprecated Use {@link ActiveShareCount}. */
|
|
47
|
+
set activeShareCount(value: number);
|
|
48
|
+
GrowthThisMonth: number;
|
|
49
|
+
/** @deprecated Use {@link GrowthThisMonth}. */
|
|
50
|
+
get growthThisMonth(): number;
|
|
51
|
+
/** @deprecated Use {@link GrowthThisMonth}. */
|
|
52
|
+
set growthThisMonth(value: number);
|
|
53
|
+
LastActivityAt: Date | null;
|
|
54
|
+
/** @deprecated Use {@link LastActivityAt}. */
|
|
55
|
+
get lastActivityAt(): Date | null;
|
|
56
|
+
/** @deprecated Use {@link LastActivityAt}. */
|
|
57
|
+
set lastActivityAt(value: Date | null);
|
|
58
|
+
Recent: RecentActivity[];
|
|
59
|
+
/** @deprecated Use {@link Recent}. */
|
|
60
|
+
get recent(): RecentActivity[];
|
|
61
|
+
/** @deprecated Use {@link Recent}. */
|
|
62
|
+
set recent(value: RecentActivity[]);
|
|
63
|
+
Loading: boolean;
|
|
64
|
+
/** @deprecated Use {@link Loading}. */
|
|
65
|
+
get loading(): boolean;
|
|
66
|
+
/** @deprecated Use {@link Loading}. */
|
|
67
|
+
set loading(value: boolean);
|
|
44
68
|
private initialized;
|
|
45
69
|
ngOnInit(): Promise<void>;
|
|
70
|
+
FormatRelative(d: Date | null): string;
|
|
71
|
+
/** @deprecated Use {@link FormatRelative}. */
|
|
46
72
|
formatRelative(d: Date | null): string;
|
|
47
73
|
private load;
|
|
48
74
|
static ɵfac: i0.ɵɵFactoryDeclaration<ListStatsComponent, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-stats.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-stats/list-stats.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAGrE;;;;;;;;;;;;;GAaG;AAEH,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;CACZ;AAOD,qBAOa,kBAAmB,SAAQ,oBAAqB,YAAW,MAAM;IAC5E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAK9B;IACD,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,OAAO,CAAC,OAAO,CAAuB;IAEtC;;;;OAIG;IACH,IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAK/B;IACD,IAAI,cAAc,IAAI,MAAM,CAE3B;IACD,OAAO,CAAC,eAAe,CAAK;IAErB,WAAW,SAAK;
|
|
1
|
+
{"version":3,"file":"list-stats.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/list-stats/list-stats.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,MAAM,EAAU,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAGrE;;;;;;;;;;;;;GAaG;AAEH,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;CACZ;AAOD,qBAOa,kBAAmB,SAAQ,oBAAqB,YAAW,MAAM;IAC5E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAK9B;IACD,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IACD,OAAO,CAAC,OAAO,CAAuB;IAEtC;;;;OAIG;IACH,IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAK/B;IACD,IAAI,cAAc,IAAI,MAAM,CAE3B;IACD,OAAO,CAAC,eAAe,CAAK;IAErB,WAAW,SAAK;IAEvB,2CAA2C;IAC3C,IAAW,WAAW,WAErB;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,QAAA,EAE3B;IACM,gBAAgB,SAAK;IAE5B,gDAAgD;IAChD,IAAW,gBAAgB,WAE1B;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAK,QAAA,EAEhC;IACM,eAAe,SAAK;IAE3B,+CAA+C;IAC/C,IAAW,eAAe,WAEzB;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,QAAA,EAE/B;IACM,cAAc,EAAE,IAAI,GAAG,IAAI,CAAQ;IAE1C,8CAA8C;IAC9C,IAAW,cAAc,IAAI,IAAI,GAAG,IAAI,CAEvC;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAE3C;IACM,MAAM,EAAE,cAAc,EAAE,CAAM;IAErC,sCAAsC;IACtC,IAAW,MAAM,IAAI,cAAc,EAAE,CAEpC;IACD,sCAAsC;IACtC,IAAW,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,EAExC;IACM,OAAO,UAAS;IAEvB,uCAAuC;IACvC,IAAW,OAAO,YAEjB;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK,SAAA,EAEvB;IAED,OAAO,CAAC,WAAW,CAAS;IAEtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM;IAgB7C,8CAA8C;IACvC,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM;YAI/B,IAAI;yCAzHP,kBAAkB;2CAAlB,kBAAkB;CAmP9B"}
|
|
@@ -117,19 +117,67 @@ export class ListStatsComponent extends BaseAngularComponent {
|
|
|
117
117
|
return this._refreshTrigger;
|
|
118
118
|
}
|
|
119
119
|
_refreshTrigger = 0;
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
120
|
+
MemberCount = 0;
|
|
121
|
+
/** @deprecated Use {@link MemberCount}. */
|
|
122
|
+
get memberCount() {
|
|
123
|
+
return this.MemberCount;
|
|
124
|
+
}
|
|
125
|
+
/** @deprecated Use {@link MemberCount}. */
|
|
126
|
+
set memberCount(value) {
|
|
127
|
+
this.MemberCount = value;
|
|
128
|
+
}
|
|
129
|
+
ActiveShareCount = 0;
|
|
130
|
+
/** @deprecated Use {@link ActiveShareCount}. */
|
|
131
|
+
get activeShareCount() {
|
|
132
|
+
return this.ActiveShareCount;
|
|
133
|
+
}
|
|
134
|
+
/** @deprecated Use {@link ActiveShareCount}. */
|
|
135
|
+
set activeShareCount(value) {
|
|
136
|
+
this.ActiveShareCount = value;
|
|
137
|
+
}
|
|
138
|
+
GrowthThisMonth = 0;
|
|
139
|
+
/** @deprecated Use {@link GrowthThisMonth}. */
|
|
140
|
+
get growthThisMonth() {
|
|
141
|
+
return this.GrowthThisMonth;
|
|
142
|
+
}
|
|
143
|
+
/** @deprecated Use {@link GrowthThisMonth}. */
|
|
144
|
+
set growthThisMonth(value) {
|
|
145
|
+
this.GrowthThisMonth = value;
|
|
146
|
+
}
|
|
147
|
+
LastActivityAt = null;
|
|
148
|
+
/** @deprecated Use {@link LastActivityAt}. */
|
|
149
|
+
get lastActivityAt() {
|
|
150
|
+
return this.LastActivityAt;
|
|
151
|
+
}
|
|
152
|
+
/** @deprecated Use {@link LastActivityAt}. */
|
|
153
|
+
set lastActivityAt(value) {
|
|
154
|
+
this.LastActivityAt = value;
|
|
155
|
+
}
|
|
156
|
+
Recent = [];
|
|
157
|
+
/** @deprecated Use {@link Recent}. */
|
|
158
|
+
get recent() {
|
|
159
|
+
return this.Recent;
|
|
160
|
+
}
|
|
161
|
+
/** @deprecated Use {@link Recent}. */
|
|
162
|
+
set recent(value) {
|
|
163
|
+
this.Recent = value;
|
|
164
|
+
}
|
|
165
|
+
Loading = false;
|
|
166
|
+
/** @deprecated Use {@link Loading}. */
|
|
167
|
+
get loading() {
|
|
168
|
+
return this.Loading;
|
|
169
|
+
}
|
|
170
|
+
/** @deprecated Use {@link Loading}. */
|
|
171
|
+
set loading(value) {
|
|
172
|
+
this.Loading = value;
|
|
173
|
+
}
|
|
126
174
|
initialized = false;
|
|
127
175
|
async ngOnInit() {
|
|
128
176
|
this.initialized = true;
|
|
129
177
|
if (this._listId)
|
|
130
178
|
await this.load();
|
|
131
179
|
}
|
|
132
|
-
|
|
180
|
+
FormatRelative(d) {
|
|
133
181
|
if (!d || isNaN(d.getTime()))
|
|
134
182
|
return 'never';
|
|
135
183
|
const diff = Date.now() - d.getTime();
|
|
@@ -150,10 +198,14 @@ export class ListStatsComponent extends BaseAngularComponent {
|
|
|
150
198
|
const months = Math.floor(days / 30);
|
|
151
199
|
return `${months}mo ago`;
|
|
152
200
|
}
|
|
201
|
+
/** @deprecated Use {@link FormatRelative}. */
|
|
202
|
+
formatRelative(d) {
|
|
203
|
+
return this.FormatRelative(d);
|
|
204
|
+
}
|
|
153
205
|
async load() {
|
|
154
206
|
if (!this._listId)
|
|
155
207
|
return;
|
|
156
|
-
this.
|
|
208
|
+
this.Loading = true;
|
|
157
209
|
this.cdr.markForCheck();
|
|
158
210
|
try {
|
|
159
211
|
const md = this.ProviderToUse;
|
|
@@ -212,17 +264,17 @@ export class ListStatsComponent extends BaseAngularComponent {
|
|
|
212
264
|
ResultType: 'simple',
|
|
213
265
|
}),
|
|
214
266
|
]);
|
|
215
|
-
this.
|
|
216
|
-
this.
|
|
217
|
-
this.
|
|
267
|
+
this.MemberCount = members.Results?.length ?? 0;
|
|
268
|
+
this.GrowthThisMonth = growth.Results?.length ?? 0;
|
|
269
|
+
this.ActiveShareCount = shares.Results?.length ?? 0;
|
|
218
270
|
const auditRows = audits.Results ?? [];
|
|
219
271
|
const latestAuditAt = auditRows.length > 0 ? new Date(auditRows[0].__mj_CreatedAt) : null;
|
|
220
272
|
const rawLatestMember = latestMember.Results?.[0]?.__mj_UpdatedAt;
|
|
221
273
|
const parsedLatestMember = rawLatestMember ? new Date(rawLatestMember) : null;
|
|
222
274
|
const latestMemberAt = parsedLatestMember && !isNaN(parsedLatestMember.getTime()) ? parsedLatestMember : null;
|
|
223
|
-
this.
|
|
275
|
+
this.LastActivityAt = newestOf(latestAuditAt, latestMemberAt);
|
|
224
276
|
if (auditRows.length === 0) {
|
|
225
|
-
this.
|
|
277
|
+
this.Recent = [];
|
|
226
278
|
return;
|
|
227
279
|
}
|
|
228
280
|
// Resolve user + audit-log type names in two cheap lookups.
|
|
@@ -248,7 +300,7 @@ export class ListStatsComponent extends BaseAngularComponent {
|
|
|
248
300
|
const typeById = new Map();
|
|
249
301
|
for (const t of types.Results ?? [])
|
|
250
302
|
typeById.set(String(t.ID), String(t.Name));
|
|
251
|
-
this.
|
|
303
|
+
this.Recent = auditRows.map((r) => ({
|
|
252
304
|
ID: String(r.ID),
|
|
253
305
|
EventType: typeById.get(String(r.AuditLogTypeID)) ?? '(unknown event)',
|
|
254
306
|
Description: r.Description ?? '',
|
|
@@ -257,7 +309,7 @@ export class ListStatsComponent extends BaseAngularComponent {
|
|
|
257
309
|
}));
|
|
258
310
|
}
|
|
259
311
|
finally {
|
|
260
|
-
this.
|
|
312
|
+
this.Loading = false;
|
|
261
313
|
this.cdr.markForCheck();
|
|
262
314
|
}
|
|
263
315
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-stats.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-stats/list-stats.component.ts","../../../../src/lib/components/list-stats/list-stats.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAE7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;ICD3C,8BAAiC;IAC/B,gCAA8D;IAChE,iBAAM;;;IAkCE,AADF,8BAA8B,eACS;IAAA,YAAoB;IAAA,iBAAO;IAChE,gCAAuC;IACrC,YACA;IAAA,gCAAqC;IAAA,YAAkD;IAE3F,AADE,AADyF,iBAAO,EACzF,EACJ;;;;IALkC,eAAoB;IAApB,uCAAoB;IAEvD,eACA;IADA,oDACA;IAAqC,eAAkD;IAAlD,8FAAkD;;;IAV/F,+BAAgE;IAC9D,wBAA6C;IAC7C,iCACF;IAAA,iBAAM;IACN,8BAA6B;IAC3B,kHAQC;IACH,iBAAK;;;IATH,eAQC;IARD,4BAQC;;;IAtCL,8BAAiC;IAC/B,uBAAwC;IACxC,uBACF;IAAA,iBAAM;IAIF,AADF,AADF,8BAAkC,aACC,aACA;IAAA,YAAiB;IAAA,iBAAM;IACtD,8BAA+B;IAAA,uBAAO;IACxC,AADwC,iBAAM,EACxC;IAEJ,AADF,8BAAiC,cACA;IAAA,aAAsB;IAAA,iBAAM;IAC3D,+BAA+B;IAAA,2BAAU;IAC3C,AAD2C,iBAAM,EAC3C;IAEJ,AADF,+BAAiC,cACA;IAAA,aAAsB;IAAA,iBAAM;IAC3D,+BAA+B;IAAA,8BAAa;IAC9C,AAD8C,iBAAM,EAC9C;IAEJ,AADF,+BAAiC,cACK;IAAA,aAAoC;IAAA,iBAAM;IAC9E,+BAA+B;IAAA,8BAAa;IAEhD,AADE,AAD8C,iBAAM,EAC9C,EACF;IAEN,0FAAyB;;;IAjBU,eAAiB;IAAjB,wCAAiB;IAIjB,eAAsB;IAAtB,kDAAsB;IAItB,eAAsB;IAAtB,6CAAsB;IAIjB,eAAoC;IAApC,kEAAoC;IAK5E,eAgBC;IAhBD,oDAgBC;;ADlBL,SAAS,QAAQ,CAAC,GAAG,KAAsB;IACzC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAa,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AASD,MAAM,OAAO,kBAAmB,SAAQ,oBAAoB;IACzC,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD,IACI,MAAM,CAAC,KAAoB;QAC7B,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK;gBAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACO,OAAO,GAAkB,IAAI,CAAC;IAEtC;;;;OAIG;IACH,IACI,cAAc,CAAC,KAAa;QAC9B,IAAI,KAAK,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO;gBAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IACD,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACO,eAAe,GAAG,CAAC,CAAC;IAErB,WAAW,GAAG,CAAC,CAAC;IAChB,gBAAgB,GAAG,CAAC,CAAC;IACrB,eAAe,GAAG,CAAC,CAAC;IACpB,cAAc,GAAgB,IAAI,CAAC;IACnC,MAAM,GAAqB,EAAE,CAAC;IAC9B,OAAO,GAAG,KAAK,CAAC;IAEf,WAAW,GAAG,KAAK,CAAC;IAE5B,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAEM,cAAc,CAAC,CAAc;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,OAAO,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,IAAI,GAAG,MAAM;YAAE,OAAO,UAAU,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,OAAO,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,GAAG,KAAK,OAAO,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,GAAG,IAAI,OAAO,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,GAAG,KAAK,OAAO,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACrC,OAAO,GAAG,MAAM,QAAQ,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YACpE,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAChG,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAEnD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAC5C,iEAAiE;YACjE,oEAAoE;YACpE,kEAAkE;YAClE,iEAAiE;YACjE,mEAAmE;YACnE,qEAAqE;YACrE,oEAAoE;YACpE,WAAW;YACX,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,WAAW,GAAG,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACxE,EAAE,CAAC,OAAO,CAAiB;oBACzB,UAAU,EAAE,kBAAkB;oBAC9B,WAAW,EAAE,WAAW,SAAS,IAAI,WAAW,EAAE;oBAClD,MAAM,EAAE,CAAC,IAAI,CAAC;oBACd,UAAU,EAAE,QAAQ;iBACrB,CAAC;gBACF,EAAE,CAAC,OAAO,CAAiB;oBACzB,UAAU,EAAE,kBAAkB;oBAC9B,WAAW,EAAE,WAAW,SAAS,4BAA4B,YAAY,IAAI,WAAW,EAAE;oBAC1F,MAAM,EAAE,CAAC,IAAI,CAAC;oBACd,UAAU,EAAE,QAAQ;iBACrB,CAAC;gBACF,EAAE,CAAC,OAAO,CAAiB;oBACzB,UAAU,EAAE,0BAA0B;oBACtC,WAAW,EACT,+EAA+E,SAAS,0BAA0B,WAAW,EAAE;oBACjI,MAAM,EAAE,CAAC,IAAI,CAAC;oBACd,UAAU,EAAE,QAAQ;iBACrB,CAAC;gBACF,EAAE,CAAC,OAAO,CAMP;oBACD,UAAU,EAAE,gBAAgB;oBAC5B,WAAW,EAAE,aAAa,WAAW,CAAC,EAAE,mBAAmB,SAAS,IAAI,WAAW,EAAE;oBACrF,OAAO,EAAE,qBAAqB;oBAC9B,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,CAAC;oBAC3E,UAAU,EAAE,QAAQ;iBACrB,CAAC;gBACF,iEAAiE;gBACjE,mEAAmE;gBACnE,+DAA+D;gBAC/D,EAAE,CAAC,OAAO,CAA2B;oBACnC,UAAU,EAAE,kBAAkB;oBAC9B,WAAW,EAAE,WAAW,SAAS,IAAI,WAAW,EAAE;oBAClD,OAAO,EAAE,qBAAqB;oBAC9B,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,CAAC,gBAAgB,CAAC;oBAC1B,UAAU,EAAE,QAAQ;iBACrB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;YAEpD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACvC,MAAM,aAAa,GACjB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtE,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC;YAClE,MAAM,kBAAkB,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,eAAgC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/F,MAAM,cAAc,GAClB,kBAAkB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;YACzF,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YAE9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,4DAA4D;YAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvC,EAAE,CAAC,OAAO,CAA+B;oBACvC,UAAU,EAAE,WAAW;oBACvB,WAAW,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;oBAClE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;oBACtB,UAAU,EAAE,QAAQ;iBACrB,CAAC;gBACF,EAAE,CAAC,OAAO,CAA+B;oBACvC,UAAU,EAAE,qBAAqB;oBACjC,WAAW,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;oBAClE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;oBACtB,UAAU,EAAE,QAAQ;iBACrB,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEhF,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,iBAAiB;gBACtE,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;gBAChC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,gBAAgB;gBACvD,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;aACjC,CAAC,CAAC,CAAC;QACN,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;qPAvLU,kBAAkB,yBAAlB,kBAAkB;6DAAlB,kBAAkB;YCxC/B,8BAAwB;YAKpB,AAJF,oFAAe,qDAIN;YA2CX,iBAAM;;YA/CJ,cA8CC;YA9CD,qCA8CC;;;iFDPU,kBAAkB;cAP9B,SAAS;6BACI,KAAK,YACP,eAAe,mBAGR,uBAAuB,CAAC,MAAM;;kBAK9C,KAAK;;kBAiBL,KAAK;;kFApBK,kBAAkB","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView } from '@memberjunction/core';\n\n/**\n * Usage-stats side panel for a single list (mockup 25). Surfaces four\n * cheap-to-compute counters + a recent-activity feed pulled from the\n * generic `MJ: Audit Logs` table (same one Phase 2's sharing emits to).\n *\n * Stats:\n * - Member count — `count(MJ: List Details)` for this list\n * - Active shares — non-revoked `MJ: Resource Permissions`\n * - Growth this month — `count(MJ: List Details where __mj_CreatedAt >= start-of-month)`\n * - Time since last activity — newest audit-log timestamp\n *\n * Recent activity = the 5 most-recent audit events (uses the same join\n * pattern as `mj-list-audit-log` — type + user lookup in a single batch).\n */\n\ninterface RecentActivity {\n ID: string;\n EventType: string;\n Description: string;\n Who: string;\n When: Date;\n}\n\nfunction newestOf(...dates: (Date | null)[]): Date | null {\n const ms = dates.filter((d): d is Date => d != null).map((d) => d.getTime());\n return ms.length === 0 ? null : new Date(Math.max(...ms));\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-stats',\n templateUrl: './list-stats.component.html',\n styleUrls: ['./list-stats.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListStatsComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input()\n set ListID(value: string | null) {\n if (this._listId !== value) {\n this._listId = value;\n if (this.initialized && value) void this.load();\n }\n }\n get ListID(): string | null {\n return this._listId;\n }\n private _listId: string | null = null;\n\n /**\n * Bump this number from the parent after any mutation (add / remove /\n * status update / share / unshare) to force the stats panel to re-query.\n * Without this, the Members count drifts from reality until full reload.\n */\n @Input()\n set RefreshTrigger(value: number) {\n if (value !== this._refreshTrigger) {\n this._refreshTrigger = value;\n if (this.initialized && this._listId) void this.load();\n }\n }\n get RefreshTrigger(): number {\n return this._refreshTrigger;\n }\n private _refreshTrigger = 0;\n\n public memberCount = 0;\n public activeShareCount = 0;\n public growthThisMonth = 0;\n public lastActivityAt: Date | null = null;\n public recent: RecentActivity[] = [];\n public loading = false;\n\n private initialized = false;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._listId) await this.load();\n }\n\n public formatRelative(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return 'never';\n const diff = Date.now() - d.getTime();\n if (diff < 60_000) return 'just now';\n const minutes = Math.floor(diff / 60_000);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n }\n\n private async load(): Promise<void> {\n if (!this._listId) return;\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity) return;\n const startOfMonth = new Date(new Date().getFullYear(), new Date().getMonth(), 1).toISOString();\n const escapedId = this._listId.replace(/'/g, \"''\");\n\n const rv = RunView.FromMetadataProvider(md);\n // Cache-buster: every RunView gets an always-true predicate that\n // varies on each load() call. The server keys its RunView cache off\n // the literal filter string, so we force a miss on every refresh.\n // Without this, Members / Growth / Active shares / Last activity\n // would all read stale until a full server restart, even after the\n // RefreshTrigger input bumps. SQL comments (`/* */`) are rejected by\n // the ExtraFilter injection validator, so we use a numeric equality\n // instead.\n const cb = Date.now();\n const cbPredicate = ` AND ${cb} = ${cb}`;\n const [members, growth, shares, audits, latestMember] = await Promise.all([\n rv.RunView<{ ID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${escapedId}'${cbPredicate}`,\n Fields: ['ID'],\n ResultType: 'simple',\n }),\n rv.RunView<{ ID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${escapedId}' AND __mj_CreatedAt >= '${startOfMonth}'${cbPredicate}`,\n Fields: ['ID'],\n ResultType: 'simple',\n }),\n rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Resource Permissions',\n ExtraFilter:\n `ResourceTypeID='E64D433E-F36B-1410-8560-0041FA62858A' AND ResourceRecordID='${escapedId}' AND Status<>'Revoked'${cbPredicate}`,\n Fields: ['ID'],\n ResultType: 'simple',\n }),\n rv.RunView<{\n ID: string;\n UserID: string;\n AuditLogTypeID: string;\n Description: string | null;\n __mj_CreatedAt: Date;\n }>({\n EntityName: 'MJ: Audit Logs',\n ExtraFilter: `EntityID='${listsEntity.ID}' AND RecordID='${escapedId}'${cbPredicate}`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5,\n Fields: ['ID', 'UserID', 'AuditLogTypeID', 'Description', '__mj_CreatedAt'],\n ResultType: 'simple',\n }),\n // Newest list-detail timestamp. Audit Logs only fire for sharing\n // events, so without this the \"Last activity\" widget reads \"never\"\n // even after the user has been adding/editing members all day.\n rv.RunView<{ __mj_UpdatedAt: Date }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${escapedId}'${cbPredicate}`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 1,\n Fields: ['__mj_UpdatedAt'],\n ResultType: 'simple',\n }),\n ]);\n\n this.memberCount = members.Results?.length ?? 0;\n this.growthThisMonth = growth.Results?.length ?? 0;\n this.activeShareCount = shares.Results?.length ?? 0;\n\n const auditRows = audits.Results ?? [];\n const latestAuditAt =\n auditRows.length > 0 ? new Date(auditRows[0].__mj_CreatedAt) : null;\n const rawLatestMember = latestMember.Results?.[0]?.__mj_UpdatedAt;\n const parsedLatestMember = rawLatestMember ? new Date(rawLatestMember as Date | string) : null;\n const latestMemberAt =\n parsedLatestMember && !isNaN(parsedLatestMember.getTime()) ? parsedLatestMember : null;\n this.lastActivityAt = newestOf(latestAuditAt, latestMemberAt);\n\n if (auditRows.length === 0) {\n this.recent = [];\n return;\n }\n\n // Resolve user + audit-log type names in two cheap lookups.\n const userIds = Array.from(new Set(auditRows.map((r) => String(r.UserID))));\n const typeIds = Array.from(new Set(auditRows.map((r) => String(r.AuditLogTypeID))));\n const [users, types] = await Promise.all([\n rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID IN (${userIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n }),\n rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Audit Log Types',\n ExtraFilter: `ID IN (${typeIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n }),\n ]);\n\n const userById = new Map<string, string>();\n for (const u of users.Results ?? []) userById.set(String(u.ID), String(u.Name));\n const typeById = new Map<string, string>();\n for (const t of types.Results ?? []) typeById.set(String(t.ID), String(t.Name));\n\n this.recent = auditRows.map((r) => ({\n ID: String(r.ID),\n EventType: typeById.get(String(r.AuditLogTypeID)) ?? '(unknown event)',\n Description: r.Description ?? '',\n Who: userById.get(String(r.UserID)) ?? '(unknown user)',\n When: new Date(r.__mj_CreatedAt),\n }));\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"list-stats\">\n @if (loading) {\n <div class=\"list-stats__loading\">\n <mj-loading text=\"Loading stats...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <div class=\"list-stats__heading\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n Usage\n </div>\n\n <div class=\"list-stats__counters\">\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value\">{{ memberCount }}</div>\n <div class=\"list-stats__label\">Members</div>\n </div>\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value\">+{{ growthThisMonth }}</div>\n <div class=\"list-stats__label\">This month</div>\n </div>\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value\">{{ activeShareCount }}</div>\n <div class=\"list-stats__label\">Active shares</div>\n </div>\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value-text\">{{ formatRelative(lastActivityAt) }}</div>\n <div class=\"list-stats__label\">Last activity</div>\n </div>\n </div>\n\n @if (recent.length > 0) {\n <div class=\"list-stats__heading list-stats__heading--secondary\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent activity\n </div>\n <ul class=\"list-stats__feed\">\n @for (item of recent; track item.ID) {\n <li class=\"list-stats__entry\">\n <span class=\"list-stats__entry-type\">{{ item.EventType }}</span>\n <span class=\"list-stats__entry-detail\">\n {{ item.Description }}\n <span class=\"list-stats__entry-meta\">— {{ item.Who }} · {{ formatRelative(item.When) }}</span>\n </span>\n </li>\n }\n </ul>\n }\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"list-stats.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-stats/list-stats.component.ts","../../../../src/lib/components/list-stats/list-stats.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView } from '@memberjunction/core';\n\n/**\n * Usage-stats side panel for a single list (mockup 25). Surfaces four\n * cheap-to-compute counters + a recent-activity feed pulled from the\n * generic `MJ: Audit Logs` table (same one Phase 2's sharing emits to).\n *\n * Stats:\n * - Member count — `count(MJ: List Details)` for this list\n * - Active shares — non-revoked `MJ: Resource Permissions`\n * - Growth this month — `count(MJ: List Details where __mj_CreatedAt >= start-of-month)`\n * - Time since last activity — newest audit-log timestamp\n *\n * Recent activity = the 5 most-recent audit events (uses the same join\n * pattern as `mj-list-audit-log` — type + user lookup in a single batch).\n */\n\ninterface RecentActivity {\n ID: string;\n EventType: string;\n Description: string;\n Who: string;\n When: Date;\n}\n\nfunction newestOf(...dates: (Date | null)[]): Date | null {\n const ms = dates.filter((d): d is Date => d != null).map((d) => d.getTime());\n return ms.length === 0 ? null : new Date(Math.max(...ms));\n}\n\n@Component({\n standalone: false,\n selector: 'mj-list-stats',\n templateUrl: './list-stats.component.html',\n styleUrls: ['./list-stats.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListStatsComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input()\n set ListID(value: string | null) {\n if (this._listId !== value) {\n this._listId = value;\n if (this.initialized && value) void this.load();\n }\n }\n get ListID(): string | null {\n return this._listId;\n }\n private _listId: string | null = null;\n\n /**\n * Bump this number from the parent after any mutation (add / remove /\n * status update / share / unshare) to force the stats panel to re-query.\n * Without this, the Members count drifts from reality until full reload.\n */\n @Input()\n set RefreshTrigger(value: number) {\n if (value !== this._refreshTrigger) {\n this._refreshTrigger = value;\n if (this.initialized && this._listId) void this.load();\n }\n }\n get RefreshTrigger(): number {\n return this._refreshTrigger;\n }\n private _refreshTrigger = 0;\n\n public MemberCount = 0;\n\n /** @deprecated Use {@link MemberCount}. */\n public get memberCount() {\n return this.MemberCount;\n }\n /** @deprecated Use {@link MemberCount}. */\n public set memberCount(value) {\n this.MemberCount = value;\n }\n public ActiveShareCount = 0;\n\n /** @deprecated Use {@link ActiveShareCount}. */\n public get activeShareCount() {\n return this.ActiveShareCount;\n }\n /** @deprecated Use {@link ActiveShareCount}. */\n public set activeShareCount(value) {\n this.ActiveShareCount = value;\n }\n public GrowthThisMonth = 0;\n\n /** @deprecated Use {@link GrowthThisMonth}. */\n public get growthThisMonth() {\n return this.GrowthThisMonth;\n }\n /** @deprecated Use {@link GrowthThisMonth}. */\n public set growthThisMonth(value) {\n this.GrowthThisMonth = value;\n }\n public LastActivityAt: Date | null = null;\n\n /** @deprecated Use {@link LastActivityAt}. */\n public get lastActivityAt(): Date | null {\n return this.LastActivityAt;\n }\n /** @deprecated Use {@link LastActivityAt}. */\n public set lastActivityAt(value: Date | null) {\n this.LastActivityAt = value;\n }\n public Recent: RecentActivity[] = [];\n\n /** @deprecated Use {@link Recent}. */\n public get recent(): RecentActivity[] {\n return this.Recent;\n }\n /** @deprecated Use {@link Recent}. */\n public set recent(value: RecentActivity[]) {\n this.Recent = value;\n }\n public Loading = false;\n\n /** @deprecated Use {@link Loading}. */\n public get loading() {\n return this.Loading;\n }\n /** @deprecated Use {@link Loading}. */\n public set loading(value) {\n this.Loading = value;\n }\n\n private initialized = false;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._listId) await this.load();\n }\n\n public FormatRelative(d: Date | null): string {\n if (!d || isNaN(d.getTime())) return 'never';\n const diff = Date.now() - d.getTime();\n if (diff < 60_000) return 'just now';\n const minutes = Math.floor(diff / 60_000);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n const weeks = Math.floor(days / 7);\n if (weeks < 5) return `${weeks}w ago`;\n const months = Math.floor(days / 30);\n return `${months}mo ago`;\n }\n\n /** @deprecated Use {@link FormatRelative}. */\n public formatRelative(d: Date | null): string {\n return this.FormatRelative(d);\n }\n\n private async load(): Promise<void> {\n if (!this._listId) return;\n this.Loading = true;\n this.cdr.markForCheck();\n try {\n const md = this.ProviderToUse;\n const listsEntity = md.Entities.find((e) => e.Name === 'MJ: Lists');\n if (!listsEntity) return;\n const startOfMonth = new Date(new Date().getFullYear(), new Date().getMonth(), 1).toISOString();\n const escapedId = this._listId.replace(/'/g, \"''\");\n\n const rv = RunView.FromMetadataProvider(md);\n // Cache-buster: every RunView gets an always-true predicate that\n // varies on each load() call. The server keys its RunView cache off\n // the literal filter string, so we force a miss on every refresh.\n // Without this, Members / Growth / Active shares / Last activity\n // would all read stale until a full server restart, even after the\n // RefreshTrigger input bumps. SQL comments (`/* */`) are rejected by\n // the ExtraFilter injection validator, so we use a numeric equality\n // instead.\n const cb = Date.now();\n const cbPredicate = ` AND ${cb} = ${cb}`;\n const [members, growth, shares, audits, latestMember] = await Promise.all([\n rv.RunView<{ ID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${escapedId}'${cbPredicate}`,\n Fields: ['ID'],\n ResultType: 'simple',\n }),\n rv.RunView<{ ID: string }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${escapedId}' AND __mj_CreatedAt >= '${startOfMonth}'${cbPredicate}`,\n Fields: ['ID'],\n ResultType: 'simple',\n }),\n rv.RunView<{ ID: string }>({\n EntityName: 'MJ: Resource Permissions',\n ExtraFilter:\n `ResourceTypeID='E64D433E-F36B-1410-8560-0041FA62858A' AND ResourceRecordID='${escapedId}' AND Status<>'Revoked'${cbPredicate}`,\n Fields: ['ID'],\n ResultType: 'simple',\n }),\n rv.RunView<{\n ID: string;\n UserID: string;\n AuditLogTypeID: string;\n Description: string | null;\n __mj_CreatedAt: Date;\n }>({\n EntityName: 'MJ: Audit Logs',\n ExtraFilter: `EntityID='${listsEntity.ID}' AND RecordID='${escapedId}'${cbPredicate}`,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 5,\n Fields: ['ID', 'UserID', 'AuditLogTypeID', 'Description', '__mj_CreatedAt'],\n ResultType: 'simple',\n }),\n // Newest list-detail timestamp. Audit Logs only fire for sharing\n // events, so without this the \"Last activity\" widget reads \"never\"\n // even after the user has been adding/editing members all day.\n rv.RunView<{ __mj_UpdatedAt: Date }>({\n EntityName: 'MJ: List Details',\n ExtraFilter: `ListID='${escapedId}'${cbPredicate}`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 1,\n Fields: ['__mj_UpdatedAt'],\n ResultType: 'simple',\n }),\n ]);\n\n this.MemberCount = members.Results?.length ?? 0;\n this.GrowthThisMonth = growth.Results?.length ?? 0;\n this.ActiveShareCount = shares.Results?.length ?? 0;\n\n const auditRows = audits.Results ?? [];\n const latestAuditAt =\n auditRows.length > 0 ? new Date(auditRows[0].__mj_CreatedAt) : null;\n const rawLatestMember = latestMember.Results?.[0]?.__mj_UpdatedAt;\n const parsedLatestMember = rawLatestMember ? new Date(rawLatestMember as Date | string) : null;\n const latestMemberAt =\n parsedLatestMember && !isNaN(parsedLatestMember.getTime()) ? parsedLatestMember : null;\n this.LastActivityAt = newestOf(latestAuditAt, latestMemberAt);\n\n if (auditRows.length === 0) {\n this.Recent = [];\n return;\n }\n\n // Resolve user + audit-log type names in two cheap lookups.\n const userIds = Array.from(new Set(auditRows.map((r) => String(r.UserID))));\n const typeIds = Array.from(new Set(auditRows.map((r) => String(r.AuditLogTypeID))));\n const [users, types] = await Promise.all([\n rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Users',\n ExtraFilter: `ID IN (${userIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n }),\n rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Audit Log Types',\n ExtraFilter: `ID IN (${typeIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n }),\n ]);\n\n const userById = new Map<string, string>();\n for (const u of users.Results ?? []) userById.set(String(u.ID), String(u.Name));\n const typeById = new Map<string, string>();\n for (const t of types.Results ?? []) typeById.set(String(t.ID), String(t.Name));\n\n this.Recent = auditRows.map((r) => ({\n ID: String(r.ID),\n EventType: typeById.get(String(r.AuditLogTypeID)) ?? '(unknown event)',\n Description: r.Description ?? '',\n Who: userById.get(String(r.UserID)) ?? '(unknown user)',\n When: new Date(r.__mj_CreatedAt),\n }));\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"list-stats\">\n @if (loading) {\n <div class=\"list-stats__loading\">\n <mj-loading text=\"Loading stats...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <div class=\"list-stats__heading\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n Usage\n </div>\n\n <div class=\"list-stats__counters\">\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value\">{{ memberCount }}</div>\n <div class=\"list-stats__label\">Members</div>\n </div>\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value\">+{{ growthThisMonth }}</div>\n <div class=\"list-stats__label\">This month</div>\n </div>\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value\">{{ activeShareCount }}</div>\n <div class=\"list-stats__label\">Active shares</div>\n </div>\n <div class=\"list-stats__counter\">\n <div class=\"list-stats__value-text\">{{ formatRelative(lastActivityAt) }}</div>\n <div class=\"list-stats__label\">Last activity</div>\n </div>\n </div>\n\n @if (recent.length > 0) {\n <div class=\"list-stats__heading list-stats__heading--secondary\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent activity\n </div>\n <ul class=\"list-stats__feed\">\n @for (item of recent; track item.ID) {\n <li class=\"list-stats__entry\">\n <span class=\"list-stats__entry-type\">{{ item.EventType }}</span>\n <span class=\"list-stats__entry-detail\">\n {{ item.Description }}\n <span class=\"list-stats__entry-meta\">— {{ item.Who }} · {{ formatRelative(item.When) }}</span>\n </span>\n </li>\n }\n </ul>\n }\n }\n</div>\n"]}
|
package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts
CHANGED
|
@@ -40,20 +40,56 @@ export declare class SaveViewAsListDialogComponent extends BaseAngularComponent
|
|
|
40
40
|
RecordCount: number | null;
|
|
41
41
|
Save: EventEmitter<SaveViewAsListResult>;
|
|
42
42
|
Cancel: EventEmitter<void>;
|
|
43
|
-
|
|
43
|
+
ListName: string;
|
|
44
|
+
/** @deprecated Use {@link ListName}. */
|
|
45
|
+
get listName(): string;
|
|
46
|
+
/** @deprecated Use {@link ListName}. */
|
|
47
|
+
set listName(value: string);
|
|
44
48
|
description: string;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
CategoryId: string | null;
|
|
50
|
+
/** @deprecated Use {@link CategoryId}. */
|
|
51
|
+
get categoryId(): string | null;
|
|
52
|
+
/** @deprecated Use {@link CategoryId}. */
|
|
53
|
+
set categoryId(value: string | null);
|
|
54
|
+
RememberLineage: boolean;
|
|
55
|
+
/** @deprecated Use {@link RememberLineage}. */
|
|
56
|
+
get rememberLineage(): boolean;
|
|
57
|
+
/** @deprecated Use {@link RememberLineage}. */
|
|
58
|
+
set rememberLineage(value: boolean);
|
|
59
|
+
UseSnapshot: boolean;
|
|
60
|
+
/** @deprecated Use {@link UseSnapshot}. */
|
|
61
|
+
get useSnapshot(): boolean;
|
|
62
|
+
/** @deprecated Use {@link UseSnapshot}. */
|
|
63
|
+
set useSnapshot(value: boolean);
|
|
64
|
+
RefreshMode: 'Additive' | 'Sync';
|
|
65
|
+
/** @deprecated Use {@link RefreshMode}. */
|
|
66
|
+
get refreshMode(): 'Additive' | 'Sync';
|
|
67
|
+
/** @deprecated Use {@link RefreshMode}. */
|
|
68
|
+
set refreshMode(value: 'Additive' | 'Sync');
|
|
69
|
+
Categories: MJListCategoryEntity[];
|
|
70
|
+
/** @deprecated Use {@link Categories}. */
|
|
71
|
+
get categories(): MJListCategoryEntity[];
|
|
72
|
+
/** @deprecated Use {@link Categories}. */
|
|
73
|
+
set categories(value: MJListCategoryEntity[]);
|
|
74
|
+
LoadingCategories: boolean;
|
|
75
|
+
/** @deprecated Use {@link LoadingCategories}. */
|
|
76
|
+
get loadingCategories(): boolean;
|
|
77
|
+
/** @deprecated Use {@link LoadingCategories}. */
|
|
78
|
+
set loadingCategories(value: boolean);
|
|
79
|
+
Submitting: boolean;
|
|
80
|
+
/** @deprecated Use {@link Submitting}. */
|
|
81
|
+
get submitting(): boolean;
|
|
82
|
+
/** @deprecated Use {@link Submitting}. */
|
|
83
|
+
set submitting(value: boolean);
|
|
52
84
|
ngOnInit(): Promise<void>;
|
|
53
85
|
OnSave(): void;
|
|
54
86
|
OnCancel(): void;
|
|
55
87
|
OnLineageChange(remember: boolean): void;
|
|
88
|
+
get CanSave(): boolean;
|
|
89
|
+
/** @deprecated Use {@link CanSave}. */
|
|
56
90
|
get canSave(): boolean;
|
|
91
|
+
get ConfirmButtonLabel(): string;
|
|
92
|
+
/** @deprecated Use {@link ConfirmButtonLabel}. */
|
|
57
93
|
get confirmButtonLabel(): string;
|
|
58
94
|
/**
|
|
59
95
|
* Load list categories for the category dropdown. Multi-provider safe.
|
package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-view-as-list-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,UAAU,GAAG,MAAM,CAAC;CAClC;AAED;;;;;;;;;GASG;AACH,qBAOa,6BAA8B,SAAQ,oBAAqB,YAAW,MAAM;IACvF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,mEAAmE;IACnE,IACI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IACD,OAAO,CAAC,QAAQ,CAAS;IAEzB,yDAAyD;IAChD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEtC,sFAAsF;IAC7E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC,uEAAuE;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,IAAI,qCAA4C;IAChD,MAAM,qBAA4B;IAErC,QAAQ,SAAM;
|
|
1
|
+
{"version":3,"file":"save-view-as-list-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.ts"],"names":[],"mappings":"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"}
|