Si vous téléchargez un fichier CSV avec des tags, la console affichera une erreur après un téléchargement réussi.
Voici quelques recherches.
Le problème sous-jacent est essentiellement que la modale se ferme trop rapidement avec la logique actuelle.
L’erreur se produit dans uppy-upload.js.
Les propriétés n’ont pas pu être définies car l’élément (uppy-upload) a déjà été détruit.
Comment est-ce possible ? this._uppyInstance?.cancelAll();
Pour référence, _reset est appelé depuis _allUploadsComplete.
_reset() {
this._uppyInstance?.cancelAll();
this.setProperties({
uploading: false,
processing: false,
cancellable: false,
uploadProgress: 0,
filesAwaitingUpload: false,
});
Lors d’un téléchargement réussi, voici l’ordre des fonctions :
uploadDone → _allUploadsComplete → [ _reset ]
this._uppyInstance.on("upload-success", (file, response) => {
if (this.usingS3Uploads) {
this.setProperties({ uploading: false, processing: true });
this._completeExternalUpload(file)
.then((completeResponse) => {
this._removeInProgressUpload(file.id);
this.appEvents.trigger(
`upload-mixin:${this.id}:upload-success`,
file.name,
completeResponse
);
this.uploadDone(
deepMerge(completeResponse, { file_name: file.name })
);
this._triggerInProgressUploadsEvent();
if (this.inProgressUploads.length === 0) {
this._allUploadsComplete();
Lorsque uploadDone est appelé, la modale est fermée immédiatement.
Cela signifie que l’élément uppy-upload sera détruit à la fin de l’image.
https://github.com/discourse/discourse/blob/main/app/assets/javascripts/admin/addon/components/tags-uploader.js#L22-L26
Retour à this._uppyInstance?.cancelAll();. Cela déclenchera l’événement ci-dessous.
C’est la raison pour laquelle cela échoue. À cause de run(), les propriétés seront définies après la destruction de l’élément.
this._uppyInstance.on("file-removed", (file, reason) => {
run(() => {
// we handle the cancel-all event specifically, so no need
// to do anything here. this event is also fired when some files
// are handled by an upload handler
if (reason === "cancel-all") {
return;
}
this.appEvents.trigger(
`upload-mixin:${this.id}:upload-cancelled`,
file.id
);
});
});
Ceci est une régression mineure. Introduite ici :
uppy-upload.js
main ← dev/uppy-upload-mixin-improvements
opened 11:24PM - 05 Apr 22 UTC
This PR brings the `UppyUploadMixin` more into line with the `ComposerUppyUpload… ` mixin, by extending the `ExtendableUploader` . This also adds better tracking of and events for in progress uploads in the `UppyUploadMixin` for better UI interactions, and also opens up the use of `_useUploadPlugin` for the mixin, so anything implementing `UppyUploadMixin` can add extra uppy preprocessor plugins as needed.
This has been done as part of work on extracting uploads out of the chat composer. In future, we might be able to do the same for `ComposerUppyUpload`, getting rid of that mixin to standardise on `UppyUploadMixin` and have a separate `composer-uploads` component that lives alongside `composer-editor` like what we are doing in https://github.com/discourse/discourse-chat/pull/764
main ← issue/improve-starting-new-uploads-progress
opened 06:48AM - 28 Sep 22 UTC
This commit addresses issues around starting new uploads in a composer etc. when… one or more uploads are already processing or uploading. There were a couple of issues:
1. When all preprocessors were complete, we were not resetting `completeProcessing` to 0, which meant that `needProcessing` would never match `completeProcessing` if a new upload was started.
2. We were relying on the uppy "complete" event which is supposed to fire when all uploads are complete, but this doesn't seem to take into account new uploads that are added. Instead now we can rely on our own `inProgressUploads` tracker, and consider all uploads complete when there are no `inProgressUploads` in flight
This is difficult to test for in JS since it involves the upload lifecycle and AJAX calls, so tests are omitted.
tags-upload.js
main ← a11y-refactor-bootbox-alerts
opened 04:30PM - 20 Sep 22 UTC
Solutions possibles :
Fermer la modale un peu plus tard
uploadDone() {
this.refresh();
this.dialog
.alert(I18n.t("tagging.upload_successful"))
.finally(() => this.closeModal());
}
Déplacer la vérification hors de la boucle run().
this._uppyInstance.on("file-removed", (file, reason) => {
// nous gérons l'événement cancel-all spécifiquement, donc pas besoin
// de faire quoi que ce soit ici. cet événement est également déclenché lorsque certains fichiers
// sont traités par un gestionnaire de téléchargement
if (reason === "cancel-all") {
return;
}
run(() => {
Je ne suis pas sûr s’il existe une meilleure solution. Je poste donc ici.
C’est beaucoup de texte pour un problème mineur non bloquant, mais il n’était pas évident au départ.