Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | 6x 6x 6x 6x 6x 6x 6x 56x 56x 56x 56x 56x 56x 56x 58x 58x 56x 56x 58x 56x 56x 58x 58x 58x 2x 9x 2x 2x 13x 13x 13x 13x 13x 9x 9x 9x 9x 4x 4x 4x | import { ArticleService } from '../../../services/articles/article.service';
import { VersionForModeration } from '../../models/version-for-moderation.model';
import {
ChangeDetectionStrategy,
Component,
DestroyRef,
computed,
effect,
inject,
input,
output,
signal,
} from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { LoggerService, NotificationService } from '@drevo-web/core';
import { APPROVAL_CLASS, APPROVAL_TITLES, ApprovalStatus, ModerationResult } from '@drevo-web/shared';
import { ButtonComponent, FormatDatePipe, StatusIconComponent, TextInputComponent } from '@drevo-web/ui';
@Component({
selector: 'app-article-moderation-panel',
imports: [ButtonComponent, StatusIconComponent, TextInputComponent, FormatDatePipe],
templateUrl: './article-moderation-panel.component.html',
styleUrl: './article-moderation-panel.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ArticleModerationPanelComponent {
private readonly articleService = inject(ArticleService);
private readonly destroyRef = inject(DestroyRef);
private readonly logger = inject(LoggerService).withContext('ArticleModerationPanelComponent');
private readonly notification = inject(NotificationService);
readonly version = input.required<VersionForModeration>();
readonly moderated = output<ModerationResult>();
readonly statusText = computed(() => {
const status = this.version().approved;
return APPROVAL_TITLES[APPROVAL_CLASS[status]];
});
private readonly _comment = signal('');
readonly comment = this._comment.asReadonly();
constructor() {
effect(() => this._comment.set(this.version().comment ?? ''));
}
private readonly _isLoading = signal(false);
readonly isLoading = this._isLoading.asReadonly();
readonly isApproved = computed(() => this.version().approved === ApprovalStatus.Approved);
readonly isPending = computed(() => this.version().approved === ApprovalStatus.Pending);
readonly isRejected = computed(() => this.version().approved === ApprovalStatus.Rejected);
onCommentChange(value: string): void {
this._comment.set(value);
}
approve(): void {
this.moderate(ApprovalStatus.Approved, 'Версия одобрена');
}
sendToReview(): void {
this.moderate(ApprovalStatus.Pending, 'Версия отправлена на проверку');
}
reject(): void {
this.moderate(ApprovalStatus.Rejected, 'Версия отклонена');
}
private moderate(approved: ApprovalStatus, successMessage: string): void {
const versionId = this.version().versionId;
const comment = this._comment();
this._isLoading.set(true);
this.logger.info('Moderation: submitting', { versionId, approved, comment });
this.articleService
.moderateVersion(versionId, approved, comment)
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe({
next: result => {
this._isLoading.set(false);
this.notification.success(successMessage);
this.logger.info('Moderation: success', { versionId, approved });
this.moderated.emit(result);
},
error: err => {
this._isLoading.set(false);
this.notification.error('Не удалось выполнить модерацию');
this.logger.error('Moderation: failed', err);
},
});
}
}
|