@rolatech/angular-comment 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/esm2022/index.mjs +4 -0
- package/esm2022/lib/components/comment-action/comment-action.component.mjs +66 -0
- package/esm2022/lib/components/comment-item/comment-item.component.mjs +107 -0
- package/esm2022/lib/components/comment-replies/comment-replies.component.mjs +51 -0
- package/esm2022/lib/components/comments/comments.component.mjs +61 -0
- package/esm2022/lib/components/comments-header/comments-header.component.mjs +84 -0
- package/esm2022/lib/components/index.mjs +5 -0
- package/esm2022/lib/components/reply-item/reply-item.component.mjs +69 -0
- package/esm2022/lib/interfaces/comment.interface.mjs +6 -0
- package/esm2022/lib/interfaces/index.mjs +2 -0
- package/esm2022/lib/services/comment.service.mjs +200 -0
- package/esm2022/lib/services/index.mjs +2 -0
- package/esm2022/rolatech-angular-comment.mjs +5 -0
- package/fesm2022/rolatech-angular-comment.mjs +581 -0
- package/fesm2022/rolatech-angular-comment.mjs.map +1 -0
- package/index.d.ts +3 -0
- package/lib/components/comment-action/comment-action.component.d.ts +21 -0
- package/lib/components/comment-item/comment-item.component.d.ts +20 -0
- package/lib/components/comment-replies/comment-replies.component.d.ts +19 -0
- package/lib/components/comments/comments.component.d.ts +19 -0
- package/lib/components/comments-header/comments-header.component.d.ts +21 -0
- package/lib/components/index.d.ts +4 -0
- package/lib/components/reply-item/reply-item.component.d.ts +16 -0
- package/lib/interfaces/comment.interface.d.ts +43 -0
- package/lib/interfaces/index.d.ts +1 -0
- package/lib/services/comment.service.d.ts +37 -0
- package/lib/services/index.d.ts +1 -0
- package/package.json +31 -0
- package/themes/_default.scss +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './lib/components';
|
|
2
|
+
export * from './lib/services';
|
|
3
|
+
export * from './lib/interfaces';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tbWVudC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ludGVyZmFjZXMnO1xuIl19
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
6
|
+
import { MatInputModule } from '@angular/material/input';
|
|
7
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
8
|
+
import { CommentService } from '../../services';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/forms";
|
|
11
|
+
import * as i2 from "@angular/material/button";
|
|
12
|
+
import * as i3 from "@angular/material/icon";
|
|
13
|
+
import * as i4 from "@angular/material/form-field";
|
|
14
|
+
import * as i5 from "@angular/material/input";
|
|
15
|
+
import * as i6 from "@angular/cdk/text-field";
|
|
16
|
+
import * as i7 from "@angular/material/progress-spinner";
|
|
17
|
+
export class CommentActionComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.commentService = inject(CommentService);
|
|
20
|
+
this.placeholder = '请输入回复内容';
|
|
21
|
+
this.reply = new EventEmitter();
|
|
22
|
+
this.thumbsUp = new EventEmitter();
|
|
23
|
+
this.thumbsDown = new EventEmitter();
|
|
24
|
+
this.show = false;
|
|
25
|
+
this.content = '';
|
|
26
|
+
this.loading = false;
|
|
27
|
+
}
|
|
28
|
+
onCancel() {
|
|
29
|
+
this.show = false;
|
|
30
|
+
this.content = '';
|
|
31
|
+
}
|
|
32
|
+
onReply() {
|
|
33
|
+
this.loading = true;
|
|
34
|
+
this.reply.emit(this.content);
|
|
35
|
+
this.commentService.onCommentLoading.subscribe({
|
|
36
|
+
next: (res) => {
|
|
37
|
+
this.loading = res;
|
|
38
|
+
this.show = false;
|
|
39
|
+
this.content = '';
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
onThumbsUp() {
|
|
44
|
+
this.thumbsUp.emit();
|
|
45
|
+
}
|
|
46
|
+
onThumbsDown() {
|
|
47
|
+
this.thumbsDown.emit();
|
|
48
|
+
}
|
|
49
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
50
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: CommentActionComponent, isStandalone: true, selector: "rolatech-comment-action", inputs: { placeholder: "placeholder", data: "data" }, outputs: { reply: "reply", thumbsUp: "thumbsUp", thumbsDown: "thumbsDown" }, ngImport: i0, template: "<div>\n <div class=\"flex items-center -ml-2\">\n <button class=\"w-8 h-8 p-1 hover:bg-gray-200 rounded-full\" (click)=\"onThumbsUp()\">\n <mat-icon [color]=\"data.like ? 'primary' : ''\">thumb_up</mat-icon>\n </button>\n @if (data.thumbsUpCount > 0) {\n <span class=\"text-sm opacity-80\">{{ data.thumbsUpCount }}</span>\n }\n <button class=\"w-8 h-8 p-1 hover:bg-gray-200 rounded-full\" (click)=\"onThumbsDown()\">\n <mat-icon [color]=\"data.dislike ? 'primary' : ''\">thumb_down</mat-icon>\n </button>\n @if (data.thumbsDownCount > 0) {\n <span class=\"text-sm opacity-80\">{{ data.thumbsDownCount }}</span>\n }\n\n <button mat-button (click)=\"show = true\" class=\"w-8 h-8\">\u56DE\u590D</button>\n </div>\n <div>\n @if (loading) {\n <div class=\"flex items-center justify-center h-20\">\n <mat-spinner diameter=\"32\"></mat-spinner>\n </div>\n } @else {\n @if (show) {\n <mat-form-field>\n <textarea\n matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n cdkAutosizeMaxRows=\"8\"\n [placeholder]=\"placeholder\"\n [(ngModel)]=\"content\"\n (focus)=\"show = true\"\n ></textarea>\n </mat-form-field>\n <div class=\"flex justify-end items-center gap-2 pr-2\">\n <button mat-button (click)=\"onCancel()\">\u53D6\u6D88</button>\n <button mat-flat-button color=\"primary\" (click)=\"onReply()\">\n <span class=\"text-white\">\u56DE\u590D</span>\n </button>\n </div>\n }\n }\n </div>\n</div>\n", styles: ["mat-icon{transform:scale(.8)}mat-form-field{width:100%}textarea:focus{outline:none;box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i6.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
51
|
+
}
|
|
52
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentActionComponent, decorators: [{
|
|
53
|
+
type: Component,
|
|
54
|
+
args: [{ selector: 'rolatech-comment-action', standalone: true, imports: [AngularCommonModule, MatButtonModule, MatIconModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule], template: "<div>\n <div class=\"flex items-center -ml-2\">\n <button class=\"w-8 h-8 p-1 hover:bg-gray-200 rounded-full\" (click)=\"onThumbsUp()\">\n <mat-icon [color]=\"data.like ? 'primary' : ''\">thumb_up</mat-icon>\n </button>\n @if (data.thumbsUpCount > 0) {\n <span class=\"text-sm opacity-80\">{{ data.thumbsUpCount }}</span>\n }\n <button class=\"w-8 h-8 p-1 hover:bg-gray-200 rounded-full\" (click)=\"onThumbsDown()\">\n <mat-icon [color]=\"data.dislike ? 'primary' : ''\">thumb_down</mat-icon>\n </button>\n @if (data.thumbsDownCount > 0) {\n <span class=\"text-sm opacity-80\">{{ data.thumbsDownCount }}</span>\n }\n\n <button mat-button (click)=\"show = true\" class=\"w-8 h-8\">\u56DE\u590D</button>\n </div>\n <div>\n @if (loading) {\n <div class=\"flex items-center justify-center h-20\">\n <mat-spinner diameter=\"32\"></mat-spinner>\n </div>\n } @else {\n @if (show) {\n <mat-form-field>\n <textarea\n matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n cdkAutosizeMaxRows=\"8\"\n [placeholder]=\"placeholder\"\n [(ngModel)]=\"content\"\n (focus)=\"show = true\"\n ></textarea>\n </mat-form-field>\n <div class=\"flex justify-end items-center gap-2 pr-2\">\n <button mat-button (click)=\"onCancel()\">\u53D6\u6D88</button>\n <button mat-flat-button color=\"primary\" (click)=\"onReply()\">\n <span class=\"text-white\">\u56DE\u590D</span>\n </button>\n </div>\n }\n }\n </div>\n</div>\n", styles: ["mat-icon{transform:scale(.8)}mat-form-field{width:100%}textarea:focus{outline:none;box-shadow:none}\n"] }]
|
|
55
|
+
}], propDecorators: { placeholder: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], data: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], reply: [{
|
|
60
|
+
type: Output
|
|
61
|
+
}], thumbsUp: [{
|
|
62
|
+
type: Output
|
|
63
|
+
}], thumbsDown: [{
|
|
64
|
+
type: Output
|
|
65
|
+
}] } });
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1hY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvbW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1lbnQtYWN0aW9uL2NvbW1lbnQtYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50LWFjdGlvbi9jb21tZW50LWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQVVoRCxNQUFNLE9BQU8sc0JBQXNCO0lBUG5DO1FBUUUsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxTQUFTLENBQUM7UUFFdkIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbkMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFL0MsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsWUFBTyxHQUFHLEtBQUssQ0FBQztLQXVCakI7SUFyQkMsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO2dCQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDcEIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQzs4R0FoQ1Usc0JBQXNCO2tHQUF0QixzQkFBc0Isc05DakJuQyxpcURBOENBLDhKRGpDWSxtQkFBbUIsOG1CQUFFLGVBQWUsMk5BQUUsYUFBYSxtTEFBRSxrQkFBa0IseU9BQUUsY0FBYyx5a0JBQUUsd0JBQXdCOzsyRkFJaEgsc0JBQXNCO2tCQVBsQyxTQUFTOytCQUNFLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSx3QkFBd0IsQ0FBQzs4QkFNbkgsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0ksS0FBSztzQkFBZCxNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZ3VsYXJDb21tb25Nb2R1bGUgfSBmcm9tICdAcm9sYXRlY2gvYW5ndWxhci1jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IENvbW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgQ29tbWVudCwgUmVwbHkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtY29tbWVudC1hY3Rpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQW5ndWxhckNvbW1vbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY29tbWVudC1hY3Rpb24uY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBDb21tZW50QWN0aW9uQ29tcG9uZW50IHtcbiAgY29tbWVudFNlcnZpY2UgPSBpbmplY3QoQ29tbWVudFNlcnZpY2UpO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICfor7fovpPlhaXlm57lpI3lhoXlrrknO1xuICBASW5wdXQoKSBkYXRhITogQ29tbWVudCB8IFJlcGx5O1xuICBAT3V0cHV0KCkgcmVwbHkgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHRodW1ic1VwID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB0aHVtYnNEb3duID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgc2hvdyA9IGZhbHNlO1xuICBjb250ZW50OiBzdHJpbmcgPSAnJztcbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIG9uQ2FuY2VsKCkge1xuICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgIHRoaXMuY29udGVudCA9ICcnO1xuICB9XG4gIG9uUmVwbHkoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlcGx5LmVtaXQodGhpcy5jb250ZW50KTtcbiAgICB0aGlzLmNvbW1lbnRTZXJ2aWNlLm9uQ29tbWVudExvYWRpbmcuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gcmVzO1xuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gJyc7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIG9uVGh1bWJzVXAoKSB7XG4gICAgdGhpcy50aHVtYnNVcC5lbWl0KCk7XG4gIH1cbiAgb25UaHVtYnNEb3duKCkge1xuICAgIHRoaXMudGh1bWJzRG93bi5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXY+XG4gIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciAtbWwtMlwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJ3LTggaC04IHAtMSBob3ZlcjpiZy1ncmF5LTIwMCByb3VuZGVkLWZ1bGxcIiAoY2xpY2spPVwib25UaHVtYnNVcCgpXCI+XG4gICAgICA8bWF0LWljb24gW2NvbG9yXT1cImRhdGEubGlrZSA/ICdwcmltYXJ5JyA6ICcnXCI+dGh1bWJfdXA8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIEBpZiAoZGF0YS50aHVtYnNVcENvdW50ID4gMCkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIG9wYWNpdHktODBcIj57eyBkYXRhLnRodW1ic1VwQ291bnQgfX08L3NwYW4+XG4gICAgfVxuICAgIDxidXR0b24gY2xhc3M9XCJ3LTggaC04IHAtMSBob3ZlcjpiZy1ncmF5LTIwMCByb3VuZGVkLWZ1bGxcIiAoY2xpY2spPVwib25UaHVtYnNEb3duKClcIj5cbiAgICAgIDxtYXQtaWNvbiBbY29sb3JdPVwiZGF0YS5kaXNsaWtlID8gJ3ByaW1hcnknIDogJydcIj50aHVtYl9kb3duPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICBAaWYgKGRhdGEudGh1bWJzRG93bkNvdW50ID4gMCkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIG9wYWNpdHktODBcIj57eyBkYXRhLnRodW1ic0Rvd25Db3VudCB9fTwvc3Bhbj5cbiAgICB9XG5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNob3cgPSB0cnVlXCIgY2xhc3M9XCJ3LTggaC04XCI+5Zue5aSNPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2PlxuICAgIEBpZiAobG9hZGluZykge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtMjBcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMzJcIj48L21hdC1zcGlubmVyPlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKHNob3cpIHtcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgICNhdXRvc2l6ZT1cImNka1RleHRhcmVhQXV0b3NpemVcIlxuICAgICAgICAgICAgY2RrQXV0b3NpemVNaW5Sb3dzPVwiMVwiXG4gICAgICAgICAgICBjZGtBdXRvc2l6ZU1heFJvd3M9XCI4XCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgKGZvY3VzKT1cInNob3cgPSB0cnVlXCJcbiAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC0yIHByLTJcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj7lj5bmtog8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25SZXBseSgpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtd2hpdGVcIj7lm57lpI08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Component, Input, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
+
import { MatInputModule } from '@angular/material/input';
|
|
6
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
|
+
import { FormsModule } from '@angular/forms';
|
|
8
|
+
import { CommentRepliesComponent } from '../comment-replies/comment-replies.component';
|
|
9
|
+
import { CommentActionComponent } from '../comment-action/comment-action.component';
|
|
10
|
+
import { CommentService } from '../../services';
|
|
11
|
+
import { TimePipe } from '@rolatech/angular-common';
|
|
12
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@angular/common";
|
|
15
|
+
import * as i2 from "@angular/material/icon";
|
|
16
|
+
import * as i3 from "@angular/material/menu";
|
|
17
|
+
export class CommentItemComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.commentService = inject(CommentService);
|
|
20
|
+
this.show = false;
|
|
21
|
+
this.loading = false;
|
|
22
|
+
this.replies = [];
|
|
23
|
+
}
|
|
24
|
+
ngOnInit() {
|
|
25
|
+
// this.countRepliesByCommentId(this.comment.id!);
|
|
26
|
+
}
|
|
27
|
+
onFocus(event) {
|
|
28
|
+
this.show = true;
|
|
29
|
+
}
|
|
30
|
+
onCommentReply(content) {
|
|
31
|
+
const data = {
|
|
32
|
+
content,
|
|
33
|
+
};
|
|
34
|
+
const id = this.comment.id;
|
|
35
|
+
this.commentService.reply(id, data).subscribe({
|
|
36
|
+
next: (res) => {
|
|
37
|
+
this.comment.repliesCount++;
|
|
38
|
+
this.comment.replies = this.comment.replies ? this.comment.replies : [];
|
|
39
|
+
this.comment.replies.push(res);
|
|
40
|
+
this.commentService.onCommentLoading.emit(false);
|
|
41
|
+
this.commentService.onCommentReply.emit(res);
|
|
42
|
+
},
|
|
43
|
+
error: (error) => {
|
|
44
|
+
this.commentService.onCommentLoading.emit(false);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
countRepliesByCommentId(commentId) {
|
|
49
|
+
this.commentService.countRepliesByCommentId(commentId).subscribe({
|
|
50
|
+
next: (res) => {
|
|
51
|
+
this.comment.repliesCount = res.data;
|
|
52
|
+
},
|
|
53
|
+
error: (error) => { },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
onFetchReplies(commentId) {
|
|
57
|
+
this.loading = true;
|
|
58
|
+
this.commentService.findRepliesByCommentId(commentId).subscribe({
|
|
59
|
+
next: (res) => {
|
|
60
|
+
this.comment.replies = res.data;
|
|
61
|
+
},
|
|
62
|
+
error: (error) => {
|
|
63
|
+
this.loading = false;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
onThumbsUp() {
|
|
68
|
+
this.commentService.commentThumbsUp(this.comment.id).subscribe({
|
|
69
|
+
next: (res) => {
|
|
70
|
+
this.comment.thumbsUpCount = res.data.thumbsUpCount;
|
|
71
|
+
this.comment.thumbsDownCount = res.data.thumbsDownCount;
|
|
72
|
+
this.comment.like = true;
|
|
73
|
+
this.comment.dislike = false;
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
onThumbsDown() {
|
|
78
|
+
this.commentService.commentThumbsDown(this.comment.id).subscribe({
|
|
79
|
+
next: (res) => {
|
|
80
|
+
this.comment.thumbsUpCount = res.data.thumbsUpCount;
|
|
81
|
+
this.comment.thumbsDownCount = res.data.thumbsDownCount;
|
|
82
|
+
this.comment.like = false;
|
|
83
|
+
this.comment.dislike = true;
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
88
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: CommentItemComponent, isStandalone: true, selector: "rolatech-comment-item", inputs: { comment: "comment" }, ngImport: i0, template: "<div class=\"block w-full\">\n @if (comment) {\n <div class=\"flex group\">\n <div class=\"bg-orange-600 min-w-10 min-h-10 mr-4 h-fit rounded-full\">\n @if (comment.user && comment.user.avatar) {\n <img class=\"w-10 h-10 rounded-full\" [src]=\"comment.user.avatar\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n <a class=\"mb-0.5\">\n @if (comment.user) {\n <span class=\"text-md font-semibold mr-1\">@{{ comment.user.username }}</span>\n }\n <span class=\"text-sm opacity-70\">{{ comment.createdAt | time }}</span>\n </a>\n\n <div [innerText]=\"comment.content\"></div>\n <rolatech-comment-action\n (reply)=\"onCommentReply($event)\"\n [data]=\"comment\"\n (thumbsUp)=\"onThumbsUp()\"\n (thumbsDown)=\"onThumbsDown()\"\n ></rolatech-comment-action>\n </div>\n <div class=\"min-w-9\">\n <button\n class=\"hover:bg-gray-200 w-9 h-9 flex items-center justify-center rounded-full group-hover:visible\"\n [ngClass]=\"memnu.menuOpen ? 'visible' : 'invisible'\"\n [matMenuTriggerFor]=\"actionMenu\"\n #memnu=\"matMenuTrigger\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n </div>\n <div>\n <rolatech-comment-replies\n [total]=\"comment.repliesCount\"\n [commentId]=\"comment.id!\"\n [replies]=\"comment.replies!\"\n (fetch)=\"onFetchReplies($event)\"\n ></rolatech-comment-replies>\n </div>\n }\n</div>\n<mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item>\n <mat-icon>flag</mat-icon>\n <span>\u4E3E\u62A5</span>\n </button>\n</mat-menu>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "component", type: CommentRepliesComponent, selector: "rolatech-comment-replies", inputs: ["total", "replies", "commentId"], outputs: ["replied", "fetch"] }, { kind: "component", type: CommentActionComponent, selector: "rolatech-comment-action", inputs: ["placeholder", "data"], outputs: ["reply", "thumbsUp", "thumbsDown"] }, { kind: "pipe", type: TimePipe, name: "time" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }] }); }
|
|
89
|
+
}
|
|
90
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentItemComponent, decorators: [{
|
|
91
|
+
type: Component,
|
|
92
|
+
args: [{ selector: 'rolatech-comment-item', standalone: true, imports: [
|
|
93
|
+
CommonModule,
|
|
94
|
+
MatButtonModule,
|
|
95
|
+
MatIconModule,
|
|
96
|
+
FormsModule,
|
|
97
|
+
MatFormFieldModule,
|
|
98
|
+
MatInputModule,
|
|
99
|
+
CommentRepliesComponent,
|
|
100
|
+
CommentActionComponent,
|
|
101
|
+
TimePipe,
|
|
102
|
+
MatMenuModule,
|
|
103
|
+
], template: "<div class=\"block w-full\">\n @if (comment) {\n <div class=\"flex group\">\n <div class=\"bg-orange-600 min-w-10 min-h-10 mr-4 h-fit rounded-full\">\n @if (comment.user && comment.user.avatar) {\n <img class=\"w-10 h-10 rounded-full\" [src]=\"comment.user.avatar\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n <a class=\"mb-0.5\">\n @if (comment.user) {\n <span class=\"text-md font-semibold mr-1\">@{{ comment.user.username }}</span>\n }\n <span class=\"text-sm opacity-70\">{{ comment.createdAt | time }}</span>\n </a>\n\n <div [innerText]=\"comment.content\"></div>\n <rolatech-comment-action\n (reply)=\"onCommentReply($event)\"\n [data]=\"comment\"\n (thumbsUp)=\"onThumbsUp()\"\n (thumbsDown)=\"onThumbsDown()\"\n ></rolatech-comment-action>\n </div>\n <div class=\"min-w-9\">\n <button\n class=\"hover:bg-gray-200 w-9 h-9 flex items-center justify-center rounded-full group-hover:visible\"\n [ngClass]=\"memnu.menuOpen ? 'visible' : 'invisible'\"\n [matMenuTriggerFor]=\"actionMenu\"\n #memnu=\"matMenuTrigger\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n </div>\n <div>\n <rolatech-comment-replies\n [total]=\"comment.repliesCount\"\n [commentId]=\"comment.id!\"\n [replies]=\"comment.replies!\"\n (fetch)=\"onFetchReplies($event)\"\n ></rolatech-comment-replies>\n </div>\n }\n</div>\n<mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item>\n <mat-icon>flag</mat-icon>\n <span>\u4E3E\u62A5</span>\n </button>\n</mat-menu>\n", styles: ["mat-form-field{width:100%}\n"] }]
|
|
104
|
+
}], propDecorators: { comment: [{
|
|
105
|
+
type: Input
|
|
106
|
+
}] } });
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50LWl0ZW0vY29tbWVudC1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50LWl0ZW0vY29tbWVudC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWdCLEtBQUssRUFBa0IsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBb0J2RCxNQUFNLE9BQU8sb0JBQW9CO0lBbEJqQztRQW1CRSxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV4QyxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQVksRUFBRSxDQUFDO0tBbUV2QjtJQWpFQyxRQUFRO1FBQ04sa0RBQWtEO0lBQ3BELENBQUM7SUFFRCxPQUFPLENBQUMsS0FBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxJQUFJLEdBQUc7WUFDWCxPQUFPO1NBQ1IsQ0FBQztRQUNGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBWSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFhLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCx1QkFBdUIsQ0FBQyxTQUFpQjtRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMvRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFFLENBQUM7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGNBQWMsQ0FBQyxTQUFpQjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2xDLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELFVBQVU7UUFDUixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM5RCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQy9CLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEUsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUM5QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0F2RVUsb0JBQW9CO2tHQUFwQixvQkFBb0IsaUhDaENqQywrdERBbURBLHFGRGpDSSxZQUFZLDRIQUNaLGVBQWUsOEJBQ2YsYUFBYSxtTEFDYixXQUFXLDhCQUNYLGtCQUFrQiw4QkFDbEIsY0FBYywrQkFDZCx1QkFBdUIsK0lBQ3ZCLHNCQUFzQiw4SUFDdEIsUUFBUSw0Q0FDUixhQUFhOzsyRkFLSixvQkFBb0I7a0JBbEJoQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsV0FBVzt3QkFDWCxrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsdUJBQXVCO3dCQUN2QixzQkFBc0I7d0JBQ3RCLFFBQVE7d0JBQ1IsYUFBYTtxQkFDZDs4QkFNUSxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21tZW50LCBSZXBseSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbW1lbnRSZXBsaWVzQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbWVudC1yZXBsaWVzL2NvbW1lbnQtcmVwbGllcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbWVudEFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1lbnQtYWN0aW9uL2NvbW1lbnQtYWN0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IFRpbWVQaXBlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtY29tbWVudC1pdGVtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0SWNvbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQ29tbWVudFJlcGxpZXNDb21wb25lbnQsXG4gICAgQ29tbWVudEFjdGlvbkNvbXBvbmVudCxcbiAgICBUaW1lUGlwZSxcbiAgICBNYXRNZW51TW9kdWxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NvbW1lbnQtaXRlbS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIENvbW1lbnRJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29tbWVudFNlcnZpY2UgPSBpbmplY3QoQ29tbWVudFNlcnZpY2UpO1xuICBASW5wdXQoKSBjb21tZW50ITogQ29tbWVudDtcbiAgc2hvdyA9IGZhbHNlO1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIHJlcGxpZXM6IFJlcGx5W10gPSBbXTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyB0aGlzLmNvdW50UmVwbGllc0J5Q29tbWVudElkKHRoaXMuY29tbWVudC5pZCEpO1xuICB9XG5cbiAgb25Gb2N1cyhldmVudDogYW55KSB7XG4gICAgdGhpcy5zaG93ID0gdHJ1ZTtcbiAgfVxuICBvbkNvbW1lbnRSZXBseShjb250ZW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgY29udGVudCxcbiAgICB9O1xuICAgIGNvbnN0IGlkID0gdGhpcy5jb21tZW50LmlkIGFzIHN0cmluZztcbiAgICB0aGlzLmNvbW1lbnRTZXJ2aWNlLnJlcGx5KGlkLCBkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNvbW1lbnQucmVwbGllc0NvdW50ISsrO1xuICAgICAgICB0aGlzLmNvbW1lbnQucmVwbGllcyA9IHRoaXMuY29tbWVudC5yZXBsaWVzID8gdGhpcy5jb21tZW50LnJlcGxpZXMgOiBbXTtcbiAgICAgICAgdGhpcy5jb21tZW50LnJlcGxpZXMucHVzaChyZXMpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudFNlcnZpY2Uub25Db21tZW50TG9hZGluZy5lbWl0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jb21tZW50U2VydmljZS5vbkNvbW1lbnRSZXBseS5lbWl0KHJlcyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmNvbW1lbnRTZXJ2aWNlLm9uQ29tbWVudExvYWRpbmcuZW1pdChmYWxzZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG4gIGNvdW50UmVwbGllc0J5Q29tbWVudElkKGNvbW1lbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5jb21tZW50U2VydmljZS5jb3VudFJlcGxpZXNCeUNvbW1lbnRJZChjb21tZW50SWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuY29tbWVudC5yZXBsaWVzQ291bnQgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7fSxcbiAgICB9KTtcbiAgfVxuICBvbkZldGNoUmVwbGllcyhjb21tZW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5jb21tZW50U2VydmljZS5maW5kUmVwbGllc0J5Q29tbWVudElkKGNvbW1lbnRJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5jb21tZW50LnJlcGxpZXMgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBvblRodW1ic1VwKCkge1xuICAgIHRoaXMuY29tbWVudFNlcnZpY2UuY29tbWVudFRodW1ic1VwKHRoaXMuY29tbWVudC5pZCEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuY29tbWVudC50aHVtYnNVcENvdW50ID0gcmVzLmRhdGEudGh1bWJzVXBDb3VudDtcbiAgICAgICAgdGhpcy5jb21tZW50LnRodW1ic0Rvd25Db3VudCA9IHJlcy5kYXRhLnRodW1ic0Rvd25Db3VudDtcbiAgICAgICAgdGhpcy5jb21tZW50Lmxpa2UgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbW1lbnQuZGlzbGlrZSA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBvblRodW1ic0Rvd24oKSB7XG4gICAgdGhpcy5jb21tZW50U2VydmljZS5jb21tZW50VGh1bWJzRG93bih0aGlzLmNvbW1lbnQuaWQhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNvbW1lbnQudGh1bWJzVXBDb3VudCA9IHJlcy5kYXRhLnRodW1ic1VwQ291bnQ7XG4gICAgICAgIHRoaXMuY29tbWVudC50aHVtYnNEb3duQ291bnQgPSByZXMuZGF0YS50aHVtYnNEb3duQ291bnQ7XG4gICAgICAgIHRoaXMuY29tbWVudC5saWtlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tbWVudC5kaXNsaWtlID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJibG9jayB3LWZ1bGxcIj5cbiAgQGlmIChjb21tZW50KSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ3JvdXBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJiZy1vcmFuZ2UtNjAwIG1pbi13LTEwIG1pbi1oLTEwIG1yLTQgaC1maXQgcm91bmRlZC1mdWxsXCI+XG4gICAgICAgIEBpZiAoY29tbWVudC51c2VyICYmIGNvbW1lbnQudXNlci5hdmF0YXIpIHtcbiAgICAgICAgICA8aW1nIGNsYXNzPVwidy0xMCBoLTEwIHJvdW5kZWQtZnVsbFwiIFtzcmNdPVwiY29tbWVudC51c2VyLmF2YXRhclwiIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdy1mdWxsXCI+XG4gICAgICAgIDxhIGNsYXNzPVwibWItMC41XCI+XG4gICAgICAgICAgQGlmIChjb21tZW50LnVzZXIpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tZCBmb250LXNlbWlib2xkIG1yLTFcIj4mIzY0O3t7IGNvbW1lbnQudXNlci51c2VybmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIG9wYWNpdHktNzBcIj57eyBjb21tZW50LmNyZWF0ZWRBdCB8IHRpbWUgfX08L3NwYW4+XG4gICAgICAgIDwvYT5cblxuICAgICAgICA8ZGl2IFtpbm5lclRleHRdPVwiY29tbWVudC5jb250ZW50XCI+PC9kaXY+XG4gICAgICAgIDxyb2xhdGVjaC1jb21tZW50LWFjdGlvblxuICAgICAgICAgIChyZXBseSk9XCJvbkNvbW1lbnRSZXBseSgkZXZlbnQpXCJcbiAgICAgICAgICBbZGF0YV09XCJjb21tZW50XCJcbiAgICAgICAgICAodGh1bWJzVXApPVwib25UaHVtYnNVcCgpXCJcbiAgICAgICAgICAodGh1bWJzRG93bik9XCJvblRodW1ic0Rvd24oKVwiXG4gICAgICAgID48L3JvbGF0ZWNoLWNvbW1lbnQtYWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWluLXctOVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJob3ZlcjpiZy1ncmF5LTIwMCB3LTkgaC05IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCBncm91cC1ob3Zlcjp2aXNpYmxlXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJtZW1udS5tZW51T3BlbiA/ICd2aXNpYmxlJyA6ICdpbnZpc2libGUnXCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWN0aW9uTWVudVwiXG4gICAgICAgICAgI21lbW51PVwibWF0TWVudVRyaWdnZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxyb2xhdGVjaC1jb21tZW50LXJlcGxpZXNcbiAgICAgICAgW3RvdGFsXT1cImNvbW1lbnQucmVwbGllc0NvdW50XCJcbiAgICAgICAgW2NvbW1lbnRJZF09XCJjb21tZW50LmlkIVwiXG4gICAgICAgIFtyZXBsaWVzXT1cImNvbW1lbnQucmVwbGllcyFcIlxuICAgICAgICAoZmV0Y2gpPVwib25GZXRjaFJlcGxpZXMoJGV2ZW50KVwiXG4gICAgICA+PC9yb2xhdGVjaC1jb21tZW50LXJlcGxpZXM+XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuPG1hdC1tZW51ICNhY3Rpb25NZW51PVwibWF0TWVudVwiPlxuICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+XG4gICAgPG1hdC1pY29uPmZsYWc8L21hdC1pY29uPlxuICAgIDxzcGFuPuS4vuaKpTwvc3Bhbj5cbiAgPC9idXR0b24+XG48L21hdC1tZW51PlxuIl19
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { ReplyItemComponent } from '../reply-item/reply-item.component';
|
|
4
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
import { CommentService } from '../../services';
|
|
7
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/material/icon";
|
|
10
|
+
import * as i2 from "@angular/material/progress-spinner";
|
|
11
|
+
export class CommentRepliesComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.commentService = inject(CommentService);
|
|
14
|
+
this.total = 0;
|
|
15
|
+
this.replies = [];
|
|
16
|
+
this.commentId = '';
|
|
17
|
+
this.replied = new EventEmitter();
|
|
18
|
+
this.fetch = new EventEmitter();
|
|
19
|
+
this.expand = false;
|
|
20
|
+
this.loading = false;
|
|
21
|
+
this.fetched = false;
|
|
22
|
+
}
|
|
23
|
+
onFetch() {
|
|
24
|
+
this.expand = !this.expand;
|
|
25
|
+
if (!this.fetched) {
|
|
26
|
+
this.fetched = true;
|
|
27
|
+
this.fetch.emit(this.commentId);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
onItemReplied(reply) {
|
|
31
|
+
this.total++;
|
|
32
|
+
this.replies.push(reply);
|
|
33
|
+
}
|
|
34
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentRepliesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: CommentRepliesComponent, isStandalone: true, selector: "rolatech-comment-replies", inputs: { total: "total", replies: "replies", commentId: "commentId" }, outputs: { replied: "replied", fetch: "fetch" }, ngImport: i0, template: "<div class=\"block ml-14\">\n @if (total > 0) {\n <div>\n <button class=\"inline-flex items-center rounded-lg hover:bg-orange-200 py-1 -ml-1\" (click)=\"onFetch()\">\n <mat-icon color=\"primary\">{{ expand ? 'arrow_drop_up' : 'arrow_drop_down' }}</mat-icon>\n <span class=\"mr-2 text-sm text-orange-500\">\u56DE\u590D({{ total || replies.length }})</span>\n </button>\n <!-- <div class=\"less-button\">\n <button (click)=\"expand = false\">222</button>\n </div> -->\n </div>\n }\n @if (loading) {\n <div class=\"flex items-center justify-center h-20\">\n <mat-spinner diameter=\"32\"></mat-spinner>\n </div>\n }\n\n @if (expand) {\n @for (item of replies; track $index) {\n <rolatech-reply-item [commentId]=\"commentId\" [reply]=\"item\" (replied)=\"onItemReplied($event)\"></rolatech-reply-item>\n }\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: ReplyItemComponent, selector: "rolatech-reply-item", inputs: ["reply", "commentId"], outputs: ["replied"] }] }); }
|
|
36
|
+
}
|
|
37
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentRepliesComponent, decorators: [{
|
|
38
|
+
type: Component,
|
|
39
|
+
args: [{ selector: 'rolatech-comment-replies', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule, ReplyItemComponent], template: "<div class=\"block ml-14\">\n @if (total > 0) {\n <div>\n <button class=\"inline-flex items-center rounded-lg hover:bg-orange-200 py-1 -ml-1\" (click)=\"onFetch()\">\n <mat-icon color=\"primary\">{{ expand ? 'arrow_drop_up' : 'arrow_drop_down' }}</mat-icon>\n <span class=\"mr-2 text-sm text-orange-500\">\u56DE\u590D({{ total || replies.length }})</span>\n </button>\n <!-- <div class=\"less-button\">\n <button (click)=\"expand = false\">222</button>\n </div> -->\n </div>\n }\n @if (loading) {\n <div class=\"flex items-center justify-center h-20\">\n <mat-spinner diameter=\"32\"></mat-spinner>\n </div>\n }\n\n @if (expand) {\n @for (item of replies; track $index) {\n <rolatech-reply-item [commentId]=\"commentId\" [reply]=\"item\" (replied)=\"onItemReplied($event)\"></rolatech-reply-item>\n }\n }\n</div>\n" }]
|
|
40
|
+
}], propDecorators: { total: [{
|
|
41
|
+
type: Input
|
|
42
|
+
}], replies: [{
|
|
43
|
+
type: Input
|
|
44
|
+
}], commentId: [{
|
|
45
|
+
type: Input
|
|
46
|
+
}], replied: [{
|
|
47
|
+
type: Output
|
|
48
|
+
}], fetch: [{
|
|
49
|
+
type: Output
|
|
50
|
+
}] } });
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1yZXBsaWVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50LXJlcGxpZXMvY29tbWVudC1yZXBsaWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50LXJlcGxpZXMvY29tbWVudC1yZXBsaWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7OztBQVM5RSxNQUFNLE9BQU8sdUJBQXVCO0lBUHBDO1FBUUUsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0IsVUFBSyxHQUFXLENBQUMsQ0FBQztRQUNsQixZQUFPLEdBQVksRUFBRSxDQUFDO1FBQ3RCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZCxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNwQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUU3QyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQUcsS0FBSyxDQUFDO0tBWWpCO0lBWEMsT0FBTztRQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDcEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBQ0QsYUFBYSxDQUFDLEtBQVk7UUFDeEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQzs4R0FyQlUsdUJBQXVCO2tHQUF2Qix1QkFBdUIsNk1DaEJwQywyM0JBd0JBLHlERFpZLFlBQVksOEJBQUUsZUFBZSw4QkFBRSxhQUFhLG1MQUFFLHdCQUF3QixtT0FBRSxrQkFBa0I7OzJGQUl6Rix1QkFBdUI7a0JBUG5DLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixDQUFDOzhCQU01RixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBSZXBseUl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9yZXBseS1pdGVtL3JlcGx5LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IFJlcGx5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgQ29tbWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtY29tbWVudC1yZXBsaWVzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIFJlcGx5SXRlbUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50LXJlcGxpZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY29tbWVudC1yZXBsaWVzLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudFJlcGxpZXNDb21wb25lbnQge1xuICBjb21tZW50U2VydmljZSA9IGluamVjdChDb21tZW50U2VydmljZSk7XG4gIEBJbnB1dCgpIHRvdGFsOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSByZXBsaWVzOiBSZXBseVtdID0gW107XG4gIEBJbnB1dCgpIGNvbW1lbnRJZCA9ICcnO1xuICBAT3V0cHV0KCkgcmVwbGllZCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVwbHk+KCk7XG4gIEBPdXRwdXQoKSBmZXRjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIGV4cGFuZCA9IGZhbHNlO1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIGZldGNoZWQgPSBmYWxzZTtcbiAgb25GZXRjaCgpIHtcbiAgICB0aGlzLmV4cGFuZCA9ICF0aGlzLmV4cGFuZDtcbiAgICBpZiAoIXRoaXMuZmV0Y2hlZCkge1xuICAgICAgdGhpcy5mZXRjaGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmV0Y2guZW1pdCh0aGlzLmNvbW1lbnRJZCk7XG4gICAgfVxuICB9XG4gIG9uSXRlbVJlcGxpZWQocmVwbHk6IFJlcGx5KSB7XG4gICAgdGhpcy50b3RhbCsrO1xuICAgIHRoaXMucmVwbGllcy5wdXNoKHJlcGx5KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImJsb2NrIG1sLTE0XCI+XG4gIEBpZiAodG90YWwgPiAwKSB7XG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1sZyBob3ZlcjpiZy1vcmFuZ2UtMjAwIHB5LTEgLW1sLTFcIiAoY2xpY2spPVwib25GZXRjaCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj57eyBleHBhbmQgPyAnYXJyb3dfZHJvcF91cCcgOiAnYXJyb3dfZHJvcF9kb3duJyB9fTwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXItMiB0ZXh0LXNtIHRleHQtb3JhbmdlLTUwMFwiPuWbnuWkjSh7eyB0b3RhbCB8fCByZXBsaWVzLmxlbmd0aCB9fSk8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImxlc3MtYnV0dG9uXCI+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cImV4cGFuZCA9IGZhbHNlXCI+MjIyPC9idXR0b24+XG4gICAgICA8L2Rpdj4gLS0+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChsb2FkaW5nKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtMjBcIj5cbiAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjMyXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIEBpZiAoZXhwYW5kKSB7XG4gICAgQGZvciAoaXRlbSBvZiByZXBsaWVzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgIDxyb2xhdGVjaC1yZXBseS1pdGVtIFtjb21tZW50SWRdPVwiY29tbWVudElkXCIgW3JlcGx5XT1cIml0ZW1cIiAocmVwbGllZCk9XCJvbkl0ZW1SZXBsaWVkKCRldmVudClcIj48L3JvbGF0ZWNoLXJlcGx5LWl0ZW0+XG4gICAgfVxuICB9XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Component, Input, inject } from '@angular/core';
|
|
2
|
+
import { CommentItemComponent } from '../comment-item/comment-item.component';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
5
|
+
import { CommentService } from '../../services';
|
|
6
|
+
import { CommentsHeaderComponent } from '../comments-header/comments-header.component';
|
|
7
|
+
import { AuthUserService } from '@rolatech/angular-auth';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class CommentsComponent {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.commentService = inject(CommentService);
|
|
12
|
+
this.authUserService = inject(AuthUserService);
|
|
13
|
+
this.comments = [];
|
|
14
|
+
this.itemId = '';
|
|
15
|
+
this.total = 0;
|
|
16
|
+
this.show = false;
|
|
17
|
+
this.content = '';
|
|
18
|
+
}
|
|
19
|
+
ngOnChanges(changes) {
|
|
20
|
+
const itemId = changes['itemId'].currentValue;
|
|
21
|
+
this.find(itemId);
|
|
22
|
+
}
|
|
23
|
+
find(itemId) {
|
|
24
|
+
this.commentService.findCommentsByItemId(itemId).subscribe({
|
|
25
|
+
next: (res) => {
|
|
26
|
+
this.total = res.meta?.pagination.count;
|
|
27
|
+
this.comments = res.data;
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
onComment(content) {
|
|
32
|
+
const data = {
|
|
33
|
+
itemId: this.itemId,
|
|
34
|
+
content,
|
|
35
|
+
};
|
|
36
|
+
this.commentService.createComment(data).subscribe({
|
|
37
|
+
next: (res) => {
|
|
38
|
+
this.comments = this.comments ? this.comments : [];
|
|
39
|
+
this.comments.unshift(res);
|
|
40
|
+
this.commentService.onCommentLoading.emit(false);
|
|
41
|
+
this.commentService.onComment.emit(true);
|
|
42
|
+
},
|
|
43
|
+
error: (error) => {
|
|
44
|
+
console.log(error);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
49
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: CommentsComponent, isStandalone: true, selector: "rolatech-comments", inputs: { comments: "comments", itemId: "itemId", total: "total" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col gap-3\" id=\"comment\">\n <rolatech-comments-header (comment)=\"onComment($event)\" [total]=\"total\"></rolatech-comments-header>\n @for (item of comments; track $index) {\n <rolatech-comment-item [comment]=\"item\"></rolatech-comment-item>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "component", type: CommentItemComponent, selector: "rolatech-comment-item", inputs: ["comment"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: CommentsHeaderComponent, selector: "rolatech-comments-header", inputs: ["comments", "placeholder", "total"], outputs: ["comment"] }] }); }
|
|
50
|
+
}
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentsComponent, decorators: [{
|
|
52
|
+
type: Component,
|
|
53
|
+
args: [{ selector: 'rolatech-comments', standalone: true, imports: [AngularCommonModule, CommentItemComponent, MatButtonModule, CommentsHeaderComponent], template: "<div class=\"flex flex-col gap-3\" id=\"comment\">\n <rolatech-comments-header (comment)=\"onComment($event)\" [total]=\"total\"></rolatech-comments-header>\n @for (item of comments; track $index) {\n <rolatech-comment-item [comment]=\"item\"></rolatech-comment-item>\n }\n</div>\n" }]
|
|
54
|
+
}], propDecorators: { comments: [{
|
|
55
|
+
type: Input
|
|
56
|
+
}], itemId: [{
|
|
57
|
+
type: Input
|
|
58
|
+
}], total: [{
|
|
59
|
+
type: Input
|
|
60
|
+
}] } });
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWNvbW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL2NvbW1lbnRzL2NvbW1lbnRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50cy9jb21tZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBNEIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQVN6RCxNQUFNLE9BQU8saUJBQWlCO0lBUDlCO1FBUUUsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFakMsYUFBUSxHQUFjLEVBQUUsQ0FBQztRQUN6QixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osVUFBSyxHQUFHLENBQUMsQ0FBQztRQUVuQixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsWUFBTyxHQUFXLEVBQUUsQ0FBQztLQThCdEI7SUE3QkMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQWM7UUFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDekQsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDM0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxTQUFTLENBQUMsT0FBWTtRQUNwQixNQUFNLElBQUksR0FBRztZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixPQUFPO1NBQ1IsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNoRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBdENVLGlCQUFpQjtrR0FBakIsaUJBQWlCLHNLQ2hCOUIsaVNBTUEseURETVksbUJBQW1CLCtCQUFFLG9CQUFvQixzRkFBRSxlQUFlLCtCQUFFLHVCQUF1Qjs7MkZBSWxGLGlCQUFpQjtrQkFQN0IsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLHVCQUF1QixDQUFDOzhCQVFyRixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbWVudEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9jb21tZW50LWl0ZW0vY29tbWVudC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgQW5ndWxhckNvbW1vbk1vZHVsZSB9IGZyb20gJ0Byb2xhdGVjaC9hbmd1bGFyLWNvbW1vbic7XG5pbXBvcnQgeyBDb21tZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IENvbW1lbnRzSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbWVudHMtaGVhZGVyL2NvbW1lbnRzLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXV0aFVzZXJTZXJ2aWNlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItYXV0aCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLWNvbW1lbnRzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0FuZ3VsYXJDb21tb25Nb2R1bGUsIENvbW1lbnRJdGVtQ29tcG9uZW50LCBNYXRCdXR0b25Nb2R1bGUsIENvbW1lbnRzSGVhZGVyQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NvbW1lbnRzLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBjb21tZW50U2VydmljZSA9IGluamVjdChDb21tZW50U2VydmljZSk7XG4gIGF1dGhVc2VyU2VydmljZSA9IGluamVjdChBdXRoVXNlclNlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIGNvbW1lbnRzOiBDb21tZW50W10gPSBbXTtcbiAgQElucHV0KCkgaXRlbUlkID0gJyc7XG4gIEBJbnB1dCgpIHRvdGFsID0gMDtcblxuICBzaG93ID0gZmFsc2U7XG4gIGNvbnRlbnQ6IHN0cmluZyA9ICcnO1xuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgaXRlbUlkID0gY2hhbmdlc1snaXRlbUlkJ10uY3VycmVudFZhbHVlO1xuICAgIHRoaXMuZmluZChpdGVtSWQpO1xuICB9XG4gIGZpbmQoaXRlbUlkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbW1lbnRTZXJ2aWNlLmZpbmRDb21tZW50c0J5SXRlbUlkKGl0ZW1JZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvdGFsID0gcmVzLm1ldGE/LnBhZ2luYXRpb24uY291bnQ7XG4gICAgICAgIHRoaXMuY29tbWVudHMgPSByZXMuZGF0YTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25Db21tZW50KGNvbnRlbnQ6IGFueSkge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpdGVtSWQ6IHRoaXMuaXRlbUlkLFxuICAgICAgY29udGVudCxcbiAgICB9O1xuICAgIHRoaXMuY29tbWVudFNlcnZpY2UuY3JlYXRlQ29tbWVudChkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmNvbW1lbnRzID0gdGhpcy5jb21tZW50cyA/IHRoaXMuY29tbWVudHMgOiBbXTtcbiAgICAgICAgdGhpcy5jb21tZW50cy51bnNoaWZ0KHJlcyk7XG4gICAgICAgIHRoaXMuY29tbWVudFNlcnZpY2Uub25Db21tZW50TG9hZGluZy5lbWl0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jb21tZW50U2VydmljZS5vbkNvbW1lbnQuZW1pdCh0cnVlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCIgaWQ9XCJjb21tZW50XCI+XG4gIDxyb2xhdGVjaC1jb21tZW50cy1oZWFkZXIgKGNvbW1lbnQpPVwib25Db21tZW50KCRldmVudClcIiBbdG90YWxdPVwidG90YWxcIj48L3JvbGF0ZWNoLWNvbW1lbnRzLWhlYWRlcj5cbiAgQGZvciAoaXRlbSBvZiBjb21tZW50czsgdHJhY2sgJGluZGV4KSB7XG4gICAgPHJvbGF0ZWNoLWNvbW1lbnQtaXRlbSBbY29tbWVudF09XCJpdGVtXCI+PC9yb2xhdGVjaC1jb21tZW50LWl0ZW0+XG4gIH1cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
3
|
+
import { AngularCommonModule } from '@rolatech/angular-common';
|
|
4
|
+
import { CommentActionComponent } from '../comment-action/comment-action.component';
|
|
5
|
+
import { CommentItemComponent } from '../comment-item/comment-item.component';
|
|
6
|
+
import { CommentService } from '../../services';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
9
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
10
|
+
import { MatInputModule } from '@angular/material/input';
|
|
11
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@angular/forms";
|
|
14
|
+
import * as i2 from "@angular/material/button";
|
|
15
|
+
import * as i3 from "@angular/material/icon";
|
|
16
|
+
import * as i4 from "@angular/material/menu";
|
|
17
|
+
import * as i5 from "@angular/material/form-field";
|
|
18
|
+
import * as i6 from "@angular/material/input";
|
|
19
|
+
import * as i7 from "@angular/cdk/text-field";
|
|
20
|
+
import * as i8 from "@angular/material/progress-spinner";
|
|
21
|
+
export class CommentsHeaderComponent {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.commentService = inject(CommentService);
|
|
24
|
+
this.comments = [];
|
|
25
|
+
this.placeholder = '请输入评论内容';
|
|
26
|
+
this.total = 0;
|
|
27
|
+
this.comment = new EventEmitter();
|
|
28
|
+
this.content = '';
|
|
29
|
+
this.show = false;
|
|
30
|
+
this.loading = false;
|
|
31
|
+
}
|
|
32
|
+
ngOnInit() {
|
|
33
|
+
this.commentService.onComment.subscribe({
|
|
34
|
+
next: (res) => {
|
|
35
|
+
this.total++;
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
onFocus(event) {
|
|
40
|
+
this.show = true;
|
|
41
|
+
}
|
|
42
|
+
onCancel() {
|
|
43
|
+
this.show = false;
|
|
44
|
+
this.content = '';
|
|
45
|
+
}
|
|
46
|
+
onComment() {
|
|
47
|
+
this.loading = true;
|
|
48
|
+
this.comment.emit(this.content);
|
|
49
|
+
this.commentService.onCommentLoading.subscribe({
|
|
50
|
+
next: (res) => {
|
|
51
|
+
this.loading = res;
|
|
52
|
+
this.show = false;
|
|
53
|
+
this.content = '';
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
fetchByComments() { }
|
|
58
|
+
fetchByReplies() { }
|
|
59
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentsHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
60
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: CommentsHeaderComponent, isStandalone: true, selector: "rolatech-comments-header", inputs: { comments: "comments", placeholder: "placeholder", total: "total" }, outputs: { comment: "comment" }, ngImport: i0, template: "<div class=\"my-2\">\n <div class=\"flex items-center gap-3 py-2\">\n <span class=\"text-lg font-bold\">\u8BC4\u8BBA({{ total }})</span>\n <button mat-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>sort</mat-icon>\n <span>\u6392\u5E8F</span>\n </button>\n </div>\n\n @if (loading) {\n <div class=\"flex items-center justify-center h-20\">\n <mat-spinner diameter=\"32\"></mat-spinner>\n </div>\n } @else {\n <div class=\"mr-3\">\n <mat-form-field>\n <textarea\n matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n cdkAutosizeMaxRows=\"8\"\n [placeholder]=\"placeholder\"\n [(ngModel)]=\"content\"\n (focus)=\"onFocus($event)\"\n ></textarea>\n </mat-form-field>\n @if (show) {\n <div class=\"flex justify-end items-center gap-2 pr-2\">\n <button mat-button (click)=\"onCancel()\">\u53D6\u6D88</button>\n <button mat-flat-button color=\"primary\" (click)=\"onComment()\">\n <span class=\"text-white\">\u8BC4\u8BBA</span>\n </button>\n </div>\n }\n </div>\n }\n</div>\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"fetchByReplies()\">\u6700\u591A\u56DE\u590D</button>\n <button mat-menu-item (click)=\"fetchByComments()\">\u6700\u65B0\u8BC4\u8BBA</button>\n</mat-menu>\n", styles: ["mat-form-field{width:100%}textarea:focus{outline:none;box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i7.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: CommentsHeaderComponent, decorators: [{
|
|
63
|
+
type: Component,
|
|
64
|
+
args: [{ selector: 'rolatech-comments-header', standalone: true, imports: [
|
|
65
|
+
AngularCommonModule,
|
|
66
|
+
CommentItemComponent,
|
|
67
|
+
MatButtonModule,
|
|
68
|
+
MatIconModule,
|
|
69
|
+
MatMenuModule,
|
|
70
|
+
MatFormFieldModule,
|
|
71
|
+
MatInputModule,
|
|
72
|
+
CommentActionComponent,
|
|
73
|
+
MatProgressSpinnerModule,
|
|
74
|
+
], template: "<div class=\"my-2\">\n <div class=\"flex items-center gap-3 py-2\">\n <span class=\"text-lg font-bold\">\u8BC4\u8BBA({{ total }})</span>\n <button mat-button [matMenuTriggerFor]=\"menu\">\n <mat-icon>sort</mat-icon>\n <span>\u6392\u5E8F</span>\n </button>\n </div>\n\n @if (loading) {\n <div class=\"flex items-center justify-center h-20\">\n <mat-spinner diameter=\"32\"></mat-spinner>\n </div>\n } @else {\n <div class=\"mr-3\">\n <mat-form-field>\n <textarea\n matInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n cdkAutosizeMaxRows=\"8\"\n [placeholder]=\"placeholder\"\n [(ngModel)]=\"content\"\n (focus)=\"onFocus($event)\"\n ></textarea>\n </mat-form-field>\n @if (show) {\n <div class=\"flex justify-end items-center gap-2 pr-2\">\n <button mat-button (click)=\"onCancel()\">\u53D6\u6D88</button>\n <button mat-flat-button color=\"primary\" (click)=\"onComment()\">\n <span class=\"text-white\">\u8BC4\u8BBA</span>\n </button>\n </div>\n }\n </div>\n }\n</div>\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"fetchByReplies()\">\u6700\u591A\u56DE\u590D</button>\n <button mat-menu-item (click)=\"fetchByComments()\">\u6700\u65B0\u8BC4\u8BBA</button>\n</mat-menu>\n", styles: ["mat-form-field{width:100%}textarea:focus{outline:none;box-shadow:none}\n"] }]
|
|
75
|
+
}], propDecorators: { comments: [{
|
|
76
|
+
type: Input
|
|
77
|
+
}], placeholder: [{
|
|
78
|
+
type: Input
|
|
79
|
+
}], total: [{
|
|
80
|
+
type: Input
|
|
81
|
+
}], comment: [{
|
|
82
|
+
type: Output
|
|
83
|
+
}] } });
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudHMtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50cy1oZWFkZXIvY29tbWVudHMtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9jb21tZW50cy1oZWFkZXIvY29tbWVudHMtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7QUFtQjlFLE1BQU0sT0FBTyx1QkFBdUI7SUFqQnBDO1FBa0JFLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9CLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFDekIsZ0JBQVcsR0FBRyxTQUFTLENBQUM7UUFDeEIsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNULFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQy9DLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLFlBQU8sR0FBRyxLQUFLLENBQUM7S0E0QmpCO0lBM0JDLFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDdEMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLENBQUMsS0FBVTtRQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO2dCQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDcEIsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxlQUFlLEtBQUksQ0FBQztJQUNwQixjQUFjLEtBQUksQ0FBQzs4R0FuQ1IsdUJBQXVCO2tHQUF2Qix1QkFBdUIsbU1DN0JwQywwNUNBMENBLGlJRDFCSSxtQkFBbUIsOG1CQUVuQixlQUFlLDJOQUNmLGFBQWEsbUxBQ2IsYUFBYSw2dkJBQ2Isa0JBQWtCLHlPQUNsQixjQUFjLHlrQkFFZCx3QkFBd0I7OzJGQUtmLHVCQUF1QjtrQkFqQm5DLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUDt3QkFDUCxtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLHNCQUFzQjt3QkFDdEIsd0JBQXdCO3FCQUN6Qjs4QkFNUSxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBBbmd1bGFyQ29tbW9uTW9kdWxlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IENvbW1lbnRBY3Rpb25Db21wb25lbnQgfSBmcm9tICcuLi9jb21tZW50LWFjdGlvbi9jb21tZW50LWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbWVudEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9jb21tZW50LWl0ZW0vY29tbWVudC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncm9sYXRlY2gtY29tbWVudHMtaGVhZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEFuZ3VsYXJDb21tb25Nb2R1bGUsXG4gICAgQ29tbWVudEl0ZW1Db21wb25lbnQsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0TWVudU1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQ29tbWVudEFjdGlvbkNvbXBvbmVudCxcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50cy1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY29tbWVudHMtaGVhZGVyLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudHNIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb21tZW50U2VydmljZSA9IGluamVjdChDb21tZW50U2VydmljZSk7XG4gIEBJbnB1dCgpIGNvbW1lbnRzOiBDb21tZW50W10gPSBbXTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAn6K+36L6T5YWl6K+E6K665YaF5a65JztcbiAgQElucHV0KCkgdG90YWwgPSAwO1xuICBAT3V0cHV0KCkgY29tbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBjb250ZW50OiBzdHJpbmcgPSAnJztcbiAgc2hvdyA9IGZhbHNlO1xuICBsb2FkaW5nID0gZmFsc2U7XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29tbWVudFNlcnZpY2Uub25Db21tZW50LnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgb25Gb2N1cyhldmVudDogYW55KSB7XG4gICAgdGhpcy5zaG93ID0gdHJ1ZTtcbiAgfVxuICBvbkNhbmNlbCgpIHtcbiAgICB0aGlzLnNob3cgPSBmYWxzZTtcbiAgICB0aGlzLmNvbnRlbnQgPSAnJztcbiAgfVxuICBvbkNvbW1lbnQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNvbW1lbnQuZW1pdCh0aGlzLmNvbnRlbnQpO1xuICAgIHRoaXMuY29tbWVudFNlcnZpY2Uub25Db21tZW50TG9hZGluZy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSByZXM7XG4gICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSAnJztcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgZmV0Y2hCeUNvbW1lbnRzKCkge31cbiAgZmV0Y2hCeVJlcGxpZXMoKSB7fVxufVxuIiwiPGRpdiBjbGFzcz1cIm15LTJcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIHB5LTJcIj5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbGcgZm9udC1ib2xkXCI+6K+E6K66KHt7IHRvdGFsIH19KTwvc3Bhbj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIj5cbiAgICAgIDxtYXQtaWNvbj5zb3J0PC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuPuaOkuW6jzwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgQGlmIChsb2FkaW5nKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtMjBcIj5cbiAgICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjMyXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gICAgPGRpdiBjbGFzcz1cIm1yLTNcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICBjZGtUZXh0YXJlYUF1dG9zaXplXG4gICAgICAgICAgI2F1dG9zaXplPVwiY2RrVGV4dGFyZWFBdXRvc2l6ZVwiXG4gICAgICAgICAgY2RrQXV0b3NpemVNaW5Sb3dzPVwiMVwiXG4gICAgICAgICAgY2RrQXV0b3NpemVNYXhSb3dzPVwiOFwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbnRlbnRcIlxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICBAaWYgKHNob3cpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC0yIHByLTJcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj7lj5bmtog8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwib25Db21tZW50KClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC13aGl0ZVwiPuivhOiuujwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImZldGNoQnlSZXBsaWVzKClcIj7mnIDlpJrlm57lpI08L2J1dHRvbj5cbiAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJmZXRjaEJ5Q29tbWVudHMoKVwiPuacgOaWsOivhOiuujwvYnV0dG9uPlxuPC9tYXQtbWVudT5cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { CommentsComponent } from './comments/comments.component';
|
|
2
|
+
export { CommentRepliesComponent } from './comment-replies/comment-replies.component';
|
|
3
|
+
export { CommentItemComponent } from './comment-item/comment-item.component';
|
|
4
|
+
export { ReplyItemComponent } from './reply-item/reply-item.component';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tbWVudC9zcmMvbGliL2NvbXBvbmVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBDb21tZW50c0NvbXBvbmVudCB9IGZyb20gJy4vY29tbWVudHMvY29tbWVudHMuY29tcG9uZW50JztcbmV4cG9ydCB7IENvbW1lbnRSZXBsaWVzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21tZW50LXJlcGxpZXMvY29tbWVudC1yZXBsaWVzLmNvbXBvbmVudCc7XG5leHBvcnQgeyBDb21tZW50SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tbWVudC1pdGVtL2NvbW1lbnQtaXRlbS5jb21wb25lbnQnO1xuZXhwb3J0IHsgUmVwbHlJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9yZXBseS1pdGVtL3JlcGx5LWl0ZW0uY29tcG9uZW50JztcbiJdfQ==
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
+
import { CommentActionComponent } from '../comment-action/comment-action.component';
|
|
6
|
+
import { CommentService } from '../../services';
|
|
7
|
+
import { TimePipe } from '@rolatech/angular-common';
|
|
8
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common";
|
|
11
|
+
import * as i2 from "@angular/material/icon";
|
|
12
|
+
import * as i3 from "@angular/material/menu";
|
|
13
|
+
export class ReplyItemComponent {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.commentService = inject(CommentService);
|
|
16
|
+
this.commentId = '';
|
|
17
|
+
this.replied = new EventEmitter();
|
|
18
|
+
this.show = false;
|
|
19
|
+
}
|
|
20
|
+
onReply(content) {
|
|
21
|
+
const data = {
|
|
22
|
+
replyId: this.reply.id,
|
|
23
|
+
content,
|
|
24
|
+
};
|
|
25
|
+
this.commentService.reply(this.commentId, data).subscribe({
|
|
26
|
+
next: (res) => {
|
|
27
|
+
this.commentService.onCommentLoading.emit(false);
|
|
28
|
+
this.replied.emit(res);
|
|
29
|
+
},
|
|
30
|
+
error: (error) => {
|
|
31
|
+
this.commentService.onCommentLoading.emit(false);
|
|
32
|
+
console.log(error);
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
onThumbsUp() {
|
|
37
|
+
this.commentService.replyThumbsUp(this.reply.id).subscribe({
|
|
38
|
+
next: (res) => {
|
|
39
|
+
this.reply.thumbsUpCount = res.data.thumbsUpCount;
|
|
40
|
+
this.reply.thumbsDownCount = res.data.thumbsDownCount;
|
|
41
|
+
this.reply.like = true;
|
|
42
|
+
this.reply.dislike = false;
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
onThumbsDown() {
|
|
47
|
+
this.commentService.replyThumbsDown(this.reply.id).subscribe({
|
|
48
|
+
next: (res) => {
|
|
49
|
+
this.reply.thumbsUpCount = res.data.thumbsUpCount;
|
|
50
|
+
this.reply.thumbsDownCount = res.data.thumbsDownCount;
|
|
51
|
+
this.reply.like = false;
|
|
52
|
+
this.reply.dislike = true;
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ReplyItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
57
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.1", type: ReplyItemComponent, isStandalone: true, selector: "rolatech-reply-item", inputs: { reply: "reply", commentId: "commentId" }, outputs: { replied: "replied" }, ngImport: i0, template: "<div class=\"block w-full\">\n @if (reply) {\n <div class=\"flex group\">\n <div class=\"bg-orange-600 min-w-[28px] min-h-[28px] h-fit mr-3 rounded-full\">\n @if (reply.user && reply.user.avatar) {\n <img class=\"w-7 h-7 rounded-full\" [src]=\"reply.user.avatar\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n <a class=\"mb-0.5\">\n @if (reply.user) {\n <span class=\"text-md font-semibold mr-1\">@{{ reply.user.username }}</span>\n }\n <span class=\"text-sm opacity-70\">{{ reply.createdAt | time }}</span>\n </a>\n <div [innerText]=\"reply.content\"></div>\n <rolatech-comment-action\n (reply)=\"onReply($event)\"\n [data]=\"reply\"\n (thumbsUp)=\"onThumbsUp()\"\n (thumbsDown)=\"onThumbsDown()\"\n ></rolatech-comment-action>\n </div>\n <div class=\"min-w-10\">\n <button\n class=\"hover:bg-gray-200 w-9 h-9 flex items-center justify-center rounded-full group-hover:visible\"\n [ngClass]=\"memnu.menuOpen ? 'visible' : 'invisible'\"\n [matMenuTriggerFor]=\"actionMenu\"\n #memnu=\"matMenuTrigger\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n </div>\n }\n</div>\n<mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item>\n <mat-icon>flag</mat-icon>\n <span>\u4E3E\u62A5</span>\n </button>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: CommentActionComponent, selector: "rolatech-comment-action", inputs: ["placeholder", "data"], outputs: ["reply", "thumbsUp", "thumbsDown"] }, { kind: "pipe", type: TimePipe, name: "time" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }] }); }
|
|
58
|
+
}
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ReplyItemComponent, decorators: [{
|
|
60
|
+
type: Component,
|
|
61
|
+
args: [{ selector: 'rolatech-reply-item', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, CommentActionComponent, TimePipe, MatMenuModule], template: "<div class=\"block w-full\">\n @if (reply) {\n <div class=\"flex group\">\n <div class=\"bg-orange-600 min-w-[28px] min-h-[28px] h-fit mr-3 rounded-full\">\n @if (reply.user && reply.user.avatar) {\n <img class=\"w-7 h-7 rounded-full\" [src]=\"reply.user.avatar\" />\n }\n </div>\n <div class=\"flex flex-col w-full\">\n <a class=\"mb-0.5\">\n @if (reply.user) {\n <span class=\"text-md font-semibold mr-1\">@{{ reply.user.username }}</span>\n }\n <span class=\"text-sm opacity-70\">{{ reply.createdAt | time }}</span>\n </a>\n <div [innerText]=\"reply.content\"></div>\n <rolatech-comment-action\n (reply)=\"onReply($event)\"\n [data]=\"reply\"\n (thumbsUp)=\"onThumbsUp()\"\n (thumbsDown)=\"onThumbsDown()\"\n ></rolatech-comment-action>\n </div>\n <div class=\"min-w-10\">\n <button\n class=\"hover:bg-gray-200 w-9 h-9 flex items-center justify-center rounded-full group-hover:visible\"\n [ngClass]=\"memnu.menuOpen ? 'visible' : 'invisible'\"\n [matMenuTriggerFor]=\"actionMenu\"\n #memnu=\"matMenuTrigger\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n </div>\n }\n</div>\n<mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item>\n <mat-icon>flag</mat-icon>\n <span>\u4E3E\u62A5</span>\n </button>\n</mat-menu>\n" }]
|
|
62
|
+
}], propDecorators: { reply: [{
|
|
63
|
+
type: Input
|
|
64
|
+
}], commentId: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], replied: [{
|
|
67
|
+
type: Output
|
|
68
|
+
}] } });
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbHktaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItY29tbWVudC9zcmMvbGliL2NvbXBvbmVudHMvcmVwbHktaXRlbS9yZXBseS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1jb21tZW50L3NyYy9saWIvY29tcG9uZW50cy9yZXBseS1pdGVtL3JlcGx5LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBUXZELE1BQU0sT0FBTyxrQkFBa0I7SUFQL0I7UUFRRSxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUUvQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2QsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDOUMsU0FBSSxHQUFHLEtBQUssQ0FBQztLQXFDZDtJQXBDQyxPQUFPLENBQUMsT0FBZTtRQUNyQixNQUFNLElBQUksR0FBRztZQUNYLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsT0FBTztTQUNSLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4RCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFELElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUM1QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0F6Q1Usa0JBQWtCO2tHQUFsQixrQkFBa0Isb0tDaEIvQiw0OENBMENBLHlERDlCWSxZQUFZLDRIQUFFLGVBQWUsOEJBQUUsYUFBYSxvTEFBRSxzQkFBc0IsOElBQUUsUUFBUSw0Q0FBRSxhQUFhOzsyRkFJNUYsa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLHFCQUFxQixjQUNuQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDOzhCQU0vRixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlcGx5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgQ29tbWVudEFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1lbnQtYWN0aW9uL2NvbW1lbnQtYWN0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IFRpbWVQaXBlIH0gZnJvbSAnQHJvbGF0ZWNoL2FuZ3VsYXItY29tbW9uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JvbGF0ZWNoLXJlcGx5LWl0ZW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIENvbW1lbnRBY3Rpb25Db21wb25lbnQsIFRpbWVQaXBlLCBNYXRNZW51TW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcGx5LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcmVwbHktaXRlbS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFJlcGx5SXRlbUNvbXBvbmVudCB7XG4gIGNvbW1lbnRTZXJ2aWNlID0gaW5qZWN0KENvbW1lbnRTZXJ2aWNlKTtcbiAgQElucHV0KCkgcmVwbHkhOiBSZXBseTtcbiAgQElucHV0KCkgY29tbWVudElkID0gJyc7XG4gIEBPdXRwdXQoKSByZXBsaWVkID0gbmV3IEV2ZW50RW1pdHRlcjxSZXBseT4oKTtcbiAgc2hvdyA9IGZhbHNlO1xuICBvblJlcGx5KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICByZXBseUlkOiB0aGlzLnJlcGx5LmlkLFxuICAgICAgY29udGVudCxcbiAgICB9O1xuICAgIHRoaXMuY29tbWVudFNlcnZpY2UucmVwbHkodGhpcy5jb21tZW50SWQsIGRhdGEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuY29tbWVudFNlcnZpY2Uub25Db21tZW50TG9hZGluZy5lbWl0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5yZXBsaWVkLmVtaXQocmVzKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuY29tbWVudFNlcnZpY2Uub25Db21tZW50TG9hZGluZy5lbWl0KGZhbHNlKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBvblRodW1ic1VwKCkge1xuICAgIHRoaXMuY29tbWVudFNlcnZpY2UucmVwbHlUaHVtYnNVcCh0aGlzLnJlcGx5LmlkISkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5yZXBseS50aHVtYnNVcENvdW50ID0gcmVzLmRhdGEudGh1bWJzVXBDb3VudDtcbiAgICAgICAgdGhpcy5yZXBseS50aHVtYnNEb3duQ291bnQgPSByZXMuZGF0YS50aHVtYnNEb3duQ291bnQ7XG4gICAgICAgIHRoaXMucmVwbHkubGlrZSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwbHkuZGlzbGlrZSA9IGZhbHNlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBvblRodW1ic0Rvd24oKSB7XG4gICAgdGhpcy5jb21tZW50U2VydmljZS5yZXBseVRodW1ic0Rvd24odGhpcy5yZXBseS5pZCEpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMucmVwbHkudGh1bWJzVXBDb3VudCA9IHJlcy5kYXRhLnRodW1ic1VwQ291bnQ7XG4gICAgICAgIHRoaXMucmVwbHkudGh1bWJzRG93bkNvdW50ID0gcmVzLmRhdGEudGh1bWJzRG93bkNvdW50O1xuICAgICAgICB0aGlzLnJlcGx5Lmxpa2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXBseS5kaXNsaWtlID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJibG9jayB3LWZ1bGxcIj5cbiAgQGlmIChyZXBseSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdyb3VwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYmctb3JhbmdlLTYwMCBtaW4tdy1bMjhweF0gbWluLWgtWzI4cHhdIGgtZml0IG1yLTMgcm91bmRlZC1mdWxsXCI+XG4gICAgICAgIEBpZiAocmVwbHkudXNlciAmJiByZXBseS51c2VyLmF2YXRhcikge1xuICAgICAgICAgIDxpbWcgY2xhc3M9XCJ3LTcgaC03IHJvdW5kZWQtZnVsbFwiIFtzcmNdPVwicmVwbHkudXNlci5hdmF0YXJcIiAvPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHctZnVsbFwiPlxuICAgICAgICA8YSBjbGFzcz1cIm1iLTAuNVwiPlxuICAgICAgICAgIEBpZiAocmVwbHkudXNlcikge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtc2VtaWJvbGQgbXItMVwiPiYjNjQ7e3sgcmVwbHkudXNlci51c2VybmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIG9wYWNpdHktNzBcIj57eyByZXBseS5jcmVhdGVkQXQgfCB0aW1lIH19PC9zcGFuPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxkaXYgW2lubmVyVGV4dF09XCJyZXBseS5jb250ZW50XCI+PC9kaXY+XG4gICAgICAgIDxyb2xhdGVjaC1jb21tZW50LWFjdGlvblxuICAgICAgICAgIChyZXBseSk9XCJvblJlcGx5KCRldmVudClcIlxuICAgICAgICAgIFtkYXRhXT1cInJlcGx5XCJcbiAgICAgICAgICAodGh1bWJzVXApPVwib25UaHVtYnNVcCgpXCJcbiAgICAgICAgICAodGh1bWJzRG93bik9XCJvblRodW1ic0Rvd24oKVwiXG4gICAgICAgID48L3JvbGF0ZWNoLWNvbW1lbnQtYWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWluLXctMTBcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiaG92ZXI6YmctZ3JheS0yMDAgdy05IGgtOSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgZ3JvdXAtaG92ZXI6dmlzaWJsZVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwibWVtbnUubWVudU9wZW4gPyAndmlzaWJsZScgOiAnaW52aXNpYmxlJ1wiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFjdGlvbk1lbnVcIlxuICAgICAgICAgICNtZW1udT1cIm1hdE1lbnVUcmlnZ2VyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbjxtYXQtbWVudSAjYWN0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtPlxuICAgIDxtYXQtaWNvbj5mbGFnPC9tYXQtaWNvbj5cbiAgICA8c3Bhbj7kuL7miqU8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9tYXQtbWVudT5cbiJdfQ==
|