import { tracked } from "@glimmer/tracking"; import Component, { Input } from "@ember/component"; import { fn } from "@ember/helper"; import { on } from "@ember/modifier"; import { action } from "@ember/object"; import { inject as service } from "@ember/service"; import DButton from "discourse/components/d-button"; import { ajax } from "discourse/lib/ajax"; import UppyUploadMixin from "discourse/mixins/uppy-upload"; import icon from "discourse-common/helpers/d-icon"; import discourseDebounce from "discourse-common/lib/debounce"; import I18n from "discourse-i18n"; import RagUploadProgress from "./rag-upload-progress"; export default class PersonaRagUploader extends Component.extend( UppyUploadMixin ) { @service appEvents; @tracked term = null; @tracked filteredUploads = null; @tracked ragIndexingStatuses = null; @tracked ragUploads = null; id = "discourse-ai-persona-rag-uploader"; maxFiles = 20; uploadUrl = "/admin/plugins/discourse-ai/ai-personas/files/upload"; preventDirectS3Uploads = true; didReceiveAttrs() { super.didReceiveAttrs(...arguments); if (this.inProgressUploads?.length > 0) { this._uppyInstance?.cancelAll(); } this.ragUploads = this.persona?.rag_uploads || []; this.filteredUploads = this.ragUploads; if (this.ragUploads?.length && this.persona?.id) { ajax( `/admin/plugins/discourse-ai/ai-personas/${this.persona.id}/files/status.json` ).then((statuses) => { this.set("ragIndexingStatuses", statuses); }); } this.appEvents.on( `upload-mixin:${this.id}:all-uploads-complete`, this, "_updatePersonaWithUploads" ); } willDestroy() { super.willDestroy(...arguments); this.appEvents.off( `upload-mixin:${this.id}:all-uploads-complete`, this, "_updatePersonaWithUploads" ); } _updatePersonaWithUploads() { this.updateUploads(this.ragUploads); } uploadDone(uploadedFile) { const newUpload = uploadedFile.upload; newUpload.status = "uploaded"; newUpload.statusText = I18n.t("discourse_ai.ai_persona.uploads.uploaded"); this.ragUploads.pushObject(newUpload); this.debouncedSearch(); } @action submitFiles() { this.fileInputEl.click(); } @action cancelUploading(upload) { this.appEvents.trigger(`upload-mixin:${this.id}:cancel-upload`, { fileId: upload.id, }); } @action search() { if (this.term) { this.filteredUploads = this.ragUploads.filter((u) => { return ( u.original_filename.toUpperCase().indexOf(this.term.toUpperCase()) > -1 ); }); } else { this.filteredUploads = this.ragUploads; } } @action debouncedSearch() { discourseDebounce(this, this.search, 100); } @action removeUpload(upload) { this.ragUploads.removeObject(upload); this.onRemove(upload); this.debouncedSearch(); } }