solidus_editor 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.hound.yml +28 -0
- data/.rspec +4 -0
- data/.rubocop.yml +8 -0
- data/.travis.yml +21 -0
- data/CONTRIBUTING.md +83 -0
- data/Gemfile +17 -0
- data/Guardfile +10 -0
- data/LICENSE.md +26 -0
- data/README.md +99 -0
- data/Rakefile +21 -0
- data/app/assets/javascripts/spree/backend/solidus_editor.js +1 -0
- data/app/assets/stylesheets/spree/backend/solidus_editor.css +6 -0
- data/app/controllers/spree/admin/editor_settings_controller.rb +21 -0
- data/app/models/ckeditor/asset.rb +4 -0
- data/app/models/ckeditor/attachment_file.rb +13 -0
- data/app/models/ckeditor/picture.rb +13 -0
- data/app/models/spree/editor_setting.rb +11 -0
- data/app/overrides/add_rich_editor_tab.rb +7 -0
- data/app/overrides/include_rich_text_js.rb +7 -0
- data/app/views/shared/_rich_editor_javascript.html.erb +8 -0
- data/app/views/shared/editor_engines/_ck_editor.html.erb +11 -0
- data/app/views/shared/editor_engines/_tiny_mce.html.erb +24 -0
- data/app/views/spree/admin/editor_settings/edit.html.erb +35 -0
- data/bin/rails +7 -0
- data/config/initializers/ckeditor.rb +21 -0
- data/config/locales/en.yml +9 -0
- data/config/locales/es.yml +9 -0
- data/config/locales/it.yml +9 -0
- data/config/locales/nl.yml +9 -0
- data/config/locales/ru.yml +9 -0
- data/config/locales/sv.yml +9 -0
- data/config/routes.rb +5 -0
- data/lib/generators/solidus_editor/install/install_generator.rb +15 -0
- data/lib/generators/spree_editor/install/install_generator.rb +15 -0
- data/lib/solidus_editor.rb +9 -0
- data/lib/solidus_editor/engine.rb +25 -0
- data/lib/solidus_editor/version.rb +18 -0
- data/lib/spree_editor/config.rb +3 -0
- data/lib/templates/config/tinymce.yml +40 -0
- data/spec/controllers/spree/admin/editor_settings_controller_spec.rb +46 -0
- data/spec/features/admin/editor_settings_spec.rb +12 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/support/capybara.rb +17 -0
- data/spec/support/database_cleaner.rb +25 -0
- data/spec/support/factory_girl.rb +5 -0
- data/spec/support/spree.rb +12 -0
- data/spec/translations/locale_spec.rb +15 -0
- data/spree_editor.gemspec +41 -0
- data/vendor/assets/javascripts/tinymce/langs/cs.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/da.js +156 -0
- data/vendor/assets/javascripts/tinymce/langs/de.js +173 -0
- data/vendor/assets/javascripts/tinymce/langs/fi.js +173 -0
- data/vendor/assets/javascripts/tinymce/langs/fr.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/id.js +71 -0
- data/vendor/assets/javascripts/tinymce/langs/it.js +155 -0
- data/vendor/assets/javascripts/tinymce/langs/nb.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/nl.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/pt-BR.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/pt.js +173 -0
- data/vendor/assets/javascripts/tinymce/langs/ro.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/ru.js +173 -0
- data/vendor/assets/javascripts/tinymce/langs/sv.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/tr.js +174 -0
- data/vendor/assets/javascripts/tinymce/langs/vi.js +96 -0
- data/vendor/assets/javascripts/tinymce/langs/zh-CN.js +173 -0
- metadata +348 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
Deface::Override.new(
|
2
|
+
original: 'e004c3e716cca1f673d5142bdd7c16dc2dc5b403',
|
3
|
+
virtual_path: 'spree/layouts/admin',
|
4
|
+
name: 'include_rich_text_js',
|
5
|
+
insert_bottom: '[data-hook="admin_footer_scripts"]',
|
6
|
+
text: '<%= render partial: "shared/rich_editor_javascript" %>'
|
7
|
+
)
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<% @editor_setting = Spree::EditorSetting.new %>
|
2
|
+
<% is_enabled = @editor_setting[:enabled] %>
|
3
|
+
<% current_editor = @editor_setting[:current_editor] %>
|
4
|
+
<% ids = @editor_setting[:ids].split %>
|
5
|
+
|
6
|
+
<% if is_enabled and ids.any? %>
|
7
|
+
<%= render "shared/editor_engines/#{@editor_setting[:current_editor].underscore}", ids: ids %>
|
8
|
+
<% end %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<%= javascript_include_tag 'tinymce-jquery' %>
|
2
|
+
|
3
|
+
<script>
|
4
|
+
$(function () {
|
5
|
+
/* Inject each textarea id with .tinymce class required for TinyMCE 4 */
|
6
|
+
$('<%= raw ids.each.map{|id| "textarea##{id}" }.join(", ") %>').addClass('tinymce');
|
7
|
+
});
|
8
|
+
|
9
|
+
$(document).ready(function () {
|
10
|
+
$('<%= raw ids.each.map{|id| "textarea##{id}" }.join(", ") %>').tinymce(
|
11
|
+
<%= raw TinyMCE::Rails.configuration.options.to_json %>);
|
12
|
+
});
|
13
|
+
</script>
|
14
|
+
|
15
|
+
<style type="text/css">
|
16
|
+
/* Reset TinyMCE menu styles */
|
17
|
+
.mce-tinymce button {
|
18
|
+
font-size: inherit !important;
|
19
|
+
text-transform: inherit !important;
|
20
|
+
}
|
21
|
+
.mce-tinymce button:hover {
|
22
|
+
background-color: inherit !important;
|
23
|
+
}
|
24
|
+
</style>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<%= render :partial => 'spree/admin/shared/configuration_menu' %>
|
2
|
+
|
3
|
+
<% content_for :page_title do %>
|
4
|
+
<%= Spree.t(:rich_editor) %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<%= form_tag admin_editor_settings_path, method: :put do %>
|
8
|
+
<fieldset class="general no-border-top">
|
9
|
+
|
10
|
+
<div class="field">
|
11
|
+
<%= label_tag(:current_editor, Spree.t(:rich_editor_engine)) %>
|
12
|
+
<br />
|
13
|
+
<%= select_tag(:current_editor, options_for_select(Spree::EditorSetting.editors, SpreeEditor::Config[:current_editor]), class: 'select2') %>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="field">
|
17
|
+
<%= label_tag(:enabled) do %>
|
18
|
+
<%= preference_field_tag(:enabled, SpreeEditor::Config[:enabled], type: :boolean) %>
|
19
|
+
<%= Spree.t(:enable_rich_editor) %>
|
20
|
+
<% end %>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div class="field">
|
24
|
+
<%= label_tag(:ids, Spree.t(:rich_editor_ids_description)) %>
|
25
|
+
<br />
|
26
|
+
<%= preference_field_tag(:ids, SpreeEditor::Config[:ids], class: 'control-form') %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
30
|
+
<%= button Spree.t('actions.update'), 'update' %>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
|
34
|
+
</fieldset>
|
35
|
+
<% end %>
|
data/bin/rails
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Use this hook to configure ckeditor
|
2
|
+
if Object.const_defined?('Ckeditor')
|
3
|
+
Ckeditor.setup do |config|
|
4
|
+
# ==> ORM configuration
|
5
|
+
# Load and configure the ORM. Supports :active_record (default), :mongo_mapper and
|
6
|
+
# :mongoid (bson_ext recommended) by default. Other ORMs may be
|
7
|
+
# available as additional gems.
|
8
|
+
require 'ckeditor/orm/active_record'
|
9
|
+
|
10
|
+
# Allowed image file types for upload.
|
11
|
+
# Set to nil or [] (empty array) for all file types
|
12
|
+
config.image_file_types = %w(jpg jpeg png gif tiff)
|
13
|
+
|
14
|
+
# Allowed attachment file types for upload.
|
15
|
+
# Set to nil or [] (empty array) for all file types
|
16
|
+
# config.attachment_file_types = %w(doc docx xls odt ods pdf rar zip tar swf)
|
17
|
+
|
18
|
+
# Setup authorization to be run as a before filter
|
19
|
+
config.authorize_with :cancan, Spree::Ability
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
spree:
|
4
|
+
enable_rich_editor: Enable Rich Editor
|
5
|
+
rich_editor: Rich Editor
|
6
|
+
rich_editor_description: Configure Rich Editor settings.
|
7
|
+
rich_editor_engine: Rich Editor engine
|
8
|
+
rich_editor_ids: Rich Editor Identificators
|
9
|
+
rich_editor_ids_description: "List textarea's ids splitted by spaces here"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
es:
|
3
|
+
spree:
|
4
|
+
enable_rich_editor: Activar editor avanzado
|
5
|
+
rich_editor: Editor avanzado
|
6
|
+
rich_editor_description: Configurar opciones del editor.
|
7
|
+
rich_editor_engine: Motor del editor avanzado
|
8
|
+
rich_editor_ids: Identificadores del editor avanzado
|
9
|
+
rich_editor_ids_description: "Listar aquí los ids de los textareas, separados por espacios"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
it:
|
3
|
+
spree:
|
4
|
+
enable_rich_editor: Abilita Editor di Testo
|
5
|
+
rich_editor: Editor di Testo
|
6
|
+
rich_editor_description: Configura Editor di Testo.
|
7
|
+
rich_editor_engine: Motore dell'Editor di Testo
|
8
|
+
rich_editor_ids: ID per l'Editor di Testo
|
9
|
+
rich_editor_ids_description: Elenca qui gli ID delle textarea divisi da spazi
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
nl:
|
3
|
+
spree:
|
4
|
+
enable_rich_editor: "HTML Editor inschakelen"
|
5
|
+
rich_editor: "HTML Editor"
|
6
|
+
rich_editor_description: "Configureer HTML Editor."
|
7
|
+
rich_editor_engine: "HTML Editor implementatie"
|
8
|
+
rich_editor_ids: "HTML Editor id's"
|
9
|
+
rich_editor_ids_description: "HTML Editor koppelen aan de volgende id's (gescheiden door spaties)"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
ru:
|
3
|
+
spree:
|
4
|
+
enable_rich_editor: Включить визуальный редактор
|
5
|
+
rich_editor: Визуальный редактор
|
6
|
+
rich_editor_description: Настройка визуального редактора.
|
7
|
+
rich_editor_engine: Реализация визуального редактора
|
8
|
+
rich_editor_ids: Идентификаторы
|
9
|
+
rich_editor_ids_description: "Перечислите идентификаторы элементов textarea через пробел"
|
@@ -0,0 +1,9 @@
|
|
1
|
+
---
|
2
|
+
sv:
|
3
|
+
spree:
|
4
|
+
enable_rich_editor: Aktivera Texthanterare
|
5
|
+
rich_editor: Texthanterare
|
6
|
+
rich_editor_description: Konfigurera Texthanterare inställningar.
|
7
|
+
rich_editor_engine: Texthanterare motor
|
8
|
+
rich_editor_ids: Texthanterare identifierare
|
9
|
+
rich_editor_ids_description: "Lista textfältens id-taggar separerade med blanksteg"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module SolidusEditor
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../../../../templates', __FILE__)
|
5
|
+
|
6
|
+
def add_stylesheets
|
7
|
+
inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/solidus_editor\n", before: /\*\//, verbose: true
|
8
|
+
end
|
9
|
+
|
10
|
+
def copy_tinymce_file
|
11
|
+
copy_file 'config/tinymce.yml', 'config/tinymce.yml'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SolidusEditor
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../../../../templates', __FILE__)
|
5
|
+
|
6
|
+
def add_stylesheets
|
7
|
+
inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/solidus_editor\n", before: /\*\//, verbose: true
|
8
|
+
end
|
9
|
+
|
10
|
+
def copy_tinymce_file
|
11
|
+
copy_file 'config/tinymce.yml', 'config/tinymce.yml'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SolidusEditor
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
isolate_namespace Spree
|
4
|
+
engine_name 'solidus_editor'
|
5
|
+
|
6
|
+
initializer 'solidus_editor.preferences', before: :load_config_initializers do
|
7
|
+
SpreeEditor::Config = Spree::EditorSetting.new
|
8
|
+
|
9
|
+
if Spree::Config.has_preference? :show_raw_product_description
|
10
|
+
Spree::Config[:show_raw_product_description] = SpreeEditor::Config[:enabled]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
15
|
+
|
16
|
+
def self.activate
|
17
|
+
cache_klasses = %W(#{config.root}/app/**/*_decorator*.rb)
|
18
|
+
Dir.glob(cache_klasses) do |klass|
|
19
|
+
Rails.configuration.cache_classes ? require(klass) : load(klass)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
config.to_prepare(&method(:activate).to_proc)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SolidusEditor
|
2
|
+
module_function
|
3
|
+
|
4
|
+
# Returns the version of the currently loaded SpreeEditor as a
|
5
|
+
# <tt>Gem::Version</tt>.
|
6
|
+
def version
|
7
|
+
Gem::Version.new VERSION::STRING
|
8
|
+
end
|
9
|
+
|
10
|
+
module VERSION
|
11
|
+
MAJOR = 1
|
12
|
+
MINOR = 0
|
13
|
+
TINY = 0
|
14
|
+
PRE = nil
|
15
|
+
|
16
|
+
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# Spree Editor TinyMCE Configuration
|
2
|
+
#
|
3
|
+
# These are the options that will automatically be passed into the tinyMCE.init function
|
4
|
+
# whenever TinyMCE is loaded in one of your spree pages. Please edit this file to
|
5
|
+
# customise your TinyMCE setup in your spree installation. If you wish to see the full
|
6
|
+
# range of configuration options then please go here:
|
7
|
+
#
|
8
|
+
# http://www.tinymce.com/wiki.php/configuration
|
9
|
+
|
10
|
+
# TinyMCE Options
|
11
|
+
mode: "exact"
|
12
|
+
theme: "modern"
|
13
|
+
language: "<%= I18n.locale.to_s.split('-')[0].downcase %>"
|
14
|
+
skin: "lightgray"
|
15
|
+
schema: "html5-strict"
|
16
|
+
element_format: "html"
|
17
|
+
resize: true
|
18
|
+
plugins:
|
19
|
+
- layer
|
20
|
+
- table
|
21
|
+
- insertdatetime
|
22
|
+
- preview
|
23
|
+
- media
|
24
|
+
- searchreplace
|
25
|
+
- contextmenu
|
26
|
+
- paste
|
27
|
+
- directionality
|
28
|
+
- fullscreen
|
29
|
+
- noneditable
|
30
|
+
- visualchars
|
31
|
+
- nonbreaking
|
32
|
+
- template
|
33
|
+
|
34
|
+
# Each line is a toolbar
|
35
|
+
toolbar:
|
36
|
+
- cut copy paste pastetext pasteword | search replace | undo redo | link unlink anchor image cleanup help code | insertdate inserttime preview
|
37
|
+
- bold italic underline strikethrough | justifyleft justifycenter justifyright justifyfull | sub sup | bullist numlist | outdent indent blockquote"
|
38
|
+
- styleselect formatselect fontselect fontsizeselect | forecolor backcolor
|
39
|
+
- tablecontrols | hr removeformat visualaid
|
40
|
+
- fullscreen | charmap media | visualchars blockquote
|
@@ -0,0 +1,46 @@
|
|
1
|
+
RSpec.describe Spree::Admin::EditorSettingsController, type: :controller do
|
2
|
+
stub_authorization!
|
3
|
+
|
4
|
+
before do
|
5
|
+
reset_spree_preferences
|
6
|
+
user = create(:admin_user)
|
7
|
+
allow(controller).to receive(:try_spree_current_user).and_return(user)
|
8
|
+
end
|
9
|
+
|
10
|
+
context '#update' do
|
11
|
+
it 'redirects to editor settings page' do
|
12
|
+
spree_put :update, preferences: { enabled: true }
|
13
|
+
expect(response).to redirect_to spree.edit_admin_editor_settings_path
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'For parameters:
|
17
|
+
current_editor: CKEditor
|
18
|
+
enabled: true
|
19
|
+
ids: product_description page_body' do
|
20
|
+
|
21
|
+
subject { SpreeEditor::Config }
|
22
|
+
|
23
|
+
it 'sets preferred_current_editor to "CKEditor"' do
|
24
|
+
spree_put :update, preferences: { current_editor: 'CKEditor' }
|
25
|
+
expect(subject.preferred_current_editor).to eq('CKEditor')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'sets preferred_enabled to true' do
|
29
|
+
spree_put :update, preferences: { enabled: true }
|
30
|
+
expect(subject.preferred_enabled).to be(true)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'sets preferred_ids to product_description page_body' do
|
34
|
+
spree_put :update, preferences: { ids: 'product_description page_body' }
|
35
|
+
expect(subject.preferred_ids).to eq('product_description page_body')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context '#edit' do
|
41
|
+
it 'renders the edit template' do
|
42
|
+
spree_get :edit
|
43
|
+
expect(response).to be_success
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
RSpec.feature 'Rich Editor Settings', :js do
|
2
|
+
stub_authorization!
|
3
|
+
|
4
|
+
context '#edit' do
|
5
|
+
scenario 'have default elements' do
|
6
|
+
visit spree.edit_admin_editor_settings_path
|
7
|
+
|
8
|
+
expect(page).to have_field 'ids', with: 'product_description page_body'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start 'rails'
|
3
|
+
|
4
|
+
ENV['RAILS_ENV'] ||= 'test'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require File.expand_path('../dummy/config/environment', __FILE__)
|
8
|
+
rescue LoadError
|
9
|
+
abort 'Could not load dummy application. Please ensure you have run `bundle exec rake test_app`'
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rspec/rails'
|
13
|
+
require 'i18n-spec'
|
14
|
+
require 'ffaker'
|
15
|
+
|
16
|
+
RSpec.configure do |config|
|
17
|
+
config.infer_spec_type_from_file_location!
|
18
|
+
config.mock_with :rspec
|
19
|
+
config.raise_errors_for_deprecations!
|
20
|
+
config.use_transactional_fixtures = false
|
21
|
+
|
22
|
+
config.expect_with :rspec do |expectations|
|
23
|
+
expectations.syntax = :expect
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |file| require file }
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'capybara/rspec'
|
2
|
+
require 'capybara/rails'
|
3
|
+
require 'capybara/poltergeist'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
Capybara.javascript_driver = :poltergeist
|
7
|
+
|
8
|
+
Capybara.register_driver(:poltergeist) do |app|
|
9
|
+
Capybara::Poltergeist::Driver.new app, js_errors: true, timeout: 40
|
10
|
+
end
|
11
|
+
|
12
|
+
config.before(:each, :js) do
|
13
|
+
if Capybara.javascript_driver == :selenium
|
14
|
+
page.driver.browser.manage.window.maximize
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'database_cleaner'
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.before(:suite) do
|
5
|
+
DatabaseCleaner.clean_with :truncation
|
6
|
+
end
|
7
|
+
|
8
|
+
config.before do
|
9
|
+
DatabaseCleaner.strategy = :transaction
|
10
|
+
end
|
11
|
+
|
12
|
+
config.before(:each, :js) do
|
13
|
+
DatabaseCleaner.strategy = :truncation
|
14
|
+
end
|
15
|
+
|
16
|
+
config.before do
|
17
|
+
DatabaseCleaner.start
|
18
|
+
end
|
19
|
+
|
20
|
+
config.after do
|
21
|
+
DatabaseCleaner.clean
|
22
|
+
end
|
23
|
+
|
24
|
+
Capybara.javascript_driver = :poltergeist
|
25
|
+
end
|