Untitled
unknown
plain_text
a year ago
8.7 kB
5
Indexable
import {
ChangeDetectorRef,
Component,
EventEmitter,
Input,
Output,
} from '@angular/core';
import {
IResource,
ResourceWithUploadProgress,
} from '../../models/resource.models';
import {
LanguageWrapperService,
LoaderService,
NotificationService,
} from '@eino/core';
import { ResourceDrawerService } from '../../services/resource-drawer.service';
import { TranslateModule } from '@ngx-translate/core';
import { ResourcePreviewCarouselComponent } from '../resource-preview-carousel/resource-preview-carousel.component';
import { ResourcePreviewCarouselListComponent } from '../resource-preview-carousel-list/resource-preview-carousel-list.component';
import { ButtonModule } from 'primeng/button';
import { ResourceService } from '../../services/resource.service';
import { ConfirmationService } from 'primeng/api';
import { NONAME } from 'dns';
import { ResourceStateService } from '../../services/resource-state.service';
import ClassicEditor from '@ckeditor/ckeditor5-build-classic';
import { CKEditorModule } from '@ckeditor/ckeditor5-angular';
import { DatePipe } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { ListboxModule } from 'primeng/listbox';
import { InputTextModule } from 'primeng/inputtext';
import { InputTextareaModule } from 'primeng/inputtextarea';
import { CardModule } from 'primeng/card';
import { ScrollerModule } from 'primeng/scroller';
import { TabMenuModule } from 'primeng/tabmenu';
import { TabPanel, TabViewModule } from 'primeng/tabview';
import { ActivatedRoute, Router } from '@angular/router';
type LayoutType = 'gallery' | 'list';
@Component({
selector: 'eino-resource-preview-gallery',
standalone: true,
imports: [
TranslateModule,
ButtonModule,
ResourcePreviewCarouselComponent,
ResourcePreviewCarouselListComponent,
CKEditorModule,
DatePipe,
FormsModule,
ReactiveFormsModule,
ListboxModule,
InputTextModule,
InputTextareaModule,
CardModule,
ScrollerModule,
DatePipe,
TabMenuModule,
TabViewModule,
],
templateUrl: './resource-preview-gallery.component.html',
styleUrls: ['./resource-preview-gallery.component.scss'],
})
export class ResourcePreviewGalleryComponent {
isShuffling = false;
currentTitle?: string;
reorderedResources: ResourceWithUploadProgress[] = [];
queueFiles: unknown[] = [];
@Input({ required: true }) resources: ResourceWithUploadProgress[] = [];
@Input() edit = false;
@Input() shuffle = false;
@Input() addExtension = true;
@Input() isQMInfo = false;
@Input() layout: LayoutType = 'gallery';
@Input() resourceInfoId?: string;
@Input() showDownloader = true;
@Input() showShareResourceDownloader = false;
@Output() infoEdited = new EventEmitter();
@Output() infoDeleted = new EventEmitter<string>();
resourceType!: string;
Editor = ClassicEditor;
editorConfig = {
toolbar: [
'bold',
'italic',
'|',
'bulletedList',
'numberedList',
'|',
'link',
'|',
'blockQuote',
'insertTable',
'|',
'undo',
'redo',
],
};
notes: any[] = [];
editorData = '';
selectedNoteIndex = 0;
resourceDrawerMode = this.resourceDrawerService.resourceDrawerMode;
resourceSharePage = false;
constructor(
private cd: ChangeDetectorRef,
private loaderService: LoaderService,
private notificationService: NotificationService,
private languageService: LanguageWrapperService,
private resourceService: ResourceService,
private resourceDrawerService: ResourceDrawerService,
private confirmationService: ConfirmationService,
private resourceStateService: ResourceStateService,
private router: Router,
private activatedRoute: ActivatedRoute
) {}
ngOnInit() {
this.saveNotes(this.resources);
console.log('resource save', this.resources);
this.resourceStateService.accessAllowedSupportValue$.subscribe((value) => {
this.resourceType = value;
});
if (this.notes.length > 0) {
this.selectedNoteIndex = 0;
this.editorData = this.notes[0].content;
}
const currentUrl = this.router.url;
if (currentUrl.includes('data-public')) {
this.resourceSharePage = true;
} else {
this.resourceSharePage = false;
}
}
selectTitle(index: number) {
this.selectedNoteIndex = index;
this.editorData = this.notes[index].content;
}
saveNotes(resources: any[]) {
this.notes = resources
.filter((resource) => resource.content_type === 'text')
.map((resource) => {
return {
title: resource.title,
content: resource.text,
created_at: resource.created_at,
};
});
}
public setLayout(layout: LayoutType) {
this.layout = layout;
}
public setShuffle(isShuffling: boolean) {
this.isShuffling = isShuffling;
}
public saveShuffle() {
if (!this.reorderedResources.length) return;
this.resourceService.reorderResources(this.reorderedResources).subscribe({
next: (res) => {
this.resourceDrawerService.updateResources(res.data);
this.notificationService.showNotification(
'success',
this.languageService.getInstantTranslation(
'resource_upload.reorder_success'
)
);
this.isShuffling = false;
},
error: () => {
this.notificationService.showNotification(
'error',
this.languageService.getInstantTranslation(
'resource_upload.network_error'
)
);
},
});
}
public handleCurrentTitle(title: string) {
this.currentTitle = title;
// this.cd.detectChanges(); // Without this we will get (NG0100: Expression has changed after it was checked)
}
public handleReorder(resources: ResourceWithUploadProgress[]) {
this.reorderedResources = resources;
}
public removeResource(resource: ResourceWithUploadProgress) {
this.confirmationService.confirm({
header: ' ',
message: this.languageService.getInstantTranslation(
'draft.delete_modal.title'
),
acceptLabel: this.languageService.getInstantTranslation(
'audio_recording.yes_button_text'
),
rejectLabel:
this.languageService.getInstantTranslation('modal_text.cancel'),
acceptButtonStyleClass: 'p-button-danger p-button-sm',
rejectButtonStyleClass:
'p-button-secondary p-button-outlined p-button-sm',
acceptIcon: 'none',
rejectIcon: 'none',
closeOnEscape: false,
accept: () => {
if (this.isQMInfo) {
this.infoDeleted.emit(resource.id);
} else {
this.resourceService
.deleteResource(resource.id!, resource.department?.id)
.subscribe({
next: () => {
this.resourceDrawerService.removeResource(resource.id!);
this.notificationService.showNotification(
'success',
this.languageService.getInstantTranslation(
'resource_upload.deleted_succssfully'
)
);
},
error: () => {
this.loaderService.stopLoader();
this.notificationService.showNotification(
'error',
this.languageService.getInstantTranslation(
'resource_upload.network_error'
)
);
},
});
}
},
});
}
public renameResource(obj: {
resourceId: string;
title: string;
departmentId: any;
}) {
if (this.infoEdited.observers.length) {
this.infoEdited.emit(obj);
} else {
this.resourceService
.renameResource(obj.resourceId, obj.title, obj.departmentId)
.subscribe(() => {
const resource = this.resources.find(
(resource) => resource.id === obj.resourceId
)!;
this.resourceDrawerService.upsertResource({
...resource,
title: obj.title,
});
});
}
}
public isInProgressResources() {
return this.resources.some((res) => res.uploadProgress);
}
get filteredResources() {
return this.resources.filter(
(resource) => resource.content_type !== 'text'
);
}
}
Editor is loading...
Leave a Comment