@masterteam/discussion 0.0.5 → 0.0.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-discussion.mjs","sources":["../../../../packages/masterteam/discussion/discussion/utils/discussion.utils.ts","../../../../packages/masterteam/discussion/discussion/services/discussion-api.service.ts","../../../../packages/masterteam/discussion/discussion/components/discussion-thread/discussion-thread.ts","../../../../packages/masterteam/discussion/discussion/components/discussion-thread/discussion-thread.html","../../../../packages/masterteam/discussion/discussion/masterteam-discussion.ts"],"sourcesContent":["import type {\r\n AppResponseViewModel,\r\n DiscussionMentionDto,\r\n DiscussionMentionUser,\r\n DiscussionReadStateDto,\r\n DiscussionReadStateLike,\r\n DiscussionThreadSummaryDto,\r\n} from '../models/discussion.model';\r\n\r\nconst MODULE_TYPE_ALIASES: Record<string, string> = {\r\n leveldata: 'Level',\r\n level: 'Level',\r\n processrequest: 'ProcessRequest',\r\n escalationinstance: 'EscalationInstance',\r\n};\r\n\r\nexport function normalizeDiscussionModuleType(moduleType: string): string {\r\n const value = moduleType.trim();\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const alias = MODULE_TYPE_ALIASES[value.toLowerCase()];\r\n return alias ?? value;\r\n}\r\n\r\nexport function normalizeDiscussionRecordId(recordId: number): number {\r\n const value = Number(recordId);\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.floor(value);\r\n}\r\n\r\nexport function isValidDiscussionThread(\r\n moduleType: string,\r\n recordId: number,\r\n): boolean {\r\n return !!moduleType.trim() && normalizeDiscussionRecordId(recordId) > 0;\r\n}\r\n\r\nexport function buildDiscussionThreadKey(\r\n moduleType: string,\r\n recordId: number,\r\n): string {\r\n const normalizedModuleType = normalizeDiscussionModuleType(moduleType);\r\n const normalizedRecordId = normalizeDiscussionRecordId(recordId);\r\n return normalizedModuleType && normalizedRecordId > 0\r\n ? `${normalizedModuleType}/${normalizedRecordId}`\r\n : '';\r\n}\r\n\r\nexport function unwrapAppResponseViewModel<T>(\r\n response: AppResponseViewModel<T>,\r\n fallbackMessage: string,\r\n): T {\r\n if (response.code === 2) {\r\n throw new Error(\r\n response.errors?.message || response.message || fallbackMessage,\r\n );\r\n }\r\n\r\n return response.data;\r\n}\r\n\r\nexport function toDiscussionErrorMessage(\r\n error: unknown,\r\n fallbackMessage: string,\r\n): string {\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n return error.message || fallbackMessage;\r\n }\r\n\r\n const nestedMessage =\r\n (error as { error?: { message?: string } } | undefined)?.error?.message ??\r\n (error as { message?: string } | undefined)?.message;\r\n\r\n if (nestedMessage && typeof nestedMessage === 'string') {\r\n return nestedMessage;\r\n }\r\n\r\n return fallbackMessage;\r\n}\r\n\r\nexport function readPathValue<T>(\r\n source: unknown,\r\n path: string,\r\n fallback: T,\r\n): T {\r\n if (!path.trim()) {\r\n return (source as T) ?? fallback;\r\n }\r\n\r\n const keys = path.split('.').map((item) => item.trim());\r\n let cursor: unknown = source;\r\n\r\n for (const key of keys) {\r\n if (!key || cursor == null || typeof cursor !== 'object') {\r\n return fallback;\r\n }\r\n\r\n cursor = (cursor as Record<string, unknown>)[key];\r\n }\r\n\r\n return (cursor as T) ?? fallback;\r\n}\r\n\r\nexport function normalizeMentionUser(\r\n value: unknown,\r\n): DiscussionMentionUser | null {\r\n if (!value || typeof value !== 'object') {\r\n return null;\r\n }\r\n\r\n const item = value as Record<string, unknown>;\r\n const userIdRaw =\r\n item['userId'] ??\r\n item['id'] ??\r\n item['value'] ??\r\n item['userID'] ??\r\n item['user_id'];\r\n const userId = String(userIdRaw ?? '').trim();\r\n\r\n if (!userId) {\r\n return null;\r\n }\r\n\r\n const displayNameRaw =\r\n item['displayName'] ??\r\n item['name'] ??\r\n item['fullName'] ??\r\n item['userName'] ??\r\n item['username'] ??\r\n userId;\r\n const displayName = String(displayNameRaw ?? userId).trim() || userId;\r\n const userNameRaw = item['userName'] ?? item['username'] ?? null;\r\n const avatarRaw = item['avatarUrl'] ?? item['photo'] ?? item['image'] ?? null;\r\n\r\n return {\r\n userId,\r\n displayName,\r\n userName: userNameRaw ? String(userNameRaw) : null,\r\n avatarUrl: avatarRaw ? String(avatarRaw) : null,\r\n };\r\n}\r\n\r\nexport function dedupeMentionUsers(\r\n users: DiscussionMentionUser[],\r\n): DiscussionMentionUser[] {\r\n const seen = new Set<string>();\r\n const result: DiscussionMentionUser[] = [];\r\n\r\n for (const user of users) {\r\n const key = user.userId.toLowerCase();\r\n if (seen.has(key)) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n result.push(user);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function sanitizeMentions(\r\n mentions: DiscussionMentionDto[],\r\n commentText: string,\r\n): DiscussionMentionDto[] {\r\n const textLength = commentText.length;\r\n const unique = new Set<string>();\r\n const normalized = mentions\r\n .map((mention) => ({\r\n userId: mention.userId?.trim(),\r\n startIndex: Math.floor(Number(mention.startIndex)),\r\n length: Math.floor(Number(mention.length)),\r\n }))\r\n .filter(\r\n (mention) =>\r\n !!mention.userId &&\r\n mention.startIndex >= 0 &&\r\n mention.length > 0 &&\r\n mention.startIndex + mention.length <= textLength,\r\n )\r\n .sort((left, right) => {\r\n if (left.startIndex !== right.startIndex) {\r\n return left.startIndex - right.startIndex;\r\n }\r\n\r\n return left.length - right.length;\r\n })\r\n .filter((mention) => {\r\n const key = `${mention.userId}::${mention.startIndex}::${mention.length}`;\r\n if (unique.has(key)) {\r\n return false;\r\n }\r\n\r\n unique.add(key);\r\n return true;\r\n });\r\n\r\n return normalized;\r\n}\r\n\r\nexport function mapSummaryToReadState(\r\n summary: DiscussionThreadSummaryDto,\r\n): DiscussionReadStateLike {\r\n return {\r\n lastReadCommentId: summary.lastReadCommentId,\r\n lastReadCommentCreatedAt: summary.lastReadCommentCreatedAt,\r\n unreadCount: summary.unreadCount,\r\n hasUnread: summary.hasUnread,\r\n };\r\n}\r\n\r\nexport function mapReadStateToLike(\r\n readState: DiscussionReadStateDto | null,\r\n): DiscussionReadStateLike | null {\r\n if (!readState) {\r\n return null;\r\n }\r\n\r\n return {\r\n lastReadCommentId: readState.lastReadCommentId,\r\n lastReadCommentCreatedAt: readState.lastReadCommentCreatedAt,\r\n unreadCount: readState.unreadCount,\r\n hasUnread: readState.hasUnread,\r\n };\r\n}\r\n","import {\r\n HttpClient,\r\n HttpContext,\r\n HttpEventType,\r\n HttpHeaders,\r\n HttpParams,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\r\nimport { filter, map, type Observable } from 'rxjs';\r\nimport type {\r\n AppResponseViewModel,\r\n DiscussionAddParticipantRequest,\r\n DiscussionAttachmentUploadProgressEvent,\r\n DiscussionAttachmentUploadResult,\r\n DiscussionCommentDto,\r\n DiscussionCommentRevisionDto,\r\n DiscussionCommentsPageDto,\r\n DiscussionCreateCommentRequest,\r\n DiscussionMentionUser,\r\n DiscussionParticipantDto,\r\n DiscussionReadStateDto,\r\n DiscussionThreadSummaryDto,\r\n DiscussionUpdateCommentRequest,\r\n DiscussionUpdateReadStateRequest,\r\n} from '../models/discussion.model';\r\nimport {\r\n normalizeMentionUser,\r\n readPathValue,\r\n unwrapAppResponseViewModel,\r\n} from '../utils/discussion.utils';\r\n\r\ninterface DiscussionAttachmentUploadApiDto {\r\n id?: string | null;\r\n fileId?: string | null;\r\n name?: string | null;\r\n fileName?: string | null;\r\n originalFileName?: string | null;\r\n contentType?: string | null;\r\n size?: number | null;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DiscussionApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly defaultContext = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n });\r\n private readonly baseRoute = 'discussions';\r\n\r\n getThreadSummary(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionThreadSummaryDto> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionThreadSummaryDto>>(\r\n this.threadRoute(moduleType, recordId),\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to load discussion.'),\r\n ),\r\n );\r\n }\r\n\r\n getComments(\r\n moduleType: string,\r\n recordId: number,\r\n take = 30,\r\n cursor?: string | null,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentsPageDto> {\r\n let params = new HttpParams().set('take', String(take));\r\n if (cursor) {\r\n params = params.set('cursor', cursor);\r\n }\r\n\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionCommentsPageDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments`,\r\n {\r\n params,\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(\r\n response,\r\n 'Failed to load discussion comments.',\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n createComment(\r\n moduleType: string,\r\n recordId: number,\r\n request: DiscussionCreateCommentRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentDto> {\r\n return this.http\r\n .post<AppResponseViewModel<DiscussionCommentDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments`,\r\n request,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-create-comment'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to create comment.'),\r\n ),\r\n );\r\n }\r\n\r\n updateComment(\r\n moduleType: string,\r\n recordId: number,\r\n commentId: number,\r\n request: DiscussionUpdateCommentRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentDto> {\r\n return this.http\r\n .patch<AppResponseViewModel<DiscussionCommentDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments/${commentId}`,\r\n request,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-update-comment'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to update comment.'),\r\n ),\r\n );\r\n }\r\n\r\n deleteComment(\r\n moduleType: string,\r\n recordId: number,\r\n commentId: number,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<AppResponseViewModel<boolean>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments/${commentId}`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-delete-comment'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to delete comment.'),\r\n ),\r\n );\r\n }\r\n\r\n getCommentRevisions(\r\n moduleType: string,\r\n recordId: number,\r\n commentId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentRevisionDto[]> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionCommentRevisionDto[]>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments/${commentId}/revisions`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(\r\n response,\r\n 'Failed to load comment revisions.',\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n getParticipants(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionParticipantDto[]> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionParticipantDto[]>>(\r\n `${this.threadRoute(moduleType, recordId)}/participants`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(\r\n response,\r\n 'Failed to load discussion participants.',\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n addParticipant(\r\n moduleType: string,\r\n recordId: number,\r\n request: DiscussionAddParticipantRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionParticipantDto> {\r\n return this.http\r\n .post<AppResponseViewModel<DiscussionParticipantDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/participants`,\r\n request,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-add-participant'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to add participant.'),\r\n ),\r\n );\r\n }\r\n\r\n getReadState(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionReadStateDto> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionReadStateDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/read-state`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to load read state.'),\r\n ),\r\n );\r\n }\r\n\r\n markReadState(\r\n moduleType: string,\r\n recordId: number,\r\n request?: DiscussionUpdateReadStateRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionReadStateDto> {\r\n return this.http\r\n .put<AppResponseViewModel<DiscussionReadStateDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/read-state`,\r\n request?.lastReadCommentId ? request : {},\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-mark-read'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to mark read state.'),\r\n ),\r\n );\r\n }\r\n\r\n clearReadState(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<AppResponseViewModel<boolean>>(\r\n `${this.threadRoute(moduleType, recordId)}/read-state`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-clear-read'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to clear read state.'),\r\n ),\r\n );\r\n }\r\n\r\n uploadAttachment(\r\n file: File,\r\n uploadEndpoint: string,\r\n context?: HttpContext,\r\n ): Observable<DiscussionAttachmentUploadProgressEvent> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n return this.http\r\n .post<\r\n | AppResponseViewModel<DiscussionAttachmentUploadApiDto>\r\n | { data?: DiscussionAttachmentUploadApiDto }\r\n >(uploadEndpoint, formData, {\r\n reportProgress: true,\r\n observe: 'events',\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((event): DiscussionAttachmentUploadProgressEvent | null => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n return {\r\n progress: event.total\r\n ? Math.round((event.loaded / event.total) * 100)\r\n : 0,\r\n completed: false,\r\n } satisfies DiscussionAttachmentUploadProgressEvent;\r\n }\r\n\r\n if (event.type === HttpEventType.Response && event.body) {\r\n return {\r\n progress: 100,\r\n completed: true,\r\n file: this.mapUploadPayload(event.body, file),\r\n } satisfies DiscussionAttachmentUploadProgressEvent;\r\n }\r\n\r\n return null;\r\n }),\r\n filter(\r\n (value): value is DiscussionAttachmentUploadProgressEvent =>\r\n value != null,\r\n ),\r\n );\r\n }\r\n\r\n searchMentionUsers(\r\n endpoint: string,\r\n query: string,\r\n paramName: string,\r\n dataPath: string,\r\n context?: HttpContext,\r\n ): Observable<DiscussionMentionUser[]> {\r\n const params = new HttpParams().set(paramName, query);\r\n\r\n return this.http\r\n .get<unknown>(endpoint, {\r\n params,\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((response) => {\r\n const payload = this.unwrapUnknownResponse(response);\r\n const candidates = readPathValue<unknown[]>(\r\n payload,\r\n dataPath,\r\n Array.isArray(payload) ? payload : [],\r\n );\r\n\r\n return candidates\r\n .map((item) => normalizeMentionUser(item))\r\n .filter((item): item is DiscussionMentionUser => item != null);\r\n }),\r\n );\r\n }\r\n\r\n downloadAttachment(\r\n endpoint: string,\r\n fileId: string,\r\n fileName: string,\r\n context?: HttpContext,\r\n ): Observable<void> {\r\n const url = this.resolveDownloadEndpoint(endpoint, fileId);\r\n\r\n return this.http\r\n .get(url, {\r\n responseType: 'blob',\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((blob) => {\r\n const objectUrl = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = objectUrl;\r\n link.download = fileName;\r\n link.click();\r\n window.URL.revokeObjectURL(objectUrl);\r\n }),\r\n );\r\n }\r\n\r\n private threadRoute(moduleType: string, recordId: number): string {\r\n return `${this.baseRoute}/${encodeURIComponent(moduleType)}/${recordId}`;\r\n }\r\n\r\n private resolveContext(context?: HttpContext): HttpContext {\r\n return context ?? this.defaultContext;\r\n }\r\n\r\n private mutationHeaders(seed: string): HttpHeaders {\r\n return new HttpHeaders({\r\n 'X-Idempotency-Key': this.idempotencyKey(seed),\r\n });\r\n }\r\n\r\n private idempotencyKey(seed: string): string {\r\n if (\r\n typeof crypto !== 'undefined' &&\r\n typeof crypto.randomUUID === 'function'\r\n ) {\r\n return `${seed}-${crypto.randomUUID()}`;\r\n }\r\n\r\n return `${seed}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\r\n }\r\n\r\n private unwrapUnknownResponse(response: unknown): unknown {\r\n if (!response || typeof response !== 'object') {\r\n return response;\r\n }\r\n\r\n const asResponse = response as AppResponseViewModel<unknown>;\r\n if (typeof asResponse.code === 'number' && asResponse.code === 2) {\r\n throw new Error(\r\n asResponse.errors?.message ||\r\n asResponse.message ||\r\n 'Request failed while loading mention candidates.',\r\n );\r\n }\r\n\r\n if ('data' in asResponse) {\r\n return asResponse.data;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n private mapUploadPayload(\r\n response:\r\n | AppResponseViewModel<DiscussionAttachmentUploadApiDto>\r\n | { data?: DiscussionAttachmentUploadApiDto },\r\n file: File,\r\n ): DiscussionAttachmentUploadResult {\r\n const payload = this.unwrapUnknownResponse(response) as\r\n | DiscussionAttachmentUploadApiDto\r\n | null\r\n | undefined;\r\n\r\n // Uploader integrations usually expose:\r\n // - fileName: storage key / retrievable id (for API payloads)\r\n // - name: original file name (for UI display)\r\n const fileId = String(\r\n payload?.fileId ??\r\n payload?.fileName ??\r\n payload?.id ??\r\n payload?.name ??\r\n file.name,\r\n ).trim();\r\n\r\n const displayFileName = String(\r\n payload?.name ??\r\n payload?.originalFileName ??\r\n payload?.fileName ??\r\n file.name,\r\n ).trim();\r\n\r\n return {\r\n fileId,\r\n fileName: displayFileName || file.name,\r\n contentType: payload?.contentType ?? file.type,\r\n size: payload?.size ?? file.size,\r\n };\r\n }\r\n\r\n private resolveDownloadEndpoint(endpoint: string, fileId: string): string {\r\n const cleanEndpoint = endpoint.trim() || 'uploader';\r\n\r\n if (cleanEndpoint.includes('{fileId}')) {\r\n return cleanEndpoint.replace('{fileId}', encodeURIComponent(fileId));\r\n }\r\n\r\n return `${cleanEndpoint.replace(/\\/$/, '')}/${encodeURIComponent(fileId)}`;\r\n }\r\n}\r\n","import { CommonModule, DatePipe } from '@angular/common';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { EntitiesPreview } from '@masterteam/components/entities';\r\nimport type {\r\n EntityData,\r\n EntityUserValue,\r\n} from '@masterteam/components/entities';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport {\r\n Subject,\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n finalize,\r\n firstValueFrom,\r\n map,\r\n of,\r\n switchMap,\r\n} from 'rxjs';\r\nimport type {\r\n DiscussionAttachmentDraft,\r\n DiscussionCommentDto,\r\n DiscussionCommentRevisionDto,\r\n DiscussionCommentSegment,\r\n DiscussionCommentsPageDto,\r\n DiscussionMentionDto,\r\n DiscussionMentionUser,\r\n DiscussionParticipantDto,\r\n DiscussionReadStateDto,\r\n DiscussionReadStateLike,\r\n DiscussionThreadSummaryDto,\r\n} from '../../models/discussion.model';\r\nimport { DiscussionApiService } from '../../services/discussion-api.service';\r\nimport {\r\n buildDiscussionThreadKey,\r\n dedupeMentionUsers,\r\n isValidDiscussionThread,\r\n mapReadStateToLike,\r\n mapSummaryToReadState,\r\n normalizeDiscussionModuleType,\r\n normalizeDiscussionRecordId,\r\n sanitizeMentions,\r\n toDiscussionErrorMessage,\r\n} from '../../utils/discussion.utils';\r\nimport { Icon } from '@masterteam/icons';\r\n\r\ninterface TextMutation {\r\n start: number;\r\n beforeEnd: number;\r\n delta: number;\r\n}\r\n\r\ntype MentionMode = 'composer' | 'edit';\r\n\r\ninterface MentionSession {\r\n mode: MentionMode;\r\n triggerIndex: number;\r\n caretIndex: number;\r\n query: string;\r\n textarea: HTMLTextAreaElement;\r\n editCommentId: number | null;\r\n}\r\n\r\ninterface MentionMenuPosition {\r\n left: number;\r\n top: number;\r\n width: number;\r\n maxHeight: number;\r\n placement: 'above' | 'below';\r\n}\r\n\r\ninterface MentionCaretMetrics {\r\n x: number;\r\n y: number;\r\n lineHeight: number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-discussion-thread',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n DatePipe,\r\n DialogModule,\r\n PopoverModule,\r\n Button,\r\n Card,\r\n EntitiesPreview,\r\n Icon,\r\n ],\r\n templateUrl: './discussion-thread.html',\r\n styleUrl: './discussion-thread.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block h-full min-h-0',\r\n },\r\n})\r\nexport class DiscussionThread {\r\n private readonly api = inject(DiscussionApiService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly moduleType = input.required<string>();\r\n readonly recordId = input.required<number>();\r\n\r\n readonly title = input<string>('Discussion');\r\n readonly subtitle = input<string>('');\r\n readonly placeholder = input<string>('Write a message');\r\n readonly pageSize = input<number>(30);\r\n readonly currentUserId = input<string>('');\r\n readonly requestContext = input<HttpContext | undefined>(undefined);\r\n\r\n readonly mentionableUsers = input<DiscussionMentionUser[]>([]);\r\n readonly mentionSearchEndpoint = input<string>('');\r\n readonly mentionSearchParam = input<string>('query');\r\n readonly mentionSearchDataPath = input<string>('data');\r\n\r\n readonly allowAttachments = input<boolean>(true);\r\n readonly uploadEndpoint = input<string>('uploader');\r\n readonly attachmentDownloadEndpoint = input<string>('uploader');\r\n\r\n readonly showParticipants = input<boolean>(true);\r\n\r\n readonly autoMarkRead = input<boolean>(true);\r\n readonly refreshIntervalMs = input<number>(0);\r\n readonly styleClass = input<string>('');\r\n readonly disabled = input<boolean>(false);\r\n\r\n readonly loaded = output<DiscussionThreadSummaryDto>();\r\n readonly errored = output<string>();\r\n readonly commentCreated = output<DiscussionCommentDto>();\r\n readonly commentUpdated = output<DiscussionCommentDto>();\r\n readonly commentDeleted = output<number>();\r\n readonly readStateChanged = output<DiscussionReadStateDto | null>();\r\n\r\n protected readonly viewportRef =\r\n viewChild<ElementRef<HTMLDivElement>>('viewport');\r\n protected readonly composerInputRef =\r\n viewChild<ElementRef<HTMLTextAreaElement>>('composerInput');\r\n protected readonly attachmentInputRef =\r\n viewChild<ElementRef<HTMLInputElement>>('attachmentInput');\r\n\r\n protected readonly loadingInitial = signal(false);\r\n protected readonly loadingMore = signal(false);\r\n protected readonly posting = signal(false);\r\n protected readonly refreshing = signal(false);\r\n protected readonly markingRead = signal(false);\r\n protected readonly participantsLoading = signal(false);\r\n protected readonly savingEdit = signal(false);\r\n protected readonly revisionLoading = signal(false);\r\n\r\n protected readonly errorMessage = signal<string | null>(null);\r\n protected readonly threadSummary = signal<DiscussionThreadSummaryDto | null>(\r\n null,\r\n );\r\n protected readonly commentsDesc = signal<DiscussionCommentDto[]>([]);\r\n protected readonly participants = signal<DiscussionParticipantDto[]>([]);\r\n protected readonly readState = signal<DiscussionReadStateDto | null>(null);\r\n\r\n protected readonly nextCursor = signal<string | null>(null);\r\n protected readonly hasMore = signal(false);\r\n\r\n protected readonly composerText = signal('');\r\n protected readonly composerMentions = signal<DiscussionMentionDto[]>([]);\r\n protected readonly composerAttachments = signal<DiscussionAttachmentDraft[]>(\r\n [],\r\n );\r\n protected readonly replyToCommentId = signal<number | null>(null);\r\n\r\n protected readonly editingCommentId = signal<number | null>(null);\r\n protected readonly editText = signal('');\r\n protected readonly editMentions = signal<DiscussionMentionDto[]>([]);\r\n\r\n protected readonly participantsExpanded = signal(false);\r\n\r\n protected readonly mentionSession = signal<MentionSession | null>(null);\r\n protected readonly mentionCandidates = signal<DiscussionMentionUser[]>([]);\r\n protected readonly mentionLoading = signal(false);\r\n protected readonly mentionActiveIndex = signal(0);\r\n protected readonly mentionMenuPosition = signal<MentionMenuPosition | null>(\r\n null,\r\n );\r\n protected readonly mentionMenuStyle = computed(() => {\r\n const position = this.mentionMenuPosition();\r\n if (!position) {\r\n return null;\r\n }\r\n\r\n return {\r\n left: `${position.left}px`,\r\n top: `${position.top}px`,\r\n width: `${position.width}px`,\r\n maxHeight: `${position.maxHeight}px`,\r\n };\r\n });\r\n\r\n protected readonly revisionsDialogVisible = signal(false);\r\n protected readonly selectedRevisionComment =\r\n signal<DiscussionCommentDto | null>(null);\r\n protected readonly revisionsByComment = signal<\r\n Map<number, DiscussionCommentRevisionDto[]>\r\n >(new Map());\r\n\r\n protected readonly deletingCommentIds = signal<Set<number>>(new Set());\r\n protected readonly atBottom = signal(true);\r\n\r\n protected readonly resolvedModuleType = computed(() =>\r\n normalizeDiscussionModuleType(this.moduleType()),\r\n );\r\n protected readonly resolvedRecordId = computed(() =>\r\n normalizeDiscussionRecordId(this.recordId()),\r\n );\r\n protected readonly resolvedPageSize = computed(() =>\r\n this.normalizePageSize(this.pageSize()),\r\n );\r\n protected readonly threadKey = computed(() =>\r\n buildDiscussionThreadKey(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n ),\r\n );\r\n protected readonly commentsAsc = computed(() =>\r\n [...this.commentsDesc()].reverse(),\r\n );\r\n protected readonly commentsById = computed(() => {\r\n const map = new Map<number, DiscussionCommentDto>();\r\n for (const comment of this.commentsDesc()) {\r\n map.set(comment.id, comment);\r\n }\r\n return map;\r\n });\r\n protected readonly resolvedCurrentUserId = computed(() => {\r\n const readStateUserId = this.readState()?.userId?.trim();\r\n if (readStateUserId) {\r\n return readStateUserId;\r\n }\r\n\r\n return this.currentUserId().trim();\r\n });\r\n protected readonly replyToComment = computed(() => {\r\n const parentId = this.replyToCommentId();\r\n if (parentId == null) {\r\n return null;\r\n }\r\n\r\n return this.commentsById().get(parentId) ?? null;\r\n });\r\n protected readonly readStateLike = computed<DiscussionReadStateLike | null>(\r\n () => {\r\n const currentReadState = this.readState();\r\n if (currentReadState) {\r\n return mapReadStateToLike(currentReadState);\r\n }\r\n\r\n const summary = this.threadSummary();\r\n return summary ? mapSummaryToReadState(summary) : null;\r\n },\r\n );\r\n protected readonly hasUnread = computed(\r\n () => this.readStateLike()?.hasUnread ?? false,\r\n );\r\n protected readonly firstUnreadCommentId = computed(() =>\r\n this.resolveFirstUnreadCommentId(this.commentsAsc(), this.readStateLike()),\r\n );\r\n protected readonly mentionPool = computed(() =>\r\n dedupeMentionUsers([\r\n ...this.mentionableUsers(),\r\n ...this.participants().map((participant) => ({\r\n userId: participant.userId,\r\n displayName: this.getParticipantDisplayName(participant),\r\n userName: participant.user?.userName ?? null,\r\n avatarUrl: participant.user?.photoUrl ?? null,\r\n })),\r\n ]),\r\n );\r\n protected readonly participantEntities = computed<EntityData[]>(() =>\r\n this.participants().map((participant, index) => ({\r\n id: participant.id,\r\n key: `participant-${participant.id}`,\r\n name: 'Participant',\r\n order: index + 1,\r\n value: this.mapParticipantToEntityUserValue(participant),\r\n viewType: 'User',\r\n configuration: {\r\n size: 24,\r\n showBorder: true,\r\n showDisplayName: true,\r\n },\r\n })),\r\n );\r\n protected readonly uploadInProgress = computed(() =>\r\n this.composerAttachments().some((item) => item.status === 'uploading'),\r\n );\r\n protected readonly readyAttachmentFileIds = computed(() =>\r\n this.composerAttachments()\r\n .filter((item) => item.status === 'ready' && !!item.fileId)\r\n .map((item) => item.fileId!)\r\n .filter((item) => !!item),\r\n );\r\n protected readonly canSend = computed(() => {\r\n if (this.disabled() || this.posting() || this.uploadInProgress()) {\r\n return false;\r\n }\r\n\r\n const commentText = this.composerText();\r\n return commentText.trim().length > 0 && commentText.length <= 10000;\r\n });\r\n protected readonly canSaveEdit = computed(() => {\r\n if (this.disabled() || this.savingEdit()) {\r\n return false;\r\n }\r\n\r\n const text = this.editText();\r\n return text.trim().length > 0 && text.length <= 10000;\r\n });\r\n protected readonly visibleRevisions = computed(() => {\r\n const commentId = this.selectedRevisionComment()?.id;\r\n if (commentId == null) {\r\n return [];\r\n }\r\n\r\n return this.revisionsByComment().get(commentId) ?? [];\r\n });\r\n\r\n private readonly mentionSearchTerms = new Subject<{\r\n query: string;\r\n localUsers: DiscussionMentionUser[];\r\n }>();\r\n private readonly mentionMenuMaxWidthPx = 352;\r\n private readonly mentionMenuPreferredHeightPx = 260;\r\n private readonly mentionMenuViewportPaddingPx = 8;\r\n private autoReadTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n this.bindMentionSearch();\r\n\r\n effect(() => {\r\n const moduleType = this.resolvedModuleType();\r\n const recordId = this.resolvedRecordId();\r\n this.requestContext();\r\n\r\n if (!isValidDiscussionThread(moduleType, recordId)) {\r\n this.resetData();\r\n if (moduleType || recordId) {\r\n this.errorMessage.set('Invalid thread identity.');\r\n }\r\n return;\r\n }\r\n\r\n untracked(() => {\r\n void this.loadThread();\r\n });\r\n });\r\n\r\n effect((onCleanup) => {\r\n const interval = this.refreshIntervalMs();\r\n const key = this.threadKey();\r\n if (!key || interval <= 0) {\r\n return;\r\n }\r\n\r\n const timer = setInterval(() => {\r\n void this.refreshThread();\r\n }, interval);\r\n\r\n onCleanup(() => clearInterval(timer));\r\n });\r\n\r\n effect((onCleanup) => {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n const onViewportChange = () =>\r\n this.positionMentionMenuForCurrentSession();\r\n window.addEventListener('resize', onViewportChange);\r\n\r\n onCleanup(() => {\r\n window.removeEventListener('resize', onViewportChange);\r\n });\r\n });\r\n }\r\n\r\n protected trackComment(_: number, comment: DiscussionCommentDto): number {\r\n return comment.id;\r\n }\r\n\r\n protected isOwnComment(comment: DiscussionCommentDto): boolean {\r\n const currentUserId = this.resolvedCurrentUserId().toLowerCase();\r\n return !!currentUserId && comment.createdBy.toLowerCase() === currentUserId;\r\n }\r\n\r\n protected canEditComment(comment: DiscussionCommentDto): boolean {\r\n return this.isOwnComment(comment) && !comment.isSystem;\r\n }\r\n\r\n protected canDeleteComment(comment: DiscussionCommentDto): boolean {\r\n return this.isOwnComment(comment) && !comment.isSystem;\r\n }\r\n\r\n protected isDeleting(commentId: number): boolean {\r\n return this.deletingCommentIds().has(commentId);\r\n }\r\n\r\n protected getAvatarText(comment: DiscussionCommentDto): string {\r\n const source = comment.createdBy || '?';\r\n return source.slice(0, 1).toUpperCase();\r\n }\r\n\r\n protected getMentionAvatarText(user: DiscussionMentionUser): string {\r\n const source = user.displayName || user.userName || user.userId || '?';\r\n return source.slice(0, 1).toUpperCase();\r\n }\r\n\r\n protected getCommentSegments(\r\n comment: DiscussionCommentDto,\r\n ): DiscussionCommentSegment[] {\r\n const text = comment.comment ?? '';\r\n const mentions = sanitizeMentions(comment.mentions ?? [], text);\r\n\r\n if (!mentions.length) {\r\n return [{ text, isMention: false }];\r\n }\r\n\r\n const segments: DiscussionCommentSegment[] = [];\r\n let cursor = 0;\r\n\r\n for (const mention of mentions) {\r\n if (mention.startIndex > cursor) {\r\n segments.push({\r\n text: text.slice(cursor, mention.startIndex),\r\n isMention: false,\r\n });\r\n }\r\n\r\n const mentionText = text.slice(\r\n mention.startIndex,\r\n mention.startIndex + mention.length,\r\n );\r\n if (mentionText) {\r\n segments.push({\r\n text: mentionText,\r\n isMention: true,\r\n userId: mention.userId,\r\n });\r\n }\r\n\r\n cursor = mention.startIndex + mention.length;\r\n }\r\n\r\n if (cursor < text.length) {\r\n segments.push({\r\n text: text.slice(cursor),\r\n isMention: false,\r\n });\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n protected getParentComment(\r\n comment: DiscussionCommentDto,\r\n ): DiscussionCommentDto | null {\r\n if (comment.parentCommentId == null) {\r\n return null;\r\n }\r\n\r\n return this.commentsById().get(comment.parentCommentId) ?? null;\r\n }\r\n\r\n protected openReply(comment: DiscussionCommentDto): void {\r\n if (comment.isSystem) {\r\n return;\r\n }\r\n\r\n this.replyToCommentId.set(comment.id);\r\n this.focusComposer();\r\n }\r\n\r\n protected clearReply(): void {\r\n this.replyToCommentId.set(null);\r\n }\r\n\r\n protected startEdit(comment: DiscussionCommentDto): void {\r\n if (!this.canEditComment(comment)) {\r\n return;\r\n }\r\n\r\n this.editingCommentId.set(comment.id);\r\n this.editText.set(comment.comment);\r\n this.editMentions.set(\r\n sanitizeMentions(comment.mentions ?? [], comment.comment),\r\n );\r\n this.closeMentionMenu();\r\n }\r\n\r\n protected cancelEdit(): void {\r\n this.editingCommentId.set(null);\r\n this.editText.set('');\r\n this.editMentions.set([]);\r\n this.closeMentionMenu();\r\n }\r\n\r\n protected async saveEdit(): Promise<void> {\r\n const commentId = this.editingCommentId();\r\n if (commentId == null || !this.canSaveEdit()) {\r\n return;\r\n }\r\n\r\n const commentText = this.editText();\r\n const mentions = sanitizeMentions(this.editMentions(), commentText);\r\n\r\n this.savingEdit.set(true);\r\n try {\r\n const updatedComment = await firstValueFrom(\r\n this.api.updateComment(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n commentId,\r\n {\r\n comment: commentText,\r\n mentions: mentions.length ? mentions : undefined,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.commentsDesc.update((comments) =>\r\n comments.map((comment) =>\r\n comment.id === updatedComment.id ? updatedComment : comment,\r\n ),\r\n );\r\n\r\n this.commentUpdated.emit(updatedComment);\r\n this.cancelEdit();\r\n } catch (error) {\r\n this.handleError(error, 'Unable to update comment.');\r\n } finally {\r\n this.savingEdit.set(false);\r\n }\r\n }\r\n\r\n protected async deleteComment(comment: DiscussionCommentDto): Promise<void> {\r\n if (!this.canDeleteComment(comment)) {\r\n return;\r\n }\r\n\r\n const accepted = window.confirm('Delete this comment?');\r\n if (!accepted) {\r\n return;\r\n }\r\n\r\n this.deletingCommentIds.update((state) => {\r\n const next = new Set(state);\r\n next.add(comment.id);\r\n return next;\r\n });\r\n\r\n try {\r\n await firstValueFrom(\r\n this.api.deleteComment(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n comment.id,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.commentsDesc.update((comments) =>\r\n comments.filter((item) => item.id !== comment.id),\r\n );\r\n this.commentDeleted.emit(comment.id);\r\n\r\n if (this.replyToCommentId() === comment.id) {\r\n this.replyToCommentId.set(null);\r\n }\r\n\r\n if (this.editingCommentId() === comment.id) {\r\n this.cancelEdit();\r\n }\r\n\r\n this.patchSummaryTotal(-1);\r\n await this.refreshReadState();\r\n } catch (error) {\r\n this.handleError(error, 'Unable to delete comment.');\r\n } finally {\r\n this.deletingCommentIds.update((state) => {\r\n const next = new Set(state);\r\n next.delete(comment.id);\r\n return next;\r\n });\r\n }\r\n }\r\n\r\n protected async sendComment(): Promise<void> {\r\n if (!this.canSend()) {\r\n if (this.composerText().length > 10000) {\r\n this.errorMessage.set('Comment cannot exceed 10000 characters.');\r\n }\r\n return;\r\n }\r\n\r\n const commentText = this.composerText();\r\n const mentions = sanitizeMentions(this.composerMentions(), commentText);\r\n\r\n this.posting.set(true);\r\n try {\r\n const createdComment = await firstValueFrom(\r\n this.api.createComment(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n {\r\n comment: commentText,\r\n parentCommentId: this.replyToCommentId(),\r\n attachmentFileIds:\r\n this.readyAttachmentFileIds().length > 0\r\n ? this.readyAttachmentFileIds()\r\n : undefined,\r\n mentions: mentions.length ? mentions : undefined,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.commentsDesc.update((comments) => [\r\n createdComment,\r\n ...comments.filter((comment) => comment.id !== createdComment.id),\r\n ]);\r\n this.patchSummaryTotal(1, createdComment.createdAt);\r\n\r\n this.commentCreated.emit(createdComment);\r\n this.resetComposer();\r\n this.scheduleScrollToBottom('smooth');\r\n this.scheduleAutoMarkRead();\r\n\r\n if (this.showParticipants()) {\r\n void this.reloadParticipantsQuiet();\r\n }\r\n } catch (error) {\r\n this.handleError(error, 'Unable to send comment.');\r\n } finally {\r\n this.posting.set(false);\r\n }\r\n }\r\n\r\n protected async loadOlder(): Promise<void> {\r\n if (!this.hasMore() || this.loadingMore()) {\r\n return;\r\n }\r\n\r\n const cursor = this.nextCursor();\r\n if (!cursor) {\r\n return;\r\n }\r\n\r\n this.loadingMore.set(true);\r\n try {\r\n const page = await firstValueFrom(\r\n this.api.getComments(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n this.resolvedPageSize(),\r\n cursor,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n const normalized = this.normalizeComments(page.items);\r\n const existingIds = new Set(this.commentsDesc().map((item) => item.id));\r\n const older = normalized.filter((item) => !existingIds.has(item.id));\r\n\r\n this.commentsDesc.update((comments) => [...comments, ...older]);\r\n this.applyCommentsPageMeta(page);\r\n } catch (error) {\r\n if (this.isCursorError(error)) {\r\n await this.loadThread({ quiet: true, preserveDraft: true });\r\n this.errorMessage.set(\r\n 'Timeline cursor expired. Comments were reloaded from latest.',\r\n );\r\n return;\r\n }\r\n\r\n this.handleError(error, 'Unable to load older comments.');\r\n } finally {\r\n this.loadingMore.set(false);\r\n }\r\n }\r\n\r\n protected async refreshThread(): Promise<void> {\r\n if (this.loadingInitial() || this.refreshing()) {\r\n return;\r\n }\r\n\r\n this.refreshing.set(true);\r\n try {\r\n await this.loadThread({ quiet: true, preserveDraft: true });\r\n } finally {\r\n this.refreshing.set(false);\r\n }\r\n }\r\n\r\n protected async markRead(): Promise<void> {\r\n if (this.markingRead()) {\r\n return;\r\n }\r\n\r\n this.markingRead.set(true);\r\n try {\r\n const state = await firstValueFrom(\r\n this.api.markReadState(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n undefined,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.readState.set(state);\r\n this.readStateChanged.emit(state);\r\n this.patchSummaryRead(state);\r\n } catch (error) {\r\n this.handleError(error, 'Unable to update read state.', false);\r\n } finally {\r\n this.markingRead.set(false);\r\n }\r\n }\r\n\r\n protected onViewportScroll(): void {\r\n const viewport = this.viewportRef()?.nativeElement;\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n const threshold = 40;\r\n const isBottom =\r\n viewport.scrollTop + viewport.clientHeight >=\r\n viewport.scrollHeight - threshold;\r\n this.atBottom.set(isBottom);\r\n\r\n if (isBottom) {\r\n this.scheduleAutoMarkRead();\r\n }\r\n\r\n this.positionMentionMenuForCurrentSession();\r\n }\r\n\r\n protected onComposerInput(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n const before = this.composerText();\r\n const after = textarea.value;\r\n this.composerText.set(after);\r\n this.composerMentions.set(\r\n this.rebaseMentions(before, after, this.composerMentions()),\r\n );\r\n this.updateMentionSession('composer', textarea, after);\r\n }\r\n\r\n protected onComposerCaretEvent(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n this.updateMentionSession('composer', textarea, this.composerText());\r\n }\r\n\r\n protected onComposerKeydown(event: KeyboardEvent): void {\r\n if (this.handleMentionKeyboard(event)) {\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' && !event.shiftKey) {\r\n event.preventDefault();\r\n void this.sendComment();\r\n }\r\n }\r\n\r\n protected onEditInput(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n const before = this.editText();\r\n const after = textarea.value;\r\n this.editText.set(after);\r\n this.editMentions.set(\r\n this.rebaseMentions(before, after, this.editMentions()),\r\n );\r\n this.updateMentionSession('edit', textarea, after);\r\n }\r\n\r\n protected onEditCaretEvent(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n this.updateMentionSession('edit', textarea, this.editText());\r\n }\r\n\r\n protected onEditKeydown(event: KeyboardEvent): void {\r\n if (this.handleMentionKeyboard(event)) {\r\n return;\r\n }\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.cancelEdit();\r\n }\r\n }\r\n\r\n protected selectMention(user: DiscussionMentionUser): void {\r\n const session = this.mentionSession();\r\n if (!session) {\r\n return;\r\n }\r\n\r\n if (\r\n session.mode === 'edit' &&\r\n session.editCommentId !== this.editingCommentId()\r\n ) {\r\n this.closeMentionMenu();\r\n return;\r\n }\r\n\r\n const mentionToken = `@${user.displayName}`;\r\n const replacement = `${mentionToken} `;\r\n\r\n const currentText =\r\n session.mode === 'composer' ? this.composerText() : this.editText();\r\n const currentMentions =\r\n session.mode === 'composer'\r\n ? this.composerMentions()\r\n : this.editMentions();\r\n\r\n const start = session.triggerIndex;\r\n const end = session.caretIndex;\r\n const nextText =\r\n currentText.slice(0, start) + replacement + currentText.slice(end);\r\n const delta = replacement.length - (end - start);\r\n\r\n const shiftedMentions = currentMentions\r\n .filter((mention) => {\r\n const mentionEnd = mention.startIndex + mention.length;\r\n return mentionEnd <= start || mention.startIndex >= end;\r\n })\r\n .map((mention) =>\r\n mention.startIndex >= end\r\n ? {\r\n ...mention,\r\n startIndex: mention.startIndex + delta,\r\n }\r\n : mention,\r\n );\r\n\r\n const nextMentions = sanitizeMentions(\r\n [\r\n ...shiftedMentions,\r\n {\r\n userId: user.userId,\r\n startIndex: start,\r\n length: mentionToken.length,\r\n },\r\n ],\r\n nextText,\r\n );\r\n\r\n if (session.mode === 'composer') {\r\n this.composerText.set(nextText);\r\n this.composerMentions.set(nextMentions);\r\n } else {\r\n this.editText.set(nextText);\r\n this.editMentions.set(nextMentions);\r\n }\r\n\r\n const nextCaret = start + replacement.length;\r\n this.closeMentionMenu();\r\n queueMicrotask(() => {\r\n session.textarea.focus();\r\n session.textarea.setSelectionRange(nextCaret, nextCaret);\r\n });\r\n }\r\n\r\n protected toggleParticipantsPanel(): void {\r\n this.participantsExpanded.update((value) => !value);\r\n }\r\n\r\n protected async openRevisions(comment: DiscussionCommentDto): Promise<void> {\r\n this.selectedRevisionComment.set(comment);\r\n this.revisionsDialogVisible.set(true);\r\n\r\n const existing = this.revisionsByComment().get(comment.id);\r\n if (existing) {\r\n return;\r\n }\r\n\r\n this.revisionLoading.set(true);\r\n try {\r\n const revisions = await firstValueFrom(\r\n this.api.getCommentRevisions(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n comment.id,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.revisionsByComment.update((state) => {\r\n const next = new Map(state);\r\n next.set(comment.id, revisions);\r\n return next;\r\n });\r\n } catch (error) {\r\n this.handleError(error, 'Unable to load revisions.');\r\n } finally {\r\n this.revisionLoading.set(false);\r\n }\r\n }\r\n\r\n protected async downloadAttachment(\r\n comment: DiscussionCommentDto,\r\n attachment: { fileId: string; fileName: string },\r\n ): Promise<void> {\r\n try {\r\n await firstValueFrom(\r\n this.api.downloadAttachment(\r\n this.attachmentDownloadEndpoint(),\r\n attachment.fileId,\r\n attachment.fileName,\r\n this.requestContext(),\r\n ),\r\n );\r\n } catch (error) {\r\n this.handleError(\r\n error,\r\n `Unable to download attachment from comment #${comment.id}.`,\r\n );\r\n }\r\n }\r\n\r\n protected browseAttachments(): void {\r\n if (!this.allowAttachments() || this.disabled()) {\r\n return;\r\n }\r\n\r\n this.attachmentInputRef()?.nativeElement.click();\r\n }\r\n\r\n protected onAttachmentSelected(event: Event): void {\r\n const target = event.target as HTMLInputElement | null;\r\n const files = target?.files;\r\n if (!files?.length) {\r\n return;\r\n }\r\n\r\n Array.from(files).forEach((file) => {\r\n this.uploadAttachment(file);\r\n });\r\n\r\n if (target) {\r\n target.value = '';\r\n }\r\n }\r\n\r\n protected removeAttachment(draftId: string): void {\r\n this.composerAttachments.update((attachments) =>\r\n attachments.filter((attachment) => attachment.id !== draftId),\r\n );\r\n }\r\n\r\n private uploadAttachment(file: File): void {\r\n const draftId = this.generateDraftId(file.name);\r\n const draft: DiscussionAttachmentDraft = {\r\n id: draftId,\r\n fileId: null,\r\n fileName: file.name,\r\n contentType: file.type,\r\n size: file.size,\r\n progress: 0,\r\n status: 'uploading',\r\n error: null,\r\n };\r\n\r\n this.composerAttachments.update((attachments) => [...attachments, draft]);\r\n\r\n this.api\r\n .uploadAttachment(file, this.uploadEndpoint(), this.requestContext())\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (uploadEvent) => {\r\n this.composerAttachments.update((attachments) =>\r\n attachments.map((item) => {\r\n if (item.id !== draftId) {\r\n return item;\r\n }\r\n\r\n if (!uploadEvent.completed) {\r\n return {\r\n ...item,\r\n progress: uploadEvent.progress,\r\n };\r\n }\r\n\r\n return {\r\n ...item,\r\n progress: 100,\r\n status: 'ready',\r\n fileId: uploadEvent.file?.fileId ?? item.fileId,\r\n fileName: uploadEvent.file?.fileName ?? item.fileName,\r\n contentType:\r\n uploadEvent.file?.contentType ?? item.contentType ?? '',\r\n size: uploadEvent.file?.size ?? item.size,\r\n };\r\n }),\r\n );\r\n },\r\n error: (error) => {\r\n const errorMessage = toDiscussionErrorMessage(\r\n error,\r\n 'Attachment upload failed.',\r\n );\r\n\r\n this.composerAttachments.update((attachments) =>\r\n attachments.map((item) =>\r\n item.id === draftId\r\n ? {\r\n ...item,\r\n status: 'failed',\r\n error: errorMessage,\r\n }\r\n : item,\r\n ),\r\n );\r\n this.handleError(error, 'Attachment upload failed.');\r\n },\r\n });\r\n }\r\n\r\n private async loadThread(options?: {\r\n quiet?: boolean;\r\n preserveDraft?: boolean;\r\n }): Promise<void> {\r\n if (!options?.quiet) {\r\n this.loadingInitial.set(true);\r\n }\r\n\r\n this.errorMessage.set(null);\r\n\r\n try {\r\n const moduleType = this.resolvedModuleType();\r\n const recordId = this.resolvedRecordId();\r\n\r\n const [summary, comments] = await Promise.all([\r\n firstValueFrom(\r\n this.api.getThreadSummary(\r\n moduleType,\r\n recordId,\r\n this.requestContext(),\r\n ),\r\n ),\r\n firstValueFrom(\r\n this.api.getComments(\r\n moduleType,\r\n recordId,\r\n this.resolvedPageSize(),\r\n undefined,\r\n this.requestContext(),\r\n ),\r\n ),\r\n ]);\r\n\r\n this.threadSummary.set(summary);\r\n this.loaded.emit(summary);\r\n\r\n this.applyInitialComments(comments);\r\n\r\n if (this.showParticipants()) {\r\n void this.reloadParticipantsQuiet();\r\n } else {\r\n this.participants.set([]);\r\n }\r\n\r\n await this.refreshReadState(comments);\r\n\r\n if (!options?.preserveDraft) {\r\n this.resetComposer();\r\n }\r\n\r\n this.scheduleScrollToBottom('auto');\r\n this.scheduleAutoMarkRead();\r\n } catch (error) {\r\n this.handleError(error, 'Unable to load discussion.');\r\n } finally {\r\n this.loadingInitial.set(false);\r\n }\r\n }\r\n\r\n private async reloadParticipantsQuiet(): Promise<void> {\r\n this.participantsLoading.set(true);\r\n try {\r\n const participants = await firstValueFrom(\r\n this.api.getParticipants(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.participants.set(this.mergeParticipants([], participants));\r\n } catch (error) {\r\n this.handleError(error, 'Unable to load participants.', false);\r\n } finally {\r\n this.participantsLoading.set(false);\r\n }\r\n }\r\n\r\n private async refreshReadState(\r\n commentsPage?: DiscussionCommentsPageDto,\r\n ): Promise<void> {\r\n try {\r\n const state = await firstValueFrom(\r\n this.api.getReadState(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.readState.set(state);\r\n this.readStateChanged.emit(state);\r\n this.patchSummaryRead(state);\r\n } catch {\r\n if (commentsPage) {\r\n const fallback = this.toReadStateFromPage(commentsPage);\r\n this.readState.set(fallback);\r\n this.readStateChanged.emit(fallback);\r\n this.patchSummaryRead(fallback);\r\n }\r\n }\r\n }\r\n\r\n private resetData(): void {\r\n this.threadSummary.set(null);\r\n this.commentsDesc.set([]);\r\n this.participants.set([]);\r\n this.readState.set(null);\r\n this.nextCursor.set(null);\r\n this.hasMore.set(false);\r\n this.cancelEdit();\r\n this.resetComposer();\r\n this.participantsExpanded.set(false);\r\n this.revisionsDialogVisible.set(false);\r\n this.selectedRevisionComment.set(null);\r\n this.revisionsByComment.set(new Map());\r\n }\r\n\r\n private resetComposer(): void {\r\n this.composerText.set('');\r\n this.composerMentions.set([]);\r\n this.composerAttachments.set([]);\r\n this.replyToCommentId.set(null);\r\n this.closeMentionMenu();\r\n }\r\n\r\n private applyInitialComments(page: DiscussionCommentsPageDto): void {\r\n this.commentsDesc.set(this.normalizeComments(page.items));\r\n this.applyCommentsPageMeta(page);\r\n }\r\n\r\n private applyCommentsPageMeta(page: DiscussionCommentsPageDto): void {\r\n this.nextCursor.set(page.nextCursor ?? null);\r\n this.hasMore.set(page.hasMore);\r\n\r\n this.readState.update((state) => {\r\n if (!state) {\r\n return state;\r\n }\r\n\r\n return {\r\n ...state,\r\n lastReadCommentId: page.lastReadCommentId,\r\n lastReadCommentCreatedAt: page.lastReadCommentCreatedAt,\r\n lastReadAt: page.lastReadAt,\r\n unreadCount: page.unreadCount,\r\n hasUnread: page.hasUnread,\r\n };\r\n });\r\n }\r\n\r\n private normalizeComments(\r\n comments: DiscussionCommentDto[],\r\n ): DiscussionCommentDto[] {\r\n return [...comments]\r\n .map((comment) => ({\r\n ...comment,\r\n attachments: [...(comment.attachments ?? [])].sort(\r\n (left, right) => left.id - right.id,\r\n ),\r\n mentions: sanitizeMentions(comment.mentions ?? [], comment.comment),\r\n }))\r\n .sort((left, right) => {\r\n if (left.createdAt !== right.createdAt) {\r\n return left.createdAt < right.createdAt ? 1 : -1;\r\n }\r\n\r\n return right.id - left.id;\r\n });\r\n }\r\n\r\n private rebaseMentions(\r\n previousText: string,\r\n currentText: string,\r\n mentions: DiscussionMentionDto[],\r\n ): DiscussionMentionDto[] {\r\n if (previousText === currentText) {\r\n return sanitizeMentions(mentions, currentText);\r\n }\r\n\r\n const mutation = this.computeTextMutation(previousText, currentText);\r\n const adjusted = mentions\r\n .map((mention) => {\r\n const mentionStart = mention.startIndex;\r\n const mentionEnd = mention.startIndex + mention.length;\r\n\r\n if (mentionEnd <= mutation.start) {\r\n return mention;\r\n }\r\n\r\n if (mentionStart >= mutation.beforeEnd) {\r\n return {\r\n ...mention,\r\n startIndex: mentionStart + mutation.delta,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter((mention): mention is DiscussionMentionDto => mention != null);\r\n\r\n return sanitizeMentions(adjusted, currentText);\r\n }\r\n\r\n private computeTextMutation(before: string, after: string): TextMutation {\r\n let start = 0;\r\n while (\r\n start < before.length &&\r\n start < after.length &&\r\n before[start] === after[start]\r\n ) {\r\n start += 1;\r\n }\r\n\r\n let beforeEnd = before.length;\r\n let afterEnd = after.length;\r\n\r\n while (\r\n beforeEnd > start &&\r\n afterEnd > start &&\r\n before[beforeEnd - 1] === after[afterEnd - 1]\r\n ) {\r\n beforeEnd -= 1;\r\n afterEnd -= 1;\r\n }\r\n\r\n return {\r\n start,\r\n beforeEnd,\r\n delta: afterEnd - beforeEnd,\r\n };\r\n }\r\n\r\n private normalizePageSize(value: number): number {\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed)) {\r\n return 30;\r\n }\r\n\r\n return Math.min(100, Math.max(1, Math.floor(parsed)));\r\n }\r\n\r\n private isCursorError(error: unknown): boolean {\r\n const message = toDiscussionErrorMessage(error, '').toLowerCase();\r\n return message.includes('cursor');\r\n }\r\n\r\n private updateMentionSession(\r\n mode: MentionMode,\r\n textarea: HTMLTextAreaElement,\r\n text: string,\r\n ): void {\r\n const caretIndex = textarea.selectionStart ?? text.length;\r\n const textBeforeCaret = text.slice(0, caretIndex);\r\n const mentionMatch = textBeforeCaret.match(/(^|\\s)@([^\\s@]{0,64})$/);\r\n\r\n if (!mentionMatch) {\r\n if (this.mentionSession()?.mode === mode) {\r\n this.closeMentionMenu();\r\n }\r\n return;\r\n }\r\n\r\n const query = mentionMatch[2] ?? '';\r\n const triggerIndex = caretIndex - query.length - 1;\r\n\r\n this.mentionSession.set({\r\n mode,\r\n triggerIndex,\r\n caretIndex,\r\n query,\r\n textarea,\r\n editCommentId: mode === 'edit' ? this.editingCommentId() : null,\r\n });\r\n this.mentionActiveIndex.set(0);\r\n this.positionMentionMenu(textarea, caretIndex);\r\n this.searchMentionCandidates(query);\r\n }\r\n\r\n private searchMentionCandidates(query: string): void {\r\n const normalizedQuery = query.trim().toLowerCase();\r\n const localUsers = this.mentionPool()\r\n .filter((user) => this.matchesMentionQuery(user, normalizedQuery))\r\n .slice(0, 12);\r\n\r\n this.mentionCandidates.set(localUsers);\r\n\r\n const endpoint = this.mentionSearchEndpoint().trim();\r\n if (!endpoint || !normalizedQuery) {\r\n this.mentionLoading.set(false);\r\n return;\r\n }\r\n\r\n this.mentionSearchTerms.next({\r\n query: normalizedQuery,\r\n localUsers,\r\n });\r\n }\r\n\r\n private matchesMentionQuery(\r\n user: DiscussionMentionUser,\r\n query: string,\r\n ): boolean {\r\n if (!query) {\r\n return true;\r\n }\r\n\r\n const haystack = [user.userId, user.displayName, user.userName ?? '']\r\n .join(' ')\r\n .toLowerCase();\r\n\r\n return haystack.includes(query);\r\n }\r\n\r\n private bindMentionSearch(): void {\r\n this.mentionSearchTerms\r\n .pipe(\r\n debounceTime(220),\r\n distinctUntilChanged((left, right) => left.query === right.query),\r\n switchMap((value) => {\r\n const endpoint = this.mentionSearchEndpoint().trim();\r\n if (!endpoint || !value.query) {\r\n return of(value.localUsers);\r\n }\r\n\r\n this.mentionLoading.set(true);\r\n return this.api\r\n .searchMentionUsers(\r\n endpoint,\r\n value.query,\r\n this.mentionSearchParam(),\r\n this.mentionSearchDataPath(),\r\n this.requestContext(),\r\n )\r\n .pipe(\r\n map((remoteUsers) =>\r\n dedupeMentionUsers([...value.localUsers, ...remoteUsers]).slice(\r\n 0,\r\n 12,\r\n ),\r\n ),\r\n catchError(() => of(value.localUsers)),\r\n finalize(() => this.mentionLoading.set(false)),\r\n );\r\n }),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe((candidates) => {\r\n if (!this.mentionSession()) {\r\n return;\r\n }\r\n\r\n this.mentionCandidates.set(candidates);\r\n this.mentionActiveIndex.set(0);\r\n this.positionMentionMenuForCurrentSession();\r\n });\r\n }\r\n\r\n private handleMentionKeyboard(event: KeyboardEvent): boolean {\r\n const session = this.mentionSession();\r\n if (!session) {\r\n return false;\r\n }\r\n\r\n const candidates = this.mentionCandidates();\r\n if (!candidates.length) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closeMentionMenu();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.mentionActiveIndex.update(\r\n (index) => (index + 1) % this.mentionCandidates().length,\r\n );\r\n return true;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.mentionActiveIndex.update((index) => {\r\n const total = this.mentionCandidates().length;\r\n return (index - 1 + total) % total;\r\n });\r\n return true;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === 'Tab') {\r\n event.preventDefault();\r\n const candidate = this.mentionCandidates()[this.mentionActiveIndex()];\r\n if (candidate) {\r\n this.selectMention(candidate);\r\n }\r\n return true;\r\n }\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closeMentionMenu();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private closeMentionMenu(): void {\r\n this.mentionSession.set(null);\r\n this.mentionCandidates.set([]);\r\n this.mentionActiveIndex.set(0);\r\n this.mentionLoading.set(false);\r\n this.mentionMenuPosition.set(null);\r\n }\r\n\r\n private positionMentionMenuForCurrentSession(): void {\r\n const session = this.mentionSession();\r\n if (!session) {\r\n this.mentionMenuPosition.set(null);\r\n return;\r\n }\r\n\r\n this.positionMentionMenu(session.textarea, session.caretIndex);\r\n }\r\n\r\n private positionMentionMenu(\r\n textarea: HTMLTextAreaElement,\r\n caretIndex: number,\r\n ): void {\r\n const wrapper = textarea.parentElement;\r\n if (!wrapper) {\r\n this.mentionMenuPosition.set(null);\r\n return;\r\n }\r\n\r\n const caret = this.measureMentionCaret(textarea, caretIndex);\r\n if (!caret) {\r\n this.mentionMenuPosition.set(null);\r\n return;\r\n }\r\n\r\n const wrapperRect = wrapper.getBoundingClientRect();\r\n const textareaRect = textarea.getBoundingClientRect();\r\n\r\n const anchorViewportX = textareaRect.left + caret.x - textarea.scrollLeft;\r\n const anchorViewportY = textareaRect.top + caret.y - textarea.scrollTop;\r\n\r\n const menuWidth = Math.min(\r\n this.mentionMenuMaxWidthPx,\r\n window.innerWidth * 0.9,\r\n );\r\n const belowTopViewport = anchorViewportY + caret.lineHeight + 6;\r\n const availableBelow =\r\n window.innerHeight - belowTopViewport - this.mentionMenuViewportPaddingPx;\r\n const availableAbove = anchorViewportY - this.mentionMenuViewportPaddingPx;\r\n const placeAbove = availableBelow < 180 && availableAbove > availableBelow;\r\n\r\n const resolvedMaxHeight = Math.max(\r\n 120,\r\n Math.min(\r\n this.mentionMenuPreferredHeightPx,\r\n (placeAbove ? availableAbove : availableBelow) - 10,\r\n ),\r\n );\r\n\r\n const desiredLeft = anchorViewportX;\r\n const clampedLeft = Math.min(\r\n Math.max(this.mentionMenuViewportPaddingPx, desiredLeft),\r\n window.innerWidth - menuWidth - this.mentionMenuViewportPaddingPx,\r\n );\r\n\r\n const topBelow = belowTopViewport;\r\n const topAbove = anchorViewportY - resolvedMaxHeight - 8;\r\n const clampedTop = placeAbove\r\n ? Math.max(this.mentionMenuViewportPaddingPx, topAbove)\r\n : Math.max(this.mentionMenuViewportPaddingPx, topBelow);\r\n\r\n this.mentionMenuPosition.set({\r\n left: clampedLeft - wrapperRect.left,\r\n top: clampedTop - wrapperRect.top,\r\n width: menuWidth,\r\n maxHeight: resolvedMaxHeight,\r\n placement: placeAbove ? 'above' : 'below',\r\n });\r\n }\r\n\r\n private measureMentionCaret(\r\n textarea: HTMLTextAreaElement,\r\n caretIndex: number,\r\n ): MentionCaretMetrics | null {\r\n const style = window.getComputedStyle(textarea);\r\n const mirror = document.createElement('div');\r\n const marker = document.createElement('span');\r\n\r\n mirror.style.position = 'fixed';\r\n mirror.style.left = '-9999px';\r\n mirror.style.top = '0';\r\n mirror.style.visibility = 'hidden';\r\n mirror.style.pointerEvents = 'none';\r\n mirror.style.whiteSpace = 'pre-wrap';\r\n mirror.style.overflowWrap = 'break-word';\r\n mirror.style.wordWrap = 'break-word';\r\n mirror.style.boxSizing = style.boxSizing;\r\n mirror.style.width = `${textarea.clientWidth}px`;\r\n mirror.style.padding = style.padding;\r\n mirror.style.border = style.border;\r\n mirror.style.font = style.font;\r\n mirror.style.fontSize = style.fontSize;\r\n mirror.style.fontFamily = style.fontFamily;\r\n mirror.style.fontWeight = style.fontWeight;\r\n mirror.style.letterSpacing = style.letterSpacing;\r\n mirror.style.lineHeight = style.lineHeight;\r\n mirror.style.textAlign = style.textAlign;\r\n mirror.style.textTransform = style.textTransform;\r\n mirror.style.textIndent = style.textIndent;\r\n mirror.style.tabSize = style.tabSize;\r\n\r\n const safeCaret = Math.max(0, Math.min(caretIndex, textarea.value.length));\r\n const beforeCaret = textarea.value.slice(0, safeCaret);\r\n mirror.textContent = beforeCaret;\r\n\r\n marker.textContent = '\\u200b';\r\n mirror.appendChild(marker);\r\n document.body.appendChild(mirror);\r\n\r\n try {\r\n const mirrorRect = mirror.getBoundingClientRect();\r\n const markerRect = marker.getBoundingClientRect();\r\n\r\n return {\r\n x: markerRect.left - mirrorRect.left,\r\n y: markerRect.top - mirrorRect.top,\r\n lineHeight: this.resolveMentionLineHeight(style),\r\n };\r\n } finally {\r\n document.body.removeChild(mirror);\r\n }\r\n }\r\n\r\n private resolveMentionLineHeight(style: CSSStyleDeclaration): number {\r\n const lineHeightRaw = style.lineHeight.trim().toLowerCase();\r\n if (lineHeightRaw.endsWith('px')) {\r\n const parsed = Number.parseFloat(lineHeightRaw);\r\n if (Number.isFinite(parsed) && parsed > 0) {\r\n return parsed;\r\n }\r\n }\r\n\r\n const fontSizeRaw = style.fontSize.trim().toLowerCase();\r\n const fontSize = fontSizeRaw.endsWith('px')\r\n ? Number.parseFloat(fontSizeRaw)\r\n : 14;\r\n\r\n return Number.isFinite(fontSize) && fontSize > 0 ? fontSize * 1.4 : 20;\r\n }\r\n\r\n private getParticipantDisplayName(\r\n participant: DiscussionParticipantDto,\r\n ): string {\r\n return (\r\n participant.user?.displayName?.trim() ||\r\n participant.user?.fullName?.trim() ||\r\n participant.user?.userName?.trim() ||\r\n participant.userId\r\n );\r\n }\r\n\r\n private mapParticipantToEntityUserValue(\r\n participant: DiscussionParticipantDto,\r\n ): EntityUserValue {\r\n const user = participant.user ?? participant.addedByUser ?? null;\r\n\r\n return {\r\n id: user?.id ?? participant.userId,\r\n userName: user?.userName ?? undefined,\r\n displayName: this.getParticipantDisplayName(participant),\r\n photoUrl: user?.photoUrl ?? undefined,\r\n };\r\n }\r\n\r\n private mergeParticipants(\r\n current: DiscussionParticipantDto[],\r\n incoming: DiscussionParticipantDto[],\r\n ): DiscussionParticipantDto[] {\r\n const byUserId = new Map<string, DiscussionParticipantDto>();\r\n [...current, ...incoming].forEach((participant) => {\r\n const key = participant.userId.toLowerCase();\r\n if (!byUserId.has(key)) {\r\n byUserId.set(key, participant);\r\n }\r\n });\r\n\r\n return [...byUserId.values()].sort((left, right) =>\r\n this.getParticipantDisplayName(left).localeCompare(\r\n this.getParticipantDisplayName(right),\r\n ),\r\n );\r\n }\r\n\r\n private toReadStateFromPage(\r\n page: DiscussionCommentsPageDto,\r\n ): DiscussionReadStateDto {\r\n const moduleType = this.resolvedModuleType();\r\n const recordId = this.resolvedRecordId();\r\n\r\n return {\r\n threadKey: buildDiscussionThreadKey(moduleType, recordId),\r\n moduleType,\r\n recordId,\r\n userId: this.resolvedCurrentUserId(),\r\n lastReadCommentId: page.lastReadCommentId,\r\n lastReadCommentCreatedAt: page.lastReadCommentCreatedAt,\r\n lastReadAt: page.lastReadAt,\r\n unreadCount: page.unreadCount,\r\n hasUnread: page.hasUnread,\r\n };\r\n }\r\n\r\n private resolveFirstUnreadCommentId(\r\n commentsAsc: DiscussionCommentDto[],\r\n readState: DiscussionReadStateLike | null,\r\n ): number | null {\r\n if (!commentsAsc.length || !readState?.hasUnread) {\r\n return null;\r\n }\r\n\r\n const pointerCreatedAt = readState.lastReadCommentCreatedAt;\r\n const pointerId = readState.lastReadCommentId;\r\n\r\n if (!pointerCreatedAt && pointerId == null) {\r\n return commentsAsc[0]?.id ?? null;\r\n }\r\n\r\n for (const comment of commentsAsc) {\r\n if (this.isCommentAfterPointer(comment, pointerCreatedAt, pointerId)) {\r\n return comment.id;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isCommentAfterPointer(\r\n comment: DiscussionCommentDto,\r\n pointerCreatedAt: string | null,\r\n pointerId: number | null,\r\n ): boolean {\r\n if (!pointerCreatedAt && pointerId == null) {\r\n return true;\r\n }\r\n\r\n if (pointerCreatedAt) {\r\n if (comment.createdAt > pointerCreatedAt) {\r\n return true;\r\n }\r\n if (comment.createdAt < pointerCreatedAt) {\r\n return false;\r\n }\r\n return pointerId != null ? comment.id > pointerId : false;\r\n }\r\n\r\n return pointerId != null ? comment.id > pointerId : false;\r\n }\r\n\r\n private focusComposer(): void {\r\n queueMicrotask(() => {\r\n this.composerInputRef()?.nativeElement.focus();\r\n });\r\n }\r\n\r\n private scheduleScrollToBottom(behavior: ScrollBehavior): void {\r\n setTimeout(() => {\r\n const viewport = this.viewportRef()?.nativeElement;\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n viewport.scrollTo({\r\n top: viewport.scrollHeight,\r\n behavior,\r\n });\r\n this.atBottom.set(true);\r\n }, 0);\r\n }\r\n\r\n private scheduleAutoMarkRead(): void {\r\n if (!this.autoMarkRead() || !this.hasUnread() || !this.atBottom()) {\r\n return;\r\n }\r\n\r\n if (this.autoReadTimer) {\r\n clearTimeout(this.autoReadTimer);\r\n }\r\n\r\n this.autoReadTimer = setTimeout(() => {\r\n this.autoReadTimer = null;\r\n void this.markRead();\r\n }, 300);\r\n }\r\n\r\n private patchSummaryTotal(delta: number, lastCommentAt?: string): void {\r\n this.threadSummary.update((summary) => {\r\n if (!summary) {\r\n return summary;\r\n }\r\n\r\n return {\r\n ...summary,\r\n totalComments: Math.max(0, summary.totalComments + delta),\r\n lastCommentAt: lastCommentAt ?? summary.lastCommentAt,\r\n };\r\n });\r\n }\r\n\r\n private patchSummaryRead(readState: DiscussionReadStateDto): void {\r\n this.threadSummary.update((summary) => {\r\n if (!summary) {\r\n return summary;\r\n }\r\n\r\n return {\r\n ...summary,\r\n lastReadCommentId: readState.lastReadCommentId,\r\n lastReadCommentCreatedAt: readState.lastReadCommentCreatedAt,\r\n lastReadAt: readState.lastReadAt,\r\n unreadCount: readState.unreadCount,\r\n hasUnread: readState.hasUnread,\r\n };\r\n });\r\n }\r\n\r\n private handleError(\r\n error: unknown,\r\n fallbackMessage: string,\r\n setGlobalError = true,\r\n ): void {\r\n const message = toDiscussionErrorMessage(error, fallbackMessage);\r\n if (setGlobalError) {\r\n this.errorMessage.set(message);\r\n }\r\n this.errored.emit(message);\r\n }\r\n\r\n private generateDraftId(fileName: string): string {\r\n if (\r\n typeof crypto !== 'undefined' &&\r\n typeof crypto.randomUUID === 'function'\r\n ) {\r\n return `${fileName}-${crypto.randomUUID()}`;\r\n }\r\n\r\n return `${fileName}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n}\r\n","<mt-card\r\n class=\"mt-discussion-card h-full min-h-0 w-full overflow-hidden shadow-sm\"\r\n [paddingless]=\"true\"\r\n [ngClass]=\"styleClass()\"\r\n>\r\n <div class=\"flex h-full min-h-0 flex-col overflow-hidden\">\r\n <input\r\n #attachmentInput\r\n type=\"file\"\r\n class=\"hidden\"\r\n multiple\r\n (change)=\"onAttachmentSelected($event)\"\r\n />\r\n\r\n <header\r\n class=\"flex items-center justify-between gap-3 border-b border-surface-200 bg-surface-0 px-4 py-3.5\"\r\n >\r\n <div class=\"min-w-0 flex-1 flex items-center gap-2\">\r\n <div class=\"text-2xl text-surface-500 font-semibold\">\r\n <mt-icon icon=\"communication.message-chat-square\"></mt-icon>\r\n </div>\r\n <h3 class=\"truncate text-base font-semibold text-surface-900\">\r\n {{ title() }}\r\n </h3>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2\">\r\n <mt-button\r\n icon=\"general.dots-vertical\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n [rounded]=\"true\"\r\n styleClass=\"mt-discussion-icon-btn\"\r\n [loading]=\"refreshing()\"\r\n [disabled]=\"loadingInitial() || markingRead()\"\r\n (onClick)=\"actionsPopover.toggle($event)\"\r\n />\r\n\r\n <p-popover\r\n #actionsPopover\r\n appendTo=\"body\"\r\n styleClass=\"mt-discussion-actions-popover\"\r\n >\r\n <div class=\"flex min-w-44 flex-col py-1\">\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 text-left text-sm text-surface-700 transition-colors hover:bg-surface-100 disabled:cursor-not-allowed disabled:opacity-50\"\r\n [disabled]=\"refreshing() || loadingInitial()\"\r\n (click)=\"actionsPopover.hide(); refreshThread()\"\r\n >\r\n <mt-icon icon=\"arrow.refresh-cw-01\"></mt-icon>\r\n\r\n <span>{{ refreshing() ? \"Refreshing...\" : \"Refresh\" }}</span>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 text-left text-sm text-surface-700 transition-colors hover:bg-surface-100 disabled:cursor-not-allowed disabled:opacity-50\"\r\n [disabled]=\"markingRead() || !hasUnread()\"\r\n (click)=\"actionsPopover.hide(); markRead()\"\r\n >\r\n <mt-icon icon=\"general.check\"></mt-icon>\r\n\r\n <span>Mark read</span>\r\n </button>\r\n\r\n @if (showParticipants()) {\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 text-left text-sm text-surface-700 transition-colors hover:bg-surface-100\"\r\n (click)=\"actionsPopover.hide(); toggleParticipantsPanel()\"\r\n >\r\n <mt-icon icon=\"user.users-01\"></mt-icon>\r\n\r\n <span>{{\r\n participantsExpanded()\r\n ? \"Hide participants\"\r\n : \"Show participants\"\r\n }}</span>\r\n </button>\r\n }\r\n </div>\r\n </p-popover>\r\n </div>\r\n </header>\r\n\r\n @if (showParticipants() && participantsExpanded()) {\r\n <section class=\"border-b border-surface-200 px-4 py-3\">\r\n @if (participantsLoading()) {\r\n <span class=\"text-xs text-surface-500\">Loading participants...</span>\r\n } @else if (participantEntities().length === 0) {\r\n <span class=\"text-xs text-surface-500\">No participants yet.</span>\r\n } @else {\r\n <div class=\"max-h-48 overflow-y-auto pr-1\">\r\n <mt-entities-preview [entities]=\"participantEntities()\" />\r\n </div>\r\n }\r\n </section>\r\n }\r\n\r\n @if (errorMessage(); as error) {\r\n <div\r\n class=\"border-b border-red-200 bg-red-50 px-4 py-2 text-sm text-red-700\"\r\n >\r\n {{ error }}\r\n </div>\r\n }\r\n\r\n <div class=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\r\n <div\r\n #viewport\r\n class=\"min-h-0 flex-1 space-y-3 overflow-x-hidden overflow-y-auto overscroll-contain bg-surface-50/60 px-3 py-3\"\r\n (scroll)=\"onViewportScroll()\"\r\n >\r\n @if (hasMore()) {\r\n <div class=\"flex justify-center py-1\">\r\n <mt-button\r\n icon=\"arrow.chevron-up\"\r\n [label]=\"loadingMore() ? 'Loading...' : 'Load older messages'\"\r\n size=\"small\"\r\n [outlined]=\"true\"\r\n [loading]=\"loadingMore()\"\r\n (onClick)=\"loadOlder()\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (loadingInitial()) {\r\n <div class=\"space-y-2\">\r\n @for (item of [1, 2, 3, 4]; track item) {\r\n <div class=\"h-16 animate-pulse rounded-xl bg-surface-100\"></div>\r\n }\r\n </div>\r\n } @else if (commentsAsc().length === 0) {\r\n <div class=\"rounded-2xl p-8 text-center\">\r\n <h4 class=\"text-sm font-semibold text-surface-700\">\r\n No comments yet\r\n </h4>\r\n <p class=\"mt-1 text-xs text-surface-500\">Start the conversation.</p>\r\n </div>\r\n } @else {\r\n @for (comment of commentsAsc(); track trackComment($index, comment)) {\r\n @if (firstUnreadCommentId() === comment.id) {\r\n <div class=\"my-1 flex items-center justify-center gap-2\">\r\n <span\r\n class=\"flex-1 border-t border-dashed border-red-300\"\r\n ></span>\r\n <span\r\n class=\"rounded-full border border-red-200 bg-red-50 px-2 py-0.5 text-[0.67rem] font-bold leading-none text-red-700\"\r\n >Unread messages</span\r\n >\r\n <span\r\n class=\"flex-1 border-t border-dashed border-red-300\"\r\n ></span>\r\n </div>\r\n }\r\n\r\n <article\r\n class=\"group flex gap-2\"\r\n [class.justify-end]=\"isOwnComment(comment)\"\r\n >\r\n @if (!isOwnComment(comment)) {\r\n <div\r\n class=\"mt-0.5 inline-flex h-[1.9rem] w-[1.9rem] shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_20%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.74rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_75%,black)]\"\r\n >\r\n {{ getAvatarText(comment) }}\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"w-fit min-w-0 max-w-full rounded-[1.35rem] border border-surface-200 bg-white px-3 py-2.5 sm:max-w-[90%]\"\r\n [class.bg-[color-mix(in_srgb,var(--p-primary-color)_7%,white)]]=\"\r\n isOwnComment(comment)\r\n \"\r\n >\r\n <div\r\n class=\"mb-1 flex flex-wrap items-center justify-between gap-2\"\r\n >\r\n <div\r\n class=\"text-xs w-full text-surface-600 flex justify-between\"\r\n >\r\n <div class=\"font-semibold text-surface-900\">\r\n {{ comment.createdBy }}\r\n </div>\r\n <div>\r\n <span>{{\r\n comment.createdAt | date: \"MMM d, y h:mm a\"\r\n }}</span>\r\n @if (comment.updatedAt) {\r\n <span class=\"ml-1 text-[11px] text-surface-500\"\r\n >(edited)</span\r\n >\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (getParentComment(comment); as parentComment) {\r\n <button\r\n type=\"button\"\r\n class=\"mb-2 block w-full rounded-xl border border-surface-200 bg-surface-50 px-2 py-1 text-left text-xs text-surface-600\"\r\n (click)=\"openReply(parentComment)\"\r\n >\r\n <span class=\"font-semibold\">{{\r\n parentComment.createdBy\r\n }}</span>\r\n <span class=\"mx-1\">:</span>\r\n <span class=\"line-clamp-1\">{{\r\n parentComment.comment\r\n }}</span>\r\n </button>\r\n }\r\n\r\n @if (editingCommentId() === comment.id) {\r\n <div class=\"relative\">\r\n <textarea\r\n rows=\"3\"\r\n class=\"w-full min-h-[5.25rem] resize-y rounded-2xl border border-surface-300 bg-white px-3 py-2.5 text-[0.86rem] leading-[1.45] text-surface-900 outline-none focus-visible:outline-2 focus-visible:outline-[color-mix(in_srgb,var(--p-primary-color)_32%,transparent)] focus-visible:outline-offset-1\"\r\n [ngModel]=\"editText()\"\r\n (ngModelChange)=\"editText.set($event)\"\r\n (input)=\"onEditInput($event)\"\r\n (keyup)=\"onEditCaretEvent($event)\"\r\n (click)=\"onEditCaretEvent($event)\"\r\n (scroll)=\"onEditCaretEvent($event)\"\r\n (keydown)=\"onEditKeydown($event)\"\r\n ></textarea>\r\n\r\n @if (\r\n mentionSession()?.mode === \"edit\" &&\r\n mentionSession()?.editCommentId === comment.id\r\n ) {\r\n <div\r\n class=\"absolute top-0 left-0 z-20 min-w-56 overflow-auto rounded-xl border border-surface-300 bg-white shadow-sm\"\r\n [ngStyle]=\"mentionMenuStyle()\"\r\n [class.origin-bottom-left]=\"\r\n mentionMenuPosition()?.placement === 'above'\r\n \"\r\n >\r\n @if (mentionLoading()) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n Searching...\r\n </div>\r\n } @else if (mentionCandidates().length === 0) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n No matches\r\n </div>\r\n } @else {\r\n @for (\r\n candidate of mentionCandidates();\r\n track candidate.userId;\r\n let i = $index\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-start gap-2 bg-transparent px-2.5 py-2 text-left text-[0.78rem] transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]\"\r\n [class.bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]]=\"\r\n mentionActiveIndex() === i\r\n \"\r\n (click)=\"selectMention(candidate)\"\r\n >\r\n <span\r\n class=\"mt-px inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_18%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.7rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)]\"\r\n >\r\n {{ getMentionAvatarText(candidate) }}\r\n </span>\r\n <span\r\n class=\"flex min-w-0 flex-1 flex-col gap-0.5\"\r\n >\r\n <span\r\n class=\"text-[0.79rem] leading-[1.25] font-semibold text-surface-900\"\r\n >{{\r\n candidate.displayName ||\r\n candidate.userName ||\r\n candidate.userId\r\n }}</span\r\n >\r\n <span\r\n class=\"inline-flex items-center text-[0.73rem] leading-[1.2] text-surface-500\"\r\n >\r\n @{{ candidate.userId }}\r\n </span>\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"mt-2 flex flex-wrap items-center justify-between gap-2\"\r\n >\r\n <span class=\"text-xs text-surface-500\"\r\n >{{ editText().length }}/10000</span\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n class=\"rounded-[0.65rem] border border-surface-300 bg-transparent px-3 py-2 text-xs font-semibold leading-none text-surface-700 transition-colors hover:border-[color-mix(in_srgb,var(--p-primary-color)_24%,transparent)] hover:bg-[color-mix(in_srgb,var(--p-primary-color)_8%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"cancelEdit()\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"rounded-[0.65rem] border border-[color-mix(in_srgb,var(--p-primary-color)_26%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_12%,white)] px-3 py-2 text-xs font-bold leading-none text-[color-mix(in_srgb,var(--p-primary-color)_76%,black)] transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_17%,white)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n [disabled]=\"!canSaveEdit()\"\r\n (click)=\"saveEdit()\"\r\n >\r\n {{ savingEdit() ? \"Saving...\" : \"Save\" }}\r\n </button>\r\n </div>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"whitespace-pre-wrap pt-1 break-words text-sm leading-6\"\r\n >\r\n @for (\r\n segment of getCommentSegments(comment);\r\n track $index\r\n ) {\r\n <span\r\n [ngClass]=\"\r\n segment.isMention\r\n ? 'rounded-sm bg-primary-50 px-0.5 font-semibold text-primary-700'\r\n : ''\r\n \"\r\n [attr.data-user-id]=\"segment.userId || null\"\r\n >\r\n {{ segment.text }}\r\n </span>\r\n }\r\n </div>\r\n\r\n @if (comment.attachments.length > 0) {\r\n <div class=\"mt-2 flex flex-wrap gap-2\">\r\n @for (\r\n attachment of comment.attachments;\r\n track attachment.id\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex max-w-full items-center gap-1.5 rounded-lg border border-surface-300 px-2 py-1 text-[0.72rem] hover:bg-surface-50\"\r\n (click)=\"downloadAttachment(comment, attachment)\"\r\n >\r\n <span class=\"truncate\">{{\r\n attachment.fileName\r\n }}</span>\r\n <span class=\"text-[11px] text-surface-500\"\r\n >({{ attachment.size | number }} bytes)</span\r\n >\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"mt-2 flex flex-wrap items-center gap-1\">\r\n @if (!comment.isSystem) {\r\n <button\r\n type=\"button\"\r\n class=\"cursor-pointer rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"openReply(comment)\"\r\n >\r\n Reply\r\n </button>\r\n }\r\n @if (canEditComment(comment)) {\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"startEdit(comment)\"\r\n >\r\n Edit\r\n </button>\r\n }\r\n @if (canDeleteComment(comment)) {\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-red-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n [disabled]=\"isDeleting(comment.id)\"\r\n (click)=\"deleteComment(comment)\"\r\n >\r\n {{ isDeleting(comment.id) ? \"Deleting...\" : \"Delete\" }}\r\n </button>\r\n }\r\n @if (comment.updatedAt) {\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"openRevisions(comment)\"\r\n >\r\n History\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (isOwnComment(comment)) {\r\n <div\r\n class=\"mt-0.5 inline-flex h-[1.9rem] w-[1.9rem] shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_20%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.74rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_75%,black)]\"\r\n >\r\n {{ getAvatarText(comment) }}\r\n </div>\r\n }\r\n </article>\r\n }\r\n }\r\n </div>\r\n\r\n <footer\r\n class=\"z-10 shrink-0 border-t border-surface-200 bg-content px-3 py-3\"\r\n >\r\n @if (replyToComment(); as replyComment) {\r\n <div\r\n class=\"mb-2 flex items-center justify-between rounded-xl border border-surface-200 bg-surface-50 px-2 py-1\"\r\n >\r\n <div class=\"min-w-0 text-xs text-surface-600\">\r\n <span class=\"font-semibold\"\r\n >Replying to {{ replyComment.createdBy }}</span\r\n >\r\n <p class=\"truncate\">{{ replyComment.comment }}</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"clearReply()\"\r\n >\r\n Cancel\r\n </button>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"rounded-[1.5rem] border border-surface-300 bg-white p-2.5 shadow-sm\"\r\n >\r\n <div class=\"relative\">\r\n <textarea\r\n #composerInput\r\n rows=\"2\"\r\n class=\"w-full min-h-[3.75rem] resize-none border-0 bg-transparent px-2 pb-10 pr-24 pt-1 text-[0.9rem] leading-[1.45] text-surface-900 outline-none\"\r\n [disabled]=\"disabled() || posting()\"\r\n [ngModel]=\"composerText()\"\r\n (ngModelChange)=\"composerText.set($event)\"\r\n (input)=\"onComposerInput($event)\"\r\n (keyup)=\"onComposerCaretEvent($event)\"\r\n (click)=\"onComposerCaretEvent($event)\"\r\n (scroll)=\"onComposerCaretEvent($event)\"\r\n (keydown)=\"onComposerKeydown($event)\"\r\n [placeholder]=\"placeholder()\"\r\n ></textarea>\r\n\r\n <div class=\"absolute right-1 bottom-1 flex items-center gap-2\">\r\n @if (allowAttachments()) {\r\n <mt-button\r\n icon=\"file.paperclip\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n [rounded]=\"true\"\r\n styleClass=\"mt-discussion-icon-btn\"\r\n [disabled]=\"disabled() || posting()\"\r\n (onClick)=\"browseAttachments()\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"communication.send-01\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n styleClass=\"mt-discussion-send-btn\"\r\n [loading]=\"posting()\"\r\n [disabled]=\"!canSend()\"\r\n (onClick)=\"sendComment()\"\r\n />\r\n </div>\r\n\r\n @if (mentionSession()?.mode === \"composer\") {\r\n <div\r\n class=\"absolute top-0 left-0 z-30 min-w-56 overflow-auto rounded-xl border border-surface-300 bg-white shadow-sm\"\r\n [ngStyle]=\"mentionMenuStyle()\"\r\n [class.origin-bottom-left]=\"\r\n mentionMenuPosition()?.placement === 'above'\r\n \"\r\n >\r\n @if (mentionLoading()) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n Searching...\r\n </div>\r\n } @else if (mentionCandidates().length === 0) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n No matches\r\n </div>\r\n } @else {\r\n @for (\r\n candidate of mentionCandidates();\r\n track candidate.userId;\r\n let i = $index\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-start gap-2 bg-transparent px-2.5 py-2 text-left text-[0.78rem] transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]\"\r\n [class.bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]]=\"\r\n mentionActiveIndex() === i\r\n \"\r\n (click)=\"selectMention(candidate)\"\r\n >\r\n <span\r\n class=\"mt-px inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_18%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.7rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)]\"\r\n >\r\n {{ getMentionAvatarText(candidate) }}\r\n </span>\r\n <span class=\"flex min-w-0 flex-1 flex-col gap-0.5\">\r\n <span\r\n class=\"text-[0.79rem] leading-[1.25] font-semibold text-surface-900\"\r\n >{{\r\n candidate.displayName ||\r\n candidate.userName ||\r\n candidate.userId\r\n }}</span\r\n >\r\n <span\r\n class=\"inline-flex items-center text-[0.73rem] leading-[1.2] text-surface-500\"\r\n >\r\n @{{ candidate.userId }}\r\n </span>\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (composerAttachments().length > 0) {\r\n <div class=\"mt-2 flex flex-wrap gap-2 px-1\">\r\n @for (attachment of composerAttachments(); track attachment.id) {\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-50 px-2.5 py-1.5 text-xs\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"max-w-[12rem] truncate\">{{\r\n attachment.fileName\r\n }}</span>\r\n @if (attachment.status === \"uploading\") {\r\n <span class=\"text-surface-500\"\r\n >{{ attachment.progress }}%</span\r\n >\r\n } @else if (attachment.status === \"failed\") {\r\n <span class=\"text-red-600\">Failed</span>\r\n } @else {\r\n <span class=\"text-emerald-600\">Ready</span>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"removeAttachment(attachment.id)\"\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n @if (attachment.error) {\r\n <p class=\"text-[11px] text-red-600\">\r\n {{ attachment.error }}\r\n </p>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (composerText().length > 10000) {\r\n <div class=\"mt-2 px-1 text-xs font-medium text-red-600\">\r\n Comment cannot exceed 10000 characters.\r\n </div>\r\n }\r\n </div>\r\n </footer>\r\n </div>\r\n </div>\r\n</mt-card>\r\n\r\n<p-dialog\r\n [visible]=\"revisionsDialogVisible()\"\r\n (visibleChange)=\"revisionsDialogVisible.set($event)\"\r\n [modal]=\"true\"\r\n [dismissableMask]=\"true\"\r\n [draggable]=\"false\"\r\n [resizable]=\"false\"\r\n [style]=\"{ width: 'min(42rem, 92vw)' }\"\r\n header=\"Comment history\"\r\n>\r\n @if (revisionLoading()) {\r\n <div class=\"space-y-2\">\r\n @for (row of [1, 2, 3]; track row) {\r\n <div class=\"h-12 animate-pulse rounded-xl bg-surface-100\"></div>\r\n }\r\n </div>\r\n } @else if (visibleRevisions().length === 0) {\r\n <p class=\"text-sm text-surface-500\">No revision snapshots.</p>\r\n } @else {\r\n <div class=\"max-h-[55vh] space-y-2 overflow-y-auto pr-1\">\r\n @for (revision of visibleRevisions(); track revision.id) {\r\n <article class=\"rounded-xl border border-surface-200 p-3\">\r\n <div class=\"mb-1 text-xs text-surface-500\">\r\n Revision #{{ revision.revisionNumber }} &bull;\r\n {{ revision.createdAt | date: \"MMM d, y h:mm a\" }} &bull;\r\n {{ revision.createdBy }}\r\n </div>\r\n <div class=\"whitespace-pre-wrap break-words text-sm leading-6\">\r\n @for (\r\n segment of getCommentSegments({\r\n id: revision.id,\r\n moduleType: selectedRevisionComment()?.moduleType || \"\",\r\n recordId: selectedRevisionComment()?.recordId || 0,\r\n parentCommentId: null,\r\n comment: revision.comment,\r\n isSystem: false,\r\n createdAt: revision.createdAt,\r\n updatedAt: null,\r\n createdBy: revision.createdBy,\r\n updatedBy: null,\r\n attachments: [],\r\n mentions: revision.mentions,\r\n });\r\n track $index\r\n ) {\r\n <span\r\n [ngClass]=\"\r\n segment.isMention\r\n ? 'rounded-sm bg-primary-50 px-0.5 font-semibold text-primary-700'\r\n : ''\r\n \"\r\n >{{ segment.text }}</span\r\n >\r\n }\r\n </div>\r\n </article>\r\n }\r\n </div>\r\n }\r\n</p-dialog>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-discussion.mjs","sources":["../../../../packages/masterteam/discussion/discussion/utils/discussion.utils.ts","../../../../packages/masterteam/discussion/discussion/services/discussion-api.service.ts","../../../../packages/masterteam/discussion/discussion/components/discussion-thread/discussion-thread.ts","../../../../packages/masterteam/discussion/discussion/components/discussion-thread/discussion-thread.html","../../../../packages/masterteam/discussion/discussion/masterteam-discussion.ts"],"sourcesContent":["import type {\r\n AppResponseViewModel,\r\n DiscussionMentionDto,\r\n DiscussionMentionUser,\r\n DiscussionReadStateDto,\r\n DiscussionReadStateLike,\r\n DiscussionThreadSummaryDto,\r\n} from '../models/discussion.model';\r\n\r\nconst MODULE_TYPE_ALIASES: Record<string, string> = {\r\n leveldata: 'Level',\r\n level: 'Level',\r\n processrequest: 'ProcessRequest',\r\n escalationinstance: 'EscalationInstance',\r\n};\r\n\r\nexport function normalizeDiscussionModuleType(moduleType: string): string {\r\n const value = moduleType.trim();\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const alias = MODULE_TYPE_ALIASES[value.toLowerCase()];\r\n return alias ?? value;\r\n}\r\n\r\nexport function normalizeDiscussionRecordId(recordId: number): number {\r\n const value = Number(recordId);\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.floor(value);\r\n}\r\n\r\nexport function isValidDiscussionThread(\r\n moduleType: string,\r\n recordId: number,\r\n): boolean {\r\n return !!moduleType.trim() && normalizeDiscussionRecordId(recordId) > 0;\r\n}\r\n\r\nexport function buildDiscussionThreadKey(\r\n moduleType: string,\r\n recordId: number,\r\n): string {\r\n const normalizedModuleType = normalizeDiscussionModuleType(moduleType);\r\n const normalizedRecordId = normalizeDiscussionRecordId(recordId);\r\n return normalizedModuleType && normalizedRecordId > 0\r\n ? `${normalizedModuleType}/${normalizedRecordId}`\r\n : '';\r\n}\r\n\r\nexport function unwrapAppResponseViewModel<T>(\r\n response: AppResponseViewModel<T>,\r\n fallbackMessage: string,\r\n): T {\r\n if (response.code === 2) {\r\n throw new Error(\r\n response.errors?.message || response.message || fallbackMessage,\r\n );\r\n }\r\n\r\n return response.data;\r\n}\r\n\r\nexport function toDiscussionErrorMessage(\r\n error: unknown,\r\n fallbackMessage: string,\r\n): string {\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n\r\n if (error instanceof Error) {\r\n return error.message || fallbackMessage;\r\n }\r\n\r\n const nestedMessage =\r\n (error as { error?: { message?: string } } | undefined)?.error?.message ??\r\n (error as { message?: string } | undefined)?.message;\r\n\r\n if (nestedMessage && typeof nestedMessage === 'string') {\r\n return nestedMessage;\r\n }\r\n\r\n return fallbackMessage;\r\n}\r\n\r\nexport function readPathValue<T>(\r\n source: unknown,\r\n path: string,\r\n fallback: T,\r\n): T {\r\n if (!path.trim()) {\r\n return (source as T) ?? fallback;\r\n }\r\n\r\n const keys = path.split('.').map((item) => item.trim());\r\n let cursor: unknown = source;\r\n\r\n for (const key of keys) {\r\n if (!key || cursor == null || typeof cursor !== 'object') {\r\n return fallback;\r\n }\r\n\r\n cursor = (cursor as Record<string, unknown>)[key];\r\n }\r\n\r\n return (cursor as T) ?? fallback;\r\n}\r\n\r\nexport function normalizeMentionUser(\r\n value: unknown,\r\n): DiscussionMentionUser | null {\r\n if (!value || typeof value !== 'object') {\r\n return null;\r\n }\r\n\r\n const item = value as Record<string, unknown>;\r\n const userIdRaw =\r\n item['userId'] ??\r\n item['id'] ??\r\n item['value'] ??\r\n item['userID'] ??\r\n item['user_id'];\r\n const userId = String(userIdRaw ?? '').trim();\r\n\r\n if (!userId) {\r\n return null;\r\n }\r\n\r\n const displayNameRaw =\r\n item['displayName'] ??\r\n item['name'] ??\r\n item['fullName'] ??\r\n item['userName'] ??\r\n item['username'] ??\r\n userId;\r\n const displayName = String(displayNameRaw ?? userId).trim() || userId;\r\n const userNameRaw = item['userName'] ?? item['username'] ?? null;\r\n const avatarRaw = item['avatarUrl'] ?? item['photo'] ?? item['image'] ?? null;\r\n\r\n return {\r\n userId,\r\n displayName,\r\n userName: userNameRaw ? String(userNameRaw) : null,\r\n avatarUrl: avatarRaw ? String(avatarRaw) : null,\r\n };\r\n}\r\n\r\nexport function dedupeMentionUsers(\r\n users: DiscussionMentionUser[],\r\n): DiscussionMentionUser[] {\r\n const seen = new Set<string>();\r\n const result: DiscussionMentionUser[] = [];\r\n\r\n for (const user of users) {\r\n const key = user.userId.toLowerCase();\r\n if (seen.has(key)) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n result.push(user);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function sanitizeMentions(\r\n mentions: DiscussionMentionDto[],\r\n commentText: string,\r\n): DiscussionMentionDto[] {\r\n const textLength = commentText.length;\r\n const unique = new Set<string>();\r\n const normalized = mentions\r\n .map((mention) => ({\r\n userId: mention.userId?.trim(),\r\n startIndex: Math.floor(Number(mention.startIndex)),\r\n length: Math.floor(Number(mention.length)),\r\n }))\r\n .filter(\r\n (mention) =>\r\n !!mention.userId &&\r\n mention.startIndex >= 0 &&\r\n mention.length > 0 &&\r\n mention.startIndex + mention.length <= textLength,\r\n )\r\n .sort((left, right) => {\r\n if (left.startIndex !== right.startIndex) {\r\n return left.startIndex - right.startIndex;\r\n }\r\n\r\n return left.length - right.length;\r\n })\r\n .filter((mention) => {\r\n const key = `${mention.userId}::${mention.startIndex}::${mention.length}`;\r\n if (unique.has(key)) {\r\n return false;\r\n }\r\n\r\n unique.add(key);\r\n return true;\r\n });\r\n\r\n return normalized;\r\n}\r\n\r\nexport function mapSummaryToReadState(\r\n summary: DiscussionThreadSummaryDto,\r\n): DiscussionReadStateLike {\r\n return {\r\n lastReadCommentId: summary.lastReadCommentId,\r\n lastReadCommentCreatedAt: summary.lastReadCommentCreatedAt,\r\n unreadCount: summary.unreadCount,\r\n hasUnread: summary.hasUnread,\r\n };\r\n}\r\n\r\nexport function mapReadStateToLike(\r\n readState: DiscussionReadStateDto | null,\r\n): DiscussionReadStateLike | null {\r\n if (!readState) {\r\n return null;\r\n }\r\n\r\n return {\r\n lastReadCommentId: readState.lastReadCommentId,\r\n lastReadCommentCreatedAt: readState.lastReadCommentCreatedAt,\r\n unreadCount: readState.unreadCount,\r\n hasUnread: readState.hasUnread,\r\n };\r\n}\r\n","import {\r\n HttpClient,\r\n HttpContext,\r\n HttpEventType,\r\n HttpHeaders,\r\n HttpParams,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\r\nimport { filter, map, type Observable } from 'rxjs';\r\nimport type {\r\n AppResponseViewModel,\r\n DiscussionAddParticipantRequest,\r\n DiscussionAttachmentUploadProgressEvent,\r\n DiscussionAttachmentUploadResult,\r\n DiscussionCommentDto,\r\n DiscussionCommentRevisionDto,\r\n DiscussionCommentsPageDto,\r\n DiscussionCreateCommentRequest,\r\n DiscussionMentionUser,\r\n DiscussionParticipantDto,\r\n DiscussionReadStateDto,\r\n DiscussionThreadSummaryDto,\r\n DiscussionUpdateCommentRequest,\r\n DiscussionUpdateReadStateRequest,\r\n} from '../models/discussion.model';\r\nimport {\r\n normalizeMentionUser,\r\n readPathValue,\r\n unwrapAppResponseViewModel,\r\n} from '../utils/discussion.utils';\r\n\r\ninterface DiscussionAttachmentUploadApiDto {\r\n id?: string | null;\r\n fileId?: string | null;\r\n name?: string | null;\r\n fileName?: string | null;\r\n originalFileName?: string | null;\r\n contentType?: string | null;\r\n size?: number | null;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DiscussionApiService {\r\n private readonly http = inject(HttpClient);\r\n private readonly defaultContext = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n });\r\n private readonly baseRoute = 'discussions';\r\n\r\n getThreadSummary(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionThreadSummaryDto> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionThreadSummaryDto>>(\r\n this.threadRoute(moduleType, recordId),\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to load discussion.'),\r\n ),\r\n );\r\n }\r\n\r\n getComments(\r\n moduleType: string,\r\n recordId: number,\r\n take = 30,\r\n cursor?: string | null,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentsPageDto> {\r\n let params = new HttpParams().set('take', String(take));\r\n if (cursor) {\r\n params = params.set('cursor', cursor);\r\n }\r\n\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionCommentsPageDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments`,\r\n {\r\n params,\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(\r\n response,\r\n 'Failed to load discussion comments.',\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n createComment(\r\n moduleType: string,\r\n recordId: number,\r\n request: DiscussionCreateCommentRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentDto> {\r\n return this.http\r\n .post<AppResponseViewModel<DiscussionCommentDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments`,\r\n request,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-create-comment'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to create comment.'),\r\n ),\r\n );\r\n }\r\n\r\n updateComment(\r\n moduleType: string,\r\n recordId: number,\r\n commentId: number,\r\n request: DiscussionUpdateCommentRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentDto> {\r\n return this.http\r\n .patch<AppResponseViewModel<DiscussionCommentDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments/${commentId}`,\r\n request,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-update-comment'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to update comment.'),\r\n ),\r\n );\r\n }\r\n\r\n deleteComment(\r\n moduleType: string,\r\n recordId: number,\r\n commentId: number,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<AppResponseViewModel<boolean>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments/${commentId}`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-delete-comment'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to delete comment.'),\r\n ),\r\n );\r\n }\r\n\r\n getCommentRevisions(\r\n moduleType: string,\r\n recordId: number,\r\n commentId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionCommentRevisionDto[]> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionCommentRevisionDto[]>>(\r\n `${this.threadRoute(moduleType, recordId)}/comments/${commentId}/revisions`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(\r\n response,\r\n 'Failed to load comment revisions.',\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n getParticipants(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionParticipantDto[]> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionParticipantDto[]>>(\r\n `${this.threadRoute(moduleType, recordId)}/participants`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(\r\n response,\r\n 'Failed to load discussion participants.',\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n addParticipant(\r\n moduleType: string,\r\n recordId: number,\r\n request: DiscussionAddParticipantRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionParticipantDto> {\r\n return this.http\r\n .post<AppResponseViewModel<DiscussionParticipantDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/participants`,\r\n request,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-add-participant'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to add participant.'),\r\n ),\r\n );\r\n }\r\n\r\n getReadState(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<DiscussionReadStateDto> {\r\n return this.http\r\n .get<AppResponseViewModel<DiscussionReadStateDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/read-state`,\r\n {\r\n context: this.resolveContext(context),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to load read state.'),\r\n ),\r\n );\r\n }\r\n\r\n markReadState(\r\n moduleType: string,\r\n recordId: number,\r\n request?: DiscussionUpdateReadStateRequest,\r\n context?: HttpContext,\r\n ): Observable<DiscussionReadStateDto> {\r\n return this.http\r\n .put<AppResponseViewModel<DiscussionReadStateDto>>(\r\n `${this.threadRoute(moduleType, recordId)}/read-state`,\r\n request?.lastReadCommentId ? request : {},\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-mark-read'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to mark read state.'),\r\n ),\r\n );\r\n }\r\n\r\n clearReadState(\r\n moduleType: string,\r\n recordId: number,\r\n context?: HttpContext,\r\n ): Observable<boolean> {\r\n return this.http\r\n .delete<AppResponseViewModel<boolean>>(\r\n `${this.threadRoute(moduleType, recordId)}/read-state`,\r\n {\r\n context: this.resolveContext(context),\r\n headers: this.mutationHeaders('discussion-clear-read'),\r\n },\r\n )\r\n .pipe(\r\n map((response) =>\r\n unwrapAppResponseViewModel(response, 'Failed to clear read state.'),\r\n ),\r\n );\r\n }\r\n\r\n uploadAttachment(\r\n file: File,\r\n uploadEndpoint: string,\r\n context?: HttpContext,\r\n ): Observable<DiscussionAttachmentUploadProgressEvent> {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n return this.http\r\n .post<\r\n | AppResponseViewModel<DiscussionAttachmentUploadApiDto>\r\n | { data?: DiscussionAttachmentUploadApiDto }\r\n >(uploadEndpoint, formData, {\r\n reportProgress: true,\r\n observe: 'events',\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((event): DiscussionAttachmentUploadProgressEvent | null => {\r\n if (event.type === HttpEventType.UploadProgress) {\r\n return {\r\n progress: event.total\r\n ? Math.round((event.loaded / event.total) * 100)\r\n : 0,\r\n completed: false,\r\n } satisfies DiscussionAttachmentUploadProgressEvent;\r\n }\r\n\r\n if (event.type === HttpEventType.Response && event.body) {\r\n return {\r\n progress: 100,\r\n completed: true,\r\n file: this.mapUploadPayload(event.body, file),\r\n } satisfies DiscussionAttachmentUploadProgressEvent;\r\n }\r\n\r\n return null;\r\n }),\r\n filter(\r\n (value): value is DiscussionAttachmentUploadProgressEvent =>\r\n value != null,\r\n ),\r\n );\r\n }\r\n\r\n searchMentionUsers(\r\n endpoint: string,\r\n query: string,\r\n paramName: string,\r\n dataPath: string,\r\n context?: HttpContext,\r\n ): Observable<DiscussionMentionUser[]> {\r\n const params = new HttpParams().set(paramName, query);\r\n\r\n return this.http\r\n .get<unknown>(endpoint, {\r\n params,\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((response) => {\r\n const payload = this.unwrapUnknownResponse(response);\r\n const candidates = readPathValue<unknown[]>(\r\n payload,\r\n dataPath,\r\n Array.isArray(payload) ? payload : [],\r\n );\r\n\r\n return candidates\r\n .map((item) => normalizeMentionUser(item))\r\n .filter((item): item is DiscussionMentionUser => item != null);\r\n }),\r\n );\r\n }\r\n\r\n downloadAttachment(\r\n endpoint: string,\r\n fileId: string,\r\n fileName: string,\r\n context?: HttpContext,\r\n ): Observable<void> {\r\n const url = this.resolveDownloadEndpoint(endpoint, fileId);\r\n\r\n return this.http\r\n .get(url, {\r\n responseType: 'blob',\r\n context: this.resolveContext(context),\r\n })\r\n .pipe(\r\n map((blob) => {\r\n const objectUrl = window.URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = objectUrl;\r\n link.download = fileName;\r\n link.click();\r\n window.URL.revokeObjectURL(objectUrl);\r\n }),\r\n );\r\n }\r\n\r\n private threadRoute(moduleType: string, recordId: number): string {\r\n return `${this.baseRoute}/${encodeURIComponent(moduleType)}/${recordId}`;\r\n }\r\n\r\n private resolveContext(context?: HttpContext): HttpContext {\r\n return context ?? this.defaultContext;\r\n }\r\n\r\n private mutationHeaders(seed: string): HttpHeaders {\r\n return new HttpHeaders({\r\n 'X-Idempotency-Key': this.idempotencyKey(seed),\r\n });\r\n }\r\n\r\n private idempotencyKey(seed: string): string {\r\n if (\r\n typeof crypto !== 'undefined' &&\r\n typeof crypto.randomUUID === 'function'\r\n ) {\r\n return `${seed}-${crypto.randomUUID()}`;\r\n }\r\n\r\n return `${seed}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\r\n }\r\n\r\n private unwrapUnknownResponse(response: unknown): unknown {\r\n if (!response || typeof response !== 'object') {\r\n return response;\r\n }\r\n\r\n const asResponse = response as AppResponseViewModel<unknown>;\r\n if (typeof asResponse.code === 'number' && asResponse.code === 2) {\r\n throw new Error(\r\n asResponse.errors?.message ||\r\n asResponse.message ||\r\n 'Request failed while loading mention candidates.',\r\n );\r\n }\r\n\r\n if ('data' in asResponse) {\r\n return asResponse.data;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n private mapUploadPayload(\r\n response:\r\n | AppResponseViewModel<DiscussionAttachmentUploadApiDto>\r\n | { data?: DiscussionAttachmentUploadApiDto },\r\n file: File,\r\n ): DiscussionAttachmentUploadResult {\r\n const payload = this.unwrapUnknownResponse(response) as\r\n | DiscussionAttachmentUploadApiDto\r\n | null\r\n | undefined;\r\n\r\n // Uploader integrations usually expose:\r\n // - fileName: storage key / retrievable id (for API payloads)\r\n // - name: original file name (for UI display)\r\n const fileId = String(\r\n payload?.fileId ??\r\n payload?.fileName ??\r\n payload?.id ??\r\n payload?.name ??\r\n file.name,\r\n ).trim();\r\n\r\n const displayFileName = String(\r\n payload?.name ??\r\n payload?.originalFileName ??\r\n payload?.fileName ??\r\n file.name,\r\n ).trim();\r\n\r\n return {\r\n fileId,\r\n fileName: displayFileName || file.name,\r\n contentType: payload?.contentType ?? file.type,\r\n size: payload?.size ?? file.size,\r\n };\r\n }\r\n\r\n private resolveDownloadEndpoint(endpoint: string, fileId: string): string {\r\n const cleanEndpoint = endpoint.trim() || 'uploader';\r\n\r\n if (cleanEndpoint.includes('{fileId}')) {\r\n return cleanEndpoint.replace('{fileId}', encodeURIComponent(fileId));\r\n }\r\n\r\n return `${cleanEndpoint.replace(/\\/$/, '')}/${encodeURIComponent(fileId)}`;\r\n }\r\n}\r\n","import { CommonModule, DatePipe } from '@angular/common';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { EntitiesPreview } from '@masterteam/components/entities';\r\nimport type {\r\n EntityData,\r\n EntityUserValue,\r\n} from '@masterteam/components/entities';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport {\r\n Subject,\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n finalize,\r\n firstValueFrom,\r\n map,\r\n of,\r\n switchMap,\r\n} from 'rxjs';\r\nimport type {\r\n DiscussionAttachmentDraft,\r\n DiscussionCommentDto,\r\n DiscussionCommentRevisionDto,\r\n DiscussionCommentSegment,\r\n DiscussionCommentsPageDto,\r\n DiscussionMentionDto,\r\n DiscussionMentionUser,\r\n DiscussionParticipantDto,\r\n DiscussionReadStateDto,\r\n DiscussionReadStateLike,\r\n DiscussionThreadSummaryDto,\r\n} from '../../models/discussion.model';\r\nimport { DiscussionApiService } from '../../services/discussion-api.service';\r\nimport {\r\n buildDiscussionThreadKey,\r\n dedupeMentionUsers,\r\n isValidDiscussionThread,\r\n mapReadStateToLike,\r\n mapSummaryToReadState,\r\n normalizeDiscussionModuleType,\r\n normalizeDiscussionRecordId,\r\n sanitizeMentions,\r\n toDiscussionErrorMessage,\r\n} from '../../utils/discussion.utils';\r\nimport { Icon } from '@masterteam/icons';\r\n\r\ninterface TextMutation {\r\n start: number;\r\n beforeEnd: number;\r\n delta: number;\r\n}\r\n\r\ntype MentionMode = 'composer' | 'edit';\r\n\r\ninterface MentionSession {\r\n mode: MentionMode;\r\n triggerIndex: number;\r\n caretIndex: number;\r\n query: string;\r\n textarea: HTMLTextAreaElement;\r\n editCommentId: number | null;\r\n}\r\n\r\ninterface MentionMenuPosition {\r\n left: number;\r\n top: number;\r\n width: number;\r\n maxHeight: number;\r\n placement: 'above' | 'below';\r\n}\r\n\r\ninterface MentionCaretMetrics {\r\n x: number;\r\n y: number;\r\n lineHeight: number;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-discussion-thread',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n DatePipe,\r\n DialogModule,\r\n PopoverModule,\r\n Button,\r\n Card,\r\n EntitiesPreview,\r\n Icon,\r\n ],\r\n templateUrl: './discussion-thread.html',\r\n styleUrl: './discussion-thread.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block h-full min-h-0',\r\n },\r\n})\r\nexport class DiscussionThread {\r\n private readonly api = inject(DiscussionApiService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n readonly moduleType = input.required<string>();\r\n readonly recordId = input.required<number>();\r\n\r\n readonly title = input<string>('Discussion');\r\n readonly subtitle = input<string>('');\r\n readonly placeholder = input<string>('Write a message');\r\n readonly pageSize = input<number>(30);\r\n readonly currentUserId = input<string>('');\r\n readonly requestContext = input<HttpContext | undefined>(undefined);\r\n\r\n readonly mentionableUsers = input<DiscussionMentionUser[]>([]);\r\n readonly mentionSearchEndpoint = input<string>('');\r\n readonly mentionSearchParam = input<string>('query');\r\n readonly mentionSearchDataPath = input<string>('data');\r\n\r\n readonly allowAttachments = input<boolean>(true);\r\n readonly uploadEndpoint = input<string>('uploader');\r\n readonly attachmentDownloadEndpoint = input<string>('uploader');\r\n\r\n readonly showParticipants = input<boolean>(true);\r\n\r\n readonly autoMarkRead = input<boolean>(true);\r\n readonly refreshIntervalMs = input<number>(0);\r\n readonly styleClass = input<string>('');\r\n readonly disabled = input<boolean>(false);\r\n\r\n readonly loaded = output<DiscussionThreadSummaryDto>();\r\n readonly errored = output<string>();\r\n readonly commentCreated = output<DiscussionCommentDto>();\r\n readonly commentUpdated = output<DiscussionCommentDto>();\r\n readonly commentDeleted = output<number>();\r\n readonly readStateChanged = output<DiscussionReadStateDto | null>();\r\n\r\n protected readonly viewportRef =\r\n viewChild<ElementRef<HTMLDivElement>>('viewport');\r\n protected readonly composerInputRef =\r\n viewChild<ElementRef<HTMLTextAreaElement>>('composerInput');\r\n protected readonly attachmentInputRef =\r\n viewChild<ElementRef<HTMLInputElement>>('attachmentInput');\r\n\r\n protected readonly loadingInitial = signal(false);\r\n protected readonly loadingMore = signal(false);\r\n protected readonly posting = signal(false);\r\n protected readonly refreshing = signal(false);\r\n protected readonly markingRead = signal(false);\r\n protected readonly participantsLoading = signal(false);\r\n protected readonly savingEdit = signal(false);\r\n protected readonly revisionLoading = signal(false);\r\n\r\n protected readonly errorMessage = signal<string | null>(null);\r\n protected readonly threadSummary = signal<DiscussionThreadSummaryDto | null>(\r\n null,\r\n );\r\n protected readonly commentsDesc = signal<DiscussionCommentDto[]>([]);\r\n protected readonly participants = signal<DiscussionParticipantDto[]>([]);\r\n protected readonly readState = signal<DiscussionReadStateDto | null>(null);\r\n\r\n protected readonly nextCursor = signal<string | null>(null);\r\n protected readonly hasMore = signal(false);\r\n\r\n protected readonly composerText = signal('');\r\n protected readonly composerMentions = signal<DiscussionMentionDto[]>([]);\r\n protected readonly composerAttachments = signal<DiscussionAttachmentDraft[]>(\r\n [],\r\n );\r\n protected readonly replyToCommentId = signal<number | null>(null);\r\n\r\n protected readonly editingCommentId = signal<number | null>(null);\r\n protected readonly editText = signal('');\r\n protected readonly editMentions = signal<DiscussionMentionDto[]>([]);\r\n\r\n protected readonly participantsExpanded = signal(false);\r\n\r\n protected readonly mentionSession = signal<MentionSession | null>(null);\r\n protected readonly mentionCandidates = signal<DiscussionMentionUser[]>([]);\r\n protected readonly mentionLoading = signal(false);\r\n protected readonly mentionActiveIndex = signal(0);\r\n protected readonly mentionMenuPosition = signal<MentionMenuPosition | null>(\r\n null,\r\n );\r\n protected readonly mentionMenuStyle = computed(() => {\r\n const position = this.mentionMenuPosition();\r\n if (!position) {\r\n return null;\r\n }\r\n\r\n return {\r\n left: `${position.left}px`,\r\n top: `${position.top}px`,\r\n width: `${position.width}px`,\r\n maxHeight: `${position.maxHeight}px`,\r\n };\r\n });\r\n\r\n protected readonly revisionsDialogVisible = signal(false);\r\n protected readonly selectedRevisionComment =\r\n signal<DiscussionCommentDto | null>(null);\r\n protected readonly revisionsByComment = signal<\r\n Map<number, DiscussionCommentRevisionDto[]>\r\n >(new Map());\r\n\r\n protected readonly deletingCommentIds = signal<Set<number>>(new Set());\r\n protected readonly atBottom = signal(true);\r\n\r\n protected readonly resolvedModuleType = computed(() =>\r\n normalizeDiscussionModuleType(this.moduleType()),\r\n );\r\n protected readonly resolvedRecordId = computed(() =>\r\n normalizeDiscussionRecordId(this.recordId()),\r\n );\r\n protected readonly resolvedPageSize = computed(() =>\r\n this.normalizePageSize(this.pageSize()),\r\n );\r\n protected readonly threadKey = computed(() =>\r\n buildDiscussionThreadKey(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n ),\r\n );\r\n protected readonly commentsAsc = computed(() =>\r\n [...this.commentsDesc()].reverse(),\r\n );\r\n protected readonly commentsById = computed(() => {\r\n const map = new Map<number, DiscussionCommentDto>();\r\n for (const comment of this.commentsDesc()) {\r\n map.set(comment.id, comment);\r\n }\r\n return map;\r\n });\r\n protected readonly resolvedCurrentUserId = computed(() => {\r\n const readStateUserId = this.readState()?.userId?.trim();\r\n if (readStateUserId) {\r\n return readStateUserId;\r\n }\r\n\r\n return this.currentUserId().trim();\r\n });\r\n protected readonly replyToComment = computed(() => {\r\n const parentId = this.replyToCommentId();\r\n if (parentId == null) {\r\n return null;\r\n }\r\n\r\n return this.commentsById().get(parentId) ?? null;\r\n });\r\n protected readonly readStateLike = computed<DiscussionReadStateLike | null>(\r\n () => {\r\n const currentReadState = this.readState();\r\n if (currentReadState) {\r\n return mapReadStateToLike(currentReadState);\r\n }\r\n\r\n const summary = this.threadSummary();\r\n return summary ? mapSummaryToReadState(summary) : null;\r\n },\r\n );\r\n protected readonly hasUnread = computed(\r\n () => this.readStateLike()?.hasUnread ?? false,\r\n );\r\n protected readonly firstUnreadCommentId = computed(() =>\r\n this.resolveFirstUnreadCommentId(this.commentsAsc(), this.readStateLike()),\r\n );\r\n protected readonly mentionPool = computed(() =>\r\n dedupeMentionUsers([\r\n ...this.mentionableUsers(),\r\n ...this.participants().map((participant) => ({\r\n userId: participant.userId,\r\n displayName: this.getParticipantDisplayName(participant),\r\n userName: participant.user?.userName ?? null,\r\n avatarUrl: participant.user?.photoUrl ?? null,\r\n })),\r\n ]),\r\n );\r\n protected readonly participantEntities = computed<EntityData[]>(() =>\r\n this.participants().map((participant, index) => ({\r\n id: participant.id,\r\n key: `participant-${participant.id}`,\r\n name: 'Participant',\r\n order: index + 1,\r\n value: this.mapParticipantToEntityUserValue(participant),\r\n viewType: 'User',\r\n configuration: {\r\n size: 24,\r\n showBorder: true,\r\n showDisplayName: true,\r\n },\r\n })),\r\n );\r\n protected readonly uploadInProgress = computed(() =>\r\n this.composerAttachments().some((item) => item.status === 'uploading'),\r\n );\r\n protected readonly readyAttachmentFileIds = computed(() =>\r\n this.composerAttachments()\r\n .filter((item) => item.status === 'ready' && !!item.fileId)\r\n .map((item) => item.fileId!)\r\n .filter((item) => !!item),\r\n );\r\n protected readonly canSend = computed(() => {\r\n if (this.disabled() || this.posting() || this.uploadInProgress()) {\r\n return false;\r\n }\r\n\r\n const commentText = this.composerText();\r\n return commentText.trim().length > 0 && commentText.length <= 10000;\r\n });\r\n protected readonly canSaveEdit = computed(() => {\r\n if (this.disabled() || this.savingEdit()) {\r\n return false;\r\n }\r\n\r\n const text = this.editText();\r\n return text.trim().length > 0 && text.length <= 10000;\r\n });\r\n protected readonly visibleRevisions = computed(() => {\r\n const commentId = this.selectedRevisionComment()?.id;\r\n if (commentId == null) {\r\n return [];\r\n }\r\n\r\n return this.revisionsByComment().get(commentId) ?? [];\r\n });\r\n\r\n private readonly mentionSearchTerms = new Subject<{\r\n query: string;\r\n localUsers: DiscussionMentionUser[];\r\n }>();\r\n private readonly mentionMenuMaxWidthPx = 352;\r\n private readonly mentionMenuPreferredHeightPx = 260;\r\n private readonly mentionMenuViewportPaddingPx = 8;\r\n private autoReadTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n this.bindMentionSearch();\r\n\r\n effect(() => {\r\n const moduleType = this.resolvedModuleType();\r\n const recordId = this.resolvedRecordId();\r\n this.requestContext();\r\n\r\n if (!isValidDiscussionThread(moduleType, recordId)) {\r\n this.resetData();\r\n if (moduleType || recordId) {\r\n this.errorMessage.set('Invalid thread identity.');\r\n }\r\n return;\r\n }\r\n\r\n untracked(() => {\r\n void this.loadThread();\r\n });\r\n });\r\n\r\n effect((onCleanup) => {\r\n const interval = this.refreshIntervalMs();\r\n const key = this.threadKey();\r\n if (!key || interval <= 0) {\r\n return;\r\n }\r\n\r\n const timer = setInterval(() => {\r\n void this.refreshThread();\r\n }, interval);\r\n\r\n onCleanup(() => clearInterval(timer));\r\n });\r\n\r\n effect((onCleanup) => {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n\r\n const onViewportChange = () =>\r\n this.positionMentionMenuForCurrentSession();\r\n window.addEventListener('resize', onViewportChange);\r\n\r\n onCleanup(() => {\r\n window.removeEventListener('resize', onViewportChange);\r\n });\r\n });\r\n }\r\n\r\n protected trackComment(_: number, comment: DiscussionCommentDto): number {\r\n return comment.id;\r\n }\r\n\r\n protected isOwnComment(comment: DiscussionCommentDto): boolean {\r\n const currentUserId = this.resolvedCurrentUserId().toLowerCase();\r\n return !!currentUserId && comment.createdBy.toLowerCase() === currentUserId;\r\n }\r\n\r\n protected canEditComment(comment: DiscussionCommentDto): boolean {\r\n return this.isOwnComment(comment) && !comment.isSystem;\r\n }\r\n\r\n protected canDeleteComment(comment: DiscussionCommentDto): boolean {\r\n return this.isOwnComment(comment) && !comment.isSystem;\r\n }\r\n\r\n protected isDeleting(commentId: number): boolean {\r\n return this.deletingCommentIds().has(commentId);\r\n }\r\n\r\n protected getAvatarText(comment: DiscussionCommentDto): string {\r\n const source = comment.createdBy || '?';\r\n return source.slice(0, 1).toUpperCase();\r\n }\r\n\r\n protected getMentionAvatarText(user: DiscussionMentionUser): string {\r\n const source = user.displayName || user.userName || user.userId || '?';\r\n return source.slice(0, 1).toUpperCase();\r\n }\r\n\r\n protected getCommentSegments(\r\n comment: DiscussionCommentDto,\r\n ): DiscussionCommentSegment[] {\r\n const text = comment.comment ?? '';\r\n const mentions = sanitizeMentions(comment.mentions ?? [], text);\r\n\r\n if (!mentions.length) {\r\n return [{ text, isMention: false }];\r\n }\r\n\r\n const segments: DiscussionCommentSegment[] = [];\r\n let cursor = 0;\r\n\r\n for (const mention of mentions) {\r\n if (mention.startIndex > cursor) {\r\n segments.push({\r\n text: text.slice(cursor, mention.startIndex),\r\n isMention: false,\r\n });\r\n }\r\n\r\n const mentionText = text.slice(\r\n mention.startIndex,\r\n mention.startIndex + mention.length,\r\n );\r\n if (mentionText) {\r\n segments.push({\r\n text: mentionText,\r\n isMention: true,\r\n userId: mention.userId,\r\n });\r\n }\r\n\r\n cursor = mention.startIndex + mention.length;\r\n }\r\n\r\n if (cursor < text.length) {\r\n segments.push({\r\n text: text.slice(cursor),\r\n isMention: false,\r\n });\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n protected getParentComment(\r\n comment: DiscussionCommentDto,\r\n ): DiscussionCommentDto | null {\r\n if (comment.parentCommentId == null) {\r\n return null;\r\n }\r\n\r\n return this.commentsById().get(comment.parentCommentId) ?? null;\r\n }\r\n\r\n protected openReply(comment: DiscussionCommentDto): void {\r\n if (comment.isSystem) {\r\n return;\r\n }\r\n\r\n this.replyToCommentId.set(comment.id);\r\n this.focusComposer();\r\n }\r\n\r\n protected clearReply(): void {\r\n this.replyToCommentId.set(null);\r\n }\r\n\r\n protected startEdit(comment: DiscussionCommentDto): void {\r\n if (!this.canEditComment(comment)) {\r\n return;\r\n }\r\n\r\n this.editingCommentId.set(comment.id);\r\n this.editText.set(comment.comment);\r\n this.editMentions.set(\r\n sanitizeMentions(comment.mentions ?? [], comment.comment),\r\n );\r\n this.closeMentionMenu();\r\n }\r\n\r\n protected cancelEdit(): void {\r\n this.editingCommentId.set(null);\r\n this.editText.set('');\r\n this.editMentions.set([]);\r\n this.closeMentionMenu();\r\n }\r\n\r\n protected async saveEdit(): Promise<void> {\r\n const commentId = this.editingCommentId();\r\n if (commentId == null || !this.canSaveEdit()) {\r\n return;\r\n }\r\n\r\n const commentText = this.editText();\r\n const mentions = sanitizeMentions(this.editMentions(), commentText);\r\n\r\n this.savingEdit.set(true);\r\n try {\r\n const updatedComment = await firstValueFrom(\r\n this.api.updateComment(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n commentId,\r\n {\r\n comment: commentText,\r\n mentions: mentions.length ? mentions : undefined,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.commentsDesc.update((comments) =>\r\n comments.map((comment) =>\r\n comment.id === updatedComment.id ? updatedComment : comment,\r\n ),\r\n );\r\n\r\n this.commentUpdated.emit(updatedComment);\r\n this.cancelEdit();\r\n } catch (error) {\r\n this.handleError(error, 'Unable to update comment.');\r\n } finally {\r\n this.savingEdit.set(false);\r\n }\r\n }\r\n\r\n protected async deleteComment(comment: DiscussionCommentDto): Promise<void> {\r\n if (!this.canDeleteComment(comment)) {\r\n return;\r\n }\r\n\r\n const accepted = window.confirm('Delete this comment?');\r\n if (!accepted) {\r\n return;\r\n }\r\n\r\n this.deletingCommentIds.update((state) => {\r\n const next = new Set(state);\r\n next.add(comment.id);\r\n return next;\r\n });\r\n\r\n try {\r\n await firstValueFrom(\r\n this.api.deleteComment(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n comment.id,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.commentsDesc.update((comments) =>\r\n comments.filter((item) => item.id !== comment.id),\r\n );\r\n this.commentDeleted.emit(comment.id);\r\n\r\n if (this.replyToCommentId() === comment.id) {\r\n this.replyToCommentId.set(null);\r\n }\r\n\r\n if (this.editingCommentId() === comment.id) {\r\n this.cancelEdit();\r\n }\r\n\r\n this.patchSummaryTotal(-1);\r\n await this.refreshReadState();\r\n } catch (error) {\r\n this.handleError(error, 'Unable to delete comment.');\r\n } finally {\r\n this.deletingCommentIds.update((state) => {\r\n const next = new Set(state);\r\n next.delete(comment.id);\r\n return next;\r\n });\r\n }\r\n }\r\n\r\n protected async sendComment(): Promise<void> {\r\n if (!this.canSend()) {\r\n if (this.composerText().length > 10000) {\r\n this.errorMessage.set('Comment cannot exceed 10000 characters.');\r\n }\r\n return;\r\n }\r\n\r\n const commentText = this.composerText();\r\n const mentions = sanitizeMentions(this.composerMentions(), commentText);\r\n\r\n this.posting.set(true);\r\n try {\r\n const createdComment = await firstValueFrom(\r\n this.api.createComment(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n {\r\n comment: commentText,\r\n parentCommentId: this.replyToCommentId(),\r\n attachmentFileIds:\r\n this.readyAttachmentFileIds().length > 0\r\n ? this.readyAttachmentFileIds()\r\n : undefined,\r\n mentions: mentions.length ? mentions : undefined,\r\n },\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.commentsDesc.update((comments) => [\r\n createdComment,\r\n ...comments.filter((comment) => comment.id !== createdComment.id),\r\n ]);\r\n this.patchSummaryTotal(1, createdComment.createdAt);\r\n\r\n this.commentCreated.emit(createdComment);\r\n this.resetComposer();\r\n this.scheduleScrollToBottom('smooth');\r\n this.scheduleAutoMarkRead();\r\n\r\n if (this.showParticipants()) {\r\n void this.reloadParticipantsQuiet();\r\n }\r\n } catch (error) {\r\n this.handleError(error, 'Unable to send comment.');\r\n } finally {\r\n this.posting.set(false);\r\n }\r\n }\r\n\r\n protected async loadOlder(): Promise<void> {\r\n if (!this.hasMore() || this.loadingMore()) {\r\n return;\r\n }\r\n\r\n const cursor = this.nextCursor();\r\n if (!cursor) {\r\n return;\r\n }\r\n\r\n this.loadingMore.set(true);\r\n try {\r\n const page = await firstValueFrom(\r\n this.api.getComments(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n this.resolvedPageSize(),\r\n cursor,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n const normalized = this.normalizeComments(page.items);\r\n const existingIds = new Set(this.commentsDesc().map((item) => item.id));\r\n const older = normalized.filter((item) => !existingIds.has(item.id));\r\n\r\n this.commentsDesc.update((comments) => [...comments, ...older]);\r\n this.applyCommentsPageMeta(page);\r\n } catch (error) {\r\n if (this.isCursorError(error)) {\r\n await this.loadThread({ quiet: true, preserveDraft: true });\r\n this.errorMessage.set(\r\n 'Timeline cursor expired. Comments were reloaded from latest.',\r\n );\r\n return;\r\n }\r\n\r\n this.handleError(error, 'Unable to load older comments.');\r\n } finally {\r\n this.loadingMore.set(false);\r\n }\r\n }\r\n\r\n protected async refreshThread(): Promise<void> {\r\n if (this.loadingInitial() || this.refreshing()) {\r\n return;\r\n }\r\n\r\n this.refreshing.set(true);\r\n try {\r\n await this.loadThread({ quiet: true, preserveDraft: true });\r\n } finally {\r\n this.refreshing.set(false);\r\n }\r\n }\r\n\r\n protected async markRead(): Promise<void> {\r\n if (this.markingRead()) {\r\n return;\r\n }\r\n\r\n this.markingRead.set(true);\r\n try {\r\n const state = await firstValueFrom(\r\n this.api.markReadState(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n undefined,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.readState.set(state);\r\n this.readStateChanged.emit(state);\r\n this.patchSummaryRead(state);\r\n } catch (error) {\r\n this.handleError(error, 'Unable to update read state.', false);\r\n } finally {\r\n this.markingRead.set(false);\r\n }\r\n }\r\n\r\n protected onViewportScroll(): void {\r\n const viewport = this.viewportRef()?.nativeElement;\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n const threshold = 40;\r\n const isBottom =\r\n viewport.scrollTop + viewport.clientHeight >=\r\n viewport.scrollHeight - threshold;\r\n this.atBottom.set(isBottom);\r\n\r\n if (isBottom) {\r\n this.scheduleAutoMarkRead();\r\n }\r\n\r\n this.positionMentionMenuForCurrentSession();\r\n }\r\n\r\n protected onComposerInput(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n const before = this.composerText();\r\n const after = textarea.value;\r\n this.composerText.set(after);\r\n this.composerMentions.set(\r\n this.rebaseMentions(before, after, this.composerMentions()),\r\n );\r\n this.updateMentionSession('composer', textarea, after);\r\n }\r\n\r\n protected onComposerCaretEvent(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n this.updateMentionSession('composer', textarea, this.composerText());\r\n }\r\n\r\n protected onComposerKeydown(event: KeyboardEvent): void {\r\n if (this.handleMentionKeyboard(event)) {\r\n return;\r\n }\r\n\r\n if (event.key === 'Enter' && !event.shiftKey) {\r\n event.preventDefault();\r\n void this.sendComment();\r\n }\r\n }\r\n\r\n protected onEditInput(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n const before = this.editText();\r\n const after = textarea.value;\r\n this.editText.set(after);\r\n this.editMentions.set(\r\n this.rebaseMentions(before, after, this.editMentions()),\r\n );\r\n this.updateMentionSession('edit', textarea, after);\r\n }\r\n\r\n protected onEditCaretEvent(event: Event): void {\r\n const textarea = event.target as HTMLTextAreaElement | null;\r\n if (!textarea) {\r\n return;\r\n }\r\n\r\n this.updateMentionSession('edit', textarea, this.editText());\r\n }\r\n\r\n protected onEditKeydown(event: KeyboardEvent): void {\r\n if (this.handleMentionKeyboard(event)) {\r\n return;\r\n }\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.cancelEdit();\r\n }\r\n }\r\n\r\n protected selectMention(user: DiscussionMentionUser): void {\r\n const session = this.mentionSession();\r\n if (!session) {\r\n return;\r\n }\r\n\r\n if (\r\n session.mode === 'edit' &&\r\n session.editCommentId !== this.editingCommentId()\r\n ) {\r\n this.closeMentionMenu();\r\n return;\r\n }\r\n\r\n const mentionToken = `@${user.displayName}`;\r\n const replacement = `${mentionToken} `;\r\n\r\n const currentText =\r\n session.mode === 'composer' ? this.composerText() : this.editText();\r\n const currentMentions =\r\n session.mode === 'composer'\r\n ? this.composerMentions()\r\n : this.editMentions();\r\n\r\n const start = session.triggerIndex;\r\n const end = session.caretIndex;\r\n const nextText =\r\n currentText.slice(0, start) + replacement + currentText.slice(end);\r\n const delta = replacement.length - (end - start);\r\n\r\n const shiftedMentions = currentMentions\r\n .filter((mention) => {\r\n const mentionEnd = mention.startIndex + mention.length;\r\n return mentionEnd <= start || mention.startIndex >= end;\r\n })\r\n .map((mention) =>\r\n mention.startIndex >= end\r\n ? {\r\n ...mention,\r\n startIndex: mention.startIndex + delta,\r\n }\r\n : mention,\r\n );\r\n\r\n const nextMentions = sanitizeMentions(\r\n [\r\n ...shiftedMentions,\r\n {\r\n userId: user.userId,\r\n startIndex: start,\r\n length: mentionToken.length,\r\n },\r\n ],\r\n nextText,\r\n );\r\n\r\n if (session.mode === 'composer') {\r\n this.composerText.set(nextText);\r\n this.composerMentions.set(nextMentions);\r\n } else {\r\n this.editText.set(nextText);\r\n this.editMentions.set(nextMentions);\r\n }\r\n\r\n const nextCaret = start + replacement.length;\r\n this.closeMentionMenu();\r\n queueMicrotask(() => {\r\n session.textarea.focus();\r\n session.textarea.setSelectionRange(nextCaret, nextCaret);\r\n });\r\n }\r\n\r\n protected toggleParticipantsPanel(): void {\r\n this.participantsExpanded.update((value) => !value);\r\n }\r\n\r\n protected async openRevisions(comment: DiscussionCommentDto): Promise<void> {\r\n this.selectedRevisionComment.set(comment);\r\n this.revisionsDialogVisible.set(true);\r\n\r\n const existing = this.revisionsByComment().get(comment.id);\r\n if (existing) {\r\n return;\r\n }\r\n\r\n this.revisionLoading.set(true);\r\n try {\r\n const revisions = await firstValueFrom(\r\n this.api.getCommentRevisions(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n comment.id,\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.revisionsByComment.update((state) => {\r\n const next = new Map(state);\r\n next.set(comment.id, revisions);\r\n return next;\r\n });\r\n } catch (error) {\r\n this.handleError(error, 'Unable to load revisions.');\r\n } finally {\r\n this.revisionLoading.set(false);\r\n }\r\n }\r\n\r\n protected async downloadAttachment(\r\n comment: DiscussionCommentDto,\r\n attachment: { fileId: string; fileName: string },\r\n ): Promise<void> {\r\n try {\r\n await firstValueFrom(\r\n this.api.downloadAttachment(\r\n this.attachmentDownloadEndpoint(),\r\n attachment.fileId,\r\n attachment.fileName,\r\n this.requestContext(),\r\n ),\r\n );\r\n } catch (error) {\r\n this.handleError(\r\n error,\r\n `Unable to download attachment from comment #${comment.id}.`,\r\n );\r\n }\r\n }\r\n\r\n protected browseAttachments(): void {\r\n if (!this.allowAttachments() || this.disabled()) {\r\n return;\r\n }\r\n\r\n this.attachmentInputRef()?.nativeElement.click();\r\n }\r\n\r\n protected onAttachmentSelected(event: Event): void {\r\n const target = event.target as HTMLInputElement | null;\r\n const files = target?.files;\r\n if (!files?.length) {\r\n return;\r\n }\r\n\r\n Array.from(files).forEach((file) => {\r\n this.uploadAttachment(file);\r\n });\r\n\r\n if (target) {\r\n target.value = '';\r\n }\r\n }\r\n\r\n protected removeAttachment(draftId: string): void {\r\n this.composerAttachments.update((attachments) =>\r\n attachments.filter((attachment) => attachment.id !== draftId),\r\n );\r\n }\r\n\r\n private uploadAttachment(file: File): void {\r\n const draftId = this.generateDraftId(file.name);\r\n const draft: DiscussionAttachmentDraft = {\r\n id: draftId,\r\n fileId: null,\r\n fileName: file.name,\r\n contentType: file.type,\r\n size: file.size,\r\n progress: 0,\r\n status: 'uploading',\r\n error: null,\r\n };\r\n\r\n this.composerAttachments.update((attachments) => [...attachments, draft]);\r\n\r\n this.api\r\n .uploadAttachment(file, this.uploadEndpoint(), this.requestContext())\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (uploadEvent) => {\r\n this.composerAttachments.update((attachments) =>\r\n attachments.map((item) => {\r\n if (item.id !== draftId) {\r\n return item;\r\n }\r\n\r\n if (!uploadEvent.completed) {\r\n return {\r\n ...item,\r\n progress: uploadEvent.progress,\r\n };\r\n }\r\n\r\n return {\r\n ...item,\r\n progress: 100,\r\n status: 'ready',\r\n fileId: uploadEvent.file?.fileId ?? item.fileId,\r\n fileName: uploadEvent.file?.fileName ?? item.fileName,\r\n contentType:\r\n uploadEvent.file?.contentType ?? item.contentType ?? '',\r\n size: uploadEvent.file?.size ?? item.size,\r\n };\r\n }),\r\n );\r\n },\r\n error: (error) => {\r\n const errorMessage = toDiscussionErrorMessage(\r\n error,\r\n 'Attachment upload failed.',\r\n );\r\n\r\n this.composerAttachments.update((attachments) =>\r\n attachments.map((item) =>\r\n item.id === draftId\r\n ? {\r\n ...item,\r\n status: 'failed',\r\n error: errorMessage,\r\n }\r\n : item,\r\n ),\r\n );\r\n this.handleError(error, 'Attachment upload failed.');\r\n },\r\n });\r\n }\r\n\r\n private async loadThread(options?: {\r\n quiet?: boolean;\r\n preserveDraft?: boolean;\r\n }): Promise<void> {\r\n if (!options?.quiet) {\r\n this.loadingInitial.set(true);\r\n }\r\n\r\n this.errorMessage.set(null);\r\n\r\n try {\r\n const moduleType = this.resolvedModuleType();\r\n const recordId = this.resolvedRecordId();\r\n\r\n const [summary, comments] = await Promise.all([\r\n firstValueFrom(\r\n this.api.getThreadSummary(\r\n moduleType,\r\n recordId,\r\n this.requestContext(),\r\n ),\r\n ),\r\n firstValueFrom(\r\n this.api.getComments(\r\n moduleType,\r\n recordId,\r\n this.resolvedPageSize(),\r\n undefined,\r\n this.requestContext(),\r\n ),\r\n ),\r\n ]);\r\n\r\n this.threadSummary.set(summary);\r\n this.loaded.emit(summary);\r\n\r\n this.applyInitialComments(comments);\r\n\r\n if (this.showParticipants()) {\r\n void this.reloadParticipantsQuiet();\r\n } else {\r\n this.participants.set([]);\r\n }\r\n\r\n await this.refreshReadState(comments);\r\n\r\n if (!options?.preserveDraft) {\r\n this.resetComposer();\r\n }\r\n\r\n this.scheduleScrollToBottom('auto');\r\n this.scheduleAutoMarkRead();\r\n } catch (error) {\r\n this.handleError(error, 'Unable to load discussion.');\r\n } finally {\r\n this.loadingInitial.set(false);\r\n }\r\n }\r\n\r\n private async reloadParticipantsQuiet(): Promise<void> {\r\n this.participantsLoading.set(true);\r\n try {\r\n const participants = await firstValueFrom(\r\n this.api.getParticipants(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.participants.set(this.mergeParticipants([], participants));\r\n } catch (error) {\r\n this.handleError(error, 'Unable to load participants.', false);\r\n } finally {\r\n this.participantsLoading.set(false);\r\n }\r\n }\r\n\r\n private async refreshReadState(\r\n commentsPage?: DiscussionCommentsPageDto,\r\n ): Promise<void> {\r\n try {\r\n const state = await firstValueFrom(\r\n this.api.getReadState(\r\n this.resolvedModuleType(),\r\n this.resolvedRecordId(),\r\n this.requestContext(),\r\n ),\r\n );\r\n\r\n this.readState.set(state);\r\n this.readStateChanged.emit(state);\r\n this.patchSummaryRead(state);\r\n } catch {\r\n if (commentsPage) {\r\n const fallback = this.toReadStateFromPage(commentsPage);\r\n this.readState.set(fallback);\r\n this.readStateChanged.emit(fallback);\r\n this.patchSummaryRead(fallback);\r\n }\r\n }\r\n }\r\n\r\n private resetData(): void {\r\n this.threadSummary.set(null);\r\n this.commentsDesc.set([]);\r\n this.participants.set([]);\r\n this.readState.set(null);\r\n this.nextCursor.set(null);\r\n this.hasMore.set(false);\r\n this.cancelEdit();\r\n this.resetComposer();\r\n this.participantsExpanded.set(false);\r\n this.revisionsDialogVisible.set(false);\r\n this.selectedRevisionComment.set(null);\r\n this.revisionsByComment.set(new Map());\r\n }\r\n\r\n private resetComposer(): void {\r\n this.composerText.set('');\r\n this.composerMentions.set([]);\r\n this.composerAttachments.set([]);\r\n this.replyToCommentId.set(null);\r\n this.closeMentionMenu();\r\n }\r\n\r\n private applyInitialComments(page: DiscussionCommentsPageDto): void {\r\n this.commentsDesc.set(this.normalizeComments(page.items));\r\n this.applyCommentsPageMeta(page);\r\n }\r\n\r\n private applyCommentsPageMeta(page: DiscussionCommentsPageDto): void {\r\n this.nextCursor.set(page.nextCursor ?? null);\r\n this.hasMore.set(page.hasMore);\r\n\r\n this.readState.update((state) => {\r\n if (!state) {\r\n return state;\r\n }\r\n\r\n return {\r\n ...state,\r\n lastReadCommentId: page.lastReadCommentId,\r\n lastReadCommentCreatedAt: page.lastReadCommentCreatedAt,\r\n lastReadAt: page.lastReadAt,\r\n unreadCount: page.unreadCount,\r\n hasUnread: page.hasUnread,\r\n };\r\n });\r\n }\r\n\r\n private normalizeComments(\r\n comments: DiscussionCommentDto[],\r\n ): DiscussionCommentDto[] {\r\n return [...comments]\r\n .map((comment) => ({\r\n ...comment,\r\n attachments: [...(comment.attachments ?? [])].sort(\r\n (left, right) => left.id - right.id,\r\n ),\r\n mentions: sanitizeMentions(comment.mentions ?? [], comment.comment),\r\n }))\r\n .sort((left, right) => {\r\n if (left.createdAt !== right.createdAt) {\r\n return left.createdAt < right.createdAt ? 1 : -1;\r\n }\r\n\r\n return right.id - left.id;\r\n });\r\n }\r\n\r\n private rebaseMentions(\r\n previousText: string,\r\n currentText: string,\r\n mentions: DiscussionMentionDto[],\r\n ): DiscussionMentionDto[] {\r\n if (previousText === currentText) {\r\n return sanitizeMentions(mentions, currentText);\r\n }\r\n\r\n const mutation = this.computeTextMutation(previousText, currentText);\r\n const adjusted = mentions\r\n .map((mention) => {\r\n const mentionStart = mention.startIndex;\r\n const mentionEnd = mention.startIndex + mention.length;\r\n\r\n if (mentionEnd <= mutation.start) {\r\n return mention;\r\n }\r\n\r\n if (mentionStart >= mutation.beforeEnd) {\r\n return {\r\n ...mention,\r\n startIndex: mentionStart + mutation.delta,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter((mention): mention is DiscussionMentionDto => mention != null);\r\n\r\n return sanitizeMentions(adjusted, currentText);\r\n }\r\n\r\n private computeTextMutation(before: string, after: string): TextMutation {\r\n let start = 0;\r\n while (\r\n start < before.length &&\r\n start < after.length &&\r\n before[start] === after[start]\r\n ) {\r\n start += 1;\r\n }\r\n\r\n let beforeEnd = before.length;\r\n let afterEnd = after.length;\r\n\r\n while (\r\n beforeEnd > start &&\r\n afterEnd > start &&\r\n before[beforeEnd - 1] === after[afterEnd - 1]\r\n ) {\r\n beforeEnd -= 1;\r\n afterEnd -= 1;\r\n }\r\n\r\n return {\r\n start,\r\n beforeEnd,\r\n delta: afterEnd - beforeEnd,\r\n };\r\n }\r\n\r\n private normalizePageSize(value: number): number {\r\n const parsed = Number(value);\r\n if (!Number.isFinite(parsed)) {\r\n return 30;\r\n }\r\n\r\n return Math.min(100, Math.max(1, Math.floor(parsed)));\r\n }\r\n\r\n private isCursorError(error: unknown): boolean {\r\n const message = toDiscussionErrorMessage(error, '').toLowerCase();\r\n return message.includes('cursor');\r\n }\r\n\r\n private updateMentionSession(\r\n mode: MentionMode,\r\n textarea: HTMLTextAreaElement,\r\n text: string,\r\n ): void {\r\n const caretIndex = textarea.selectionStart ?? text.length;\r\n const textBeforeCaret = text.slice(0, caretIndex);\r\n const mentionMatch = textBeforeCaret.match(/(^|\\s)@([^\\s@]{0,64})$/);\r\n\r\n if (!mentionMatch) {\r\n if (this.mentionSession()?.mode === mode) {\r\n this.closeMentionMenu();\r\n }\r\n return;\r\n }\r\n\r\n const query = mentionMatch[2] ?? '';\r\n const triggerIndex = caretIndex - query.length - 1;\r\n\r\n this.mentionSession.set({\r\n mode,\r\n triggerIndex,\r\n caretIndex,\r\n query,\r\n textarea,\r\n editCommentId: mode === 'edit' ? this.editingCommentId() : null,\r\n });\r\n this.mentionActiveIndex.set(0);\r\n this.positionMentionMenu(textarea, caretIndex);\r\n this.searchMentionCandidates(query);\r\n }\r\n\r\n private searchMentionCandidates(query: string): void {\r\n const normalizedQuery = query.trim().toLowerCase();\r\n const localUsers = this.mentionPool()\r\n .filter((user) => this.matchesMentionQuery(user, normalizedQuery))\r\n .slice(0, 12);\r\n\r\n this.mentionCandidates.set(localUsers);\r\n\r\n const endpoint = this.mentionSearchEndpoint().trim();\r\n if (!endpoint || !normalizedQuery) {\r\n this.mentionLoading.set(false);\r\n return;\r\n }\r\n\r\n this.mentionSearchTerms.next({\r\n query: normalizedQuery,\r\n localUsers,\r\n });\r\n }\r\n\r\n private matchesMentionQuery(\r\n user: DiscussionMentionUser,\r\n query: string,\r\n ): boolean {\r\n if (!query) {\r\n return true;\r\n }\r\n\r\n const haystack = [user.userId, user.displayName, user.userName ?? '']\r\n .join(' ')\r\n .toLowerCase();\r\n\r\n return haystack.includes(query);\r\n }\r\n\r\n private bindMentionSearch(): void {\r\n this.mentionSearchTerms\r\n .pipe(\r\n debounceTime(220),\r\n distinctUntilChanged((left, right) => left.query === right.query),\r\n switchMap((value) => {\r\n const endpoint = this.mentionSearchEndpoint().trim();\r\n if (!endpoint || !value.query) {\r\n return of(value.localUsers);\r\n }\r\n\r\n this.mentionLoading.set(true);\r\n return this.api\r\n .searchMentionUsers(\r\n endpoint,\r\n value.query,\r\n this.mentionSearchParam(),\r\n this.mentionSearchDataPath(),\r\n this.requestContext(),\r\n )\r\n .pipe(\r\n map((remoteUsers) =>\r\n dedupeMentionUsers([...value.localUsers, ...remoteUsers]).slice(\r\n 0,\r\n 12,\r\n ),\r\n ),\r\n catchError(() => of(value.localUsers)),\r\n finalize(() => this.mentionLoading.set(false)),\r\n );\r\n }),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe((candidates) => {\r\n if (!this.mentionSession()) {\r\n return;\r\n }\r\n\r\n this.mentionCandidates.set(candidates);\r\n this.mentionActiveIndex.set(0);\r\n this.positionMentionMenuForCurrentSession();\r\n });\r\n }\r\n\r\n private handleMentionKeyboard(event: KeyboardEvent): boolean {\r\n const session = this.mentionSession();\r\n if (!session) {\r\n return false;\r\n }\r\n\r\n const candidates = this.mentionCandidates();\r\n if (!candidates.length) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closeMentionMenu();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.mentionActiveIndex.update(\r\n (index) => (index + 1) % this.mentionCandidates().length,\r\n );\r\n return true;\r\n }\r\n\r\n if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.mentionActiveIndex.update((index) => {\r\n const total = this.mentionCandidates().length;\r\n return (index - 1 + total) % total;\r\n });\r\n return true;\r\n }\r\n\r\n if (event.key === 'Enter' || event.key === 'Tab') {\r\n event.preventDefault();\r\n const candidate = this.mentionCandidates()[this.mentionActiveIndex()];\r\n if (candidate) {\r\n this.selectMention(candidate);\r\n }\r\n return true;\r\n }\r\n\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closeMentionMenu();\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private closeMentionMenu(): void {\r\n this.mentionSession.set(null);\r\n this.mentionCandidates.set([]);\r\n this.mentionActiveIndex.set(0);\r\n this.mentionLoading.set(false);\r\n this.mentionMenuPosition.set(null);\r\n }\r\n\r\n private positionMentionMenuForCurrentSession(): void {\r\n const session = this.mentionSession();\r\n if (!session) {\r\n this.mentionMenuPosition.set(null);\r\n return;\r\n }\r\n\r\n this.positionMentionMenu(session.textarea, session.caretIndex);\r\n }\r\n\r\n private positionMentionMenu(\r\n textarea: HTMLTextAreaElement,\r\n caretIndex: number,\r\n ): void {\r\n const wrapper = textarea.parentElement;\r\n if (!wrapper) {\r\n this.mentionMenuPosition.set(null);\r\n return;\r\n }\r\n\r\n const caret = this.measureMentionCaret(textarea, caretIndex);\r\n if (!caret) {\r\n this.mentionMenuPosition.set(null);\r\n return;\r\n }\r\n\r\n const wrapperRect = wrapper.getBoundingClientRect();\r\n const textareaRect = textarea.getBoundingClientRect();\r\n\r\n const anchorViewportX = textareaRect.left + caret.x - textarea.scrollLeft;\r\n const anchorViewportY = textareaRect.top + caret.y - textarea.scrollTop;\r\n\r\n const menuWidth = Math.min(\r\n this.mentionMenuMaxWidthPx,\r\n window.innerWidth * 0.9,\r\n );\r\n const belowTopViewport = anchorViewportY + caret.lineHeight + 6;\r\n const availableBelow =\r\n window.innerHeight - belowTopViewport - this.mentionMenuViewportPaddingPx;\r\n const availableAbove = anchorViewportY - this.mentionMenuViewportPaddingPx;\r\n const placeAbove = availableBelow < 180 && availableAbove > availableBelow;\r\n\r\n const resolvedMaxHeight = Math.max(\r\n 120,\r\n Math.min(\r\n this.mentionMenuPreferredHeightPx,\r\n (placeAbove ? availableAbove : availableBelow) - 10,\r\n ),\r\n );\r\n\r\n const desiredLeft = anchorViewportX;\r\n const clampedLeft = Math.min(\r\n Math.max(this.mentionMenuViewportPaddingPx, desiredLeft),\r\n window.innerWidth - menuWidth - this.mentionMenuViewportPaddingPx,\r\n );\r\n\r\n const topBelow = belowTopViewport;\r\n const topAbove = anchorViewportY - resolvedMaxHeight - 8;\r\n const clampedTop = placeAbove\r\n ? Math.max(this.mentionMenuViewportPaddingPx, topAbove)\r\n : Math.max(this.mentionMenuViewportPaddingPx, topBelow);\r\n\r\n this.mentionMenuPosition.set({\r\n left: clampedLeft - wrapperRect.left,\r\n top: clampedTop - wrapperRect.top,\r\n width: menuWidth,\r\n maxHeight: resolvedMaxHeight,\r\n placement: placeAbove ? 'above' : 'below',\r\n });\r\n }\r\n\r\n private measureMentionCaret(\r\n textarea: HTMLTextAreaElement,\r\n caretIndex: number,\r\n ): MentionCaretMetrics | null {\r\n const style = window.getComputedStyle(textarea);\r\n const mirror = document.createElement('div');\r\n const marker = document.createElement('span');\r\n\r\n mirror.style.position = 'fixed';\r\n mirror.style.left = '-9999px';\r\n mirror.style.top = '0';\r\n mirror.style.visibility = 'hidden';\r\n mirror.style.pointerEvents = 'none';\r\n mirror.style.whiteSpace = 'pre-wrap';\r\n mirror.style.overflowWrap = 'break-word';\r\n mirror.style.wordWrap = 'break-word';\r\n mirror.style.boxSizing = style.boxSizing;\r\n mirror.style.width = `${textarea.clientWidth}px`;\r\n mirror.style.padding = style.padding;\r\n mirror.style.border = style.border;\r\n mirror.style.font = style.font;\r\n mirror.style.fontSize = style.fontSize;\r\n mirror.style.fontFamily = style.fontFamily;\r\n mirror.style.fontWeight = style.fontWeight;\r\n mirror.style.letterSpacing = style.letterSpacing;\r\n mirror.style.lineHeight = style.lineHeight;\r\n mirror.style.textAlign = style.textAlign;\r\n mirror.style.textTransform = style.textTransform;\r\n mirror.style.textIndent = style.textIndent;\r\n mirror.style.tabSize = style.tabSize;\r\n\r\n const safeCaret = Math.max(0, Math.min(caretIndex, textarea.value.length));\r\n const beforeCaret = textarea.value.slice(0, safeCaret);\r\n mirror.textContent = beforeCaret;\r\n\r\n marker.textContent = '\\u200b';\r\n mirror.appendChild(marker);\r\n document.body.appendChild(mirror);\r\n\r\n try {\r\n const mirrorRect = mirror.getBoundingClientRect();\r\n const markerRect = marker.getBoundingClientRect();\r\n\r\n return {\r\n x: markerRect.left - mirrorRect.left,\r\n y: markerRect.top - mirrorRect.top,\r\n lineHeight: this.resolveMentionLineHeight(style),\r\n };\r\n } finally {\r\n document.body.removeChild(mirror);\r\n }\r\n }\r\n\r\n private resolveMentionLineHeight(style: CSSStyleDeclaration): number {\r\n const lineHeightRaw = style.lineHeight.trim().toLowerCase();\r\n if (lineHeightRaw.endsWith('px')) {\r\n const parsed = Number.parseFloat(lineHeightRaw);\r\n if (Number.isFinite(parsed) && parsed > 0) {\r\n return parsed;\r\n }\r\n }\r\n\r\n const fontSizeRaw = style.fontSize.trim().toLowerCase();\r\n const fontSize = fontSizeRaw.endsWith('px')\r\n ? Number.parseFloat(fontSizeRaw)\r\n : 14;\r\n\r\n return Number.isFinite(fontSize) && fontSize > 0 ? fontSize * 1.4 : 20;\r\n }\r\n\r\n private getParticipantDisplayName(\r\n participant: DiscussionParticipantDto,\r\n ): string {\r\n return (\r\n participant.user?.displayName?.trim() ||\r\n participant.user?.fullName?.trim() ||\r\n participant.user?.userName?.trim() ||\r\n participant.userId\r\n );\r\n }\r\n\r\n private mapParticipantToEntityUserValue(\r\n participant: DiscussionParticipantDto,\r\n ): EntityUserValue {\r\n const user = participant.user ?? participant.addedByUser ?? null;\r\n\r\n return {\r\n id: user?.id ?? participant.userId,\r\n userName: user?.userName ?? undefined,\r\n displayName: this.getParticipantDisplayName(participant),\r\n photoUrl: user?.photoUrl ?? undefined,\r\n };\r\n }\r\n\r\n private mergeParticipants(\r\n current: DiscussionParticipantDto[],\r\n incoming: DiscussionParticipantDto[],\r\n ): DiscussionParticipantDto[] {\r\n const byUserId = new Map<string, DiscussionParticipantDto>();\r\n [...current, ...incoming].forEach((participant) => {\r\n const key = participant.userId.toLowerCase();\r\n if (!byUserId.has(key)) {\r\n byUserId.set(key, participant);\r\n }\r\n });\r\n\r\n return [...byUserId.values()].sort((left, right) =>\r\n this.getParticipantDisplayName(left).localeCompare(\r\n this.getParticipantDisplayName(right),\r\n ),\r\n );\r\n }\r\n\r\n private toReadStateFromPage(\r\n page: DiscussionCommentsPageDto,\r\n ): DiscussionReadStateDto {\r\n const moduleType = this.resolvedModuleType();\r\n const recordId = this.resolvedRecordId();\r\n\r\n return {\r\n threadKey: buildDiscussionThreadKey(moduleType, recordId),\r\n moduleType,\r\n recordId,\r\n userId: this.resolvedCurrentUserId(),\r\n lastReadCommentId: page.lastReadCommentId,\r\n lastReadCommentCreatedAt: page.lastReadCommentCreatedAt,\r\n lastReadAt: page.lastReadAt,\r\n unreadCount: page.unreadCount,\r\n hasUnread: page.hasUnread,\r\n };\r\n }\r\n\r\n private resolveFirstUnreadCommentId(\r\n commentsAsc: DiscussionCommentDto[],\r\n readState: DiscussionReadStateLike | null,\r\n ): number | null {\r\n if (!commentsAsc.length || !readState?.hasUnread) {\r\n return null;\r\n }\r\n\r\n const pointerCreatedAt = readState.lastReadCommentCreatedAt;\r\n const pointerId = readState.lastReadCommentId;\r\n\r\n if (!pointerCreatedAt && pointerId == null) {\r\n return commentsAsc[0]?.id ?? null;\r\n }\r\n\r\n for (const comment of commentsAsc) {\r\n if (this.isCommentAfterPointer(comment, pointerCreatedAt, pointerId)) {\r\n return comment.id;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private isCommentAfterPointer(\r\n comment: DiscussionCommentDto,\r\n pointerCreatedAt: string | null,\r\n pointerId: number | null,\r\n ): boolean {\r\n if (!pointerCreatedAt && pointerId == null) {\r\n return true;\r\n }\r\n\r\n if (pointerCreatedAt) {\r\n if (comment.createdAt > pointerCreatedAt) {\r\n return true;\r\n }\r\n if (comment.createdAt < pointerCreatedAt) {\r\n return false;\r\n }\r\n return pointerId != null ? comment.id > pointerId : false;\r\n }\r\n\r\n return pointerId != null ? comment.id > pointerId : false;\r\n }\r\n\r\n private focusComposer(): void {\r\n queueMicrotask(() => {\r\n this.composerInputRef()?.nativeElement.focus();\r\n });\r\n }\r\n\r\n private scheduleScrollToBottom(behavior: ScrollBehavior): void {\r\n setTimeout(() => {\r\n const viewport = this.viewportRef()?.nativeElement;\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n viewport.scrollTo({\r\n top: viewport.scrollHeight,\r\n behavior,\r\n });\r\n this.atBottom.set(true);\r\n }, 0);\r\n }\r\n\r\n private scheduleAutoMarkRead(): void {\r\n if (!this.autoMarkRead() || !this.hasUnread() || !this.atBottom()) {\r\n return;\r\n }\r\n\r\n if (this.autoReadTimer) {\r\n clearTimeout(this.autoReadTimer);\r\n }\r\n\r\n this.autoReadTimer = setTimeout(() => {\r\n this.autoReadTimer = null;\r\n void this.markRead();\r\n }, 300);\r\n }\r\n\r\n private patchSummaryTotal(delta: number, lastCommentAt?: string): void {\r\n this.threadSummary.update((summary) => {\r\n if (!summary) {\r\n return summary;\r\n }\r\n\r\n return {\r\n ...summary,\r\n totalComments: Math.max(0, summary.totalComments + delta),\r\n lastCommentAt: lastCommentAt ?? summary.lastCommentAt,\r\n };\r\n });\r\n }\r\n\r\n private patchSummaryRead(readState: DiscussionReadStateDto): void {\r\n this.threadSummary.update((summary) => {\r\n if (!summary) {\r\n return summary;\r\n }\r\n\r\n return {\r\n ...summary,\r\n lastReadCommentId: readState.lastReadCommentId,\r\n lastReadCommentCreatedAt: readState.lastReadCommentCreatedAt,\r\n lastReadAt: readState.lastReadAt,\r\n unreadCount: readState.unreadCount,\r\n hasUnread: readState.hasUnread,\r\n };\r\n });\r\n }\r\n\r\n private handleError(\r\n error: unknown,\r\n fallbackMessage: string,\r\n setGlobalError = true,\r\n ): void {\r\n const message = toDiscussionErrorMessage(error, fallbackMessage);\r\n if (setGlobalError) {\r\n this.errorMessage.set(message);\r\n }\r\n this.errored.emit(message);\r\n }\r\n\r\n private generateDraftId(fileName: string): string {\r\n if (\r\n typeof crypto !== 'undefined' &&\r\n typeof crypto.randomUUID === 'function'\r\n ) {\r\n return `${fileName}-${crypto.randomUUID()}`;\r\n }\r\n\r\n return `${fileName}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n}\r\n","<mt-card\r\n class=\"mt-discussion-card h-full min-h-0 w-full overflow-hidden shadow-sm\"\r\n [paddingless]=\"true\"\r\n [ngClass]=\"styleClass()\"\r\n>\r\n <div class=\"flex h-full min-h-0 flex-col overflow-hidden\">\r\n <input\r\n #attachmentInput\r\n type=\"file\"\r\n class=\"hidden\"\r\n multiple\r\n (change)=\"onAttachmentSelected($event)\"\r\n />\r\n\r\n <header\r\n class=\"flex items-center justify-between gap-3 border-b border-surface-200 bg-surface-0 px-4 py-3.5\"\r\n >\r\n <div class=\"min-w-0 flex-1 flex items-center gap-2\">\r\n <div class=\"text-2xl text-surface-500 font-semibold\">\r\n <mt-icon icon=\"communication.message-chat-square\"></mt-icon>\r\n </div>\r\n <h3 class=\"truncate text-base font-semibold text-surface-900\">\r\n {{ title() }}\r\n </h3>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2\">\r\n <mt-button\r\n icon=\"general.dots-vertical\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n [rounded]=\"true\"\r\n styleClass=\"mt-discussion-icon-btn\"\r\n [loading]=\"refreshing()\"\r\n [disabled]=\"loadingInitial() || markingRead()\"\r\n (onClick)=\"actionsPopover.toggle($event)\"\r\n />\r\n\r\n <p-popover\r\n #actionsPopover\r\n appendTo=\"body\"\r\n styleClass=\"mt-discussion-actions-popover\"\r\n >\r\n <div class=\"flex min-w-44 flex-col py-1\">\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 text-left text-sm text-surface-700 transition-colors hover:bg-surface-100 disabled:cursor-not-allowed disabled:opacity-50\"\r\n [disabled]=\"refreshing() || loadingInitial()\"\r\n (click)=\"actionsPopover.hide(); refreshThread()\"\r\n >\r\n <mt-icon icon=\"arrow.refresh-cw-01\"></mt-icon>\r\n\r\n <span>{{ refreshing() ? \"Refreshing...\" : \"Refresh\" }}</span>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 text-left text-sm text-surface-700 transition-colors hover:bg-surface-100 disabled:cursor-not-allowed disabled:opacity-50\"\r\n [disabled]=\"markingRead() || !hasUnread()\"\r\n (click)=\"actionsPopover.hide(); markRead()\"\r\n >\r\n <mt-icon icon=\"general.check\"></mt-icon>\r\n\r\n <span>Mark read</span>\r\n </button>\r\n\r\n @if (showParticipants()) {\r\n <button\r\n type=\"button\"\r\n class=\"flex cursor-pointer items-center gap-2 rounded-xl px-3 py-2 text-left text-sm text-surface-700 transition-colors hover:bg-surface-100\"\r\n (click)=\"actionsPopover.hide(); toggleParticipantsPanel()\"\r\n >\r\n <mt-icon icon=\"user.users-01\"></mt-icon>\r\n\r\n <span>{{\r\n participantsExpanded()\r\n ? \"Hide participants\"\r\n : \"Show participants\"\r\n }}</span>\r\n </button>\r\n }\r\n </div>\r\n </p-popover>\r\n </div>\r\n </header>\r\n\r\n @if (showParticipants() && participantsExpanded()) {\r\n <section class=\"border-b border-surface-200 px-4 py-3\">\r\n @if (participantsLoading()) {\r\n <span class=\"text-xs text-surface-500\">Loading participants...</span>\r\n } @else if (participantEntities().length === 0) {\r\n <span class=\"text-xs text-surface-500\">No participants yet.</span>\r\n } @else {\r\n <div class=\"max-h-48 overflow-y-auto pr-1\">\r\n <mt-entities-preview [entities]=\"participantEntities()\" />\r\n </div>\r\n }\r\n </section>\r\n }\r\n\r\n @if (errorMessage(); as error) {\r\n <div\r\n class=\"border-b border-red-200 bg-red-50 px-4 py-2 text-sm text-red-700\"\r\n >\r\n {{ error }}\r\n </div>\r\n }\r\n\r\n <div class=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\r\n <div\r\n #viewport\r\n class=\"min-h-0 flex-1 space-y-3 overflow-x-hidden overflow-y-auto overscroll-contain bg-surface-50/60 px-3 py-3\"\r\n (scroll)=\"onViewportScroll()\"\r\n >\r\n @if (hasMore()) {\r\n <div class=\"flex justify-center py-1\">\r\n <mt-button\r\n icon=\"arrow.chevron-up\"\r\n [label]=\"loadingMore() ? 'Loading...' : 'Load older messages'\"\r\n size=\"small\"\r\n [outlined]=\"true\"\r\n [loading]=\"loadingMore()\"\r\n (onClick)=\"loadOlder()\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (loadingInitial()) {\r\n <div class=\"space-y-2\">\r\n @for (item of [1, 2, 3, 4]; track item) {\r\n <div class=\"h-16 animate-pulse rounded-xl bg-surface-100\"></div>\r\n }\r\n </div>\r\n } @else if (commentsAsc().length === 0) {\r\n <div class=\"rounded-2xl p-8 text-center\">\r\n <h4 class=\"text-sm font-semibold text-surface-700\">\r\n No comments yet\r\n </h4>\r\n <p class=\"mt-1 text-xs text-surface-500\">Start the conversation.</p>\r\n </div>\r\n } @else {\r\n @for (comment of commentsAsc(); track trackComment($index, comment)) {\r\n @if (firstUnreadCommentId() === comment.id) {\r\n <div class=\"my-1 flex items-center justify-center gap-2\">\r\n <span\r\n class=\"flex-1 border-t border-dashed border-red-300\"\r\n ></span>\r\n <span\r\n class=\"rounded-full border border-red-200 bg-red-50 px-2 py-0.5 text-[0.67rem] font-bold leading-none text-red-700\"\r\n >Unread messages</span\r\n >\r\n <span\r\n class=\"flex-1 border-t border-dashed border-red-300\"\r\n ></span>\r\n </div>\r\n }\r\n\r\n <article\r\n class=\"group flex gap-2\"\r\n [class.justify-end]=\"isOwnComment(comment)\"\r\n >\r\n @if (!isOwnComment(comment)) {\r\n <div\r\n class=\"mt-0.5 inline-flex h-[1.9rem] w-[1.9rem] shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_20%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.74rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_75%,black)]\"\r\n >\r\n {{ getAvatarText(comment) }}\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"w-fit min-w-0 max-w-full rounded-[1.35rem] border border-surface-200 bg-white px-3 py-2.5 sm:max-w-[90%]\"\r\n [class.bg-[color-mix(in_srgb,var(--p-primary-color)_7%,white)]]=\"\r\n isOwnComment(comment)\r\n \"\r\n >\r\n <div\n class=\"mb-1 flex flex-col gap-1 text-xs text-surface-600 sm:flex-row sm:items-start sm:justify-between sm:gap-3\"\n >\n <div class=\"min-w-0 break-words font-semibold text-surface-900\">\n {{ comment.createdBy }}\n </div>\n <div\n class=\"inline-flex flex-wrap items-center gap-1 text-surface-500 sm:shrink-0 sm:flex-nowrap sm:text-right\"\n >\n <span class=\"whitespace-nowrap\">{{\n comment.createdAt | date: \"MMM d, y h:mm a\"\n }}</span>\n @if (comment.updatedAt) {\n <span class=\"whitespace-nowrap text-[11px] text-surface-500\"\n >(edited)</span\n >\n }\n </div>\n </div>\n\r\n @if (getParentComment(comment); as parentComment) {\r\n <button\r\n type=\"button\"\r\n class=\"mb-2 block w-full rounded-xl border border-surface-200 bg-surface-50 px-2 py-1 text-left text-xs text-surface-600\"\r\n (click)=\"openReply(parentComment)\"\r\n >\r\n <span class=\"font-semibold\">{{\r\n parentComment.createdBy\r\n }}</span>\r\n <span class=\"mx-1\">:</span>\r\n <span class=\"line-clamp-1\">{{\r\n parentComment.comment\r\n }}</span>\r\n </button>\r\n }\r\n\r\n @if (editingCommentId() === comment.id) {\r\n <div class=\"relative\">\r\n <textarea\r\n rows=\"3\"\r\n class=\"w-full min-h-[5.25rem] resize-y rounded-2xl border border-surface-300 bg-white px-3 py-2.5 text-[0.86rem] leading-[1.45] text-surface-900 outline-none focus-visible:outline-2 focus-visible:outline-[color-mix(in_srgb,var(--p-primary-color)_32%,transparent)] focus-visible:outline-offset-1\"\r\n [ngModel]=\"editText()\"\r\n (ngModelChange)=\"editText.set($event)\"\r\n (input)=\"onEditInput($event)\"\r\n (keyup)=\"onEditCaretEvent($event)\"\r\n (click)=\"onEditCaretEvent($event)\"\r\n (scroll)=\"onEditCaretEvent($event)\"\r\n (keydown)=\"onEditKeydown($event)\"\r\n ></textarea>\r\n\r\n @if (\r\n mentionSession()?.mode === \"edit\" &&\r\n mentionSession()?.editCommentId === comment.id\r\n ) {\r\n <div\r\n class=\"absolute top-0 left-0 z-20 min-w-56 overflow-auto rounded-xl border border-surface-300 bg-white shadow-sm\"\r\n [ngStyle]=\"mentionMenuStyle()\"\r\n [class.origin-bottom-left]=\"\r\n mentionMenuPosition()?.placement === 'above'\r\n \"\r\n >\r\n @if (mentionLoading()) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n Searching...\r\n </div>\r\n } @else if (mentionCandidates().length === 0) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n No matches\r\n </div>\r\n } @else {\r\n @for (\r\n candidate of mentionCandidates();\r\n track candidate.userId;\r\n let i = $index\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-start gap-2 bg-transparent px-2.5 py-2 text-left text-[0.78rem] transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]\"\r\n [class.bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]]=\"\r\n mentionActiveIndex() === i\r\n \"\r\n (click)=\"selectMention(candidate)\"\r\n >\r\n <span\r\n class=\"mt-px inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_18%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.7rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)]\"\r\n >\r\n {{ getMentionAvatarText(candidate) }}\r\n </span>\r\n <span\r\n class=\"flex min-w-0 flex-1 flex-col gap-0.5\"\r\n >\r\n <span\r\n class=\"text-[0.79rem] leading-[1.25] font-semibold text-surface-900\"\r\n >{{\r\n candidate.displayName ||\r\n candidate.userName ||\r\n candidate.userId\r\n }}</span\r\n >\r\n <span\r\n class=\"inline-flex items-center text-[0.73rem] leading-[1.2] text-surface-500\"\r\n >\r\n @{{ candidate.userId }}\r\n </span>\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"mt-2 flex flex-wrap items-center justify-between gap-2\"\r\n >\r\n <span class=\"text-xs text-surface-500\"\r\n >{{ editText().length }}/10000</span\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n class=\"rounded-[0.65rem] border border-surface-300 bg-transparent px-3 py-2 text-xs font-semibold leading-none text-surface-700 transition-colors hover:border-[color-mix(in_srgb,var(--p-primary-color)_24%,transparent)] hover:bg-[color-mix(in_srgb,var(--p-primary-color)_8%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"cancelEdit()\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"rounded-[0.65rem] border border-[color-mix(in_srgb,var(--p-primary-color)_26%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_12%,white)] px-3 py-2 text-xs font-bold leading-none text-[color-mix(in_srgb,var(--p-primary-color)_76%,black)] transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_17%,white)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n [disabled]=\"!canSaveEdit()\"\r\n (click)=\"saveEdit()\"\r\n >\r\n {{ savingEdit() ? \"Saving...\" : \"Save\" }}\r\n </button>\r\n </div>\r\n </div>\r\n } @else {\r\n <div\r\n class=\"whitespace-pre-wrap pt-1 break-words text-sm leading-6\"\r\n >\r\n @for (\r\n segment of getCommentSegments(comment);\r\n track $index\r\n ) {\r\n <span\r\n [ngClass]=\"\r\n segment.isMention\r\n ? 'rounded-sm bg-primary-50 px-0.5 font-semibold text-primary-700'\r\n : ''\r\n \"\r\n [attr.data-user-id]=\"segment.userId || null\"\r\n >\r\n {{ segment.text }}\r\n </span>\r\n }\r\n </div>\r\n\r\n @if (comment.attachments.length > 0) {\r\n <div class=\"mt-2 flex flex-wrap gap-2\">\r\n @for (\r\n attachment of comment.attachments;\r\n track attachment.id\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex max-w-full items-center gap-1.5 rounded-lg border border-surface-300 px-2 py-1 text-[0.72rem] hover:bg-surface-50\"\r\n (click)=\"downloadAttachment(comment, attachment)\"\r\n >\r\n <span class=\"truncate\">{{\r\n attachment.fileName\r\n }}</span>\r\n <span class=\"text-[11px] text-surface-500\"\r\n >({{ attachment.size | number }} bytes)</span\r\n >\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"mt-2 flex flex-wrap items-center gap-1\">\r\n @if (!comment.isSystem) {\r\n <button\r\n type=\"button\"\r\n class=\"cursor-pointer rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"openReply(comment)\"\r\n >\r\n Reply\r\n </button>\r\n }\r\n @if (canEditComment(comment)) {\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"startEdit(comment)\"\r\n >\r\n Edit\r\n </button>\r\n }\r\n @if (canDeleteComment(comment)) {\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-red-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n [disabled]=\"isDeleting(comment.id)\"\r\n (click)=\"deleteComment(comment)\"\r\n >\r\n {{ isDeleting(comment.id) ? \"Deleting...\" : \"Delete\" }}\r\n </button>\r\n }\r\n @if (comment.updatedAt) {\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"openRevisions(comment)\"\r\n >\r\n History\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (isOwnComment(comment)) {\r\n <div\r\n class=\"mt-0.5 inline-flex h-[1.9rem] w-[1.9rem] shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_20%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.74rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_75%,black)]\"\r\n >\r\n {{ getAvatarText(comment) }}\r\n </div>\r\n }\r\n </article>\r\n }\r\n }\r\n </div>\r\n\r\n <footer\r\n class=\"z-10 shrink-0 border-t border-surface-200 bg-content px-3 py-3\"\r\n >\r\n @if (replyToComment(); as replyComment) {\r\n <div\r\n class=\"mb-2 flex items-center justify-between rounded-xl border border-surface-200 bg-surface-50 px-2 py-1\"\r\n >\r\n <div class=\"min-w-0 text-xs text-surface-600\">\r\n <span class=\"font-semibold\"\r\n >Replying to {{ replyComment.createdBy }}</span\r\n >\r\n <p class=\"truncate\">{{ replyComment.comment }}</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"clearReply()\"\r\n >\r\n Cancel\r\n </button>\r\n </div>\r\n }\r\n\r\n <div\r\n class=\"rounded-[1.5rem] border border-surface-300 bg-white p-2.5 shadow-sm\"\r\n >\r\n <div class=\"relative\">\r\n <textarea\r\n #composerInput\r\n rows=\"2\"\r\n class=\"w-full min-h-[3.75rem] resize-none border-0 bg-transparent px-2 pb-10 pr-24 pt-1 text-[0.9rem] leading-[1.45] text-surface-900 outline-none\"\r\n [disabled]=\"disabled() || posting()\"\r\n [ngModel]=\"composerText()\"\r\n (ngModelChange)=\"composerText.set($event)\"\r\n (input)=\"onComposerInput($event)\"\r\n (keyup)=\"onComposerCaretEvent($event)\"\r\n (click)=\"onComposerCaretEvent($event)\"\r\n (scroll)=\"onComposerCaretEvent($event)\"\r\n (keydown)=\"onComposerKeydown($event)\"\r\n [placeholder]=\"placeholder()\"\r\n ></textarea>\r\n\r\n <div class=\"absolute right-1 bottom-1 flex items-center gap-2\">\r\n @if (allowAttachments()) {\r\n <mt-button\r\n icon=\"file.paperclip\"\r\n size=\"small\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n [rounded]=\"true\"\r\n styleClass=\"mt-discussion-icon-btn\"\r\n [disabled]=\"disabled() || posting()\"\r\n (onClick)=\"browseAttachments()\"\r\n />\r\n }\r\n\r\n <mt-button\r\n icon=\"communication.send-01\"\r\n size=\"small\"\r\n [rounded]=\"true\"\r\n styleClass=\"mt-discussion-send-btn\"\r\n [loading]=\"posting()\"\r\n [disabled]=\"!canSend()\"\r\n (onClick)=\"sendComment()\"\r\n />\r\n </div>\r\n\r\n @if (mentionSession()?.mode === \"composer\") {\r\n <div\r\n class=\"absolute top-0 left-0 z-30 min-w-56 overflow-auto rounded-xl border border-surface-300 bg-white shadow-sm\"\r\n [ngStyle]=\"mentionMenuStyle()\"\r\n [class.origin-bottom-left]=\"\r\n mentionMenuPosition()?.placement === 'above'\r\n \"\r\n >\r\n @if (mentionLoading()) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n Searching...\r\n </div>\r\n } @else if (mentionCandidates().length === 0) {\r\n <div class=\"px-3 py-2 text-xs text-surface-500\">\r\n No matches\r\n </div>\r\n } @else {\r\n @for (\r\n candidate of mentionCandidates();\r\n track candidate.userId;\r\n let i = $index\r\n ) {\r\n <button\r\n type=\"button\"\r\n class=\"flex w-full cursor-pointer items-start gap-2 bg-transparent px-2.5 py-2 text-left text-[0.78rem] transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]\"\r\n [class.bg-[color-mix(in_srgb,var(--p-primary-color)_11%,white)]]=\"\r\n mentionActiveIndex() === i\r\n \"\r\n (click)=\"selectMention(candidate)\"\r\n >\r\n <span\r\n class=\"mt-px inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-[color-mix(in_srgb,var(--p-primary-color)_18%,transparent)] bg-[color-mix(in_srgb,var(--p-primary-color)_16%,white)] text-[0.7rem] font-bold text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)]\"\r\n >\r\n {{ getMentionAvatarText(candidate) }}\r\n </span>\r\n <span class=\"flex min-w-0 flex-1 flex-col gap-0.5\">\r\n <span\r\n class=\"text-[0.79rem] leading-[1.25] font-semibold text-surface-900\"\r\n >{{\r\n candidate.displayName ||\r\n candidate.userName ||\r\n candidate.userId\r\n }}</span\r\n >\r\n <span\r\n class=\"inline-flex items-center text-[0.73rem] leading-[1.2] text-surface-500\"\r\n >\r\n @{{ candidate.userId }}\r\n </span>\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (composerAttachments().length > 0) {\r\n <div class=\"mt-2 flex flex-wrap gap-2 px-1\">\r\n @for (attachment of composerAttachments(); track attachment.id) {\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-50 px-2.5 py-1.5 text-xs\"\r\n >\r\n <div class=\"flex items-center gap-2\">\r\n <span class=\"max-w-[12rem] truncate\">{{\r\n attachment.fileName\r\n }}</span>\r\n @if (attachment.status === \"uploading\") {\r\n <span class=\"text-surface-500\"\r\n >{{ attachment.progress }}%</span\r\n >\r\n } @else if (attachment.status === \"failed\") {\r\n <span class=\"text-red-600\">Failed</span>\r\n } @else {\r\n <span class=\"text-emerald-600\">Ready</span>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"rounded-lg bg-transparent px-2 py-1 text-[0.72rem] font-semibold leading-none text-surface-600 transition-colors hover:bg-[color-mix(in_srgb,var(--p-primary-color)_10%,white)] hover:text-[color-mix(in_srgb,var(--p-primary-color)_74%,black)] disabled:cursor-not-allowed disabled:opacity-55\"\r\n (click)=\"removeAttachment(attachment.id)\"\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n @if (attachment.error) {\r\n <p class=\"text-[11px] text-red-600\">\r\n {{ attachment.error }}\r\n </p>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n @if (composerText().length > 10000) {\r\n <div class=\"mt-2 px-1 text-xs font-medium text-red-600\">\r\n Comment cannot exceed 10000 characters.\r\n </div>\r\n }\r\n </div>\r\n </footer>\r\n </div>\r\n </div>\r\n</mt-card>\r\n\r\n<p-dialog\r\n [visible]=\"revisionsDialogVisible()\"\r\n (visibleChange)=\"revisionsDialogVisible.set($event)\"\r\n [modal]=\"true\"\r\n [dismissableMask]=\"true\"\r\n [draggable]=\"false\"\r\n [resizable]=\"false\"\r\n [style]=\"{ width: 'min(42rem, 92vw)' }\"\r\n header=\"Comment history\"\r\n>\r\n @if (revisionLoading()) {\r\n <div class=\"space-y-2\">\r\n @for (row of [1, 2, 3]; track row) {\r\n <div class=\"h-12 animate-pulse rounded-xl bg-surface-100\"></div>\r\n }\r\n </div>\r\n } @else if (visibleRevisions().length === 0) {\r\n <p class=\"text-sm text-surface-500\">No revision snapshots.</p>\r\n } @else {\r\n <div class=\"max-h-[55vh] space-y-2 overflow-y-auto pr-1\">\r\n @for (revision of visibleRevisions(); track revision.id) {\r\n <article class=\"rounded-xl border border-surface-200 p-3\">\r\n <div class=\"mb-1 text-xs text-surface-500\">\r\n Revision #{{ revision.revisionNumber }} &bull;\r\n {{ revision.createdAt | date: \"MMM d, y h:mm a\" }} &bull;\r\n {{ revision.createdBy }}\r\n </div>\r\n <div class=\"whitespace-pre-wrap break-words text-sm leading-6\">\r\n @for (\r\n segment of getCommentSegments({\r\n id: revision.id,\r\n moduleType: selectedRevisionComment()?.moduleType || \"\",\r\n recordId: selectedRevisionComment()?.recordId || 0,\r\n parentCommentId: null,\r\n comment: revision.comment,\r\n isSystem: false,\r\n createdAt: revision.createdAt,\r\n updatedAt: null,\r\n createdBy: revision.createdBy,\r\n updatedBy: null,\r\n attachments: [],\r\n mentions: revision.mentions,\r\n });\r\n track $index\r\n ) {\r\n <span\r\n [ngClass]=\"\r\n segment.isMention\r\n ? 'rounded-sm bg-primary-50 px-0.5 font-semibold text-primary-700'\r\n : ''\r\n \"\r\n >{{ segment.text }}</span\r\n >\r\n }\r\n </div>\r\n </article>\r\n }\r\n </div>\r\n }\r\n</p-dialog>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}