mirror of
https://github.com/discourse/discourse.git
synced 2025-03-30 02:36:39 +08:00
FIX: support for async uploads of emojis
This commit is contained in:
parent
566b267981
commit
c91634c09a
@ -2,19 +2,24 @@ export default Ember.ArrayController.extend({
|
|||||||
sortProperties: ["name"],
|
sortProperties: ["name"],
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
emojiUploaded: function (emoji) {
|
emojiUploaded(emoji) {
|
||||||
this.pushObject(emoji);
|
this.pushObject(Em.Object.create(emoji));
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function(emoji) {
|
destroy(emoji) {
|
||||||
var self = this;
|
const self = this;
|
||||||
return bootbox.confirm(I18n.t("admin.emoji.delete_confirm", { name: emoji.name }), I18n.t("no_value"), I18n.t("yes_value"), function (destroy) {
|
return bootbox.confirm(
|
||||||
if (destroy) {
|
I18n.t("admin.emoji.delete_confirm", { name: emoji.get("name") }),
|
||||||
return Discourse.ajax("/admin/customize/emojis/" + emoji.name, { type: "DELETE" }).then(function() {
|
I18n.t("no_value"),
|
||||||
self.removeObject(emoji);
|
I18n.t("yes_value"),
|
||||||
});
|
function(destroy) {
|
||||||
|
if (destroy) {
|
||||||
|
return Discourse.ajax("/admin/customize/emojis/" + emoji.get("name"), { type: "DELETE" }).then(function() {
|
||||||
|
self.removeObject(emoji);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -296,8 +296,9 @@ Discourse.Utilities = {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (data.errors) {
|
} else if (data.errors && data.errors.length > 0) {
|
||||||
bootbox.alert(data.errors.join("\n"));
|
bootbox.alert(data.errors.join("\n"));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// otherwise, display a generic error message
|
// otherwise, display a generic error message
|
||||||
bootbox.alert(I18n.t('post.errors.upload'));
|
bootbox.alert(I18n.t('post.errors.upload'));
|
||||||
|
@ -8,21 +8,25 @@ class Admin::EmojisController < Admin::AdminController
|
|||||||
file = params[:file] || params[:files].first
|
file = params[:file] || params[:files].first
|
||||||
name = params[:name] || File.basename(file.original_filename, ".*")
|
name = params[:name] || File.basename(file.original_filename, ".*")
|
||||||
|
|
||||||
# fix the name
|
Scheduler::Defer.later("Upload Emoji") do
|
||||||
name = name.gsub(/[^a-z0-9]+/i, '_')
|
# fix the name
|
||||||
.gsub(/_{2,}/, '_')
|
name = name.gsub(/[^a-z0-9]+/i, '_')
|
||||||
.downcase
|
.gsub(/_{2,}/, '_')
|
||||||
|
.downcase
|
||||||
|
|
||||||
if Emoji.exists?(name)
|
data = if Emoji.exists?(name)
|
||||||
render json: failed_json.merge(message: I18n.t("emoji.errors.name_already_exists", name: name)), status: 422
|
failed_json.merge(errors: [I18n.t("emoji.errors.name_already_exists", name: name)])
|
||||||
else
|
elsif emoji = Emoji.create_for(file, name)
|
||||||
if emoji = Emoji.create_for(file, name)
|
emoji
|
||||||
render_serialized(emoji, EmojiSerializer, root: false)
|
|
||||||
else
|
else
|
||||||
render json: failed_json.merge(message: I18n.t("emoji.errors.error_while_storing_emoji")), status: 422
|
failed_json.merge(errors: [I18n.t("emoji.errors.error_while_storing_emoji")])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
MessageBus.publish("/uploads/emoji", data.as_json, user_ids: [current_user.id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
render json: success_json
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
require 'spec_helper'
|
require "spec_helper"
|
||||||
|
|
||||||
describe Admin::EmojisController do
|
describe Admin::EmojisController do
|
||||||
|
|
||||||
@ -9,6 +9,13 @@ describe Admin::EmojisController do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
let(:custom_emoji2) do
|
||||||
|
Emoji.new("/path/to/hello2").tap do |e|
|
||||||
|
e.name = "hello2"
|
||||||
|
e.url = "/url/to/hello2.png"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "is a subclass of AdminController" do
|
it "is a subclass of AdminController" do
|
||||||
expect(Admin::EmojisController < Admin::AdminController).to eq(true)
|
expect(Admin::EmojisController < Admin::AdminController).to eq(true)
|
||||||
end
|
end
|
||||||
@ -16,57 +23,59 @@ describe Admin::EmojisController do
|
|||||||
context "when logged in" do
|
context "when logged in" do
|
||||||
let!(:user) { log_in(:admin) }
|
let!(:user) { log_in(:admin) }
|
||||||
|
|
||||||
context '.index' do
|
context ".index" do
|
||||||
it "returns a list of custom emojis" do
|
it "returns a list of custom emojis" do
|
||||||
Emoji.expects(:custom).returns([custom_emoji])
|
Emoji.expects(:custom).returns([custom_emoji])
|
||||||
xhr :get, :index
|
xhr :get, :index
|
||||||
expect(response).to be_success
|
expect(response).to be_success
|
||||||
json = ::JSON.parse(response.body)
|
json = ::JSON.parse(response.body)
|
||||||
expect(json[0]['name']).to eq(custom_emoji.name)
|
expect(json[0]["name"]).to eq(custom_emoji.name)
|
||||||
expect(json[0]['url']).to eq(custom_emoji.url)
|
expect(json[0]["url"]).to eq(custom_emoji.url)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context '.create' do
|
context ".create" do
|
||||||
|
|
||||||
before { Emoji.expects(:custom).returns([custom_emoji]) }
|
before { Emoji.expects(:custom).returns([custom_emoji]) }
|
||||||
|
|
||||||
context 'name already exist' do
|
context "name already exist" do
|
||||||
it "throws an error" do
|
it "throws an error" do
|
||||||
xhr :post, :create, { name: "hello", file: "" }
|
message = MessageBus.track_publish do
|
||||||
expect(response).not_to be_success
|
xhr :post, :create, { name: "hello", file: "" }
|
||||||
|
end.first
|
||||||
|
|
||||||
|
expect(response).to be_success
|
||||||
|
expect(message.data["errors"]).to be
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'error while saving emoji' do
|
context "error while saving emoji" do
|
||||||
it "throws an error" do
|
it "throws an error" do
|
||||||
Emoji.expects(:create_for).returns(nil)
|
Emoji.expects(:create_for).returns(nil)
|
||||||
xhr :post, :create, { name: "garbage", file: "" }
|
message = MessageBus.track_publish do
|
||||||
expect(response).not_to be_success
|
xhr :post, :create, { name: "garbage", file: "" }
|
||||||
|
end.first
|
||||||
|
|
||||||
|
expect(response).to be_success
|
||||||
|
expect(message.data["errors"]).to be
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'it works' do
|
it "works" do
|
||||||
let(:custom_emoji2) do
|
Emoji.expects(:create_for).returns(custom_emoji2)
|
||||||
Emoji.new("/path/to/hello2").tap do |e|
|
|
||||||
e.name = "hello2"
|
|
||||||
e.url = "/url/to/hello2.png"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it "creates a custom emoji" do
|
message = MessageBus.track_publish do
|
||||||
Emoji.expects(:create_for).returns(custom_emoji2)
|
|
||||||
xhr :post, :create, { name: "hello2", file: ""}
|
xhr :post, :create, { name: "hello2", file: ""}
|
||||||
expect(response).to be_success
|
end.first
|
||||||
json = ::JSON.parse(response.body)
|
|
||||||
expect(json['name']).to eq(custom_emoji2.name)
|
|
||||||
expect(json['url']).to eq(custom_emoji2.url)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
expect(response).to be_success
|
||||||
|
|
||||||
|
expect(message.data["name"]).to eq(custom_emoji2.name)
|
||||||
|
expect(message.data["url"]).to eq(custom_emoji2.url)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context '.destroy' do
|
context ".destroy" do
|
||||||
it "deletes the custom emoji" do
|
it "deletes the custom emoji" do
|
||||||
custom_emoji.expects(:remove)
|
custom_emoji.expects(:remove)
|
||||||
Emoji.expects(:custom).returns([custom_emoji])
|
Emoji.expects(:custom).returns([custom_emoji])
|
||||||
@ -77,4 +86,3 @@ describe Admin::EmojisController do
|
|||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user