diff --git a/app/assets/javascripts/discourse/app/models/composer.js b/app/assets/javascripts/discourse/app/models/composer.js
index 5fee7738421..5b8f6c68154 100644
--- a/app/assets/javascripts/discourse/app/models/composer.js
+++ b/app/assets/javascripts/discourse/app/models/composer.js
@@ -1,6 +1,6 @@
import EmberObject, { set } from "@ember/object";
import { and, equal, not, or, reads } from "@ember/object/computed";
-import { cancel, later, next, throttle } from "@ember/runloop";
+import { next, throttle } from "@ember/runloop";
import discourseComputed, {
observes,
on,
@@ -113,7 +113,6 @@ const Composer = RestModel.extend({
unlistTopic: false,
noBump: false,
draftSaving: false,
- draftSaved: false,
draftForceSave: false,
archetypes: reads("site.archetypes"),
@@ -1190,16 +1189,10 @@ const Composer = RestModel.extend({
}
this.setProperties({
- draftSaved: false,
draftSaving: true,
draftConflictUser: null,
});
- if (this._clearingStatus) {
- cancel(this._clearingStatus);
- this._clearingStatus = null;
- }
-
let data = this.serialize(_draft_serializer);
if (data.postId && !isEmpty(this.originalText)) {
@@ -1224,7 +1217,7 @@ const Composer = RestModel.extend({
});
} else {
this.setProperties({
- draftSaved: true,
+ draftStatus: null,
draftConflictUser: null,
draftForceSave: false,
});
@@ -1276,23 +1269,6 @@ const Composer = RestModel.extend({
this.set("draftSaving", false);
});
},
-
- @observes("title", "reply")
- dataChanged() {
- const draftStatus = this.draftStatus;
-
- if (draftStatus && !this._clearingStatus) {
- this._clearingStatus = later(
- this,
- () => {
- this.setProperties({ draftStatus: null, draftConflictUser: null });
- this._clearingStatus = null;
- this.setProperties({ draftSaving: false, draftSaved: false });
- },
- Ember.Test ? 0 : 1000
- );
- }
- },
});
Composer.reopenClass({
diff --git a/app/assets/javascripts/discourse/app/templates/composer.hbs b/app/assets/javascripts/discourse/app/templates/composer.hbs
index 955df36efe8..7779c0e1aef 100644
--- a/app/assets/javascripts/discourse/app/templates/composer.hbs
+++ b/app/assets/javascripts/discourse/app/templates/composer.hbs
@@ -175,14 +175,12 @@
{{/if}}
- {{#if model.draftSaving}}
{{/if}}
- {{#if model.draftSaved}}{{d-icon "check" class="save-animation"}}{{/if}}
{{#if model.draftStatus}}
{{#if model.draftConflictUser}}
{{avatar model.draftConflictUser imageSize="small"}} {{d-icon "user-edit"}}
{{else}}
- {{d-icon "sync-alt"}}
+ {{d-icon "exclamation-triangle"}}
{{/if}}
{{#unless site.mobileView}}
{{model.draftStatus}}
diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-draft-saving-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-draft-saving-test.js
new file mode 100644
index 00000000000..44f6b4d87f9
--- /dev/null
+++ b/app/assets/javascripts/discourse/tests/acceptance/composer-draft-saving-test.js
@@ -0,0 +1,53 @@
+import {
+ acceptance,
+ exists,
+ query,
+} from "discourse/tests/helpers/qunit-helpers";
+import { click, fillIn, visit } from "@ember/test-helpers";
+import { test } from "qunit";
+import I18n from "I18n";
+
+acceptance("Composer - Draft saving", function (needs) {
+ needs.user();
+
+ const draftThatWillBeSaved = "This_will_be_saved_successfully";
+
+ needs.pretender((server, helper) => {
+ server.post("/draft.json", (request) => {
+ const success = request.requestBody.includes(draftThatWillBeSaved);
+ return success
+ ? helper.response({ success: true })
+ : helper.response(500, {});
+ });
+ });
+
+ test("Shows a warning if a draft wasn't saved", async function (assert) {
+ await visit("/t/internationalization-localization/280");
+ await click(".topic-post:nth-of-type(1) button.show-more-actions");
+ await click(".topic-post:nth-of-type(1) button.edit");
+
+ await fillIn(".d-editor-input", draftThatWillBeSaved);
+
+ assert.notOk(
+ exists("div#draft-status span"),
+ "the draft was saved, there's no warning"
+ );
+
+ await fillIn(".d-editor-input", "This won't be saved because of error");
+ assert.equal(
+ query("div#draft-status span").innerText.trim(),
+ I18n.t("composer.drafts_offline"),
+ "the draft wasn't saved, a warning is rendered"
+ );
+ assert.ok(
+ exists("div#draft-status svg.d-icon-exclamation-triangle"),
+ "an exclamation icon is rendered"
+ );
+
+ await fillIn(".d-editor-input", draftThatWillBeSaved);
+ assert.notOk(
+ exists("div#draft-status span"),
+ "the draft was saved again, the warning has disappeared"
+ );
+ });
+});
diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js
index cd0bb88cf25..5440a5aa2ce 100644
--- a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js
+++ b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js
@@ -698,8 +698,6 @@ acceptance("Composer", function (needs) {
),
"mode should have changed"
);
-
- assert.ok(queryAll(".save-animation"), "save animation should show");
} finally {
toggleCheckDraftPopup(false);
}
diff --git a/app/assets/stylesheets/common/base/compose.scss b/app/assets/stylesheets/common/base/compose.scss
index a37e875194a..67e7165b61b 100644
--- a/app/assets/stylesheets/common/base/compose.scss
+++ b/app/assets/stylesheets/common/base/compose.scss
@@ -482,11 +482,6 @@ div.ac-wrap {
}
}
-.save-animation {
- -webkit-animation: transformer 5s forwards;
- animation: transformer 5s forwards;
-}
-
@-webkit-keyframes transformer {
90% {
-webkit-filter: opacity(1);