зеркало из
https://github.com/rs-pro/activeadmin-quill_editor.git
synced 2026-08-28 15:36:17 +03:00
Сравнить коммиты
17 Коммитов
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
2d5429718c | ||
|
|
78126d0cd7 | ||
|
|
3190134973 | ||
|
|
8d6b05297a | ||
|
|
5d9b6f70fd | ||
|
|
6fa021c0c7 | ||
|
|
357ef382d6 | ||
|
|
43ae70c7c9 | ||
|
|
6daf6f6bc8 | ||
|
|
98c235d346 | ||
|
|
e6e6742753 | ||
|
|
c2c8d48795 | ||
|
|
72062c1a30 | ||
|
|
c4aa91225b | ||
|
|
3cc6edb302 | ||
|
|
d78fb2eb9c | ||
|
|
e5db64af96 |
44
.github/workflows/brakeman-analysis.yml
поставляемый
Обычный файл
44
.github/workflows/brakeman-analysis.yml
поставляемый
Обычный файл
@@ -0,0 +1,44 @@
|
|||||||
|
# This workflow integrates Brakeman with GitHub's Code Scanning feature
|
||||||
|
# Brakeman is a static analysis security vulnerability scanner for Ruby on Rails applications
|
||||||
|
|
||||||
|
name: Brakeman Scan
|
||||||
|
|
||||||
|
# This section configures the trigger for the workflow. Feel free to customize depending on your convention
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "master", "main" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "master", "main" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
brakeman-scan:
|
||||||
|
name: Brakeman Scan
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
# Checkout the repository to the GitHub Actions runner
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# Customize the ruby version depending on your needs
|
||||||
|
- name: Setup Ruby
|
||||||
|
uses: actions/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: '2.7'
|
||||||
|
|
||||||
|
- name: Setup Brakeman
|
||||||
|
env:
|
||||||
|
BRAKEMAN_VERSION: '4.10' # SARIF support is provided in Brakeman version 4.10+
|
||||||
|
run: |
|
||||||
|
gem install brakeman --version $BRAKEMAN_VERSION
|
||||||
|
|
||||||
|
# Execute Brakeman CLI and generate a SARIF output with the security issues identified during the analysis
|
||||||
|
- name: Scan
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
brakeman -f sarif -o output.sarif.json .
|
||||||
|
|
||||||
|
# Upload the SARIF file generated in the previous step
|
||||||
|
- name: Upload SARIF
|
||||||
|
uses: github/codeql-action/upload-sarif@v1
|
||||||
|
with:
|
||||||
|
sarif_file: output.sarif.json
|
||||||
1
.rspec
1
.rspec
@@ -1,3 +1,2 @@
|
|||||||
--require rails_helper
|
--require rails_helper
|
||||||
--format documentation
|
--format documentation
|
||||||
--profile
|
|
||||||
|
|||||||
27
README.md
27
README.md
@@ -5,7 +5,10 @@ An Active Admin plugin to use [Quill Rich Text Editor](https://github.com/quillj
|
|||||||

|

|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
- After installing Active Admin, add to your Gemfile: `gem 'activeadmin_quill_editor'` (and execute *bundle*)
|
After installing Active Admin, add to your Gemfile: `gem 'activeadmin_quill_editor'` (and execute *bundle*)
|
||||||
|
|
||||||
|
If you installed Active Admin without Webpacker support (default for now):
|
||||||
|
|
||||||
- Add at the end of your Active Admin styles (_app/assets/stylesheets/active_admin.scss_):
|
- Add at the end of your Active Admin styles (_app/assets/stylesheets/active_admin.scss_):
|
||||||
```scss
|
```scss
|
||||||
@import 'activeadmin/quill_editor/quill.snow';
|
@import 'activeadmin/quill_editor/quill.snow';
|
||||||
@@ -16,13 +19,23 @@ An Active Admin plugin to use [Quill Rich Text Editor](https://github.com/quillj
|
|||||||
//= require activeadmin/quill_editor/quill
|
//= require activeadmin/quill_editor/quill
|
||||||
//= require activeadmin/quill_editor_input
|
//= require activeadmin/quill_editor_input
|
||||||
```
|
```
|
||||||
- Use the input with `as: :quill_editor` in Active Admin model conf
|
|
||||||
|
|
||||||
Why 2 separated scripts/styles? In this way you can include a different version of *quill editor* if you like.
|
|
||||||
|
|
||||||
> **UPDATE FROM VERSION <= 2.0**: please add to your _app/assets/stylesheets/active_admin.scss_ the line `@import 'activeadmin/quill_editor/quill.snow';`
|
> **UPDATE FROM VERSION <= 2.0**: please add to your _app/assets/stylesheets/active_admin.scss_ the line `@import 'activeadmin/quill_editor/quill.snow';`
|
||||||
|
|
||||||
## Options
|
If you installed Active Admin with Webpacker support:
|
||||||
|
|
||||||
|
- Execute in your project root:
|
||||||
|
```sh
|
||||||
|
yarn add blocknotes/activeadmin_quill_editor
|
||||||
|
```
|
||||||
|
- Add to your *app/javascript/packs/active_admin.js*:
|
||||||
|
```js
|
||||||
|
require('activeadmin_quill_editor')
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
In your Active Admin models, form configuration, set the text inputs with `as: :quill_editor` where needed.
|
||||||
|
|
||||||
**data-options**: permits to set *quill editor* options directly - see [options list](https://quilljs.com/docs/configuration/)
|
**data-options**: permits to set *quill editor* options directly - see [options list](https://quilljs.com/docs/configuration/)
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
@@ -74,9 +87,9 @@ the *upload_admin_post_path*) and it doesn't provide a way to remove images (jus
|
|||||||
the editor will not destroy them, you'll need to implement a purge logic for that).
|
the editor will not destroy them, you'll need to implement a purge logic for that).
|
||||||
|
|
||||||
## Do you like it? Star it!
|
## Do you like it? Star it!
|
||||||
If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
|
If you use this component just star it. A developer is more motivated to improve a project when there is some interest. My other [Active Admin components](https://github.com/blocknotes?utf8=✓&tab=repositories&q=activeadmin&type=source).
|
||||||
|
|
||||||
Take a look at [other Active Admin components](https://github.com/blocknotes?utf8=✓&tab=repositories&q=activeadmin&type=source) that I made if you are curious.
|
Or consider offering me a coffee, it's a small thing but it is greatly appreciated: [about me](https://www.blocknot.es/about-me).
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
- [Mattia Roccoberton](http://blocknot.es): author
|
- [Mattia Roccoberton](http://blocknot.es): author
|
||||||
|
|||||||
5
Rakefile
5
Rakefile
@@ -5,7 +5,10 @@ require 'bundler/gem_tasks'
|
|||||||
begin
|
begin
|
||||||
require 'rspec/core/rake_task'
|
require 'rspec/core/rake_task'
|
||||||
|
|
||||||
RSpec::Core::RakeTask.new(:spec)
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
||||||
|
# t.ruby_opts = %w[-w]
|
||||||
|
t.rspec_opts = ['--color', '--format documentation']
|
||||||
|
end
|
||||||
|
|
||||||
task default: :spec
|
task default: :spec
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
|
|||||||
@@ -19,13 +19,15 @@ Gem::Specification.new do |spec|
|
|||||||
|
|
||||||
spec.add_runtime_dependency 'activeadmin', '~> 2.0'
|
spec.add_runtime_dependency 'activeadmin', '~> 2.0'
|
||||||
|
|
||||||
spec.add_development_dependency 'activestorage', '~> 6.0.3.2'
|
spec.add_development_dependency 'activestorage', '~> 6.0'
|
||||||
spec.add_development_dependency 'capybara', '~> 3.33.0'
|
spec.add_development_dependency 'capybara', '~> 3.33'
|
||||||
spec.add_development_dependency 'pry', '~> 0.13.1'
|
spec.add_development_dependency 'pry', '~> 0.13'
|
||||||
spec.add_development_dependency 'puma', '~> 4.3.5'
|
spec.add_development_dependency 'puma', '~> 4.3'
|
||||||
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.4.1'
|
spec.add_development_dependency 'rspec_junit_formatter', '~> 0.4'
|
||||||
spec.add_development_dependency 'rspec-rails', '~> 4.0.1'
|
spec.add_development_dependency 'rspec-rails', '~> 4.0'
|
||||||
spec.add_development_dependency 'rubocop', '~> 0.90.0'
|
spec.add_development_dependency 'rubocop', '~> 0.90'
|
||||||
spec.add_development_dependency 'selenium-webdriver', '~> 3.142.7'
|
spec.add_development_dependency 'sassc', '~> 2.4'
|
||||||
spec.add_development_dependency 'sqlite3', '~> 1.4.2'
|
spec.add_development_dependency 'selenium-webdriver', '~> 3.142'
|
||||||
|
spec.add_development_dependency 'sprockets-rails', '~> 3.2'
|
||||||
|
spec.add_development_dependency 'sqlite3', '~> 1.4'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,91 +1,91 @@
|
|||||||
// --- functions ---------------------------------------------------------------
|
(function () {
|
||||||
function initQuillEditors() {
|
'use strict'
|
||||||
var default_theme = 'snow';
|
|
||||||
var default_toolbar = [
|
|
||||||
['bold', 'italic', 'underline'],
|
|
||||||
['link', 'blockquote', 'code-block'],
|
|
||||||
[{ 'script': 'sub'}, { 'script': 'super' }],
|
|
||||||
[{ 'align': [] }, { list: 'ordered' }, { list: 'bullet' }],
|
|
||||||
[{ 'color': [] }, { 'background': [] }],
|
|
||||||
['image'],
|
|
||||||
['clean'],
|
|
||||||
];
|
|
||||||
var editors = document.querySelectorAll('.quill-editor');
|
|
||||||
var registered_plugins = {};
|
|
||||||
|
|
||||||
for(var i = 0; i < editors.length; i++) {
|
// --- functions ---------------------------------------------------------------
|
||||||
var content = editors[i].querySelector('.quill-editor-content');
|
function initQuillEditors() {
|
||||||
var isActive = editors[i].classList.contains('quill-editor--active');
|
let default_theme = 'snow'
|
||||||
if(content && !isActive) {
|
let default_toolbar = [
|
||||||
// Setup editor options
|
['bold', 'italic', 'underline'],
|
||||||
var options = editors[i].getAttribute('data-options') ? JSON.parse(editors[i].getAttribute('data-options')) : {};
|
['link', 'blockquote', 'code-block'],
|
||||||
if(!options.theme) options.theme = default_theme;
|
[{ 'script': 'sub' }, { 'script': 'super' }],
|
||||||
if(!options.modules) options.modules = {};
|
[{ 'align': [] }, { list: 'ordered' }, { list: 'bullet' }],
|
||||||
if(!options.modules.toolbar) options.modules.toolbar = default_toolbar;
|
[{ 'color': [] }, { 'background': [] }],
|
||||||
|
['image'],
|
||||||
|
['clean'],
|
||||||
|
]
|
||||||
|
let editors = document.querySelectorAll('[data-aa-quill-editor]')
|
||||||
|
let registered_plugins = {}
|
||||||
|
|
||||||
// Setup plugin options
|
for (let i = 0; i < editors.length; i++) {
|
||||||
var plugin_options = editors[i].getAttribute('data-plugins') ? JSON.parse(editors[i].getAttribute('data-plugins')) : {};
|
let content = editors[i].querySelector('[data-aa-quill-content]')
|
||||||
if(plugin_options.image_uploader && plugin_options.image_uploader.server_url) {
|
let isActive = editors[i].classList.contains('quill-editor--active')
|
||||||
if(!registered_plugins.image_uploader) {
|
if (content && !isActive) {
|
||||||
Quill.register('modules/imageUploader', ImageUploader);
|
// Setup editor options
|
||||||
registered_plugins.image_uploader = true;
|
let options = editors[i].getAttribute('data-options') ? JSON.parse(editors[i].getAttribute('data-options')) : {}
|
||||||
|
if (!options.theme) options.theme = default_theme
|
||||||
|
if (!options.modules) options.modules = {}
|
||||||
|
if (!options.modules.toolbar) options.modules.toolbar = default_toolbar
|
||||||
|
|
||||||
|
// Setup plugin options
|
||||||
|
let plugin_options = editors[i].getAttribute('data-plugins') ? JSON.parse(editors[i].getAttribute('data-plugins')) : {}
|
||||||
|
if (plugin_options.image_uploader && plugin_options.image_uploader.server_url) {
|
||||||
|
if (!registered_plugins.image_uploader) {
|
||||||
|
Quill.register('modules/imageUploader', ImageUploader)
|
||||||
|
registered_plugins.image_uploader = true
|
||||||
|
}
|
||||||
|
let opts = plugin_options.image_uploader
|
||||||
|
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name)
|
||||||
}
|
}
|
||||||
var opts = plugin_options.image_uploader;
|
|
||||||
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init editor
|
// Init editor
|
||||||
editors[i]['_quill-editor'] = new Quill(content, options);
|
editors[i]['_quill-editor'] = new Quill(content, options)
|
||||||
editors[i].classList += ' quill-editor--active';
|
editors[i].classList += ' quill-editor--active'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let formtastic = document.querySelector('form.formtastic')
|
||||||
|
if (formtastic) {
|
||||||
|
formtastic.onsubmit = () => {
|
||||||
|
for (let i = 0; i < editors.length; i++) {
|
||||||
|
let input = editors[i].querySelector('input[type="hidden"]')
|
||||||
|
if (editors[i]['_quill-editor'].editor.isBlank()) {
|
||||||
|
input.value = ''
|
||||||
|
} else {
|
||||||
|
input.value = editors[i]['_quill-editor'].root.innerHTML
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var formtastic = document.querySelector('form.formtastic');
|
function setupImageUploader(server_url, field_name) {
|
||||||
if(formtastic) {
|
return {
|
||||||
formtastic.onsubmit = function() {
|
upload: file => {
|
||||||
for(var i = 0; i < editors.length; i++) {
|
return new Promise((resolve, reject) => {
|
||||||
var input = editors[i].querySelector('input[type="hidden"]');
|
const formData = new FormData()
|
||||||
if (editors[i]['_quill-editor'].editor.isBlank()) {
|
formData.append(field_name || 'file_upload', file)
|
||||||
input.value = '';
|
|
||||||
} else {
|
|
||||||
input.value = editors[i]['_quill-editor'].root.innerHTML;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function setupImageUploader(server_url, field_name) {
|
fetch(server_url, {
|
||||||
return {
|
body: formData,
|
||||||
upload: file => {
|
headers: {
|
||||||
return new Promise((resolve, reject) => {
|
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
|
||||||
const formData = new FormData();
|
},
|
||||||
formData.append(field_name || 'file_upload', file);
|
method: 'POST'
|
||||||
|
}).then(response => response.json())
|
||||||
fetch(server_url, {
|
.then(result => {
|
||||||
body: formData,
|
resolve(result.url);
|
||||||
headers: {
|
})
|
||||||
'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
|
.catch(error => {
|
||||||
},
|
reject('Upload failed')
|
||||||
method: 'POST'
|
console.error('Error: ', error)
|
||||||
}).then(response => response.json())
|
})
|
||||||
.then(result => {
|
|
||||||
resolve(result.url);
|
|
||||||
})
|
})
|
||||||
.catch(error => {
|
}
|
||||||
reject('Upload failed');
|
|
||||||
console.error('Error: ', error);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// --- events ------------------------------------------------------------------
|
// --- events ------------------------------------------------------------------
|
||||||
$(document).ready( function() {
|
$(document).ready(initQuillEditors)
|
||||||
initQuillEditors();
|
$(document).on('has_many_add:after', '.has_many_container', initQuillEditors)
|
||||||
});
|
$(document).on('turbolinks:load', initQuillEditors)
|
||||||
|
})()
|
||||||
$(document).on('has_many_add:after', function() {
|
|
||||||
initQuillEditors();
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
text-align: initial;
|
text-align: initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
body.active_admin .quill-editor {
|
body.active_admin [data-aa-quill-editor] {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: calc(80% - 2px);
|
width: calc(80% - 2px);
|
||||||
|
|
||||||
@@ -29,6 +29,7 @@ body.active_admin .quill-editor {
|
|||||||
max-height: 300px;
|
max-height: 300px;
|
||||||
min-height: 150px;
|
min-height: 150px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
|
word-break: break-all;
|
||||||
|
|
||||||
ol {
|
ol {
|
||||||
list-style-type: decimal;
|
list-style-type: decimal;
|
||||||
|
|||||||
7
index.js
Обычный файл
7
index.js
Обычный файл
@@ -0,0 +1,7 @@
|
|||||||
|
// Styles
|
||||||
|
import 'activeadmin_quill_editor/app/assets/stylesheets/activeadmin/quill_editor/quill.snow'
|
||||||
|
import 'activeadmin_quill_editor/app/assets/stylesheets/activeadmin/_quill_editor_input'
|
||||||
|
|
||||||
|
// JS
|
||||||
|
window.Quill = require('activeadmin_quill_editor/app/assets/javascripts/activeadmin/quill_editor/quill')
|
||||||
|
require('activeadmin_quill_editor/app/assets/javascripts/activeadmin/quill_editor_input')
|
||||||
@@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
module ActiveAdmin
|
module ActiveAdmin
|
||||||
module QuillEditor
|
module QuillEditor
|
||||||
VERSION = '0.2.10'
|
VERSION = '0.3.4'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ module Formtastic
|
|||||||
def to_html
|
def to_html
|
||||||
input_wrapping do
|
input_wrapping do
|
||||||
label_html <<
|
label_html <<
|
||||||
template.content_tag(:div, input_html_options.merge(class: 'quill-editor')) do
|
template.content_tag(:div, input_html_options.merge('data-aa-quill-editor': '1')) do
|
||||||
builder.hidden_field(input_name) <<
|
builder.hidden_field(input_name) <<
|
||||||
template.content_tag(:div, class: 'quill-editor-content') do
|
template.content_tag(:div, 'data-aa-quill-content': '1') do
|
||||||
object.send(method).try :html_safe
|
object.send(method).try :html_safe
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
13
package.json
Обычный файл
13
package.json
Обычный файл
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "activeadmin_quill_editor",
|
||||||
|
"version": "0.3.4",
|
||||||
|
"description": "Quill Editor for ActiveAdmin",
|
||||||
|
"author": "Mattia Roccoberton <mat@blocknot.es>",
|
||||||
|
"license": "MIT",
|
||||||
|
"homepage": "https://github.com/blocknotes/activeadmin_quill_editor",
|
||||||
|
"main": "index.js",
|
||||||
|
"files": [
|
||||||
|
"app/**/*",
|
||||||
|
"index.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -38,10 +38,11 @@ ActiveAdmin.register Post do
|
|||||||
end
|
end
|
||||||
|
|
||||||
form do |f|
|
form do |f|
|
||||||
|
toolbar = %w[bold italic underline link]
|
||||||
f.inputs 'Post' do
|
f.inputs 'Post' do
|
||||||
f.input :author
|
f.input :author
|
||||||
f.input :title
|
f.input :title
|
||||||
f.input :description, as: :quill_editor
|
f.input :description, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: toolbar } } } }
|
||||||
f.input :category
|
f.input :category
|
||||||
f.input :dt
|
f.input :dt
|
||||||
f.input :position
|
f.input :position
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
require_relative 'boot'
|
require_relative 'boot'
|
||||||
|
|
||||||
require 'rails/all'
|
require 'rails/all'
|
||||||
|
require 'sprockets/railtie'
|
||||||
|
|
||||||
Bundler.require(*Rails.groups)
|
Bundler.require(*Rails.groups)
|
||||||
|
|
||||||
|
|||||||
@@ -9,22 +9,50 @@ RSpec.describe 'Quill editor', type: :system do
|
|||||||
end
|
end
|
||||||
|
|
||||||
after do
|
after do
|
||||||
Post.destroy_all
|
Post.delete_all
|
||||||
author.destroy
|
author.delete
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a Quill editor' do
|
context 'with a Quill editor' do
|
||||||
it 'updates some HTML content' do
|
it 'initialize the editor' do
|
||||||
visit "/admin/posts/#{post.id}/edit"
|
visit "/admin/posts/#{post.id}/edit"
|
||||||
|
|
||||||
|
%w[bold italic underline link].each do |button|
|
||||||
|
expect(page).to have_css(".ql-toolbar button.ql-#{button}")
|
||||||
|
end
|
||||||
|
expect(page).to have_css('#post_description[data-aa-quill-editor]')
|
||||||
expect(page).to have_css('#post_description_input .ql-editor', text: 'Some content...')
|
expect(page).to have_css('#post_description_input .ql-editor', text: 'Some content...')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'adds some text to the description' do
|
||||||
|
visit "/admin/posts/#{post.id}/edit"
|
||||||
|
|
||||||
find('#post_description_input .ql-editor').click
|
find('#post_description_input .ql-editor').click
|
||||||
find('#post_description_input .ql-editor').base.send_keys('more text')
|
find('#post_description_input .ql-editor').base.send_keys('more text')
|
||||||
|
|
||||||
find('[type="submit"]').click
|
find('[type="submit"]').click
|
||||||
expect(page).to have_content('was successfully updated')
|
expect(page).to have_content('was successfully updated')
|
||||||
expect(post.reload.description).to eq '<p>Some content...more text</p>'
|
expect(post.reload.description).to eq '<p>Some content...more text</p>'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'adds some bold text to the description' do
|
||||||
|
visit "/admin/posts/#{post.id}/edit"
|
||||||
|
|
||||||
|
find('#post_description_input .ql-editor').click
|
||||||
|
find('#post_description_input .ql-toolbar .ql-bold').click
|
||||||
|
find('#post_description_input .ql-editor').base.send_keys('more text')
|
||||||
|
find('[type="submit"]').click
|
||||||
|
expect(post.reload.description).to eq '<p>Some content...<strong>more text</strong></p>'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'adds some italic text to the description' do
|
||||||
|
visit "/admin/posts/#{post.id}/edit"
|
||||||
|
|
||||||
|
find('#post_description_input .ql-editor').click
|
||||||
|
find('#post_description_input .ql-toolbar .ql-italic').click
|
||||||
|
find('#post_description_input .ql-editor').base.send_keys('more text')
|
||||||
|
find('[type="submit"]').click
|
||||||
|
expect(post.reload.description).to eq '<p>Some content...<em>more text</em></p>'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with a Quill editor in a nested resource' do
|
context 'with a Quill editor in a nested resource' do
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user