{"version":3,"file":"sinequa-components-comments.mjs","sources":["../../../projects/components/comments/comments.web.service.ts","../../../projects/components/comments/creation-date.pipe.ts","../../../projects/components/comments/markdown.pipe.ts","../../../projects/components/comments/comments.component.ts","../../../projects/components/comments/comments.component.html","../../../projects/components/comments/comments.module.ts","../../../projects/components/comments/messages/en.ts","../../../projects/components/comments/messages/fr.ts","../../../projects/components/comments/messages/de.ts","../../../projects/components/comments/sinequa-components-comments.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { HttpService } from \"@sinequa/core/web-services\";\r\nimport { Observable, of, map } from \"rxjs\";\r\n\r\ndeclare interface CoreComment {\r\n    commentid: string;\r\n    docid: string;\r\n    replyto: string;\r\n    creation: string;\r\n    modified: string;\r\n    subcomments?: Comment[];\r\n}\r\n\r\nexport interface DeletedComment extends CoreComment{\r\n    deleted: true;\r\n}\r\n\r\nexport interface NormalComment extends CoreComment {\r\n    message: string;\r\n    userid: string;\r\n    username: string;\r\n    likes: number;\r\n    likedByUser: boolean;\r\n}\r\n\r\nexport type Comment = NormalComment | DeletedComment;\r\n\r\n\r\n@Injectable({\r\n    providedIn: 'root'\r\n})\r\nexport class CommentsWebService extends HttpService {\r\n    protected endpoint = 'plugin/CommentsWebService';\r\n\r\n    /**\r\n     * Return the list of comments for a given document\r\n     * @param docid\r\n     * @returns\r\n     */\r\n    getComments(docid: string): Observable<Comment[]> {\r\n        return this.httpClient.post<{comments: Comment[]}>(\r\n            this.makeUrl(this.endpoint), {docid, action: 'read'}\r\n        ).pipe(map(c => c.comments));\r\n    }\r\n\r\n    /**\r\n     * Return the number of comments for a given document\r\n     * @param docid\r\n     * @returns\r\n     */\r\n    getCommentCount(docid: string): Observable<number> {\r\n        return this.httpClient.post<{count: number}>(\r\n            this.makeUrl(this.endpoint), {docid, action: 'count'}\r\n        ).pipe(map(c => c.count));\r\n    }\r\n\r\n    /**\r\n     * Return the number of comments for a list of documents\r\n     * @param docids\r\n     * @returns\r\n     */\r\n    getCommentCounts(docids: string[]): Observable<{[id: string]: number}> {\r\n        if(docids.length === 0) {\r\n            return of({});\r\n        }\r\n        return this.httpClient.post<{counts: {[id: string]: number}}>(\r\n            this.makeUrl(this.endpoint), {docid: docids[0], docids, action: 'count'}\r\n        ).pipe(map(c => c.counts));\r\n    }\r\n\r\n    /**\r\n     * Create a comment with given message for a given document\r\n     * @param docid\r\n     * @param message\r\n     * @param replyto\r\n     * @returns\r\n     */\r\n    createComment(docid: string, message: string, replyto?: string): Observable<NormalComment> {\r\n        return this.httpClient.post<{comment: NormalComment}>(\r\n            this.makeUrl(this.endpoint), {docid, message, replyto, action: 'create'}\r\n        ).pipe(map(c => c.comment));\r\n    }\r\n\r\n    /**\r\n     * Modify the content of a comment\r\n     * @param docid\r\n     * @param commentid\r\n     * @param message\r\n     * @returns\r\n     */\r\n    updateComment(docid: string, commentid: string, message: string) {\r\n        return this.httpClient.post<{comment: NormalComment}>(\r\n            this.makeUrl(this.endpoint), {docid, commentid, message, action: 'update'}\r\n        ).pipe(map(c => c.comment));\r\n    }\r\n\r\n    /**\r\n     * Delete a specific comment\r\n     * @param docid\r\n     * @param commentid\r\n     * @param markAsDeleted\r\n     * @returns\r\n     */\r\n    deleteComment(docid: string, commentid: string, markAsDeleted: boolean): Observable<void> {\r\n        return this.httpClient.post<void>(\r\n            this.makeUrl(this.endpoint), {docid, commentid, markAsDeleted, action: 'delete'}\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Add a like to a comment\r\n     * @param docid\r\n     * @param commentid\r\n     * @returns\r\n     */\r\n    likeComment(docid: string, commentid: string): Observable<NormalComment> {\r\n        return this.httpClient.post<{comment: NormalComment}>(\r\n            this.makeUrl(this.endpoint), {docid, commentid, action: 'like'}\r\n        ).pipe(map(c => c.comment));\r\n    }\r\n}\r\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\nimport { IntlService } from \"@sinequa/core/intl\";\r\nimport { Comment } from \"./comments.web.service\";\r\n\r\n@Pipe({\n    name: \"sqCreationDate\",\n    standalone: false\n})\r\nexport class CreationDatePipe implements PipeTransform {\r\n\r\n    constructor(\r\n        public intlService: IntlService\r\n    ){}\r\n\r\n    transform(comment: Comment): string {\r\n        const creation = this.intlService.formatDate(comment.creation) + \" \" + this.intlService.formatTime(comment.creation);\r\n        let msg = this.intlService.formatMessage(\"msg#comments.created\", {date: creation});\r\n        if(comment.modified !== comment.creation) {\r\n            const modified = this.intlService.formatDate(comment.modified) + \" \" + this.intlService.formatTime(comment.modified);\r\n            msg += \" - \" + this.intlService.formatMessage(\"msg#comments.modified\", {date: modified});\r\n        }\r\n        return msg;\r\n    }\r\n}","import { Pipe, PipeTransform } from \"@angular/core\";\r\nimport {marked} from \"marked\";\r\n\r\n@Pipe({\n    name: \"sqMarkdown\",\n    standalone: false\n})\r\nexport class MarkdownPipe implements PipeTransform {\r\n  transform(value: any): any {\r\n    if (value && value.length > 0) {\r\n      return marked(value);\r\n    }\r\n    return value;\r\n  }\r\n}","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\r\nimport { Validators } from \"@angular/forms\";\r\nimport { ConfirmType, ModalButton, ModalResult, ModalService } from \"@sinequa/core/modal\";\r\nimport { Principal, PrincipalWebService } from \"@sinequa/core/web-services\";\r\nimport { CommentsWebService, Comment, NormalComment } from \"./comments.web.service\";\r\n\r\n@Component({\n    selector: 'sq-comments',\n    templateUrl: './comments.component.html',\n    styleUrls: ['./comments.component.scss'],\n    standalone: false\n})\r\nexport class CommentsComponent implements OnChanges {\r\n    @Input() docid: string;\r\n    @Input() theme: 'light' | 'dark' = 'light';\r\n\r\n    comments: Comment[];\r\n    user?: Principal;\r\n\r\n    constructor(\r\n        public commentsWebService: CommentsWebService,\r\n        public modalService: ModalService,\r\n        public principalService: PrincipalWebService\r\n    ){\r\n\r\n    }\r\n\r\n    ngOnChanges(simpleChanges: SimpleChanges) {\r\n        if(simpleChanges.docid && this.docid) {\r\n            this.user = this.principalService.principal;\r\n            this.commentsWebService.getComments(this.docid)\r\n                .subscribe(comments => this.comments = comments);\r\n        }\r\n    }\r\n\r\n    addComment(replyTo?: Comment) {\r\n        const model = {\r\n            title: replyTo? 'msg#comments.replyTo' : 'msg#comments.add',\r\n            message: 'msg#comments.markdownNotice',\r\n            buttons: [],\r\n            output: '',\r\n            validators: [Validators.required],\r\n            rowCount: 5\r\n        }\r\n        this.modalService.prompt(model).then(result => {\r\n            if(result === ModalResult.OK && model.output.trim() !== \"\") {\r\n                this.commentsWebService.createComment(this.docid, model.output, replyTo?.commentid).subscribe(comment => {\r\n                    if(replyTo) {\r\n                        if(!replyTo.subcomments) {\r\n                            replyTo.subcomments = [];\r\n                        }\r\n                        replyTo.subcomments.push(comment);\r\n                    }\r\n                    else {\r\n                        this.comments.push(comment);\r\n                    }\r\n                });\r\n            }\r\n        });\r\n    }\r\n\r\n    likeComment(comment: NormalComment) {\r\n        this.commentsWebService.likeComment(comment.docid, comment.commentid)\r\n            .subscribe(res => {\r\n                comment.likes = res.likes;\r\n                comment.likedByUser = res.likedByUser;\r\n            });\r\n    }\r\n\r\n    editComment(comment: NormalComment) {\r\n        const model = {\r\n            title: 'msg#comments.editComment',\r\n            message: 'msg#comments.markdownNotice',\r\n            buttons: [],\r\n            output: comment.message,\r\n            validators: [Validators.required],\r\n            rowCount: 5\r\n        }\r\n        this.modalService.prompt(model).then(result => {\r\n            if(result === ModalResult.OK && model.output.trim() !== \"\") {\r\n                this.commentsWebService.updateComment(comment.docid, comment.commentid, model.output)\r\n                    .subscribe(res => {\r\n                        comment.message = res.message;\r\n                        comment.modified = res.modified;\r\n                        comment.likes = res.likes;\r\n                        comment.likedByUser = res.likedByUser;\r\n                    });\r\n            }\r\n        });\r\n    }\r\n\r\n    deleteComment(comment: NormalComment) {\r\n        // If the comment has subcomments, only mark it as deleted\r\n        const markAsDeleted = !!comment.subcomments?.length;\r\n\r\n        this.modalService.confirm({\r\n            message: \"msg#comments.deleteNotice\",\r\n            confirmType: ConfirmType.Warning,\r\n            buttons: [\r\n                new ModalButton({\r\n                    result: ModalResult.Yes,\r\n                    primary: true\r\n                }),\r\n                new ModalButton({\r\n                    result: ModalResult.Cancel\r\n                })\r\n            ]\r\n        }).then(res => {\r\n            if(res === ModalResult.Yes) {\r\n                this.commentsWebService.deleteComment(comment.docid, comment.commentid, markAsDeleted)\r\n                    .subscribe(res => {\r\n                        if(markAsDeleted) {\r\n                            let c = comment as any;\r\n                            c.deleted = true;\r\n                            delete c.message;\r\n                            delete c.userid;\r\n                            delete c.username;\r\n                            delete c.likes;\r\n                            delete c.likedByUser;\r\n                        }\r\n                        else {\r\n                            this.remove(this.comments, comment);\r\n                        }\r\n                    });\r\n            }\r\n        });\r\n\r\n    }\r\n\r\n    protected remove(comments: Comment[], comment: Comment): boolean {\r\n        for(let i=0; i<comments.length; i++) {\r\n            if(comments[i] === comment) {\r\n                comments.splice(i,1);\r\n                return true;\r\n            }\r\n            const subcomments = comments[i].subcomments;\r\n            if(subcomments) {\r\n                if(this.remove(subcomments, comment)) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n}","<div *ngIf=\"comments\" class=\"comments\" [ngClass]=\"theme\">\r\n    <ng-container *ngTemplateOutlet=\"commentsTpl; context:{$implicit: comments}\"></ng-container>\r\n\r\n    <div *ngIf=\"comments.length === 0\" class=\"fst-italic text-center my-4\">\r\n        {{ 'msg#comments.noComment' | sqMessage }}\r\n    </div>\r\n\r\n    <div>\r\n        <button class=\"btn btn-primary d-block mx-auto mt-3\" (click)=\"addComment()\">\r\n            <i class=\"fas fa-comment\"></i>\r\n            {{ 'msg#comments.write' | sqMessage }}\r\n        </button>\r\n    </div>\r\n</div>\r\n\r\n<div *ngIf=\"!comments\">\r\n    <div class=\"spinner-grow d-block mx-auto mt-4\" role=\"status\">\r\n        <span class=\"visually-hidden\">{{ 'msg#preview.loading' | sqMessage }}</span>\r\n    </div>\r\n</div>\r\n\r\n\r\n<ng-template #commentsTpl let-comments>\r\n\r\n    <ng-container *ngFor=\"let comment of comments\">\r\n\r\n        <div class=\"message ps-2 py-1 pe-2\">\r\n            <div class=\"mt-2 d-flex\" [ngClass]=\"{'text-muted':comment.deleted}\" (click)=\"comment.$collapsed = !comment.$collapsed\">\r\n                <i class=\"fas fa-user-circle me-1\"></i>\r\n                <span class=\"text-truncate small fw-bold me-2\" *ngIf=\"!comment.deleted\">{{comment.username}}</span>\r\n                <span class=\"text-truncate small fw-bold me-2\" *ngIf=\"comment.deleted\">{{ 'msg#comments.deleted' | sqMessage }}</span>\r\n                <span class=\"small text-muted ms-auto\" [title]=\"comment | sqCreationDate\">{{comment.modified | sqRelativeTime}}<ng-container *ngIf=\"comment.modified !== comment.creation\">*</ng-container></span>\r\n                <sq-collapse-button [collapsed]=\"comment.$collapsed\" (state)=\"comment.$collapsed = $event\" (click)=\"$event.stopPropagation()\" class=\"ms-1 small\"></sq-collapse-button>\r\n            </div>\r\n\r\n            <sq-collapse [collapsed]=\"comment.$collapsed\">\r\n\r\n                <ng-template>\r\n\r\n                    <div class=\"message-body\" *ngIf=\"!comment.deleted\" [innerHTML]=\"comment.message | sqMarkdown\"></div>\r\n                    <div class=\"text-muted\" *ngIf=\"comment.deleted\">{{ 'msg#comments.deleted' | sqMessage }}</div>\r\n\r\n                    <div class=\"d-flex justify-content-end\">\r\n                        <div class=\"btn-group\" role=\"group\" *ngIf=\"!comment.deleted\" (click)=\"$event.stopPropagation()\">\r\n                            <button class=\"btn btn-sm\" (click)=\"likeComment(comment)\" [ngClass]=\"{'btn-success': comment.likedByUser, 'btn-outline-secondary': !comment.likedByUser}\">\r\n                                <i class=\"fas fa-thumbs-up\"></i>\r\n                                <span *ngIf=\"comment.likes > 0\">&nbsp;{{comment.likes}}</span>\r\n                                <span *ngIf=\"comment.likes === 0\">&nbsp;{{ 'msg#comments.like' | sqMessage }}</span>\r\n                            </button>\r\n                            <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"addComment(comment)\">\r\n                                <i class=\"fas fa-reply\"></i>\r\n                                <span>&nbsp;{{ 'msg#comments.reply' | sqMessage }}</span>\r\n                            </button>\r\n                            <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"editComment(comment)\" *ngIf=\"user?.userId === comment.userid || user?.isAdministrator\">\r\n                                <i class=\"fas fa-edit\"></i>\r\n                                <span>&nbsp;{{ 'msg#comments.edit' | sqMessage }}</span>\r\n                            </button>\r\n                            <button class=\"btn btn-sm btn-outline-secondary\" (click)=\"deleteComment(comment)\" *ngIf=\"user?.userId === comment.userid || user?.isAdministrator\">\r\n                                <i class=\"fas fa-trash-alt\"></i>\r\n                                <span>&nbsp;{{ 'msg#comments.delete' | sqMessage }}</span>\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n\r\n                </ng-template>\r\n\r\n            </sq-collapse>\r\n        </div>\r\n\r\n        <div *ngIf=\"!comment.$collapsed && comment.subcomments\" class=\"subcomments ms-2\">\r\n            <ng-container *ngTemplateOutlet=\"commentsTpl; context:{$implicit: comment.subcomments}\"></ng-container>\r\n        </div>\r\n\r\n    </ng-container>\r\n\r\n</ng-template>\r\n","import { CommonModule } from \"@angular/common\";\r\nimport { NgModule } from \"@angular/core\";\r\nimport { CollapseModule } from \"@sinequa/components/collapse\";\r\nimport { UtilsModule } from \"@sinequa/components/utils\";\r\nimport { IntlModule } from \"@sinequa/core/intl\";\r\nimport { LoginModule } from \"@sinequa/core/login\";\r\nimport { WebServicesModule } from \"@sinequa/core/web-services\";\r\nimport { CommentsComponent } from \"./comments.component\";\r\nimport { CreationDatePipe } from \"./creation-date.pipe\";\r\nimport { MarkdownPipe } from \"./markdown.pipe\";\r\n\r\n@NgModule({\r\n    imports: [\r\n        CommonModule,\r\n\r\n        WebServicesModule,\r\n        IntlModule,\r\n        LoginModule,\r\n\r\n        UtilsModule,\r\n        CollapseModule\r\n    ],\r\n    declarations: [\r\n        CommentsComponent,\r\n        CreationDatePipe,\r\n        MarkdownPipe\r\n    ],\r\n    exports: [\r\n        CommentsComponent,\r\n        MarkdownPipe\r\n    ],\r\n})\r\nexport class CommentsModule {\r\n}","export default {\r\n    \"comments\": {\r\n        \"created\": \"Created on {date}\",\r\n        \"modified\": \"Modified on {date}\",\r\n        \"replyTo\": \"Reply to comment\",\r\n        \"add\": \"Add a comment\",\r\n        \"write\": \"Write a comment\",\r\n        \"like\": \"Like\",\r\n        \"reply\": \"Reply\",\r\n        \"edit\": \"Edit\",\r\n        \"delete\": \"Delete\",\r\n        \"editComment\": \"Edit your comment\",\r\n        \"markdownNotice\": \"(Markdown syntax supported)\",\r\n        \"noComment\": \"No comment yet\",\r\n        \"deleteNotice\": \"Are you sure you want to delete this comment? (replies will remain visible)\",\r\n        \"deleted\": \"[deleted]\"\r\n    }\r\n}","export default {\r\n    \"comments\": {\r\n        \"created\": \"Créé le {date}\",\r\n        \"modified\": \"Modifié le {date}\",\r\n        \"replyTo\": \"Répondre à un commentaire\",\r\n        \"add\": \"Ajouter un commentaire\",\r\n        \"write\": \"Écrire un commentaire\",\r\n        \"like\": \"Aimer\",\r\n        \"reply\": \"Répondre\",\r\n        \"edit\": \"Éditer\",\r\n        \"delete\": \"Supprimer\",\r\n        \"editComment\": \"Éditer votre commentaire\",\r\n        \"markdownNotice\": \"(Syntaxe Markdown supportée)\",\r\n        \"noComment\": \"Pas encore de commentaire\",\r\n        \"deleteNotice\": \"Êtes-vous certain de vouloir supprimer ce commentaire? (les réponses resteront visibles)\",\r\n        \"deleted\": \"[supprimé]\"\r\n    }\r\n}","export default {\r\n    \"comments\": {\r\n        \"created\": \"Erstellt am {date}\",\r\n        \"modified\": \"Geändert am {date}\",\r\n        \"replyTo\": \"Auf einen Kommentar antworten\",\r\n        \"add\": \"Einen Kommentar hinzufügen\",\r\n        \"write\": \"Schreibe einen Kommentar\",\r\n        \"like\": \"Mögen\",\r\n        \"reply\": \"Antworten\",\r\n        \"edit\": \"Bearbeiten\",\r\n        \"delete\": \"Löschen\",\r\n        \"editComment\": \"Bearbeiten Sie Ihren Kommentar\",\r\n        \"markdownNotice\": \"(Markdown-Syntax unterstützt)\",\r\n        \"noComment\": \"Noch kein Kommentar\",\r\n        \"deleteNotice\": \"Möchten Sie diesen Kommentar wirklich löschen? (Antworten bleiben sichtbar)\",\r\n        \"deleted\": \"[gelöscht]\"\r\n    }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CommentsWebService","i6","i8.CreationDatePipe","i9.MarkdownPipe"],"mappings":"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"}