ckeditor5 1.12.0 → 1.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c39a460f498306970334acf87d4bd8c66a24ddaf79ad0dd9f461ed5d9772de11
4
- data.tar.gz: b5a221dbe9dd9d47c649d1b8d78eda335fdeebe4fde6190db9f03cf3f3fe4aca
3
+ metadata.gz: 6b4d6c95733dd5744553bb787f20f9efaf474086c6268d6842561905747ec10f
4
+ data.tar.gz: 17052fae7a4e0e88fcc7c0af8ab397c8fadb3421ce611c64a10fe597d15a9d82
5
5
  SHA512:
6
- metadata.gz: a7368d44b2ed0ce7416c8a4ed0052c9c15b343bf012e39fa24abd5761a61173c4ae95925061dce751c0b6419b19e1a69f2d98266f316b99d1c06479b1cad9b1c
7
- data.tar.gz: b0c6f01ac1d2efbc70f11a12997b6d48567293c13689e203ba29f9034dc233d25851e6d0c6bde29f382fbfafcb6f8630e4e51eb47db15922928eb20a199e3274
6
+ metadata.gz: 4dbaefb77863ceaeaad0805d430c86b90c7fbec675a7478fc55994a9706bfc3b8ec59c7791ce916389346da508f47a88ce2ff8c38a79d1c9189aa77405769f9f
7
+ data.tar.gz: 6b1d599bbfe28b35c81d037b052085c15fe55c1248f8e858efc77b7515c88b5ea2818187082f0db7810192b7d2cdfd3bb45d3dba57f7cf03cd0f53932dfbb202
data/README.md CHANGED
@@ -85,9 +85,10 @@ Voilà! You have CKEditor 5 integrated with your Rails application. 🎉
85
85
  - [`plugin(name, premium:, import_name:)` method](#pluginname-premium-import_name-method)
86
86
  - [`plugins(*names, **kwargs)` method](#pluginsnames-kwargs-method)
87
87
  - [`inline_plugin(name, code)` method](#inline_pluginname-code-method)
88
+ - [`simple_upload_adapter(url)` method](#simple_upload_adapterurl-method)
88
89
  - [Controller / View helpers 📦](#controller--view-helpers-)
89
90
  - [`ckeditor5_element_ref(selector)` method](#ckeditor5_element_refselector-method)
90
- - [`ckeditor5_preset(&block)` method](#ckeditor5_presetblock-method)
91
+ - [`ckeditor5_preset(&block)` method](#ckeditor5_presetblock-method)
91
92
  - [Including CKEditor 5 assets 📦](#including-ckeditor-5-assets-)
92
93
  - [Format 📝](#format-)
93
94
  - [Using default preset](#using-default-preset)
@@ -534,6 +535,20 @@ CKEditor5::Rails.configure do
534
535
  end
535
536
  ```
536
537
 
538
+ Methods such as `remove`, `append`, and `prepend` can be used to modify the plugins configuration. To remove a plugin, you can use the `remove` method with the plugin name as an argument:
539
+
540
+ ```rb
541
+ # config/initializers/ckeditor5.rb
542
+
543
+ CKEditor5::Rails.configure do
544
+ # ... other configuration
545
+
546
+ plugins do
547
+ remove :Heading
548
+ end
549
+ end
550
+ ```
551
+
537
552
  #### `inline_plugin(name, code)` method
538
553
 
539
554
  Use with caution as this is an inline definition of the plugin code, and you can define a custom class or function for the plugin here. The example below shows how to define a custom plugin that highlights the text:
@@ -560,6 +575,35 @@ CKEditor5::Rails.configure do
560
575
  end
561
576
  ```
562
577
 
578
+ #### `simple_upload_adapter(url)` method
579
+
580
+ Defines the URL for the simple upload adapter. The default endpoint is `/uploads` and the method is `POST`. The example below shows how to set the URL to `/uploads`:
581
+
582
+ ```rb
583
+ # config/initializers/ckeditor5.rb
584
+
585
+ CKEditor5::Rails.configure do
586
+ # ... other configuration
587
+
588
+ simple_upload_adapter
589
+ # or: simple_upload_adapter '/uploads'
590
+ end
591
+ ```
592
+
593
+ Remember to remove the `Base64UploadAdapter` plugin from the plugins list if you want to use the simple upload adapter. It may cause issues.
594
+
595
+ ```rb
596
+ # config/initializers/ckeditor5.rb
597
+
598
+ CKEditor5::Rails.configure do
599
+ # ... other configuration
600
+
601
+ plugins do
602
+ remove :Base64UploadAdapter
603
+ end
604
+ end
605
+ ```
606
+
563
607
  ### Controller / View helpers 📦
564
608
 
565
609
  #### `ckeditor5_element_ref(selector)` method
@@ -578,7 +622,7 @@ CKEditor5::Rails.configure do
578
622
  end
579
623
  ```
580
624
 
581
- ### `ckeditor5_preset(&block)` method
625
+ #### `ckeditor5_preset(&block)` method
582
626
 
583
627
  The `ckeditor5_preset` method allows you to define a custom preset in your application controller. It may be useful when you want to define a preset based on the current user or request.
584
628
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  module CKEditor5::Rails::Editor
4
4
  class PropsInlinePlugin
5
+ attr_reader :name, :code
6
+
5
7
  def initialize(name, code)
6
8
  @name = name
7
9
  @code = code
@@ -18,8 +20,6 @@ module CKEditor5::Rails::Editor
18
20
 
19
21
  private
20
22
 
21
- attr_reader :name, :code
22
-
23
23
  def validate_code!
24
24
  raise ArgumentError, 'Code must be a String' unless code.is_a?(String)
25
25
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  module CKEditor5::Rails::Editor
4
4
  class PropsPlugin
5
+ attr_reader :name, :js_import_meta
6
+
5
7
  delegate :to_h, to: :import_meta
6
8
 
7
9
  def initialize(name, premium: false, **js_import_meta)
@@ -30,9 +32,5 @@ module CKEditor5::Rails::Editor
30
32
  meta.merge!({ type: :external })
31
33
  meta
32
34
  end
33
-
34
- private
35
-
36
- attr_reader :name, :js_import_meta
37
35
  end
38
36
  end
@@ -4,6 +4,7 @@ require 'rails/engine'
4
4
 
5
5
  require_relative 'presets/manager'
6
6
  require_relative 'hooks/form'
7
+ require_relative 'plugins/simple_upload_adapter'
7
8
 
8
9
  module CKEditor5::Rails
9
10
  class Engine < ::Rails::Engine
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CKEditor5::Rails::Plugins
4
+ class SimpleUploadAdapter < CKEditor5::Rails::Editor::PropsInlinePlugin
5
+ PLUGIN_CODE = <<~JAVASCRIPT
6
+ import { Plugin, FileRepository } from 'ckeditor5';
7
+
8
+ export default class SimpleUploadAdapter extends Plugin {
9
+ static get requires() {
10
+ return [FileRepository];
11
+ }
12
+
13
+ static get pluginName() {
14
+ return 'SimpleUploadAdapter';
15
+ }
16
+
17
+ init() {
18
+ const fileRepository = this.editor.plugins.get(FileRepository);
19
+ const config = this.editor.config.get('simpleUpload');
20
+
21
+ if (!config || !config.uploadUrl) {
22
+ console.warn('Upload URL is not configured');
23
+ return;
24
+ }
25
+
26
+ fileRepository.createUploadAdapter = (loader) => ({
27
+ async upload() {
28
+ try {
29
+ const file = await loader.file;
30
+ const formData = new FormData();
31
+ formData.append('upload', file);
32
+
33
+ return new Promise((resolve, reject) => {
34
+ const xhr = new XMLHttpRequest();
35
+
36
+ xhr.open('POST', config.uploadUrl, true);
37
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
38
+
39
+ xhr.upload.onprogress = (evt) => {
40
+ if (evt.lengthComputable) {
41
+ loader.uploadTotal = evt.total;
42
+ loader.uploaded = evt.loaded;
43
+ }
44
+ };
45
+
46
+ xhr.onload = () => {
47
+ if (xhr.status >= 200 && xhr.status < 300) {
48
+ const data = JSON.parse(xhr.response);
49
+ resolve({ default: data.url });
50
+ } else {
51
+ reject(`Upload failed: ${xhr.statusText}`);
52
+ }
53
+ };
54
+
55
+ xhr.onerror = () => reject('Upload failed');
56
+ xhr.onabort = () => reject('Upload aborted');
57
+
58
+ xhr.send(formData);
59
+ this._xhr = xhr;
60
+ });
61
+ } catch (error) {
62
+ throw error;
63
+ }
64
+ },
65
+
66
+ abort() {
67
+ if (this._xhr) {
68
+ this._xhr.abort();
69
+ }
70
+ }
71
+ });
72
+ }
73
+ }
74
+ JAVASCRIPT
75
+
76
+ def initialize
77
+ super(:SimpleUpload, PLUGIN_CODE)
78
+ end
79
+ end
80
+ end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'preset_builder'
4
3
  require_relative 'toolbar_builder'
4
+ require_relative 'plugins_builder'
5
+ require_relative 'preset_builder'
5
6
 
6
7
  module CKEditor5::Rails::Presets
7
8
  class Manager
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CKEditor5::Rails
4
+ class Presets::PluginsBuilder
5
+ attr_reader :plugins
6
+
7
+ def initialize(plugins)
8
+ @plugins = plugins
9
+ end
10
+
11
+ def self.create_plugin(name, **kwargs)
12
+ if name.is_a?(Editor::PropsInlinePlugin) || name.is_a?(Editor::PropsPlugin)
13
+ name
14
+ else
15
+ Editor::PropsPlugin.new(name, **kwargs)
16
+ end
17
+ end
18
+
19
+ def remove(*names)
20
+ names.each { |name| plugins.delete_if { |plugin| plugin.name == name } }
21
+ end
22
+
23
+ def prepend(*names, before: nil, **kwargs)
24
+ new_plugins = names.map { |name| self.class.create_plugin(name, **kwargs) }
25
+
26
+ if before
27
+ index = plugins.index { |p| p.name == before }
28
+ raise ArgumentError, "Plugin '#{before}' not found" unless index
29
+
30
+ plugins.insert(index, *new_plugins)
31
+ else
32
+ plugins.insert(0, *new_plugins)
33
+ end
34
+ end
35
+
36
+ def append(*names, after: nil, **kwargs)
37
+ new_plugins = names.map { |name| self.class.create_plugin(name, **kwargs) }
38
+
39
+ if after
40
+ index = plugins.index { |p| p.name == after }
41
+ raise ArgumentError, "Plugin '#{after}' not found" unless index
42
+
43
+ plugins.insert(index + 1, *new_plugins)
44
+ else
45
+ plugins.push(*new_plugins)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -137,7 +137,7 @@ module CKEditor5::Rails
137
137
 
138
138
  return unless block
139
139
 
140
- builder = ToolbarBuilder.new(@config[:toolbar])
140
+ builder = ArrayBuilder.new(@config[:toolbar][:items])
141
141
  builder.instance_eval(&block)
142
142
  end
143
143
 
@@ -146,11 +146,21 @@ module CKEditor5::Rails
146
146
  end
147
147
 
148
148
  def plugin(name, **kwargs)
149
- @config[:plugins] << Editor::PropsPlugin.new(name, **kwargs)
149
+ plugin_obj = PluginsBuilder.create_plugin(name, **kwargs)
150
+
151
+ @config[:plugins] << plugin_obj
152
+ plugin_obj
150
153
  end
151
154
 
152
- def plugins(*names, **kwargs)
153
- names.each { |name| plugin(name, **kwargs) }
155
+ def plugins(*names, **kwargs, &block)
156
+ @config[:plugins] ||= []
157
+
158
+ names.each { |name| plugin(name, **kwargs) } unless names.empty?
159
+
160
+ return unless block
161
+
162
+ builder = PluginsBuilder.new(@config[:plugins])
163
+ builder.instance_eval(&block)
154
164
  end
155
165
 
156
166
  def language(ui = nil, content: ui) # rubocop:disable Naming/MethodParameterName
@@ -161,6 +171,15 @@ module CKEditor5::Rails
161
171
  content: content
162
172
  }
163
173
  end
174
+
175
+ def simple_upload_adapter(upload_url = '/uploads')
176
+ plugins do
177
+ remove :Base64UploadAdapter
178
+ end
179
+
180
+ plugin(Plugins::SimpleUploadAdapter.new)
181
+ configure(:simpleUpload, { uploadUrl: upload_url })
182
+ end
164
183
  end
165
184
  end
166
185
  end
@@ -2,12 +2,10 @@
2
2
 
3
3
  module CKEditor5::Rails::Presets
4
4
  class ToolbarBuilder
5
- def initialize(toolbar_config)
6
- @toolbar_config = toolbar_config
7
- end
5
+ attr_reader :items
8
6
 
9
- def items
10
- @toolbar_config[:items]
7
+ def initialize(items)
8
+ @items = items
11
9
  end
12
10
 
13
11
  def remove(*removed_items)
@@ -17,7 +15,7 @@ module CKEditor5::Rails::Presets
17
15
  def prepend(*prepended_items, before: nil)
18
16
  if before
19
17
  index = items.index(before)
20
- raise ArgumentError, "Item '#{before}' not found in toolbar" unless index
18
+ raise ArgumentError, "Item '#{before}' not found in array" unless index
21
19
 
22
20
  items.insert(index, *prepended_items)
23
21
  else
@@ -28,7 +26,7 @@ module CKEditor5::Rails::Presets
28
26
  def append(*appended_items, after: nil)
29
27
  if after
30
28
  index = items.index(after)
31
- raise ArgumentError, "Item '#{after}' not found in toolbar" unless index
29
+ raise ArgumentError, "Item '#{after}' not found in array" unless index
32
30
 
33
31
  items.insert(index + 1, *appended_items)
34
32
  else
@@ -2,6 +2,6 @@
2
2
 
3
3
  module CKEditor5
4
4
  module Rails
5
- VERSION = '1.12.0'
5
+ VERSION = '1.14.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ckeditor5
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.0
4
+ version: 1.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mateusz Bagiński
@@ -67,7 +67,9 @@ files:
67
67
  - lib/ckeditor5/rails/helpers.rb
68
68
  - lib/ckeditor5/rails/hooks/form.rb
69
69
  - lib/ckeditor5/rails/hooks/simple_form.rb
70
+ - lib/ckeditor5/rails/plugins/simple_upload_adapter.rb
70
71
  - lib/ckeditor5/rails/presets/manager.rb
72
+ - lib/ckeditor5/rails/presets/plugins_builder.rb
71
73
  - lib/ckeditor5/rails/presets/preset_builder.rb
72
74
  - lib/ckeditor5/rails/presets/toolbar_builder.rb
73
75
  - lib/ckeditor5/rails/semver.rb