зеркало из
https://github.com/rs-pro/activeadmin-quill_editor.git
synced 2026-08-28 15:36:17 +03:00
Сравнить коммиты
55 Коммитов
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
f291f7e7e6 | ||
|
|
df944277b5 | ||
|
|
3cc5683d44 | ||
|
|
498cbbd0c9 | ||
|
|
bfc2e997f1 | ||
|
|
9bda446762 | ||
|
|
533471c0d6 | ||
|
|
3617aab7f2 | ||
|
|
5196a8811a | ||
|
|
5e9a3b6c5a | ||
|
|
181aab7fd6 | ||
|
|
300b4a0a03 | ||
|
|
451a225277 | ||
|
|
6cbb39daad | ||
|
|
d19fc7ddfc | ||
|
|
74790fc115 | ||
|
|
c3b129a212 | ||
|
|
ab858f7c6f | ||
|
|
6cf744b84c | ||
|
|
0ae4ce2035 | ||
|
|
dd9aa22cf5 | ||
|
|
b6f3c0c3a6 | ||
|
|
7d3a084977 | ||
|
|
1569b1ff18 | ||
|
|
3459800dbf | ||
|
|
af901f4f7d | ||
|
|
328ee0d9fa | ||
|
|
751196ef8c | ||
|
|
589b782866 | ||
|
|
554f6086e7 | ||
|
|
051ada9843 | ||
|
|
fd90851a6b | ||
|
|
bd32c5f28f | ||
|
|
21ec7a918b | ||
|
|
b310f9e71b | ||
|
|
bbee6f7681 | ||
|
|
57e151aa03 | ||
|
|
0913bb6915 | ||
|
|
728e3fa097 | ||
|
|
9d891f0602 | ||
|
|
21fc69c2c0 | ||
|
|
b0e770ca9e | ||
|
|
ba53f9febf | ||
|
|
d690b9906f | ||
|
|
99908f97f7 | ||
|
|
9389f9e32d | ||
|
|
4629ac4133 | ||
|
|
0d4485c321 | ||
|
|
0c1cfefa83 | ||
|
|
0c674025a9 | ||
|
|
770e069442 | ||
|
|
d346729cd1 | ||
|
|
ce65cfbb7e | ||
|
|
22a1c8714c | ||
|
|
489e1c35eb |
24
.github/workflows/linters.yml
поставляемый
24
.github/workflows/linters.yml
поставляемый
@@ -2,31 +2,35 @@
|
||||
name: Linters
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
reviewdog:
|
||||
name: reviewdog
|
||||
name: Reviewdog
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
env:
|
||||
RAILS_VERSION: 7.0
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '2.7'
|
||||
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
||||
ruby-version: 3.0
|
||||
bundler-cache: true
|
||||
|
||||
- uses: reviewdog/action-setup@v1
|
||||
- name: Set up Reviewdog
|
||||
uses: reviewdog/action-setup@v1
|
||||
with:
|
||||
reviewdog_version: latest
|
||||
|
||||
- name: Run reviewdog
|
||||
- name: Run Reviewdog
|
||||
env:
|
||||
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
|
||||
25
.github/workflows/specs_rails61.yml
поставляемый
25
.github/workflows/specs_rails61.yml
поставляемый
@@ -1,29 +1,27 @@
|
||||
---
|
||||
name: Specs Rails 6.1
|
||||
name: Specs Rails 6.1 with ActiveAdmin 2.9
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
ruby: ['2.6', '2.7', '3.0']
|
||||
gemfile: ['rails61_activeadmin29', 'rails61_activeadmin']
|
||||
ruby: ['3.0']
|
||||
|
||||
env:
|
||||
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||
RAILS_VERSION: 6.0
|
||||
ACTIVEADMIN_VERSION: 2.9.0
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -31,11 +29,14 @@ jobs:
|
||||
ruby-version: ${{ matrix.ruby }}
|
||||
bundler-cache: true
|
||||
|
||||
- name: Database setup
|
||||
run: bin/rails db:create db:migrate db:test:prepare
|
||||
|
||||
- name: Run tests
|
||||
run: bundle exec rspec --profile
|
||||
|
||||
- name: On failure, archive screenshots as artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: test-failed-screenshots
|
||||
|
||||
22
.github/workflows/specs_rails70.yml
поставляемый
22
.github/workflows/specs_rails70.yml
поставляемый
@@ -2,28 +2,25 @@
|
||||
name: Specs Rails 7.0
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
ruby: ['3.0', '3.1', '3.2']
|
||||
gemfile: ['rails70_activeadmin']
|
||||
ruby: ['3.0', '3.2']
|
||||
|
||||
env:
|
||||
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||
RAILS_VERSION: 7.0
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -31,11 +28,14 @@ jobs:
|
||||
ruby-version: ${{ matrix.ruby }}
|
||||
bundler-cache: true
|
||||
|
||||
- name: Database setup
|
||||
run: bin/rails db:create db:migrate db:test:prepare
|
||||
|
||||
- name: Run tests
|
||||
run: bundle exec rspec --profile
|
||||
|
||||
- name: On failure, archive screenshots as artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: test-failed-screenshots
|
||||
|
||||
@@ -1,29 +1,26 @@
|
||||
---
|
||||
name: Specs Rails 6.0
|
||||
name: Specs Rails 7.1
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
ruby: ['2.6', '2.7']
|
||||
gemfile: ['rails60_activeadmin22', 'rails60_activeadmin']
|
||||
ruby: ['3.2', '3.4']
|
||||
|
||||
env:
|
||||
BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile
|
||||
RAILS_VERSION: 7.1
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
@@ -31,11 +28,14 @@ jobs:
|
||||
ruby-version: ${{ matrix.ruby }}
|
||||
bundler-cache: true
|
||||
|
||||
- name: Database setup
|
||||
run: bin/rails db:create db:migrate db:test:prepare
|
||||
|
||||
- name: Run tests
|
||||
run: bundle exec rspec --profile
|
||||
|
||||
- name: On failure, archive screenshots as artifacts
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: test-failed-screenshots
|
||||
42
.github/workflows/specs_rails72.yml
поставляемый
Обычный файл
42
.github/workflows/specs_rails72.yml
поставляемый
Обычный файл
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: Specs Rails 7.2
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
ruby: ['3.2', '3.4']
|
||||
|
||||
env:
|
||||
RAILS_VERSION: 7.2
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: ${{ matrix.ruby }}
|
||||
bundler-cache: true
|
||||
|
||||
- name: Database setup
|
||||
run: bin/rails db:create db:migrate db:test:prepare
|
||||
|
||||
- name: Run tests
|
||||
run: bundle exec rspec --profile
|
||||
|
||||
- name: On failure, archive screenshots as artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: test-failed-screenshots
|
||||
path: spec/dummy/tmp/screenshots
|
||||
42
.github/workflows/specs_rails80.yml
поставляемый
Обычный файл
42
.github/workflows/specs_rails80.yml
поставляемый
Обычный файл
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: Specs Rails 8.0
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
ruby: ['3.2', '3.4']
|
||||
|
||||
env:
|
||||
RAILS_VERSION: 8.0
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: ${{ matrix.ruby }}
|
||||
bundler-cache: true
|
||||
|
||||
- name: Database setup
|
||||
run: bin/rails db:create db:migrate db:test:prepare
|
||||
|
||||
- name: Run tests
|
||||
run: bundle exec rspec --profile
|
||||
|
||||
- name: On failure, archive screenshots as artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
if: failure()
|
||||
with:
|
||||
name: test-failed-screenshots
|
||||
path: spec/dummy/tmp/screenshots
|
||||
2
.gitignore
поставляемый
2
.gitignore
поставляемый
@@ -6,7 +6,9 @@
|
||||
/Gemfile.lock
|
||||
|
||||
/_misc/
|
||||
/coverage/
|
||||
/spec/dummy/db/*.sqlite3*
|
||||
/spec/dummy/db/schema-dev.rb
|
||||
/spec/dummy/log/
|
||||
/spec/dummy/storage/
|
||||
/spec/dummy/tmp/
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
inherit_from:
|
||||
- https://relaxed.ruby.style/rubocop.yml
|
||||
|
||||
require:
|
||||
plugins:
|
||||
- rubocop-capybara
|
||||
- rubocop-packaging
|
||||
- rubocop-performance
|
||||
- rubocop-rails
|
||||
- rubocop-rspec
|
||||
- rubocop-rspec_rails
|
||||
|
||||
AllCops:
|
||||
Exclude:
|
||||
@@ -16,6 +18,7 @@ AllCops:
|
||||
- spec/dummy/**/*
|
||||
- vendor/**/*
|
||||
NewCops: enable
|
||||
TargetRubyVersion: 3.0
|
||||
|
||||
RSpec/ExampleLength:
|
||||
# default 5
|
||||
@@ -24,3 +27,7 @@ RSpec/ExampleLength:
|
||||
RSpec/MultipleExpectations:
|
||||
# default 1
|
||||
Max: 4
|
||||
|
||||
RSpec/MultipleMemoizedHelpers:
|
||||
# default 5
|
||||
Max: 10
|
||||
|
||||
29
Appraisals
29
Appraisals
@@ -1,29 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
appraise 'rails60-activeadmin22' do
|
||||
gem 'activeadmin', '~> 2.2.0'
|
||||
gem 'rails', '~> 6.0.0'
|
||||
gem 'selenium-webdriver', require: false
|
||||
end
|
||||
|
||||
appraise 'rails60-activeadmin' do
|
||||
gem 'activeadmin'
|
||||
gem 'rails', '~> 6.0.0'
|
||||
gem 'selenium-webdriver', require: false
|
||||
end
|
||||
|
||||
appraise 'rails61-activeadmin29' do
|
||||
gem 'activeadmin', '~> 2.9.0'
|
||||
gem 'rails', '~> 6.1.0'
|
||||
end
|
||||
|
||||
appraise 'rails61-activeadmin' do
|
||||
gem 'activeadmin'
|
||||
gem 'rails', '~> 6.1.0'
|
||||
end
|
||||
|
||||
appraise 'rails70-activeadmin' do
|
||||
gem 'activeadmin'
|
||||
gem 'rails', '~> 7.0.0'
|
||||
gem 'sprockets-rails'
|
||||
end
|
||||
13
CHANGELOG.md
13
CHANGELOG.md
@@ -2,6 +2,19 @@
|
||||
|
||||
An Active Admin plugin to use Quill Rich Text Editor.
|
||||
|
||||
## v2.0.0 - 2025-04-15
|
||||
|
||||
- Update Quill from 1.3.7 to 2.0.3
|
||||
|
||||
## v1.3.0 - 2025-03-18
|
||||
|
||||
- Javascript API: expose Quill editor query functions
|
||||
- ImageUploader: reject the Promise if an url is not provided in the response
|
||||
|
||||
## v1.2.0 - 2024-02-29
|
||||
|
||||
- Update minimum supported Ruby version to 3.0
|
||||
|
||||
## v1.1.0 - 2023-08-20
|
||||
|
||||
- Support ActiveAdmin 3.x
|
||||
|
||||
81
Gemfile
81
Gemfile
@@ -2,28 +2,63 @@
|
||||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gemspec
|
||||
def eval_version(dependency, version)
|
||||
return [dependency] if version.empty?
|
||||
|
||||
group :development, :test do
|
||||
gem 'puma'
|
||||
gem 'sassc'
|
||||
gem 'sqlite3'
|
||||
|
||||
# Testing
|
||||
gem 'capybara'
|
||||
gem 'cuprite'
|
||||
gem 'rspec_junit_formatter'
|
||||
gem 'rspec-rails'
|
||||
gem 'rspec-retry'
|
||||
|
||||
# Linters
|
||||
gem 'fasterer'
|
||||
gem 'rubocop'
|
||||
gem 'rubocop-packaging'
|
||||
gem 'rubocop-performance'
|
||||
gem 'rubocop-rails'
|
||||
gem 'rubocop-rspec'
|
||||
|
||||
# Tools
|
||||
gem 'pry-rails'
|
||||
version.count('.') < 2 ? [dependency, "~> #{version}.0"] : [dependency, version]
|
||||
end
|
||||
|
||||
if ENV['DEVEL'] == '1'
|
||||
gem 'activeadmin_quill_editor', path: './'
|
||||
else
|
||||
gemspec
|
||||
end
|
||||
|
||||
ruby_ver = ENV.fetch('RUBY_VERSION', '')
|
||||
|
||||
rails_ver = ENV.fetch('RAILS_VERSION', '')
|
||||
rails = eval_version('rails', rails_ver)
|
||||
gem(*rails)
|
||||
|
||||
active_admin_ver = ENV.fetch('ACTIVEADMIN_VERSION', '')
|
||||
active_admin = eval_version('activeadmin', active_admin_ver)
|
||||
gem(*active_admin)
|
||||
|
||||
ruby32 = ruby_ver.empty? || Gem::Version.new(ruby_ver) >= Gem::Version.new('3.2')
|
||||
rails72 = rails_ver.empty? || Gem::Version.new(rails_ver) >= Gem::Version.new('7.2')
|
||||
sqlite3 = ruby32 && rails72 ? ['sqlite3'] : ['sqlite3', '~> 1.4']
|
||||
gem(*sqlite3)
|
||||
|
||||
gem 'zeitwerk', '~> 2.6.18' unless ruby32
|
||||
|
||||
# NOTE: to avoid error: uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger
|
||||
gem 'concurrent-ruby', '1.3.4'
|
||||
|
||||
# Misc
|
||||
gem 'bigdecimal'
|
||||
gem 'csv'
|
||||
gem 'mutex_m'
|
||||
gem 'puma'
|
||||
gem 'sassc'
|
||||
gem 'sprockets-rails'
|
||||
|
||||
# Testing
|
||||
gem 'capybara'
|
||||
gem 'cuprite'
|
||||
gem 'rspec_junit_formatter'
|
||||
gem 'rspec-rails'
|
||||
gem 'simplecov', require: false
|
||||
gem 'super_diff'
|
||||
|
||||
# Linters
|
||||
gem 'fasterer'
|
||||
gem 'rubocop'
|
||||
gem 'rubocop-capybara'
|
||||
gem 'rubocop-packaging'
|
||||
gem 'rubocop-performance'
|
||||
gem 'rubocop-rails'
|
||||
gem 'rubocop-rspec'
|
||||
gem 'rubocop-rspec_rails'
|
||||
|
||||
# Tools
|
||||
gem 'pry-rails'
|
||||
|
||||
47
Makefile
Обычный файл
47
Makefile
Обычный файл
@@ -0,0 +1,47 @@
|
||||
include extra/.env
|
||||
|
||||
help:
|
||||
@echo -e "${COMPOSE_PROJECT_NAME} - Main project commands:\n\
|
||||
make up # starts the dev services (optional env vars: RUBY / RAILS / ACTIVEADMIN)\n\
|
||||
make specs # run the tests (after up)\n\
|
||||
make lint # run the linters (after up)\n\
|
||||
make server # run the server (after up)\n\
|
||||
make shell # open a shell (after up)\n\
|
||||
make down # cleanup (after up)\n\
|
||||
Example: RUBY=3.2 RAILS=7.1 ACTIVEADMIN=3.2.0 make up"
|
||||
|
||||
# System commands
|
||||
|
||||
build:
|
||||
@rm -f Gemfile.lock spec/dummy/db/*.sqlite3
|
||||
@docker compose -f extra/docker-compose.yml build
|
||||
|
||||
db_reset:
|
||||
@docker compose -f extra/docker-compose.yml run --rm app bin/rails db:create db:migrate db:test:prepare
|
||||
|
||||
up: build db_reset
|
||||
@docker compose -f extra/docker-compose.yml up
|
||||
|
||||
shell:
|
||||
@docker compose -f extra/docker-compose.yml exec app bash
|
||||
|
||||
down:
|
||||
@docker compose -f extra/docker-compose.yml down --volumes --rmi local --remove-orphans
|
||||
|
||||
# App commands
|
||||
|
||||
seed:
|
||||
@docker compose -f extra/docker-compose.yml exec app bin/rails db:seed
|
||||
|
||||
console: seed
|
||||
@docker compose -f extra/docker-compose.yml exec app bin/rails console
|
||||
|
||||
lint:
|
||||
@docker compose -f extra/docker-compose.yml exec app bin/rubocop
|
||||
|
||||
server: seed
|
||||
@rm -f spec/dummy/tmp/pids/server.pid
|
||||
@docker compose -f extra/docker-compose.yml exec app bin/rails server -b 0.0.0.0 -p ${SERVER_PORT}
|
||||
|
||||
specs:
|
||||
@docker compose -f extra/docker-compose.yml exec app bin/rspec --fail-fast
|
||||
29
README.md
29
README.md
@@ -2,8 +2,12 @@
|
||||
[](https://badge.fury.io/rb/activeadmin_quill_editor)
|
||||
[](https://rubygems.org/gems/activeadmin_quill_editor)
|
||||
[](https://github.com/blocknotes/activeadmin_quill_editor/actions/workflows/linters.yml)
|
||||
|
||||
[](https://github.com/blocknotes/activeadmin_quill_editor/actions/workflows/specs_rails61.yml)
|
||||
[](https://github.com/blocknotes/activeadmin_quill_editor/actions/workflows/specs_rails70.yml)
|
||||
[](https://github.com/blocknotes/activeadmin_quill_editor/actions/workflows/specs_rails71.yml)
|
||||
[](https://github.com/blocknotes/activeadmin_quill_editor/actions/workflows/specs_rails72.yml)
|
||||
[](https://github.com/blocknotes/activeadmin_quill_editor/actions/workflows/specs_rails80.yml)
|
||||
|
||||
An Active Admin plugin to use [Quill Rich Text Editor](https://github.com/quilljs/quill) in form fields.
|
||||
|
||||
@@ -13,6 +17,8 @@ Please :star: if you like it.
|
||||
|
||||
## Install
|
||||
|
||||
_NOTE_: the gem 2.x provide Quill 2.x, while Quill 1.x is provided with the gem version 1.x
|
||||
|
||||
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):
|
||||
@@ -29,8 +35,6 @@ If you installed Active Admin without Webpacker support (default for now):
|
||||
//= require activeadmin/quill_editor_input
|
||||
```
|
||||
|
||||
> **UPDATE FROM VERSION <= 2.0**: please add to your _app/assets/stylesheets/active_admin.scss_ the line `@import 'activeadmin/quill_editor/quill.snow';`
|
||||
|
||||
If you installed Active Admin with Webpacker support:
|
||||
|
||||
- Execute in your project root:
|
||||
@@ -48,6 +52,8 @@ In your Active Admin models, form configuration, set the text inputs with `as: :
|
||||
|
||||
**data-options**: permits to set *quill editor* options directly - see [options list](https://quilljs.com/docs/configuration/)
|
||||
|
||||
If you are using Action Text (`has_rich_text`) on the same field of the Quill editor please take a look at [this workaround](https://github.com/blocknotes/activeadmin_quill_editor/issues/33#issuecomment-1965996947) to avoid issues.
|
||||
|
||||
## Examples
|
||||
|
||||
### Basic usage
|
||||
@@ -97,9 +103,19 @@ Consider that this is just a basic example: images are uploaded as soon as they
|
||||
the *upload_admin_post_path*) and it doesn't provide a way to remove images (just deleting them from
|
||||
the editor will not destroy them, you'll need to implement a purge logic for that).
|
||||
|
||||
## Changelog
|
||||
## Javascript API
|
||||
|
||||
The changelog is available [here](CHANGELOG.md).
|
||||
Some methods are provided for advanced use cases:
|
||||
|
||||
- `window.getQuillEditors()`: returns all the available Quill editors instances;
|
||||
- `window.getQuillEditorByIndex(n)`: returns the N-th Quill editor instance;
|
||||
- `window.getQuillEditorByElementId(id)`: returns the Quill editor instance related to the specified element id (e.g. _article_description_).
|
||||
|
||||
## Development
|
||||
|
||||
Project created by [Mattia Roccoberton](http://blocknot.es), thanks also to the good guys that opened issues and pull requests from time to time.
|
||||
|
||||
For development information please check [this document](extra/development.md).
|
||||
|
||||
## Do you like it? Star it!
|
||||
|
||||
@@ -107,11 +123,6 @@ If you use this component just star it. A developer is more motivated to improve
|
||||
|
||||
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
|
||||
|
||||
- [Mattia Roccoberton](http://blocknot.es): author
|
||||
- The good guys that opened issues and pull requests from time to time
|
||||
|
||||
## License
|
||||
|
||||
The gem is available as open-source under the terms of the [MIT](LICENSE.txt).
|
||||
|
||||
11
Rakefile
11
Rakefile
@@ -1,5 +1,16 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
begin
|
||||
require 'bundler/setup'
|
||||
rescue LoadError
|
||||
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
||||
end
|
||||
|
||||
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
||||
load 'rails/tasks/engine.rake'
|
||||
|
||||
load 'rails/tasks/statistics.rake'
|
||||
|
||||
require 'bundler/gem_tasks'
|
||||
|
||||
begin
|
||||
|
||||
@@ -14,10 +14,10 @@ Gem::Specification.new do |spec|
|
||||
spec.email = 'mat@blocknot.es'
|
||||
spec.homepage = 'https://github.com/blocknotes/activeadmin_quill_editor'
|
||||
|
||||
spec.required_ruby_version = '>= 2.6.0'
|
||||
spec.required_ruby_version = '>= 3.0'
|
||||
|
||||
spec.metadata['homepage_uri'] = spec.homepage
|
||||
spec.metadata['changelog_uri'] = 'https://github.com/blocknotes/activeadmin_quill_editor/blob/master/CHANGELOG.md'
|
||||
spec.metadata['changelog_uri'] = 'https://github.com/blocknotes/activeadmin_quill_editor/blob/main/CHANGELOG.md'
|
||||
spec.metadata['source_code_uri'] = spec.homepage
|
||||
|
||||
spec.metadata['rubygems_mfa_required'] = 'true'
|
||||
@@ -25,7 +25,5 @@ Gem::Specification.new do |spec|
|
||||
spec.files = Dir['{app,lib}/**/*', 'LICENSE.txt', 'Rakefile', 'README.md']
|
||||
spec.require_paths = ['lib']
|
||||
|
||||
spec.add_runtime_dependency 'activeadmin', '>= 2.0', '< 4'
|
||||
|
||||
spec.add_development_dependency 'appraisal', '~> 2.4'
|
||||
spec.add_runtime_dependency 'activeadmin', '>= 2.9', '< 4' # rubocop:disable Gemspec/AddRuntimeDependency
|
||||
end
|
||||
|
||||
362
app/assets/javascripts/activeadmin/quill.imageUploader.js
Обычный файл
362
app/assets/javascripts/activeadmin/quill.imageUploader.js
Обычный файл
@@ -0,0 +1,362 @@
|
||||
/******/ (function(modules) { // webpackBootstrap
|
||||
/******/ // The module cache
|
||||
/******/ var installedModules = {};
|
||||
/******/
|
||||
/******/ // The require function
|
||||
/******/ function __webpack_require__(moduleId) {
|
||||
/******/
|
||||
/******/ // Check if module is in cache
|
||||
/******/ if(installedModules[moduleId]) {
|
||||
/******/ return installedModules[moduleId].exports;
|
||||
/******/ }
|
||||
/******/ // Create a new module (and put it into the cache)
|
||||
/******/ var module = installedModules[moduleId] = {
|
||||
/******/ i: moduleId,
|
||||
/******/ l: false,
|
||||
/******/ exports: {}
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // Execute the module function
|
||||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
||||
/******/
|
||||
/******/ // Flag the module as loaded
|
||||
/******/ module.l = true;
|
||||
/******/
|
||||
/******/ // Return the exports of the module
|
||||
/******/ return module.exports;
|
||||
/******/ }
|
||||
/******/
|
||||
/******/
|
||||
/******/ // expose the modules object (__webpack_modules__)
|
||||
/******/ __webpack_require__.m = modules;
|
||||
/******/
|
||||
/******/ // expose the module cache
|
||||
/******/ __webpack_require__.c = installedModules;
|
||||
/******/
|
||||
/******/ // define getter function for harmony exports
|
||||
/******/ __webpack_require__.d = function(exports, name, getter) {
|
||||
/******/ if(!__webpack_require__.o(exports, name)) {
|
||||
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
||||
/******/ }
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // define __esModule on exports
|
||||
/******/ __webpack_require__.r = function(exports) {
|
||||
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
||||
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
||||
/******/ }
|
||||
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // create a fake namespace object
|
||||
/******/ // mode & 1: value is a module id, require it
|
||||
/******/ // mode & 2: merge all properties of value into the ns
|
||||
/******/ // mode & 4: return value when already ns object
|
||||
/******/ // mode & 8|1: behave like require
|
||||
/******/ __webpack_require__.t = function(value, mode) {
|
||||
/******/ if(mode & 1) value = __webpack_require__(value);
|
||||
/******/ if(mode & 8) return value;
|
||||
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
||||
/******/ var ns = Object.create(null);
|
||||
/******/ __webpack_require__.r(ns);
|
||||
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
||||
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
||||
/******/ return ns;
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
||||
/******/ __webpack_require__.n = function(module) {
|
||||
/******/ var getter = module && module.__esModule ?
|
||||
/******/ function getDefault() { return module['default']; } :
|
||||
/******/ function getModuleExports() { return module; };
|
||||
/******/ __webpack_require__.d(getter, 'a', getter);
|
||||
/******/ return getter;
|
||||
/******/ };
|
||||
/******/
|
||||
/******/ // Object.prototype.hasOwnProperty.call
|
||||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
||||
/******/
|
||||
/******/ // __webpack_public_path__
|
||||
/******/ __webpack_require__.p = "";
|
||||
/******/
|
||||
/******/
|
||||
/******/ // Load entry module and return exports
|
||||
/******/ return __webpack_require__(__webpack_require__.s = 0);
|
||||
/******/ })
|
||||
/************************************************************************/
|
||||
/******/ ([
|
||||
/* 0 */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var _blots_image_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
|
||||
/* harmony import */ var _quill_imageUploader_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
|
||||
/* harmony import */ var _quill_imageUploader_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_quill_imageUploader_css__WEBPACK_IMPORTED_MODULE_1__);
|
||||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||||
|
||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
|
||||
|
||||
|
||||
var ImageUploader = function () {
|
||||
function ImageUploader(quill, options) {
|
||||
_classCallCheck(this, ImageUploader);
|
||||
|
||||
this.quill = quill;
|
||||
this.options = options;
|
||||
this.range = null;
|
||||
|
||||
if (typeof this.options.upload !== "function") {
|
||||
console.warn("[Missing config] upload function that returns a promise is required");
|
||||
}
|
||||
|
||||
if (this.options.loadingClass) {
|
||||
_blots_image_js__WEBPACK_IMPORTED_MODULE_0__["default"].className = this.options.loadingClass;
|
||||
}
|
||||
|
||||
var toolbar = this.quill.getModule("toolbar");
|
||||
toolbar.addHandler("image", this.selectLocalImage.bind(this));
|
||||
|
||||
this.handleDrop = this.handleDrop.bind(this);
|
||||
this.handlePaste = this.handlePaste.bind(this);
|
||||
|
||||
this.quill.root.addEventListener("drop", this.handleDrop, false);
|
||||
this.quill.root.addEventListener("paste", this.handlePaste, false);
|
||||
}
|
||||
|
||||
_createClass(ImageUploader, [{
|
||||
key: "selectLocalImage",
|
||||
value: function selectLocalImage() {
|
||||
var _this = this;
|
||||
|
||||
this.range = this.quill.getSelection();
|
||||
this.fileHolder = document.createElement("input");
|
||||
this.fileHolder.setAttribute("type", "file");
|
||||
this.fileHolder.setAttribute("accept", "image/*");
|
||||
this.fileHolder.setAttribute("style", "visibility:hidden");
|
||||
|
||||
this.fileHolder.onchange = this.fileChanged.bind(this);
|
||||
|
||||
document.body.appendChild(this.fileHolder);
|
||||
|
||||
this.fileHolder.click();
|
||||
|
||||
window.requestAnimationFrame(function () {
|
||||
document.body.removeChild(_this.fileHolder);
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: "handleDrop",
|
||||
value: function handleDrop(evt) {
|
||||
var _this2 = this;
|
||||
|
||||
evt.stopPropagation();
|
||||
evt.preventDefault();
|
||||
if (evt.dataTransfer && evt.dataTransfer.files && evt.dataTransfer.files.length) {
|
||||
if (document.caretRangeFromPoint) {
|
||||
var selection = document.getSelection();
|
||||
var range = document.caretRangeFromPoint(evt.clientX, evt.clientY);
|
||||
if (selection && range) {
|
||||
selection.setBaseAndExtent(range.startContainer, range.startOffset, range.startContainer, range.startOffset);
|
||||
}
|
||||
} else {
|
||||
var _selection = document.getSelection();
|
||||
var _range = document.caretPositionFromPoint(evt.clientX, evt.clientY);
|
||||
if (_selection && _range) {
|
||||
_selection.setBaseAndExtent(_range.offsetNode, _range.offset, _range.offsetNode, _range.offset);
|
||||
}
|
||||
}
|
||||
|
||||
this.range = this.quill.getSelection();
|
||||
var file = evt.dataTransfer.files[0];
|
||||
|
||||
setTimeout(function () {
|
||||
_this2.range = _this2.quill.getSelection();
|
||||
_this2.readAndUploadFile(file);
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
}, {
|
||||
key: "handlePaste",
|
||||
value: function handlePaste(evt) {
|
||||
var _this3 = this;
|
||||
|
||||
var clipboard = evt.clipboardData || window.clipboardData;
|
||||
|
||||
// IE 11 is .files other browsers are .items
|
||||
if (clipboard && (clipboard.items || clipboard.files)) {
|
||||
var items = clipboard.items || clipboard.files;
|
||||
var IMAGE_MIME_REGEX = /^image\/(jpe?g|gif|png|svg|webp)$/i;
|
||||
|
||||
for (var i = 0; i < items.length; i++) {
|
||||
if (IMAGE_MIME_REGEX.test(items[i].type)) {
|
||||
(function () {
|
||||
var file = items[i].getAsFile ? items[i].getAsFile() : items[i];
|
||||
|
||||
if (file) {
|
||||
_this3.range = _this3.quill.getSelection();
|
||||
evt.preventDefault();
|
||||
setTimeout(function () {
|
||||
_this3.range = _this3.quill.getSelection();
|
||||
_this3.readAndUploadFile(file);
|
||||
}, 0);
|
||||
}
|
||||
})();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {
|
||||
key: "readAndUploadFile",
|
||||
value: function readAndUploadFile(file) {
|
||||
var _this4 = this;
|
||||
|
||||
var isUploadReject = false;
|
||||
|
||||
var fileReader = new FileReader();
|
||||
|
||||
fileReader.addEventListener("load", function () {
|
||||
if (!isUploadReject) {
|
||||
var base64ImageSrc = fileReader.result;
|
||||
_this4.insertBase64Image(base64ImageSrc);
|
||||
}
|
||||
}, false);
|
||||
|
||||
if (file) {
|
||||
fileReader.readAsDataURL(file);
|
||||
}
|
||||
|
||||
this.options.upload(file).then(function (imageUrl) {
|
||||
_this4.insertToEditor(imageUrl);
|
||||
}, function (error) {
|
||||
isUploadReject = true;
|
||||
_this4.removeBase64Image();
|
||||
console.warn(error);
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: "fileChanged",
|
||||
value: function fileChanged() {
|
||||
var file = this.fileHolder.files[0];
|
||||
this.readAndUploadFile(file);
|
||||
}
|
||||
}, {
|
||||
key: "insertBase64Image",
|
||||
value: function insertBase64Image(url) {
|
||||
var range = this.range;
|
||||
|
||||
this.quill.insertEmbed(range.index, _blots_image_js__WEBPACK_IMPORTED_MODULE_0__["default"].blotName, "" + url, "user");
|
||||
}
|
||||
}, {
|
||||
key: "insertToEditor",
|
||||
value: function insertToEditor(url) {
|
||||
var range = this.range;
|
||||
// Delete the placeholder image
|
||||
|
||||
this.quill.deleteText(range.index, 3, "user");
|
||||
// Insert the server saved image
|
||||
this.quill.insertEmbed(range.index, "image", "" + url, "user");
|
||||
|
||||
range.index++;
|
||||
this.quill.setSelection(range, "user");
|
||||
}
|
||||
}, {
|
||||
key: "removeBase64Image",
|
||||
value: function removeBase64Image() {
|
||||
var range = this.range;
|
||||
|
||||
this.quill.deleteText(range.index, 3, "user");
|
||||
}
|
||||
}]);
|
||||
|
||||
return ImageUploader;
|
||||
}();
|
||||
|
||||
window.ImageUploader = ImageUploader;
|
||||
/* harmony default export */ __webpack_exports__["default"] = (ImageUploader);
|
||||
|
||||
/***/ }),
|
||||
/* 1 */
|
||||
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
||||
|
||||
"use strict";
|
||||
__webpack_require__.r(__webpack_exports__);
|
||||
/* harmony import */ var quill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
|
||||
/* harmony import */ var quill__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(quill__WEBPACK_IMPORTED_MODULE_0__);
|
||||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||||
|
||||
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
|
||||
|
||||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||||
|
||||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
||||
|
||||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
||||
|
||||
|
||||
|
||||
var InlineBlot = quill__WEBPACK_IMPORTED_MODULE_0___default.a.import('blots/block');
|
||||
|
||||
var LoadingImage = function (_InlineBlot) {
|
||||
_inherits(LoadingImage, _InlineBlot);
|
||||
|
||||
function LoadingImage() {
|
||||
_classCallCheck(this, LoadingImage);
|
||||
|
||||
return _possibleConstructorReturn(this, (LoadingImage.__proto__ || Object.getPrototypeOf(LoadingImage)).apply(this, arguments));
|
||||
}
|
||||
|
||||
_createClass(LoadingImage, [{
|
||||
key: 'deleteAt',
|
||||
value: function deleteAt(index, length) {
|
||||
_get(LoadingImage.prototype.__proto__ || Object.getPrototypeOf(LoadingImage.prototype), 'deleteAt', this).call(this, index, length);
|
||||
this.cache = {};
|
||||
}
|
||||
}], [{
|
||||
key: 'create',
|
||||
value: function create(src) {
|
||||
var node = _get(LoadingImage.__proto__ || Object.getPrototypeOf(LoadingImage), 'create', this).call(this, src);
|
||||
if (src === true) return node;
|
||||
|
||||
var image = document.createElement('img');
|
||||
image.setAttribute('src', src);
|
||||
node.appendChild(image);
|
||||
return node;
|
||||
}
|
||||
}, {
|
||||
key: 'value',
|
||||
value: function value(domNode) {
|
||||
var _domNode$dataset = domNode.dataset,
|
||||
src = _domNode$dataset.src,
|
||||
custom = _domNode$dataset.custom;
|
||||
|
||||
return { src: src, custom: custom };
|
||||
}
|
||||
}]);
|
||||
|
||||
return LoadingImage;
|
||||
}(InlineBlot);
|
||||
|
||||
LoadingImage.blotName = 'imageBlot';
|
||||
LoadingImage.className = 'quill-image-uploading';
|
||||
LoadingImage.tagName = 'span';
|
||||
quill__WEBPACK_IMPORTED_MODULE_0___default.a.register({ 'formats/imageBlot': LoadingImage });
|
||||
|
||||
/* harmony default export */ __webpack_exports__["default"] = (LoadingImage);
|
||||
|
||||
/***/ }),
|
||||
/* 2 */
|
||||
/***/ (function(module, exports) {
|
||||
|
||||
module.exports = Quill;
|
||||
|
||||
/***/ }),
|
||||
/* 3 */
|
||||
/***/ (function(module, exports) {
|
||||
|
||||
// removed by extract-text-webpack-plugin
|
||||
|
||||
/***/ })
|
||||
/******/ ]);
|
||||
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
8
app/assets/javascripts/activeadmin/quill_editor/quill.min.js
поставляемый
8
app/assets/javascripts/activeadmin/quill_editor/quill.min.js
поставляемый
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
@@ -1,10 +1,11 @@
|
||||
/* globals $ Quill ImageUploader */
|
||||
(function () {
|
||||
'use strict'
|
||||
'use strict';
|
||||
|
||||
// --- functions ---------------------------------------------------------------
|
||||
function initQuillEditors() {
|
||||
let default_theme = 'snow'
|
||||
let default_toolbar = [
|
||||
const initQuillEditors = () => {
|
||||
const defaultTheme = 'snow';
|
||||
const defaultToolbar = [
|
||||
['bold', 'italic', 'underline'],
|
||||
['link', 'blockquote', 'code-block'],
|
||||
[{ 'script': 'sub' }, { 'script': 'super' }],
|
||||
@@ -12,59 +13,65 @@
|
||||
[{ 'color': [] }, { 'background': [] }],
|
||||
['image'],
|
||||
['clean'],
|
||||
]
|
||||
let editors = document.querySelectorAll('[data-aa-quill-editor]')
|
||||
let registered_plugins = {}
|
||||
];
|
||||
const editors = document.querySelectorAll('[data-aa-quill-editor]');
|
||||
const registeredPlugins = {};
|
||||
|
||||
for (let i = 0; i < editors.length; i++) {
|
||||
let content = editors[i].querySelector('[data-aa-quill-content]')
|
||||
let isActive = editors[i].classList.contains('quill-editor--active')
|
||||
const content = editors[i].querySelector('[data-aa-quill-content]');
|
||||
const isActive = editors[i].classList.contains('quill-editor--active');
|
||||
|
||||
if (content && !isActive) {
|
||||
// Setup editor options
|
||||
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
|
||||
const options = editors[i].getAttribute('data-options') ? JSON.parse(editors[i].getAttribute('data-options')) : {};
|
||||
|
||||
if (!options.theme) options.theme = defaultTheme;
|
||||
if (!options.modules) options.modules = {};
|
||||
if (!options.modules.toolbar) options.modules.toolbar = defaultToolbar;
|
||||
|
||||
// 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
|
||||
const pluginOptions = editors[i].getAttribute('data-plugins') ? JSON.parse(editors[i].getAttribute('data-plugins')) : {};
|
||||
|
||||
if (pluginOptions.image_uploader && pluginOptions.image_uploader.server_url) {
|
||||
if (!registeredPlugins.image_uploader) {
|
||||
Quill.register('modules/imageUploader', ImageUploader);
|
||||
registeredPlugins.image_uploader = true;
|
||||
}
|
||||
let opts = plugin_options.image_uploader
|
||||
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name)
|
||||
const opts = pluginOptions.image_uploader;
|
||||
|
||||
options.modules.imageUploader = setupImageUploader(opts.server_url, opts.field_name);
|
||||
}
|
||||
|
||||
// Init editor
|
||||
editors[i]['_quill-editor'] = new Quill(content, options)
|
||||
editors[i].classList += ' quill-editor--active'
|
||||
editors[i]['_quill-editor'] = new Quill(content, options);
|
||||
editors[i].classList += ' quill-editor--active';
|
||||
}
|
||||
}
|
||||
|
||||
let formtastic = document.querySelector('form.formtastic')
|
||||
const 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"]')
|
||||
const input = editors[i].querySelector('input[type="hidden"]');
|
||||
|
||||
if (editors[i]['_quill-editor'].editor.isBlank()) {
|
||||
input.value = ''
|
||||
input.value = '';
|
||||
} else {
|
||||
input.value = editors[i]['_quill-editor'].root.innerHTML
|
||||
input.value = editors[i]['_quill-editor'].root.innerHTML;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function setupImageUploader(server_url, field_name) {
|
||||
const setupImageUploader = (server_url, field_name) => {
|
||||
return {
|
||||
upload: file => {
|
||||
upload: (file) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const formData = new FormData()
|
||||
formData.append(field_name || 'file_upload', file)
|
||||
const formData = new FormData();
|
||||
|
||||
formData.append(field_name || 'file_upload', file);
|
||||
fetch(server_url, {
|
||||
body: formData,
|
||||
headers: {
|
||||
@@ -73,19 +80,44 @@
|
||||
method: 'POST'
|
||||
}).then(response => response.json())
|
||||
.then(result => {
|
||||
if (!result.url) {
|
||||
reject('Upload failed');
|
||||
}
|
||||
resolve(result.url);
|
||||
})
|
||||
.catch(error => {
|
||||
reject('Upload failed')
|
||||
console.error('Error: ', error)
|
||||
reject('Upload failed');
|
||||
console.error('Error: ', error);
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- public functions --------------------------------------------------------
|
||||
window.getQuillEditors = function() {
|
||||
const editors = document.querySelectorAll('[data-aa-quill-editor]');
|
||||
const list = [];
|
||||
|
||||
editors.forEach(function(editor) { list.push(editor['_quill-editor']) });
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
window.getQuillEditorByIndex = function(index) {
|
||||
const editors = document.querySelectorAll('[data-aa-quill-editor]');
|
||||
|
||||
return (index >= 0 && index < editors.length) ? editors[index]['_quill-editor'] : null;
|
||||
}
|
||||
|
||||
window.getQuillEditorByElementId = function(id) {
|
||||
const editor = document.querySelector(`[data-aa-quill-editor]#${id}`);
|
||||
|
||||
return editor ? editor['_quill-editor'] : null;
|
||||
}
|
||||
|
||||
// --- events ------------------------------------------------------------------
|
||||
$(document).ready(initQuillEditors)
|
||||
$(document).on('has_many_add:after', '.has_many_container', initQuillEditors)
|
||||
$(document).on('turbolinks:load', initQuillEditors)
|
||||
})()
|
||||
$(document).ready(initQuillEditors);
|
||||
$(document).on('has_many_add:after', '.has_many_container', initQuillEditors);
|
||||
$(document).on('turbolinks:load', initQuillEditors);
|
||||
})();
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
.image-uploading {
|
||||
.quill-image-uploading {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.image-uploading img {
|
||||
.quill-image-uploading img {
|
||||
max-width: 98% !important;
|
||||
filter: blur(5px);
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.image-uploading::before {
|
||||
.quill-image-uploading::before {
|
||||
content: "";
|
||||
box-sizing: border-box;
|
||||
position: absolute;
|
||||
@@ -21,7 +21,7 @@
|
||||
margin-left: -15px;
|
||||
border-radius: 50%;
|
||||
border: 3px solid #ccc;
|
||||
border-top-color: #1e986c;
|
||||
border-top-color: #1e40af;
|
||||
z-index: 1;
|
||||
animation: spinner 0.6s linear infinite;
|
||||
}
|
||||
|
||||
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
@@ -1,29 +0,0 @@
|
||||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
#
|
||||
# This file was generated by Bundler.
|
||||
#
|
||||
# The application 'appraisal' is installed as part of a gem, and
|
||||
# this file is here to facilitate running it.
|
||||
#
|
||||
|
||||
require "pathname"
|
||||
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
||||
Pathname.new(__FILE__).realpath)
|
||||
|
||||
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
||||
|
||||
if File.file?(bundle_binstub)
|
||||
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
||||
load(bundle_binstub)
|
||||
else
|
||||
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
||||
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
||||
end
|
||||
end
|
||||
|
||||
require "rubygems"
|
||||
require "bundler/setup"
|
||||
|
||||
load Gem.bin_path("appraisal", "appraisal")
|
||||
@@ -2,7 +2,7 @@
|
||||
# This command will automatically be run when you run "rails" with Rails gems
|
||||
# installed from the root of your application.
|
||||
|
||||
ENV['RAILS_ENV'] ||= 'test'
|
||||
ENV['RAILS_ENV'] ||= 'development'
|
||||
|
||||
ENGINE_ROOT = File.expand_path('..', __dir__)
|
||||
ENGINE_PATH = File.expand_path('../lib/activeadmin/quill_editor/engine', __dir__)
|
||||
|
||||
3
extra/.bashrc
Обычный файл
3
extra/.bashrc
Обычный файл
@@ -0,0 +1,3 @@
|
||||
alias ls='ls --color'
|
||||
alias ll='ls -l'
|
||||
alias la='ls -la'
|
||||
7
extra/.env
Обычный файл
7
extra/.env
Обычный файл
@@ -0,0 +1,7 @@
|
||||
COMPOSE_PROJECT_NAME=activeadmin_quill_editor
|
||||
|
||||
BUNDLER_VERSION=2.5.23
|
||||
SERVER_PORT=4000
|
||||
|
||||
UID=1000
|
||||
GID=1000
|
||||
31
extra/Dockerfile
Обычный файл
31
extra/Dockerfile
Обычный файл
@@ -0,0 +1,31 @@
|
||||
ARG RUBY_IMAGE=ruby:3
|
||||
FROM ${RUBY_IMAGE}
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV DEVEL=1
|
||||
ENV LANG=C.UTF-8
|
||||
|
||||
RUN apt-get update -qq
|
||||
RUN apt-get install -yqq --no-install-recommends build-essential chromium less libyaml-dev nano netcat-traditional pkg-config
|
||||
|
||||
ARG BUNDLER_VERSION
|
||||
RUN gem install bundler -v ${BUNDLER_VERSION}
|
||||
RUN echo 'gem: --no-document' > /etc/gemrc
|
||||
|
||||
ARG UID
|
||||
RUN useradd -u $UID --shell /bin/bash app
|
||||
|
||||
RUN mkdir -p /home/app && chown -R app:app /home/app
|
||||
|
||||
ARG RAILS_VERSION
|
||||
ENV RAILS_VERSION=$RAILS_VERSION
|
||||
|
||||
ARG ACTIVEADMIN_VERSION
|
||||
ENV ACTIVEADMIN_VERSION=$ACTIVEADMIN_VERSION
|
||||
|
||||
WORKDIR /app
|
||||
COPY . /app
|
||||
RUN bundle install
|
||||
RUN chown -R app:app /usr/local/bundle
|
||||
|
||||
RUN ln -s /app/extra/.bashrc /home/app/.bashrc
|
||||
6
extra/Dockerfile.dockerignore
Обычный файл
6
extra/Dockerfile.dockerignore
Обычный файл
@@ -0,0 +1,6 @@
|
||||
# Ignore everything but the required files for bundle install
|
||||
/**/*
|
||||
|
||||
!/*.gemspec
|
||||
!/Gemfile
|
||||
!/lib
|
||||
@@ -1,21 +0,0 @@
|
||||
# Development
|
||||
|
||||
Overcommit can be used to ensure that Conventional commits are good.
|
||||
|
||||
## Releases
|
||||
|
||||
```sh
|
||||
# Update version.rb with the new version
|
||||
# Update the gemfiles:
|
||||
bin/appraisal
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
```sh
|
||||
# Running specs using a specific configuration:
|
||||
bin/appraisal rails60-activeadmin22 rspec
|
||||
# Using latest activeadmin version:
|
||||
bin/appraisal rails60-activeadmin rspec
|
||||
# See gemfiles for more configurations
|
||||
```
|
||||
6
extra/dev_setup.sh
Исполняемый файл
6
extra/dev_setup.sh
Исполняемый файл
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
export DEVEL=1
|
||||
|
||||
export RAILS_VERSION=7.2.2.1
|
||||
export ACTIVEADMIN_VERSION=3.3.0
|
||||
50
extra/development.md
Обычный файл
50
extra/development.md
Обычный файл
@@ -0,0 +1,50 @@
|
||||
## Development
|
||||
|
||||
### Dev setup
|
||||
|
||||
There are 2 ways to interact with this project:
|
||||
|
||||
1) Using Docker:
|
||||
|
||||
```sh
|
||||
make up # starts the dev services (optional env vars: RUBY / RAILS / ACTIVEADMIN)
|
||||
make specs # run the tests (after up)
|
||||
make lint # run the linters (after up)
|
||||
make server # run the server (after up)
|
||||
make shell # open a shell (after up)
|
||||
make down # cleanup (after up)
|
||||
|
||||
# Example using specific versions:
|
||||
RUBY=3.2 RAILS=7.1 ACTIVEADMIN=3.2.0 make up
|
||||
```
|
||||
|
||||
2) With a local setup:
|
||||
|
||||
```sh
|
||||
# Dev setup (set the required envs):
|
||||
source extra/dev_setup.sh
|
||||
# Install dependencies:
|
||||
bundle update
|
||||
# Run server (or any command):
|
||||
bin/rails s
|
||||
# To try different versions of Rails/ActiveAdmin edit extra/dev_setup.sh
|
||||
```
|
||||
|
||||
### Update the editor
|
||||
|
||||
- Update the CSS/JS editor assets:
|
||||
|
||||
```sh
|
||||
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.snow.css" -O "app/assets/stylesheets/activeadmin/quill_editor/quill.snow.css"
|
||||
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.bubble.css" -O "app/assets/stylesheets/activeadmin/quill_editor/quill.bubble.css"
|
||||
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.core.css" -O "app/assets/stylesheets/activeadmin/quill_editor/quill.core.css"
|
||||
|
||||
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.js" -O "app/assets/javascripts/activeadmin/quill_editor/quill.js"
|
||||
wget "https://cdn.jsdelivr.net/npm/quill@2/dist/quill.core.js" -O "app/assets/javascripts/activeadmin/quill_editor/quill.core.js"
|
||||
|
||||
wget "https://github.com/valentsea/quill2-image-uploader/raw/refs/heads/master/dist/quill.imageUploader.min.js" -O "app/assets/javascripts/activeadmin/quill.imageUploader.min.js"
|
||||
|
||||
wget "https://github.com/valentsea/quill2-image-uploader/raw/refs/heads/master/dist/quill.imageUploader.min.css" -O "app/assets/stylesheets/activeadmin/quill.imageUploader.min.css"
|
||||
```
|
||||
|
||||
- Check the changes, most of them should be for updated files plus some new / removed file
|
||||
19
extra/docker-compose.yml
Обычный файл
19
extra/docker-compose.yml
Обычный файл
@@ -0,0 +1,19 @@
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: extra/Dockerfile
|
||||
args:
|
||||
BUNDLER_VERSION: ${BUNDLER_VERSION}
|
||||
RUBY_IMAGE: ruby:${RUBY:-3.4}-slim
|
||||
RAILS_VERSION: ${RAILS:-}
|
||||
ACTIVEADMIN_VERSION: ${ACTIVEADMIN:-}
|
||||
UID: ${UID}
|
||||
user: ${UID}:${GID}
|
||||
ports:
|
||||
- ${SERVER_PORT}:${SERVER_PORT}
|
||||
working_dir: /app
|
||||
volumes:
|
||||
- ..:/app
|
||||
stdin_open: true
|
||||
tty: true
|
||||
@@ -1,27 +0,0 @@
|
||||
# This file was generated by Appraisal
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "activeadmin"
|
||||
gem "rails", "~> 6.0.0"
|
||||
gem "selenium-webdriver", require: false
|
||||
|
||||
group :development, :test do
|
||||
gem "puma"
|
||||
gem "sassc"
|
||||
gem "sqlite3"
|
||||
gem "capybara"
|
||||
gem "cuprite"
|
||||
gem "rspec_junit_formatter"
|
||||
gem "rspec-rails"
|
||||
gem "rspec-retry"
|
||||
gem "fasterer"
|
||||
gem "rubocop"
|
||||
gem "rubocop-packaging"
|
||||
gem "rubocop-performance"
|
||||
gem "rubocop-rails"
|
||||
gem "rubocop-rspec"
|
||||
gem "pry-rails"
|
||||
end
|
||||
|
||||
gemspec path: "../"
|
||||
@@ -1,319 +0,0 @@
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
activeadmin_quill_editor (1.1.0)
|
||||
activeadmin (>= 2.0, < 4)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actioncable (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
activestorage (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
mail (>= 2.7.1)
|
||||
actionmailer (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
actionview (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (6.0.4.7)
|
||||
actionview (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
rack (~> 2.0, >= 2.0.8)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actiontext (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
activestorage (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activeadmin (2.11.1)
|
||||
arbre (~> 1.2, >= 1.2.1)
|
||||
formtastic (>= 3.1, < 5.0)
|
||||
formtastic_i18n (~> 0.4)
|
||||
inherited_resources (~> 1.7)
|
||||
jquery-rails (~> 4.2)
|
||||
kaminari (~> 1.0, >= 1.2.1)
|
||||
railties (>= 6.0, < 7.1)
|
||||
ransack (~> 2.1, >= 2.1.1)
|
||||
activejob (6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
activerecord (6.0.4.7)
|
||||
activemodel (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
activestorage (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
marcel (~> 1.0.0)
|
||||
activesupport (6.0.4.7)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
minitest (~> 5.1)
|
||||
tzinfo (~> 1.1)
|
||||
zeitwerk (~> 2.2, >= 2.2.2)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
appraisal (2.4.1)
|
||||
bundler
|
||||
rake
|
||||
thor (>= 0.14.0)
|
||||
arbre (1.5.0)
|
||||
activesupport (>= 3.0.0, < 7.1)
|
||||
ruby2_keywords (>= 0.0.2, < 1.0)
|
||||
ast (2.4.2)
|
||||
builder (3.2.4)
|
||||
capybara (3.36.0)
|
||||
addressable
|
||||
matrix
|
||||
mini_mime (>= 0.1.3)
|
||||
nokogiri (~> 1.8)
|
||||
rack (>= 1.6.0)
|
||||
rack-test (>= 0.6.3)
|
||||
regexp_parser (>= 1.5, < 3.0)
|
||||
xpath (~> 3.2)
|
||||
childprocess (4.1.0)
|
||||
cliver (0.3.2)
|
||||
coderay (1.1.3)
|
||||
colorize (0.8.1)
|
||||
concurrent-ruby (1.1.10)
|
||||
crass (1.0.6)
|
||||
cuprite (0.13)
|
||||
capybara (>= 2.1, < 4)
|
||||
ferrum (~> 0.11.0)
|
||||
diff-lcs (1.5.0)
|
||||
erubi (1.10.0)
|
||||
fasterer (0.9.0)
|
||||
colorize (~> 0.7)
|
||||
ruby_parser (>= 3.14.1)
|
||||
ferrum (0.11)
|
||||
addressable (~> 2.5)
|
||||
cliver (~> 0.3)
|
||||
concurrent-ruby (~> 1.1)
|
||||
websocket-driver (>= 0.6, < 0.8)
|
||||
ffi (1.15.5)
|
||||
formtastic (4.0.0)
|
||||
actionpack (>= 5.2.0)
|
||||
formtastic_i18n (0.7.0)
|
||||
globalid (1.0.0)
|
||||
activesupport (>= 5.0)
|
||||
has_scope (0.8.0)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
i18n (1.10.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
inherited_resources (1.13.1)
|
||||
actionpack (>= 5.2, < 7.1)
|
||||
has_scope (~> 0.6)
|
||||
railties (>= 5.2, < 7.1)
|
||||
responders (>= 2, < 4)
|
||||
jquery-rails (4.4.0)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
kaminari (1.2.2)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.2.2)
|
||||
kaminari-activerecord (= 1.2.2)
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-actionview (1.2.2)
|
||||
actionview
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-activerecord (1.2.2)
|
||||
activerecord
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-core (1.2.2)
|
||||
loofah (2.15.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.1)
|
||||
mini_mime (>= 0.1.1)
|
||||
marcel (1.0.2)
|
||||
matrix (0.4.2)
|
||||
method_source (1.0.0)
|
||||
mini_mime (1.1.2)
|
||||
mini_portile2 (2.8.4)
|
||||
minitest (5.15.0)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.3)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
parallel (1.22.1)
|
||||
parser (3.1.1.0)
|
||||
ast (~> 2.4.1)
|
||||
pry (0.14.1)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
pry-rails (0.3.9)
|
||||
pry (>= 0.10.4)
|
||||
public_suffix (4.0.6)
|
||||
puma (5.6.2)
|
||||
nio4r (~> 2.0)
|
||||
racc (1.6.0)
|
||||
rack (2.2.3)
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rails (6.0.4.7)
|
||||
actioncable (= 6.0.4.7)
|
||||
actionmailbox (= 6.0.4.7)
|
||||
actionmailer (= 6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
actiontext (= 6.0.4.7)
|
||||
actionview (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
activemodel (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
activestorage (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
bundler (>= 1.3.0)
|
||||
railties (= 6.0.4.7)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.4.2)
|
||||
loofah (~> 2.3)
|
||||
railties (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
method_source
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.20.3, < 2.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
ransack (2.6.0)
|
||||
activerecord (>= 6.0.4)
|
||||
activesupport (>= 6.0.4)
|
||||
i18n
|
||||
regexp_parser (2.2.1)
|
||||
responders (3.0.1)
|
||||
actionpack (>= 5.0)
|
||||
railties (>= 5.0)
|
||||
rexml (3.2.5)
|
||||
rspec-core (3.11.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-expectations (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-mocks (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-rails (5.1.1)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rspec-core (~> 3.10)
|
||||
rspec-expectations (~> 3.10)
|
||||
rspec-mocks (~> 3.10)
|
||||
rspec-support (~> 3.10)
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.11.0)
|
||||
rspec_junit_formatter (0.5.1)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rubocop (1.26.1)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.1.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.16.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.16.0)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-packaging (0.5.1)
|
||||
rubocop (>= 0.89, < 2.0)
|
||||
rubocop-performance (1.13.3)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-ast (>= 0.4.0)
|
||||
rubocop-rails (2.14.2)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-rspec (2.9.0)
|
||||
rubocop (~> 1.19)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
ruby_parser (3.18.1)
|
||||
sexp_processor (~> 4.16)
|
||||
rubyzip (2.3.2)
|
||||
sassc (2.4.0)
|
||||
ffi (~> 1.9)
|
||||
selenium-webdriver (4.1.0)
|
||||
childprocess (>= 0.5, < 5.0)
|
||||
rexml (~> 3.2, >= 3.2.5)
|
||||
rubyzip (>= 1.2.2)
|
||||
sexp_processor (4.16.0)
|
||||
sprockets (4.0.3)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.4.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
sprockets (>= 3.0.0)
|
||||
sqlite3 (1.4.2)
|
||||
thor (1.2.1)
|
||||
thread_safe (0.3.6)
|
||||
tzinfo (1.2.9)
|
||||
thread_safe (~> 0.1)
|
||||
unicode-display_width (2.1.0)
|
||||
websocket-driver (0.7.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
xpath (3.2.0)
|
||||
nokogiri (~> 1.8)
|
||||
zeitwerk (2.5.4)
|
||||
|
||||
PLATFORMS
|
||||
arm64-darwin-22
|
||||
x86_64-darwin-21
|
||||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
activeadmin
|
||||
activeadmin_quill_editor!
|
||||
appraisal (~> 2.4)
|
||||
capybara
|
||||
cuprite
|
||||
fasterer
|
||||
pry-rails
|
||||
puma
|
||||
rails (~> 6.0.0)
|
||||
rspec-rails
|
||||
rspec-retry
|
||||
rspec_junit_formatter
|
||||
rubocop
|
||||
rubocop-packaging
|
||||
rubocop-performance
|
||||
rubocop-rails
|
||||
rubocop-rspec
|
||||
sassc
|
||||
selenium-webdriver
|
||||
sqlite3
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.8
|
||||
@@ -1,27 +0,0 @@
|
||||
# This file was generated by Appraisal
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "activeadmin", "~> 2.2.0"
|
||||
gem "rails", "~> 6.0.0"
|
||||
gem "selenium-webdriver", require: false
|
||||
|
||||
group :development, :test do
|
||||
gem "puma"
|
||||
gem "sassc"
|
||||
gem "sqlite3"
|
||||
gem "capybara"
|
||||
gem "cuprite"
|
||||
gem "rspec_junit_formatter"
|
||||
gem "rspec-rails"
|
||||
gem "rspec-retry"
|
||||
gem "fasterer"
|
||||
gem "rubocop"
|
||||
gem "rubocop-packaging"
|
||||
gem "rubocop-performance"
|
||||
gem "rubocop-rails"
|
||||
gem "rubocop-rspec"
|
||||
gem "pry-rails"
|
||||
end
|
||||
|
||||
gemspec path: "../"
|
||||
@@ -1,338 +0,0 @@
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
activeadmin_quill_editor (1.1.0)
|
||||
activeadmin (>= 2.0, < 4)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actioncable (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
activestorage (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
mail (>= 2.7.1)
|
||||
actionmailer (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
actionview (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (6.0.4.7)
|
||||
actionview (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
rack (~> 2.0, >= 2.0.8)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actiontext (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
activestorage (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activeadmin (2.2.0)
|
||||
arbre (~> 1.2, >= 1.2.1)
|
||||
formtastic (~> 3.1)
|
||||
formtastic_i18n (~> 0.4)
|
||||
inherited_resources (~> 1.7)
|
||||
jquery-rails (~> 4.2)
|
||||
kaminari (~> 1.0, >= 1.0.1)
|
||||
railties (>= 5.0, < 6.1)
|
||||
ransack (~> 2.1, >= 2.1.1)
|
||||
sassc-rails (~> 2.1)
|
||||
sprockets (>= 3.0, < 4.1)
|
||||
sprockets-es6 (~> 0.9, >= 0.9.2)
|
||||
activejob (6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
activerecord (6.0.4.7)
|
||||
activemodel (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
activestorage (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
marcel (~> 1.0.0)
|
||||
activesupport (6.0.4.7)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
minitest (~> 5.1)
|
||||
tzinfo (~> 1.1)
|
||||
zeitwerk (~> 2.2, >= 2.2.2)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
appraisal (2.4.1)
|
||||
bundler
|
||||
rake
|
||||
thor (>= 0.14.0)
|
||||
arbre (1.5.0)
|
||||
activesupport (>= 3.0.0, < 7.1)
|
||||
ruby2_keywords (>= 0.0.2, < 1.0)
|
||||
ast (2.4.2)
|
||||
babel-source (5.8.35)
|
||||
babel-transpiler (0.7.0)
|
||||
babel-source (>= 4.0, < 6)
|
||||
execjs (~> 2.0)
|
||||
builder (3.2.4)
|
||||
capybara (3.36.0)
|
||||
addressable
|
||||
matrix
|
||||
mini_mime (>= 0.1.3)
|
||||
nokogiri (~> 1.8)
|
||||
rack (>= 1.6.0)
|
||||
rack-test (>= 0.6.3)
|
||||
regexp_parser (>= 1.5, < 3.0)
|
||||
xpath (~> 3.2)
|
||||
childprocess (4.1.0)
|
||||
cliver (0.3.2)
|
||||
coderay (1.1.3)
|
||||
colorize (0.8.1)
|
||||
concurrent-ruby (1.1.10)
|
||||
crass (1.0.6)
|
||||
cuprite (0.13)
|
||||
capybara (>= 2.1, < 4)
|
||||
ferrum (~> 0.11.0)
|
||||
diff-lcs (1.5.0)
|
||||
erubi (1.10.0)
|
||||
execjs (2.8.1)
|
||||
fasterer (0.9.0)
|
||||
colorize (~> 0.7)
|
||||
ruby_parser (>= 3.14.1)
|
||||
ferrum (0.11)
|
||||
addressable (~> 2.5)
|
||||
cliver (~> 0.3)
|
||||
concurrent-ruby (~> 1.1)
|
||||
websocket-driver (>= 0.6, < 0.8)
|
||||
ffi (1.15.5)
|
||||
formtastic (3.1.5)
|
||||
actionpack (>= 3.2.13)
|
||||
formtastic_i18n (0.7.0)
|
||||
globalid (1.0.0)
|
||||
activesupport (>= 5.0)
|
||||
has_scope (0.8.0)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
i18n (1.10.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
inherited_resources (1.13.1)
|
||||
actionpack (>= 5.2, < 7.1)
|
||||
has_scope (~> 0.6)
|
||||
railties (>= 5.2, < 7.1)
|
||||
responders (>= 2, < 4)
|
||||
jquery-rails (4.4.0)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
kaminari (1.2.2)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.2.2)
|
||||
kaminari-activerecord (= 1.2.2)
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-actionview (1.2.2)
|
||||
actionview
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-activerecord (1.2.2)
|
||||
activerecord
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-core (1.2.2)
|
||||
loofah (2.15.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.1)
|
||||
mini_mime (>= 0.1.1)
|
||||
marcel (1.0.2)
|
||||
matrix (0.4.2)
|
||||
method_source (1.0.0)
|
||||
mini_mime (1.1.2)
|
||||
mini_portile2 (2.8.4)
|
||||
minitest (5.15.0)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.3)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
parallel (1.22.1)
|
||||
parser (3.1.1.0)
|
||||
ast (~> 2.4.1)
|
||||
pry (0.14.1)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
pry-rails (0.3.9)
|
||||
pry (>= 0.10.4)
|
||||
public_suffix (4.0.6)
|
||||
puma (5.6.2)
|
||||
nio4r (~> 2.0)
|
||||
racc (1.6.0)
|
||||
rack (2.2.3)
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rails (6.0.4.7)
|
||||
actioncable (= 6.0.4.7)
|
||||
actionmailbox (= 6.0.4.7)
|
||||
actionmailer (= 6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
actiontext (= 6.0.4.7)
|
||||
actionview (= 6.0.4.7)
|
||||
activejob (= 6.0.4.7)
|
||||
activemodel (= 6.0.4.7)
|
||||
activerecord (= 6.0.4.7)
|
||||
activestorage (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
bundler (>= 1.3.0)
|
||||
railties (= 6.0.4.7)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.4.2)
|
||||
loofah (~> 2.3)
|
||||
railties (6.0.4.7)
|
||||
actionpack (= 6.0.4.7)
|
||||
activesupport (= 6.0.4.7)
|
||||
method_source
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.20.3, < 2.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
ransack (2.6.0)
|
||||
activerecord (>= 6.0.4)
|
||||
activesupport (>= 6.0.4)
|
||||
i18n
|
||||
regexp_parser (2.2.1)
|
||||
responders (3.0.1)
|
||||
actionpack (>= 5.0)
|
||||
railties (>= 5.0)
|
||||
rexml (3.2.5)
|
||||
rspec-core (3.11.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-expectations (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-mocks (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-rails (5.1.1)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rspec-core (~> 3.10)
|
||||
rspec-expectations (~> 3.10)
|
||||
rspec-mocks (~> 3.10)
|
||||
rspec-support (~> 3.10)
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.11.0)
|
||||
rspec_junit_formatter (0.5.1)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rubocop (1.26.1)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.1.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.16.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.16.0)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-packaging (0.5.1)
|
||||
rubocop (>= 0.89, < 2.0)
|
||||
rubocop-performance (1.13.3)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-ast (>= 0.4.0)
|
||||
rubocop-rails (2.14.2)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-rspec (2.9.0)
|
||||
rubocop (~> 1.19)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
ruby_parser (3.18.1)
|
||||
sexp_processor (~> 4.16)
|
||||
rubyzip (2.3.2)
|
||||
sassc (2.4.0)
|
||||
ffi (~> 1.9)
|
||||
sassc-rails (2.1.2)
|
||||
railties (>= 4.0.0)
|
||||
sassc (>= 2.0)
|
||||
sprockets (> 3.0)
|
||||
sprockets-rails
|
||||
tilt
|
||||
selenium-webdriver (4.1.0)
|
||||
childprocess (>= 0.5, < 5.0)
|
||||
rexml (~> 3.2, >= 3.2.5)
|
||||
rubyzip (>= 1.2.2)
|
||||
sexp_processor (4.16.0)
|
||||
sprockets (4.0.3)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-es6 (0.9.2)
|
||||
babel-source (>= 5.8.11)
|
||||
babel-transpiler
|
||||
sprockets (>= 3.0.0)
|
||||
sprockets-rails (3.4.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
sprockets (>= 3.0.0)
|
||||
sqlite3 (1.4.2)
|
||||
thor (1.2.1)
|
||||
thread_safe (0.3.6)
|
||||
tilt (2.0.10)
|
||||
tzinfo (1.2.9)
|
||||
thread_safe (~> 0.1)
|
||||
unicode-display_width (2.1.0)
|
||||
websocket-driver (0.7.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
xpath (3.2.0)
|
||||
nokogiri (~> 1.8)
|
||||
zeitwerk (2.5.4)
|
||||
|
||||
PLATFORMS
|
||||
arm64-darwin-22
|
||||
x86_64-darwin-21
|
||||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
activeadmin (~> 2.2.0)
|
||||
activeadmin_quill_editor!
|
||||
appraisal (~> 2.4)
|
||||
capybara
|
||||
cuprite
|
||||
fasterer
|
||||
pry-rails
|
||||
puma
|
||||
rails (~> 6.0.0)
|
||||
rspec-rails
|
||||
rspec-retry
|
||||
rspec_junit_formatter
|
||||
rubocop
|
||||
rubocop-packaging
|
||||
rubocop-performance
|
||||
rubocop-rails
|
||||
rubocop-rspec
|
||||
sassc
|
||||
selenium-webdriver
|
||||
sqlite3
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.8
|
||||
@@ -1,26 +0,0 @@
|
||||
# This file was generated by Appraisal
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "activeadmin"
|
||||
gem "rails", "~> 6.1.0"
|
||||
|
||||
group :development, :test do
|
||||
gem "puma"
|
||||
gem "sassc"
|
||||
gem "sqlite3"
|
||||
gem "capybara"
|
||||
gem "cuprite"
|
||||
gem "rspec_junit_formatter"
|
||||
gem "rspec-rails"
|
||||
gem "rspec-retry"
|
||||
gem "fasterer"
|
||||
gem "rubocop"
|
||||
gem "rubocop-packaging"
|
||||
gem "rubocop-performance"
|
||||
gem "rubocop-rails"
|
||||
gem "rubocop-rspec"
|
||||
gem "pry-rails"
|
||||
end
|
||||
|
||||
gemspec path: "../"
|
||||
@@ -1,315 +0,0 @@
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
activeadmin_quill_editor (1.1.0)
|
||||
activeadmin (>= 2.0, < 4)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actioncable (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activestorage (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
mail (>= 2.7.1)
|
||||
actionmailer (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
actionview (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (6.1.5)
|
||||
actionview (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
rack (~> 2.0, >= 2.0.9)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actiontext (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activestorage (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activeadmin (2.11.1)
|
||||
arbre (~> 1.2, >= 1.2.1)
|
||||
formtastic (>= 3.1, < 5.0)
|
||||
formtastic_i18n (~> 0.4)
|
||||
inherited_resources (~> 1.7)
|
||||
jquery-rails (~> 4.2)
|
||||
kaminari (~> 1.0, >= 1.2.1)
|
||||
railties (>= 6.0, < 7.1)
|
||||
ransack (~> 2.1, >= 2.1.1)
|
||||
activejob (6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
activerecord (6.1.5)
|
||||
activemodel (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
activestorage (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
marcel (~> 1.0)
|
||||
mini_mime (>= 1.1.0)
|
||||
activesupport (6.1.5)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
zeitwerk (~> 2.3)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
appraisal (2.4.1)
|
||||
bundler
|
||||
rake
|
||||
thor (>= 0.14.0)
|
||||
arbre (1.5.0)
|
||||
activesupport (>= 3.0.0, < 7.1)
|
||||
ruby2_keywords (>= 0.0.2, < 1.0)
|
||||
ast (2.4.2)
|
||||
builder (3.2.4)
|
||||
capybara (3.36.0)
|
||||
addressable
|
||||
matrix
|
||||
mini_mime (>= 0.1.3)
|
||||
nokogiri (~> 1.8)
|
||||
rack (>= 1.6.0)
|
||||
rack-test (>= 0.6.3)
|
||||
regexp_parser (>= 1.5, < 3.0)
|
||||
xpath (~> 3.2)
|
||||
cliver (0.3.2)
|
||||
coderay (1.1.3)
|
||||
colorize (0.8.1)
|
||||
concurrent-ruby (1.1.10)
|
||||
crass (1.0.6)
|
||||
cuprite (0.13)
|
||||
capybara (>= 2.1, < 4)
|
||||
ferrum (~> 0.11.0)
|
||||
diff-lcs (1.5.0)
|
||||
erubi (1.10.0)
|
||||
fasterer (0.9.0)
|
||||
colorize (~> 0.7)
|
||||
ruby_parser (>= 3.14.1)
|
||||
ferrum (0.11)
|
||||
addressable (~> 2.5)
|
||||
cliver (~> 0.3)
|
||||
concurrent-ruby (~> 1.1)
|
||||
websocket-driver (>= 0.6, < 0.8)
|
||||
ffi (1.15.5)
|
||||
formtastic (4.0.0)
|
||||
actionpack (>= 5.2.0)
|
||||
formtastic_i18n (0.7.0)
|
||||
globalid (1.0.0)
|
||||
activesupport (>= 5.0)
|
||||
has_scope (0.8.0)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
i18n (1.10.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
inherited_resources (1.13.1)
|
||||
actionpack (>= 5.2, < 7.1)
|
||||
has_scope (~> 0.6)
|
||||
railties (>= 5.2, < 7.1)
|
||||
responders (>= 2, < 4)
|
||||
jquery-rails (4.4.0)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
kaminari (1.2.2)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.2.2)
|
||||
kaminari-activerecord (= 1.2.2)
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-actionview (1.2.2)
|
||||
actionview
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-activerecord (1.2.2)
|
||||
activerecord
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-core (1.2.2)
|
||||
loofah (2.15.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.1)
|
||||
mini_mime (>= 0.1.1)
|
||||
marcel (1.0.2)
|
||||
matrix (0.4.2)
|
||||
method_source (1.0.0)
|
||||
mini_mime (1.1.2)
|
||||
mini_portile2 (2.8.4)
|
||||
minitest (5.15.0)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.3)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
parallel (1.22.1)
|
||||
parser (3.1.1.0)
|
||||
ast (~> 2.4.1)
|
||||
pry (0.14.1)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
pry-rails (0.3.9)
|
||||
pry (>= 0.10.4)
|
||||
public_suffix (4.0.6)
|
||||
puma (5.6.2)
|
||||
nio4r (~> 2.0)
|
||||
racc (1.6.0)
|
||||
rack (2.2.3)
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rails (6.1.5)
|
||||
actioncable (= 6.1.5)
|
||||
actionmailbox (= 6.1.5)
|
||||
actionmailer (= 6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
actiontext (= 6.1.5)
|
||||
actionview (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activemodel (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activestorage (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 6.1.5)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.4.2)
|
||||
loofah (~> 2.3)
|
||||
railties (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
method_source
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
ransack (2.6.0)
|
||||
activerecord (>= 6.0.4)
|
||||
activesupport (>= 6.0.4)
|
||||
i18n
|
||||
regexp_parser (2.2.1)
|
||||
responders (3.0.1)
|
||||
actionpack (>= 5.0)
|
||||
railties (>= 5.0)
|
||||
rexml (3.2.5)
|
||||
rspec-core (3.11.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-expectations (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-mocks (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-rails (5.1.1)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rspec-core (~> 3.10)
|
||||
rspec-expectations (~> 3.10)
|
||||
rspec-mocks (~> 3.10)
|
||||
rspec-support (~> 3.10)
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.11.0)
|
||||
rspec_junit_formatter (0.5.1)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rubocop (1.26.1)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.1.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.16.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.16.0)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-packaging (0.5.1)
|
||||
rubocop (>= 0.89, < 2.0)
|
||||
rubocop-performance (1.13.3)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-ast (>= 0.4.0)
|
||||
rubocop-rails (2.14.2)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-rspec (2.9.0)
|
||||
rubocop (~> 1.19)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
ruby_parser (3.18.1)
|
||||
sexp_processor (~> 4.16)
|
||||
sassc (2.4.0)
|
||||
ffi (~> 1.9)
|
||||
sexp_processor (4.16.0)
|
||||
sprockets (4.0.3)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.4.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
sprockets (>= 3.0.0)
|
||||
sqlite3 (1.4.2)
|
||||
thor (1.2.1)
|
||||
tzinfo (2.0.4)
|
||||
concurrent-ruby (~> 1.0)
|
||||
unicode-display_width (2.1.0)
|
||||
websocket-driver (0.7.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
xpath (3.2.0)
|
||||
nokogiri (~> 1.8)
|
||||
zeitwerk (2.5.4)
|
||||
|
||||
PLATFORMS
|
||||
arm64-darwin-22
|
||||
x86_64-darwin-21
|
||||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
activeadmin
|
||||
activeadmin_quill_editor!
|
||||
appraisal (~> 2.4)
|
||||
capybara
|
||||
cuprite
|
||||
fasterer
|
||||
pry-rails
|
||||
puma
|
||||
rails (~> 6.1.0)
|
||||
rspec-rails
|
||||
rspec-retry
|
||||
rspec_junit_formatter
|
||||
rubocop
|
||||
rubocop-packaging
|
||||
rubocop-performance
|
||||
rubocop-rails
|
||||
rubocop-rspec
|
||||
sassc
|
||||
sqlite3
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.8
|
||||
@@ -1,26 +0,0 @@
|
||||
# This file was generated by Appraisal
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "activeadmin", "~> 2.9.0"
|
||||
gem "rails", "~> 6.1.0"
|
||||
|
||||
group :development, :test do
|
||||
gem "puma"
|
||||
gem "sassc"
|
||||
gem "sqlite3"
|
||||
gem "capybara"
|
||||
gem "cuprite"
|
||||
gem "rspec_junit_formatter"
|
||||
gem "rspec-rails"
|
||||
gem "rspec-retry"
|
||||
gem "fasterer"
|
||||
gem "rubocop"
|
||||
gem "rubocop-packaging"
|
||||
gem "rubocop-performance"
|
||||
gem "rubocop-rails"
|
||||
gem "rubocop-rspec"
|
||||
gem "pry-rails"
|
||||
end
|
||||
|
||||
gemspec path: "../"
|
||||
@@ -1,315 +0,0 @@
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
activeadmin_quill_editor (1.1.0)
|
||||
activeadmin (>= 2.0, < 4)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actioncable (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activestorage (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
mail (>= 2.7.1)
|
||||
actionmailer (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
actionview (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (6.1.5)
|
||||
actionview (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
rack (~> 2.0, >= 2.0.9)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actiontext (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activestorage (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activeadmin (2.9.0)
|
||||
arbre (~> 1.2, >= 1.2.1)
|
||||
formtastic (>= 3.1, < 5.0)
|
||||
formtastic_i18n (~> 0.4)
|
||||
inherited_resources (~> 1.7)
|
||||
jquery-rails (~> 4.2)
|
||||
kaminari (~> 1.0, >= 1.2.1)
|
||||
railties (>= 5.2, < 6.2)
|
||||
ransack (~> 2.1, >= 2.1.1)
|
||||
activejob (6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
activerecord (6.1.5)
|
||||
activemodel (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
activestorage (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
marcel (~> 1.0)
|
||||
mini_mime (>= 1.1.0)
|
||||
activesupport (6.1.5)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
zeitwerk (~> 2.3)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
appraisal (2.4.1)
|
||||
bundler
|
||||
rake
|
||||
thor (>= 0.14.0)
|
||||
arbre (1.5.0)
|
||||
activesupport (>= 3.0.0, < 7.1)
|
||||
ruby2_keywords (>= 0.0.2, < 1.0)
|
||||
ast (2.4.2)
|
||||
builder (3.2.4)
|
||||
capybara (3.36.0)
|
||||
addressable
|
||||
matrix
|
||||
mini_mime (>= 0.1.3)
|
||||
nokogiri (~> 1.8)
|
||||
rack (>= 1.6.0)
|
||||
rack-test (>= 0.6.3)
|
||||
regexp_parser (>= 1.5, < 3.0)
|
||||
xpath (~> 3.2)
|
||||
cliver (0.3.2)
|
||||
coderay (1.1.3)
|
||||
colorize (0.8.1)
|
||||
concurrent-ruby (1.1.10)
|
||||
crass (1.0.6)
|
||||
cuprite (0.13)
|
||||
capybara (>= 2.1, < 4)
|
||||
ferrum (~> 0.11.0)
|
||||
diff-lcs (1.5.0)
|
||||
erubi (1.10.0)
|
||||
fasterer (0.9.0)
|
||||
colorize (~> 0.7)
|
||||
ruby_parser (>= 3.14.1)
|
||||
ferrum (0.11)
|
||||
addressable (~> 2.5)
|
||||
cliver (~> 0.3)
|
||||
concurrent-ruby (~> 1.1)
|
||||
websocket-driver (>= 0.6, < 0.8)
|
||||
ffi (1.15.5)
|
||||
formtastic (4.0.0)
|
||||
actionpack (>= 5.2.0)
|
||||
formtastic_i18n (0.7.0)
|
||||
globalid (1.0.0)
|
||||
activesupport (>= 5.0)
|
||||
has_scope (0.8.0)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
i18n (1.10.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
inherited_resources (1.13.1)
|
||||
actionpack (>= 5.2, < 7.1)
|
||||
has_scope (~> 0.6)
|
||||
railties (>= 5.2, < 7.1)
|
||||
responders (>= 2, < 4)
|
||||
jquery-rails (4.4.0)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
kaminari (1.2.2)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.2.2)
|
||||
kaminari-activerecord (= 1.2.2)
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-actionview (1.2.2)
|
||||
actionview
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-activerecord (1.2.2)
|
||||
activerecord
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-core (1.2.2)
|
||||
loofah (2.15.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.1)
|
||||
mini_mime (>= 0.1.1)
|
||||
marcel (1.0.2)
|
||||
matrix (0.4.2)
|
||||
method_source (1.0.0)
|
||||
mini_mime (1.1.2)
|
||||
mini_portile2 (2.8.4)
|
||||
minitest (5.15.0)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.3)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.13.3-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
parallel (1.22.1)
|
||||
parser (3.1.1.0)
|
||||
ast (~> 2.4.1)
|
||||
pry (0.14.1)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
pry-rails (0.3.9)
|
||||
pry (>= 0.10.4)
|
||||
public_suffix (4.0.6)
|
||||
puma (5.6.2)
|
||||
nio4r (~> 2.0)
|
||||
racc (1.6.0)
|
||||
rack (2.2.3)
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rails (6.1.5)
|
||||
actioncable (= 6.1.5)
|
||||
actionmailbox (= 6.1.5)
|
||||
actionmailer (= 6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
actiontext (= 6.1.5)
|
||||
actionview (= 6.1.5)
|
||||
activejob (= 6.1.5)
|
||||
activemodel (= 6.1.5)
|
||||
activerecord (= 6.1.5)
|
||||
activestorage (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 6.1.5)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.4.2)
|
||||
loofah (~> 2.3)
|
||||
railties (6.1.5)
|
||||
actionpack (= 6.1.5)
|
||||
activesupport (= 6.1.5)
|
||||
method_source
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
ransack (2.6.0)
|
||||
activerecord (>= 6.0.4)
|
||||
activesupport (>= 6.0.4)
|
||||
i18n
|
||||
regexp_parser (2.2.1)
|
||||
responders (3.0.1)
|
||||
actionpack (>= 5.0)
|
||||
railties (>= 5.0)
|
||||
rexml (3.2.5)
|
||||
rspec-core (3.11.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-expectations (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-mocks (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-rails (5.1.1)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rspec-core (~> 3.10)
|
||||
rspec-expectations (~> 3.10)
|
||||
rspec-mocks (~> 3.10)
|
||||
rspec-support (~> 3.10)
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.11.0)
|
||||
rspec_junit_formatter (0.5.1)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rubocop (1.26.1)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.1.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.16.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.16.0)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-packaging (0.5.1)
|
||||
rubocop (>= 0.89, < 2.0)
|
||||
rubocop-performance (1.13.3)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-ast (>= 0.4.0)
|
||||
rubocop-rails (2.14.2)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-rspec (2.9.0)
|
||||
rubocop (~> 1.19)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
ruby_parser (3.18.1)
|
||||
sexp_processor (~> 4.16)
|
||||
sassc (2.4.0)
|
||||
ffi (~> 1.9)
|
||||
sexp_processor (4.16.0)
|
||||
sprockets (4.0.3)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.4.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
sprockets (>= 3.0.0)
|
||||
sqlite3 (1.4.2)
|
||||
thor (1.2.1)
|
||||
tzinfo (2.0.4)
|
||||
concurrent-ruby (~> 1.0)
|
||||
unicode-display_width (2.1.0)
|
||||
websocket-driver (0.7.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
xpath (3.2.0)
|
||||
nokogiri (~> 1.8)
|
||||
zeitwerk (2.5.4)
|
||||
|
||||
PLATFORMS
|
||||
arm64-darwin-22
|
||||
x86_64-darwin-21
|
||||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
activeadmin (~> 2.9.0)
|
||||
activeadmin_quill_editor!
|
||||
appraisal (~> 2.4)
|
||||
capybara
|
||||
cuprite
|
||||
fasterer
|
||||
pry-rails
|
||||
puma
|
||||
rails (~> 6.1.0)
|
||||
rspec-rails
|
||||
rspec-retry
|
||||
rspec_junit_formatter
|
||||
rubocop
|
||||
rubocop-packaging
|
||||
rubocop-performance
|
||||
rubocop-rails
|
||||
rubocop-rspec
|
||||
sassc
|
||||
sqlite3
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.8
|
||||
@@ -1,27 +0,0 @@
|
||||
# This file was generated by Appraisal
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "activeadmin"
|
||||
gem "rails", "~> 7.0.0"
|
||||
gem "sprockets-rails"
|
||||
|
||||
group :development, :test do
|
||||
gem "puma"
|
||||
gem "sassc"
|
||||
gem "sqlite3"
|
||||
gem "capybara"
|
||||
gem "cuprite"
|
||||
gem "rspec_junit_formatter"
|
||||
gem "rspec-rails"
|
||||
gem "rspec-retry"
|
||||
gem "fasterer"
|
||||
gem "rubocop"
|
||||
gem "rubocop-packaging"
|
||||
gem "rubocop-performance"
|
||||
gem "rubocop-rails"
|
||||
gem "rubocop-rspec"
|
||||
gem "pry-rails"
|
||||
end
|
||||
|
||||
gemspec path: "../"
|
||||
@@ -1,347 +0,0 @@
|
||||
PATH
|
||||
remote: ..
|
||||
specs:
|
||||
activeadmin_quill_editor (1.1.0)
|
||||
activeadmin (>= 2.0, < 4)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actioncable (7.0.7)
|
||||
actionpack (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
nio4r (~> 2.0)
|
||||
websocket-driver (>= 0.6.1)
|
||||
actionmailbox (7.0.7)
|
||||
actionpack (= 7.0.7)
|
||||
activejob (= 7.0.7)
|
||||
activerecord (= 7.0.7)
|
||||
activestorage (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
mail (>= 2.7.1)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
actionmailer (7.0.7)
|
||||
actionpack (= 7.0.7)
|
||||
actionview (= 7.0.7)
|
||||
activejob (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (7.0.7)
|
||||
actionview (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
rack (~> 2.0, >= 2.2.4)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actiontext (7.0.7)
|
||||
actionpack (= 7.0.7)
|
||||
activerecord (= 7.0.7)
|
||||
activestorage (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
globalid (>= 0.6.0)
|
||||
nokogiri (>= 1.8.5)
|
||||
actionview (7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
activeadmin (3.0.0)
|
||||
arbre (~> 1.2, >= 1.2.1)
|
||||
formtastic (>= 3.1, < 5.0)
|
||||
formtastic_i18n (~> 0.4)
|
||||
inherited_resources (~> 1.7)
|
||||
jquery-rails (~> 4.2)
|
||||
kaminari (~> 1.0, >= 1.2.1)
|
||||
railties (>= 6.1, < 7.1)
|
||||
ransack (>= 4.0, < 5)
|
||||
activejob (7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
activerecord (7.0.7)
|
||||
activemodel (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
activestorage (7.0.7)
|
||||
actionpack (= 7.0.7)
|
||||
activejob (= 7.0.7)
|
||||
activerecord (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
marcel (~> 1.0)
|
||||
mini_mime (>= 1.1.0)
|
||||
activesupport (7.0.7)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.5)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
appraisal (2.5.0)
|
||||
bundler
|
||||
rake
|
||||
thor (>= 0.14.0)
|
||||
arbre (1.6.0)
|
||||
activesupport (>= 3.0.0, < 7.1)
|
||||
ruby2_keywords (>= 0.0.2, < 1.0)
|
||||
ast (2.4.2)
|
||||
base64 (0.1.1)
|
||||
builder (3.2.4)
|
||||
capybara (3.39.2)
|
||||
addressable
|
||||
matrix
|
||||
mini_mime (>= 0.1.3)
|
||||
nokogiri (~> 1.8)
|
||||
rack (>= 1.6.0)
|
||||
rack-test (>= 0.6.3)
|
||||
regexp_parser (>= 1.5, < 3.0)
|
||||
xpath (~> 3.2)
|
||||
coderay (1.1.3)
|
||||
colorize (0.8.1)
|
||||
concurrent-ruby (1.2.2)
|
||||
crass (1.0.6)
|
||||
cuprite (0.14.3)
|
||||
capybara (~> 3.0)
|
||||
ferrum (~> 0.13.0)
|
||||
date (3.3.3)
|
||||
diff-lcs (1.5.0)
|
||||
erubi (1.12.0)
|
||||
fasterer (0.10.1)
|
||||
colorize (~> 0.7)
|
||||
ruby_parser (>= 3.19.1)
|
||||
ferrum (0.13)
|
||||
addressable (~> 2.5)
|
||||
concurrent-ruby (~> 1.1)
|
||||
webrick (~> 1.7)
|
||||
websocket-driver (>= 0.6, < 0.8)
|
||||
ffi (1.15.5)
|
||||
formtastic (4.0.0)
|
||||
actionpack (>= 5.2.0)
|
||||
formtastic_i18n (0.7.0)
|
||||
globalid (1.1.0)
|
||||
activesupport (>= 5.0)
|
||||
has_scope (0.8.1)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
i18n (1.14.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
inherited_resources (1.13.1)
|
||||
actionpack (>= 5.2, < 7.1)
|
||||
has_scope (~> 0.6)
|
||||
railties (>= 5.2, < 7.1)
|
||||
responders (>= 2, < 4)
|
||||
jquery-rails (4.6.0)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
json (2.6.3)
|
||||
kaminari (1.2.2)
|
||||
activesupport (>= 4.1.0)
|
||||
kaminari-actionview (= 1.2.2)
|
||||
kaminari-activerecord (= 1.2.2)
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-actionview (1.2.2)
|
||||
actionview
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-activerecord (1.2.2)
|
||||
activerecord
|
||||
kaminari-core (= 1.2.2)
|
||||
kaminari-core (1.2.2)
|
||||
language_server-protocol (3.17.0.3)
|
||||
loofah (2.21.3)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
mail (2.8.1)
|
||||
mini_mime (>= 0.1.1)
|
||||
net-imap
|
||||
net-pop
|
||||
net-smtp
|
||||
marcel (1.0.2)
|
||||
matrix (0.4.2)
|
||||
method_source (1.0.0)
|
||||
mini_mime (1.1.5)
|
||||
minitest (5.19.0)
|
||||
net-imap (0.3.7)
|
||||
date
|
||||
net-protocol
|
||||
net-pop (0.1.2)
|
||||
net-protocol
|
||||
net-protocol (0.2.1)
|
||||
timeout
|
||||
net-smtp (0.3.3)
|
||||
net-protocol
|
||||
nio4r (2.5.9)
|
||||
nokogiri (1.15.4-arm64-darwin)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.15.4-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
parallel (1.23.0)
|
||||
parser (3.2.2.3)
|
||||
ast (~> 2.4.1)
|
||||
racc
|
||||
pry (0.14.2)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
pry-rails (0.3.9)
|
||||
pry (>= 0.10.4)
|
||||
public_suffix (5.0.3)
|
||||
puma (6.3.1)
|
||||
nio4r (~> 2.0)
|
||||
racc (1.7.1)
|
||||
rack (2.2.8)
|
||||
rack-test (2.1.0)
|
||||
rack (>= 1.3)
|
||||
rails (7.0.7)
|
||||
actioncable (= 7.0.7)
|
||||
actionmailbox (= 7.0.7)
|
||||
actionmailer (= 7.0.7)
|
||||
actionpack (= 7.0.7)
|
||||
actiontext (= 7.0.7)
|
||||
actionview (= 7.0.7)
|
||||
activejob (= 7.0.7)
|
||||
activemodel (= 7.0.7)
|
||||
activerecord (= 7.0.7)
|
||||
activestorage (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
bundler (>= 1.15.0)
|
||||
railties (= 7.0.7)
|
||||
rails-dom-testing (2.2.0)
|
||||
activesupport (>= 5.0.0)
|
||||
minitest
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.6.0)
|
||||
loofah (~> 2.21)
|
||||
nokogiri (~> 1.14)
|
||||
railties (7.0.7)
|
||||
actionpack (= 7.0.7)
|
||||
activesupport (= 7.0.7)
|
||||
method_source
|
||||
rake (>= 12.2)
|
||||
thor (~> 1.0)
|
||||
zeitwerk (~> 2.5)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
ransack (4.0.0)
|
||||
activerecord (>= 6.1.5)
|
||||
activesupport (>= 6.1.5)
|
||||
i18n
|
||||
regexp_parser (2.8.1)
|
||||
responders (3.1.0)
|
||||
actionpack (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rexml (3.2.6)
|
||||
rspec-core (3.12.2)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-expectations (3.12.3)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-mocks (3.12.6)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.12.0)
|
||||
rspec-rails (6.0.3)
|
||||
actionpack (>= 6.1)
|
||||
activesupport (>= 6.1)
|
||||
railties (>= 6.1)
|
||||
rspec-core (~> 3.12)
|
||||
rspec-expectations (~> 3.12)
|
||||
rspec-mocks (~> 3.12)
|
||||
rspec-support (~> 3.12)
|
||||
rspec-retry (0.6.2)
|
||||
rspec-core (> 3.3)
|
||||
rspec-support (3.12.1)
|
||||
rspec_junit_formatter (0.6.0)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rubocop (1.56.0)
|
||||
base64 (~> 0.1.1)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (>= 3.17.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.2.2.3)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml (>= 3.2.5, < 4.0)
|
||||
rubocop-ast (>= 1.28.1, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 2.4.0, < 3.0)
|
||||
rubocop-ast (1.29.0)
|
||||
parser (>= 3.2.1.0)
|
||||
rubocop-capybara (2.18.0)
|
||||
rubocop (~> 1.41)
|
||||
rubocop-factory_bot (2.23.1)
|
||||
rubocop (~> 1.33)
|
||||
rubocop-packaging (0.5.2)
|
||||
rubocop (>= 1.33, < 2.0)
|
||||
rubocop-performance (1.19.0)
|
||||
rubocop (>= 1.7.0, < 2.0)
|
||||
rubocop-ast (>= 0.4.0)
|
||||
rubocop-rails (2.20.2)
|
||||
activesupport (>= 4.2.0)
|
||||
rack (>= 1.1)
|
||||
rubocop (>= 1.33.0, < 2.0)
|
||||
rubocop-rspec (2.23.2)
|
||||
rubocop (~> 1.33)
|
||||
rubocop-capybara (~> 2.17)
|
||||
rubocop-factory_bot (~> 2.22)
|
||||
ruby-progressbar (1.13.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
ruby_parser (3.20.3)
|
||||
sexp_processor (~> 4.16)
|
||||
sassc (2.4.0)
|
||||
ffi (~> 1.9)
|
||||
sexp_processor (4.17.0)
|
||||
sprockets (4.2.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (>= 2.2.4, < 4)
|
||||
sprockets-rails (3.4.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
sprockets (>= 3.0.0)
|
||||
sqlite3 (1.6.3-arm64-darwin)
|
||||
sqlite3 (1.6.3-x86_64-linux)
|
||||
thor (1.2.2)
|
||||
timeout (0.4.0)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
unicode-display_width (2.4.2)
|
||||
webrick (1.8.1)
|
||||
websocket-driver (0.7.6)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.5)
|
||||
xpath (3.2.0)
|
||||
nokogiri (~> 1.8)
|
||||
zeitwerk (2.6.11)
|
||||
|
||||
PLATFORMS
|
||||
arm64-darwin-22
|
||||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
activeadmin
|
||||
activeadmin_quill_editor!
|
||||
appraisal (~> 2.4)
|
||||
capybara
|
||||
cuprite
|
||||
fasterer
|
||||
pry-rails
|
||||
puma
|
||||
rails (~> 7.0.0)
|
||||
rspec-rails
|
||||
rspec-retry
|
||||
rspec_junit_formatter
|
||||
rubocop
|
||||
rubocop-packaging
|
||||
rubocop-performance
|
||||
rubocop-rails
|
||||
rubocop-rspec
|
||||
sassc
|
||||
sprockets-rails
|
||||
sqlite3
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.8
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
module ActiveAdmin
|
||||
module QuillEditor
|
||||
VERSION = '1.1.0'
|
||||
QUILL_VERSION = '1.3.7'
|
||||
VERSION = '2.0.0'
|
||||
QUILL_VERSION = '2.0.3'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "activeadmin_quill_editor",
|
||||
"version": "1.1.0",
|
||||
"version": "2.0.0",
|
||||
"description": "Quill Editor for ActiveAdmin",
|
||||
"author": "Mattia Roccoberton <mat@blocknot.es>",
|
||||
"license": "MIT",
|
||||
@@ -9,5 +9,10 @@
|
||||
"files": [
|
||||
"app/**/*",
|
||||
"index.js"
|
||||
]
|
||||
],
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.22.0",
|
||||
"eslint": "^9.22.0",
|
||||
"globals": "^16.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
ruby-2.7.1
|
||||
@@ -1 +0,0 @@
|
||||
ruby 2.6.6
|
||||
@@ -3,6 +3,12 @@
|
||||
ActiveAdmin.register Post do
|
||||
permit_params :author_id, :title, :summary, :description, :category, :dt, :position, :published, tag_ids: []
|
||||
|
||||
member_action :upload, method: [:post] do
|
||||
result = { success: resource.images.attach(params[:file_upload]) }
|
||||
result[:url] = url_for(resource.images.last) if result[:success]
|
||||
render json: result
|
||||
end
|
||||
|
||||
index do
|
||||
selectable_column
|
||||
id_column
|
||||
@@ -44,7 +50,12 @@ ActiveAdmin.register Post do
|
||||
f.input :author
|
||||
f.input :title
|
||||
f.input :summary, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: toolbar } } } }
|
||||
f.input :description, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: toolbar } } } }
|
||||
if object.new_record?
|
||||
f.input :description, as: :quill_editor # using default options
|
||||
else
|
||||
plugin_opts = { image_uploader: { server_url: upload_admin_post_path(object.id), field_name: 'file_upload' } }
|
||||
f.input :description, as: :quill_editor, input_html: { data: { plugins: plugin_opts } }
|
||||
end
|
||||
f.input :category
|
||||
f.input :dt
|
||||
f.input :position
|
||||
|
||||
5
spec/dummy/app/admin/profiles.rb
Обычный файл
5
spec/dummy/app/admin/profiles.rb
Обычный файл
@@ -0,0 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
ActiveAdmin.register Profile do
|
||||
permit_params :author_id, :description
|
||||
end
|
||||
@@ -1,4 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
ActiveAdmin.register Tag do
|
||||
permit_params :name
|
||||
end
|
||||
|
||||
@@ -2,3 +2,5 @@
|
||||
|
||||
//= require activeadmin/quill_editor/quill
|
||||
//= require activeadmin/quill_editor_input
|
||||
|
||||
//= require activeadmin/quill.imageUploader.min
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
@import 'activeadmin/quill_editor/quill.snow';
|
||||
@import 'activeadmin/quill_editor_input';
|
||||
|
||||
@import 'activeadmin/quill.imageUploader.min';
|
||||
|
||||
// Overriding any non-variable SASS must be done after the fact.
|
||||
// For example, to change the default status-tag color:
|
||||
//
|
||||
|
||||
@@ -24,7 +24,9 @@ class Author < ApplicationRecord
|
||||
"#{name} (#{age})"
|
||||
end
|
||||
|
||||
def self.ransackable_attributes(auth_object = nil)
|
||||
%w[age created_at email id name updated_at]
|
||||
class << self
|
||||
def ransackable_attributes(_auth_object = nil)
|
||||
%w[age created_at email id name updated_at]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Post < ApplicationRecord
|
||||
enum state: %i[available unavailable arriving]
|
||||
|
||||
belongs_to :author, inverse_of: :posts, autosave: true
|
||||
|
||||
has_one :author_profile, through: :author, source: :profile
|
||||
@@ -27,11 +25,13 @@ class Post < ApplicationRecord
|
||||
title.upcase
|
||||
end
|
||||
|
||||
def self.ransackable_attributes(auth_object = nil)
|
||||
%w[author_id category created_at description dt id position published summary title updated_at]
|
||||
end
|
||||
class << self
|
||||
def ransackable_associations(_auth_object = nil)
|
||||
%w[author author_profile post_tags tags images_attachments images_blobs]
|
||||
end
|
||||
|
||||
def self.ransackable_associations(auth_object = nil)
|
||||
%w[author author_profile images_attachments images_blobs post_tags tags]
|
||||
def ransackable_attributes(_auth_object = nil)
|
||||
%w[author_id category created_at description dt id position published title summary updated_at]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,7 +7,9 @@ class PostTag < ApplicationRecord
|
||||
validates :post, presence: true
|
||||
validates :tag, presence: true
|
||||
|
||||
def self.ransackable_attributes(auth_object = nil)
|
||||
%w[created_at id post_id tag_id updated_at]
|
||||
class << self
|
||||
def ransackable_attributes(auth_object = nil)
|
||||
%w[created_at id post_id tag_id updated_at]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,7 +7,13 @@ class Profile < ApplicationRecord
|
||||
description
|
||||
end
|
||||
|
||||
def self.ransackable_attributes(auth_object = nil)
|
||||
%w[author_id created_at description id updated_at]
|
||||
class << self
|
||||
def ransackable_associations(_auth_object = nil)
|
||||
%w[author]
|
||||
end
|
||||
|
||||
def ransackable_attributes(_auth_object = nil)
|
||||
%w[author_id created_at description id updated_at]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,4 +3,14 @@
|
||||
class Tag < ApplicationRecord
|
||||
has_many :post_tags, inverse_of: :tag, dependent: :destroy
|
||||
has_many :posts, through: :post_tags
|
||||
|
||||
class << self
|
||||
def ransackable_associations(auth_object = nil)
|
||||
%w[post_tags posts]
|
||||
end
|
||||
|
||||
def ransackable_attributes(auth_object = nil)
|
||||
%w[created_at id id_value name updated_at]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
require_relative 'boot'
|
||||
|
||||
require 'rails/all'
|
||||
require 'sprockets/railtie'
|
||||
|
||||
Bundler.require(*Rails.groups)
|
||||
|
||||
module Dummy
|
||||
class Application < Rails::Application
|
||||
# Initialize configuration defaults for originally generated Rails version.
|
||||
config.load_defaults 6.0 if Rails::VERSION::MAJOR == 6
|
||||
config.load_defaults Rails::VERSION::STRING.to_f
|
||||
|
||||
# Settings in config/environments/* take precedence over those specified here.
|
||||
# Application configuration can go into files in config/initializers
|
||||
# -- all .rb files in that directory are automatically loaded after loading
|
||||
# the framework and any gems in your application.
|
||||
config.active_support.deprecation = :raise
|
||||
|
||||
###
|
||||
if Gem::Version.new(Rails.version) < Gem::Version.new('7.1')
|
||||
config.active_record.legacy_connection_handling = false
|
||||
end
|
||||
|
||||
config.active_record.legacy_connection_handling = false if Rails::VERSION::MAJOR > 6
|
||||
if Gem::Version.new(Rails.version) > Gem::Version.new('7.0')
|
||||
config.before_configuration do
|
||||
ActiveSupport::Cache.format_version = 7.0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -3,6 +3,11 @@ default: &default
|
||||
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
||||
timeout: 5000
|
||||
|
||||
development:
|
||||
<<: *default
|
||||
database: db/development.sqlite3
|
||||
schema_dump: schema-dev.rb
|
||||
|
||||
test:
|
||||
<<: *default
|
||||
database: db/test.sqlite3
|
||||
|
||||
@@ -59,4 +59,8 @@ Rails.application.configure do
|
||||
# Use an evented file watcher to asynchronously detect changes in source code,
|
||||
# routes, locales, etc. This feature depends on the listen gem.
|
||||
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
|
||||
|
||||
###
|
||||
|
||||
config.active_support.to_time_preserves_timezone = :zone if Gem::Version.new(Rails.version) >= Gem::Version.new('8.0')
|
||||
end
|
||||
|
||||
@@ -1,112 +0,0 @@
|
||||
Rails.application.configure do
|
||||
# Settings specified here will take precedence over those in config/application.rb.
|
||||
|
||||
# Code is not reloaded between requests.
|
||||
config.cache_classes = true
|
||||
|
||||
# Eager load code on boot. This eager loads most of Rails and
|
||||
# your application in memory, allowing both threaded web servers
|
||||
# and those relying on copy on write to perform better.
|
||||
# Rake tasks automatically ignore this option for performance.
|
||||
config.eager_load = true
|
||||
|
||||
# Full error reports are disabled and caching is turned on.
|
||||
config.consider_all_requests_local = false
|
||||
config.action_controller.perform_caching = true
|
||||
|
||||
# Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
|
||||
# or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
|
||||
# config.require_master_key = true
|
||||
|
||||
# Disable serving static files from the `/public` folder by default since
|
||||
# Apache or NGINX already handles this.
|
||||
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
|
||||
|
||||
# Compress CSS using a preprocessor.
|
||||
# config.assets.css_compressor = :sass
|
||||
|
||||
# Do not fallback to assets pipeline if a precompiled asset is missed.
|
||||
config.assets.compile = false
|
||||
|
||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
||||
# config.action_controller.asset_host = 'http://assets.example.com'
|
||||
|
||||
# Specifies the header that your server uses for sending files.
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
|
||||
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
|
||||
|
||||
# Store uploaded files on the local file system (see config/storage.yml for options).
|
||||
config.active_storage.service = :local
|
||||
|
||||
# Mount Action Cable outside main process or domain.
|
||||
# config.action_cable.mount_path = nil
|
||||
# config.action_cable.url = 'wss://example.com/cable'
|
||||
# config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
|
||||
|
||||
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
||||
# config.force_ssl = true
|
||||
|
||||
# Use the lowest log level to ensure availability of diagnostic information
|
||||
# when problems arise.
|
||||
config.log_level = :debug
|
||||
|
||||
# Prepend all log lines with the following tags.
|
||||
config.log_tags = [ :request_id ]
|
||||
|
||||
# Use a different cache store in production.
|
||||
# config.cache_store = :mem_cache_store
|
||||
|
||||
# Use a real queuing backend for Active Job (and separate queues per environment).
|
||||
# config.active_job.queue_adapter = :resque
|
||||
# config.active_job.queue_name_prefix = "dummy_production"
|
||||
|
||||
# config.action_mailer.perform_caching = false
|
||||
|
||||
# Ignore bad email addresses and do not raise email delivery errors.
|
||||
# Set this to true and configure the email server for immediate delivery to raise delivery errors.
|
||||
# config.action_mailer.raise_delivery_errors = false
|
||||
|
||||
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
||||
# the I18n.default_locale when a translation cannot be found).
|
||||
config.i18n.fallbacks = true
|
||||
|
||||
# Send deprecation notices to registered listeners.
|
||||
config.active_support.deprecation = :notify
|
||||
|
||||
# Use default logging formatter so that PID and timestamp are not suppressed.
|
||||
config.log_formatter = ::Logger::Formatter.new
|
||||
|
||||
# Use a different logger for distributed setups.
|
||||
# require 'syslog/logger'
|
||||
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
|
||||
|
||||
if ENV["RAILS_LOG_TO_STDOUT"].present?
|
||||
logger = ActiveSupport::Logger.new(STDOUT)
|
||||
logger.formatter = config.log_formatter
|
||||
config.logger = ActiveSupport::TaggedLogging.new(logger)
|
||||
end
|
||||
|
||||
# Do not dump schema after migrations.
|
||||
config.active_record.dump_schema_after_migration = false
|
||||
|
||||
# Inserts middleware to perform automatic connection switching.
|
||||
# The `database_selector` hash is used to pass options to the DatabaseSelector
|
||||
# middleware. The `delay` is used to determine how long to wait after a write
|
||||
# to send a subsequent read to the primary.
|
||||
#
|
||||
# The `database_resolver` class is used by the middleware to determine which
|
||||
# database is appropriate to use based on the time delay.
|
||||
#
|
||||
# The `database_resolver_context` class is used by the middleware to set
|
||||
# timestamps for the last write to the primary. The resolver uses the context
|
||||
# class timestamps to determine how long to wait before reading from the
|
||||
# replica.
|
||||
#
|
||||
# By default Rails will store a last write timestamp in the session. The
|
||||
# DatabaseSelector middleware is designed as such you can define your own
|
||||
# strategy for connection switching and pass that into the middleware through
|
||||
# these configuration options.
|
||||
# config.active_record.database_selector = { delay: 2.seconds }
|
||||
# config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
|
||||
# config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
|
||||
end
|
||||
@@ -26,7 +26,7 @@ Rails.application.configure do
|
||||
config.cache_store = :null_store
|
||||
|
||||
# Raise exceptions instead of rendering exception templates.
|
||||
config.action_dispatch.show_exceptions = false
|
||||
config.action_dispatch.show_exceptions = :none
|
||||
|
||||
# Disable request forgery protection in test environment.
|
||||
config.action_controller.allow_forgery_protection = false
|
||||
@@ -46,4 +46,8 @@ Rails.application.configure do
|
||||
|
||||
# Raises error for missing translations.
|
||||
# config.action_view.raise_on_missing_translations = true
|
||||
|
||||
###
|
||||
|
||||
config.active_support.to_time_preserves_timezone = :zone if Gem::Version.new(Rails.version) >= Gem::Version.new('8.0')
|
||||
end
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
ActiveSupport::Reloader.to_prepare do
|
||||
Rails.application.reloader.to_prepare do
|
||||
ActiveStorage::Attachment.class_eval do
|
||||
def self.ransackable_attributes(auth_object = nil)
|
||||
%w[blob_id created_at id name record_id record_type]
|
||||
class << self
|
||||
def ransackable_attributes(auth_object = nil)
|
||||
%w[blob_id created_at id name record_id record_type]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# This migration comes from active_storage (originally 20170806125915)
|
||||
class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
create_table :active_storage_blobs do |t|
|
||||
t.string :key, null: false
|
||||
t.string :filename, null: false
|
||||
t.string :content_type
|
||||
t.text :metadata
|
||||
t.bigint :byte_size, null: false
|
||||
t.string :checksum, null: false
|
||||
t.datetime :created_at, null: false
|
||||
|
||||
t.index [ :key ], unique: true
|
||||
end
|
||||
|
||||
create_table :active_storage_attachments do |t|
|
||||
t.string :name, null: false
|
||||
t.references :record, null: false, polymorphic: true, index: false
|
||||
t.references :blob, null: false
|
||||
|
||||
t.datetime :created_at, null: false
|
||||
|
||||
t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
|
||||
t.foreign_key :active_storage_blobs, column: :blob_id
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class CreateActiveAdminComments < ActiveRecord::Migration[6.0]
|
||||
def self.up
|
||||
create_table :active_admin_comments do |t|
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
# frozen_string_literal: true
|
||||
# This migration comes from active_storage (originally 20170806125915)
|
||||
|
||||
class CreateActiveStorageTables < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
# Use Active Record's configured type for primary and foreign keys
|
||||
primary_key_type, foreign_key_type = primary_and_foreign_key_types
|
||||
|
||||
create_table :active_storage_blobs, id: primary_key_type do |t|
|
||||
t.string :key, null: false
|
||||
t.string :filename, null: false
|
||||
t.string :content_type
|
||||
t.text :metadata
|
||||
t.string :service_name, null: false
|
||||
t.bigint :byte_size, null: false
|
||||
t.string :checksum
|
||||
|
||||
if connection.supports_datetime_with_precision?
|
||||
t.datetime :created_at, precision: 6, null: false
|
||||
else
|
||||
t.datetime :created_at, null: false
|
||||
end
|
||||
|
||||
t.index [ :key ], unique: true
|
||||
end
|
||||
|
||||
create_table :active_storage_attachments, id: primary_key_type do |t|
|
||||
t.string :name, null: false
|
||||
t.references :record, null: false, polymorphic: true, index: false, type: foreign_key_type
|
||||
t.references :blob, null: false, type: foreign_key_type
|
||||
|
||||
if connection.supports_datetime_with_precision?
|
||||
t.datetime :created_at, precision: 6, null: false
|
||||
else
|
||||
t.datetime :created_at, null: false
|
||||
end
|
||||
|
||||
t.index [ :record_type, :record_id, :name, :blob_id ], name: :index_active_storage_attachments_uniqueness, unique: true
|
||||
t.foreign_key :active_storage_blobs, column: :blob_id
|
||||
end
|
||||
|
||||
create_table :active_storage_variant_records, id: primary_key_type do |t|
|
||||
t.belongs_to :blob, null: false, index: false, type: foreign_key_type
|
||||
t.string :variation_digest, null: false
|
||||
|
||||
t.index [ :blob_id, :variation_digest ], name: :index_active_storage_variant_records_uniqueness, unique: true
|
||||
t.foreign_key :active_storage_blobs, column: :blob_id
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def primary_and_foreign_key_types
|
||||
config = Rails.configuration.generators
|
||||
setting = config.options[config.orm][:primary_key_type]
|
||||
primary_key_type = setting || :primary_key
|
||||
foreign_key_type = setting || :bigint
|
||||
[ primary_key_type, foreign_key_type ]
|
||||
end
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class CreateAuthors < ActiveRecord::Migration[5.2]
|
||||
class CreateAuthors < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
create_table :authors do |t|
|
||||
t.string :name
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class CreateProfiles < ActiveRecord::Migration[5.2]
|
||||
class CreateProfiles < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
create_table :profiles do |t|
|
||||
t.text :description
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class CreateTags < ActiveRecord::Migration[5.2]
|
||||
class CreateTags < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
create_table :tags do |t|
|
||||
t.string :name
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class CreatePostTags < ActiveRecord::Migration[5.2]
|
||||
class CreatePostTags < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
create_table :post_tags do |t|
|
||||
t.belongs_to :post, foreign_key: true
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class CreatePosts < ActiveRecord::Migration[5.2]
|
||||
class CreatePosts < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
create_table :posts do |t|
|
||||
t.string :title
|
||||
|
||||
@@ -11,16 +11,15 @@
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2018_06_07_053739) do
|
||||
|
||||
create_table "active_admin_comments", force: :cascade do |t|
|
||||
t.string "namespace"
|
||||
t.text "body"
|
||||
t.string "resource_type"
|
||||
t.bigint "resource_id"
|
||||
t.integer "resource_id"
|
||||
t.string "author_type"
|
||||
t.bigint "author_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.integer "author_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id"
|
||||
t.index ["namespace"], name: "index_active_admin_comments_on_namespace"
|
||||
t.index ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id"
|
||||
@@ -29,8 +28,8 @@ ActiveRecord::Schema.define(version: 2018_06_07_053739) do
|
||||
create_table "active_storage_attachments", force: :cascade do |t|
|
||||
t.string "name", null: false
|
||||
t.string "record_type", null: false
|
||||
t.integer "record_id", null: false
|
||||
t.integer "blob_id", null: false
|
||||
t.bigint "record_id", null: false
|
||||
t.bigint "blob_id", null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
|
||||
t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
|
||||
@@ -41,25 +40,32 @@ ActiveRecord::Schema.define(version: 2018_06_07_053739) do
|
||||
t.string "filename", null: false
|
||||
t.string "content_type"
|
||||
t.text "metadata"
|
||||
t.string "service_name", null: false
|
||||
t.bigint "byte_size", null: false
|
||||
t.string "checksum", null: false
|
||||
t.string "checksum"
|
||||
t.datetime "created_at", null: false
|
||||
t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
|
||||
end
|
||||
|
||||
create_table "active_storage_variant_records", force: :cascade do |t|
|
||||
t.bigint "blob_id", null: false
|
||||
t.string "variation_digest", null: false
|
||||
t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
|
||||
end
|
||||
|
||||
create_table "authors", force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.integer "age"
|
||||
t.string "email"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "created_at", precision: nil, null: false
|
||||
t.datetime "updated_at", precision: nil, null: false
|
||||
end
|
||||
|
||||
create_table "post_tags", force: :cascade do |t|
|
||||
t.integer "post_id"
|
||||
t.integer "tag_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "created_at", precision: nil, null: false
|
||||
t.datetime "updated_at", precision: nil, null: false
|
||||
t.index ["post_id"], name: "index_post_tags_on_post_id"
|
||||
t.index ["tag_id"], name: "index_post_tags_on_tag_id"
|
||||
end
|
||||
@@ -70,29 +76,30 @@ ActiveRecord::Schema.define(version: 2018_06_07_053739) do
|
||||
t.text "description"
|
||||
t.integer "author_id"
|
||||
t.string "category"
|
||||
t.datetime "dt"
|
||||
t.datetime "dt", precision: nil
|
||||
t.float "position"
|
||||
t.boolean "published"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "created_at", precision: nil, null: false
|
||||
t.datetime "updated_at", precision: nil, null: false
|
||||
t.index ["author_id"], name: "index_posts_on_author_id"
|
||||
end
|
||||
|
||||
create_table "profiles", force: :cascade do |t|
|
||||
t.text "description"
|
||||
t.integer "author_id"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "created_at", precision: nil, null: false
|
||||
t.datetime "updated_at", precision: nil, null: false
|
||||
t.index ["author_id"], name: "index_profiles_on_author_id"
|
||||
end
|
||||
|
||||
create_table "tags", force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "created_at", precision: nil, null: false
|
||||
t.datetime "updated_at", precision: nil, null: false
|
||||
end
|
||||
|
||||
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
|
||||
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
|
||||
add_foreign_key "post_tags", "posts"
|
||||
add_foreign_key "post_tags", "tags"
|
||||
add_foreign_key "posts", "authors"
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
puts 'Seeds:'
|
||||
|
||||
puts 'Tags...'
|
||||
(11..16).each do |i|
|
||||
Tag.find_or_create_by!(name: "Tag #{i}")
|
||||
end
|
||||
|
||||
puts 'Authors...'
|
||||
(11..20).each do |i|
|
||||
age = 21 + 3 * (i - 10)
|
||||
attrs = { name: "Author #{i}", age: age, email: "some@email#{i}.com" }
|
||||
Author.find_or_create_by!(attrs) do |author|
|
||||
Author.find_or_create_by!(name: "Author #{i}") do |author|
|
||||
author.assign_attributes(attrs)
|
||||
author.profile = Profile.new(description: "Profile description for Author #{i}") if (i % 3).zero?
|
||||
end
|
||||
end
|
||||
|
||||
puts 'Posts...'
|
||||
authors = Author.pluck(:id)
|
||||
tags = Tag.where.not(name: 'A test tag').pluck(:id)
|
||||
(11..40).each do |i|
|
||||
@@ -24,6 +20,8 @@ tags = Tag.where.not(name: 'A test tag').pluck(:id)
|
||||
title: "Post #{i}",
|
||||
author_id: authors.sample,
|
||||
position: rand(100),
|
||||
summary: "<p><em>Summary</em> for post #{i}</p>",
|
||||
description: "<p><strong>Some bold</strong> <em>Some italic</em> <u>Some underline</u> [#{i}]</p>",
|
||||
created_at: Time.now - rand(3600).seconds
|
||||
}
|
||||
attrs[:category] = 'news' if (i % 4).zero?
|
||||
@@ -38,4 +36,4 @@ end
|
||||
Author.find_or_create_by!(name: 'A test author', email: 'aaa@bbb.ccc', age: 30)
|
||||
Tag.find_or_create_by!(name: 'A test tag')
|
||||
|
||||
puts 'done.'
|
||||
puts '> Seeds: done.'
|
||||
|
||||
9
spec/page_objects/admin/authors/edit_page.rb
Обычный файл
9
spec/page_objects/admin/authors/edit_page.rb
Обычный файл
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Admin
|
||||
module Authors
|
||||
class EditPage < BasePage
|
||||
include Capybara::DSL
|
||||
end
|
||||
end
|
||||
end
|
||||
9
spec/page_objects/admin/posts/edit_page.rb
Обычный файл
9
spec/page_objects/admin/posts/edit_page.rb
Обычный файл
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Admin
|
||||
module Posts
|
||||
class EditPage < BasePage
|
||||
include Capybara::DSL
|
||||
end
|
||||
end
|
||||
end
|
||||
12
spec/page_objects/base_object.rb
Обычный файл
12
spec/page_objects/base_object.rb
Обычный файл
@@ -0,0 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class BaseObject
|
||||
include Capybara::DSL
|
||||
|
||||
attr_reader :element, :selector
|
||||
|
||||
def initialize(selector:)
|
||||
@selector = selector
|
||||
@element = find(selector)
|
||||
end
|
||||
end
|
||||
19
spec/page_objects/base_page.rb
Обычный файл
19
spec/page_objects/base_page.rb
Обычный файл
@@ -0,0 +1,19 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class BasePage
|
||||
include Capybara::DSL
|
||||
|
||||
attr_reader :path
|
||||
|
||||
def initialize(path:)
|
||||
@path = path
|
||||
end
|
||||
|
||||
def load
|
||||
visit(path)
|
||||
end
|
||||
|
||||
def lookup_editor(editor_container:)
|
||||
@editor = Shared::QuillEditor.new(editor_container)
|
||||
end
|
||||
end
|
||||
35
spec/page_objects/shared/html_editor.rb
Обычный файл
35
spec/page_objects/shared/html_editor.rb
Обычный файл
@@ -0,0 +1,35 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Shared
|
||||
class HtmlEditor < BaseObject
|
||||
def content_element
|
||||
raise NotImplementedError
|
||||
end
|
||||
|
||||
def clear
|
||||
select_all
|
||||
content_element.send_keys(:delete)
|
||||
self
|
||||
end
|
||||
|
||||
# @return [self]
|
||||
def open_dropdown
|
||||
raise NotImplementedError
|
||||
end
|
||||
|
||||
def select_all
|
||||
content_element.send_keys([:control, "a"])
|
||||
self
|
||||
end
|
||||
|
||||
def toolbar_control(control, ...)
|
||||
send(:"toggle_#{control}", ...)
|
||||
self
|
||||
end
|
||||
|
||||
def <<(content)
|
||||
content_element.send_keys(content)
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
||||
64
spec/page_objects/shared/quill_editor.rb
Обычный файл
64
spec/page_objects/shared/quill_editor.rb
Обычный файл
@@ -0,0 +1,64 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Shared
|
||||
class QuillEditor < HtmlEditor
|
||||
attr_reader :editor_selector, :toolbar_selector
|
||||
|
||||
def initialize(container)
|
||||
@editor_selector = "#{container} .ql-container"
|
||||
@toolbar_selector = "#{container} .ql-toolbar"
|
||||
super(selector: editor_selector)
|
||||
end
|
||||
|
||||
def content = content_element['innerHTML']
|
||||
|
||||
def content_element
|
||||
@content_element ||= find("#{selector} .ql-editor")
|
||||
end
|
||||
|
||||
def open_dropdown(dropdown)
|
||||
find("#{toolbar_selector} .ql-#{dropdown} .ql-picker-label").click
|
||||
self
|
||||
end
|
||||
|
||||
def toggle_bold
|
||||
find("#{toolbar_selector} button.ql-bold").click
|
||||
end
|
||||
|
||||
def toggle_italic
|
||||
find("#{toolbar_selector} button.ql-italic").click
|
||||
end
|
||||
|
||||
def toggle_underline
|
||||
find("#{toolbar_selector} button.ql-underline").click
|
||||
end
|
||||
|
||||
def toggle_link
|
||||
find("#{toolbar_selector} button.ql-link").click
|
||||
end
|
||||
|
||||
def toggle_blockquote
|
||||
find("#{toolbar_selector} button.ql-blockquote").click
|
||||
end
|
||||
|
||||
def toggle_code_block
|
||||
find("#{toolbar_selector} button.ql-code-block").click
|
||||
end
|
||||
|
||||
def toggle_sub
|
||||
find("#{toolbar_selector} button.ql-script[value='sub']").click
|
||||
end
|
||||
|
||||
def toggle_super
|
||||
find("#{toolbar_selector} button.ql-script[value='super']").click
|
||||
end
|
||||
|
||||
def toggle_align_right
|
||||
find("#{toolbar_selector} .ql-picker-item[data-value='right']").click
|
||||
end
|
||||
|
||||
def tooltip_editing
|
||||
find("#{editor_selector} .ql-tooltip.ql-editing")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,24 +1,28 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
require 'super_diff/rspec'
|
||||
|
||||
require 'zeitwerk'
|
||||
loader = Zeitwerk::Loader.new
|
||||
loader.push_dir("#{__dir__}/page_objects")
|
||||
loader.setup
|
||||
|
||||
require_relative 'spec_helper'
|
||||
|
||||
ENV['RAILS_ENV'] = 'test'
|
||||
|
||||
require 'simplecov'
|
||||
SimpleCov.start 'rails'
|
||||
|
||||
require File.expand_path('dummy/config/environment.rb', __dir__)
|
||||
|
||||
abort('The Rails environment is running in production mode!') if Rails.env.production?
|
||||
|
||||
require 'rspec/rails'
|
||||
require 'capybara/rails'
|
||||
require 'rspec/retry'
|
||||
|
||||
Dir[File.expand_path('support/**/*.rb', __dir__)].sort.each { |f| require f }
|
||||
Dir[File.expand_path('support/**/*.rb', __dir__)].each { |f| require_relative f }
|
||||
|
||||
# Force deprecations to raise an exception.
|
||||
ActiveSupport::Deprecation.behavior = :raise
|
||||
|
||||
# Checks for pending migrations and applies them before tests are run.
|
||||
# If you are not using ActiveRecord, you can remove these lines.
|
||||
begin
|
||||
ActiveRecord::Migration.maintain_test_schema!
|
||||
rescue ActiveRecord::PendingMigrationError => e
|
||||
@@ -27,7 +31,12 @@ rescue ActiveRecord::PendingMigrationError => e
|
||||
end
|
||||
|
||||
RSpec.configure do |config|
|
||||
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
||||
if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1')
|
||||
config.fixture_paths = [Rails.root.join('spec/fixtures')]
|
||||
else
|
||||
config.fixture_path = Rails.root.join('spec/fixtures')
|
||||
end
|
||||
|
||||
config.infer_spec_type_from_file_location!
|
||||
config.filter_rails_from_backtrace!
|
||||
|
||||
@@ -35,8 +44,6 @@ RSpec.configure do |config|
|
||||
config.use_instantiated_fixtures = false
|
||||
config.render_views = false
|
||||
|
||||
config.default_retry_count = 2
|
||||
|
||||
config.before(:suite) do
|
||||
intro = ('-' * 80)
|
||||
intro << "\n"
|
||||
|
||||
@@ -1,12 +1,28 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
Capybara.server = :puma
|
||||
Capybara.default_driver = Capybara.javascript_driver = :cuprite
|
||||
require 'capybara/cuprite'
|
||||
|
||||
Capybara.register_driver(:capybara_cuprite) do |app|
|
||||
browser_options = {}.tap do |opts|
|
||||
opts['no-sandbox'] = nil if ENV['DEVEL']
|
||||
end
|
||||
|
||||
Capybara::Cuprite::Driver.new(
|
||||
app,
|
||||
window_size: [1600, 1024],
|
||||
browser_options: browser_options,
|
||||
process_timeout: 30,
|
||||
timeout: 30,
|
||||
inspector: true,
|
||||
headless: !ENV['CUPRITE_HEADLESS'].in?(%w[n 0 no false])
|
||||
)
|
||||
end
|
||||
|
||||
# Capybara.server = :puma
|
||||
Capybara.default_driver = Capybara.javascript_driver = :capybara_cuprite
|
||||
|
||||
RSpec.configure do |config|
|
||||
# Make sure this hook runs before others
|
||||
config.prepend_before(:each, type: :system) do
|
||||
# Use JS driver always
|
||||
driven_by Capybara.javascript_driver
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'capybara/cuprite'
|
||||
|
||||
Capybara.register_driver(:cuprite) do |app|
|
||||
browser_options = {}.tap do |opts|
|
||||
opts['no-sandbox'] = nil if ENV['CI']
|
||||
end
|
||||
|
||||
Capybara::Cuprite::Driver.new(
|
||||
app,
|
||||
**{
|
||||
window_size: [1600, 1280],
|
||||
# See additional options for Dockerized environment in the respective section of this article
|
||||
browser_options: browser_options,
|
||||
# Increase Chrome startup wait time (required for stable CI builds)
|
||||
process_timeout: 20,
|
||||
# The number of seconds we'll wait for a response when communicating with browser. Default is 5
|
||||
timeout: 20,
|
||||
# Enable debugging capabilities
|
||||
inspector: true,
|
||||
# Allow running Chrome in a headful mode by setting HEADLESS env var to a falsey value
|
||||
headless: !ENV['CUPRITE_HEADLESS'].in?(%w[n 0 no false])
|
||||
}
|
||||
)
|
||||
end
|
||||
10
spec/support/string_clean_multiline.rb
Обычный файл
10
spec/support/string_clean_multiline.rb
Обычный файл
@@ -0,0 +1,10 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module StringCleanMultiline
|
||||
refine String do
|
||||
def clean_multiline
|
||||
# Get rid of newlines and indentation spaces
|
||||
strip.gsub(/\s*\n\s*/, "")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,86 +1,149 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe 'Quill editor', type: :system do
|
||||
using StringCleanMultiline
|
||||
|
||||
RSpec.describe 'Quill editor' do
|
||||
let(:author) { Author.create!(email: 'some_email@example.com', name: 'John Doe', age: 30) }
|
||||
let!(:post) { Post.create!(title: 'Test', author: author, description: 'Some content...') }
|
||||
let(:post) do
|
||||
Post.create!(title: 'Test', author: author, description: '<p>Some content</p>', summary: '<p>Post summary</p>')
|
||||
end
|
||||
|
||||
let(:submit_button) { find('#post_submit_action [type="submit"]') }
|
||||
|
||||
context 'with a Quill editor' do
|
||||
it 'initialize the editor' do
|
||||
visit "/admin/posts/#{post.id}/edit"
|
||||
let(:edit_page) do
|
||||
path = edit_admin_post_path(post)
|
||||
Admin::Posts::EditPage.new(path: path)
|
||||
end
|
||||
let(:editor) { edit_page.lookup_editor(editor_container: '#post_description_input') }
|
||||
let(:input_field) { find('#post_description[data-aa-quill-editor]') }
|
||||
|
||||
%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...')
|
||||
before do
|
||||
edit_page.load
|
||||
end
|
||||
|
||||
it 'adds some text to the description' do
|
||||
visit "/admin/posts/#{post.id}/edit"
|
||||
it 'initializes the editor', :aggregate_failures do
|
||||
expect(editor.content_element).to be_present
|
||||
expect(editor.content).to eq('<p>Some content</p>')
|
||||
expect(input_field).to be_present
|
||||
end
|
||||
|
||||
find('#post_description_input .ql-editor').click
|
||||
find('#post_description_input .ql-editor').base.send_keys('more text')
|
||||
find('[type="submit"]').click
|
||||
it 'edits some content using the editor' do
|
||||
editor.select_all
|
||||
editor.toggle_link
|
||||
editor.tooltip_editing.send_keys(["https://blocknot.es", :return])
|
||||
|
||||
editor << :right << :return << 'More content'
|
||||
editor.toggle_bold
|
||||
editor << 'Some bold'
|
||||
editor.toggle_italic
|
||||
editor << 'Some italic'
|
||||
editor.toggle_underline
|
||||
editor << 'Some underline' << :return
|
||||
|
||||
editor.toggle_blockquote
|
||||
editor << 'blockquote enabled' << :return
|
||||
editor.toggle_blockquote
|
||||
|
||||
editor.toggle_code_block
|
||||
editor << 'code block enabled' << :return
|
||||
editor.toggle_code_block
|
||||
|
||||
editor << "Some text"
|
||||
editor.toggle_sub
|
||||
editor << "sub text"
|
||||
editor.toggle_sub
|
||||
editor << " More text"
|
||||
editor.toggle_super
|
||||
editor << "sup text"
|
||||
editor.toggle_super
|
||||
editor << :return
|
||||
|
||||
editor.open_dropdown(:align).toggle_align_right
|
||||
editor << "Text aligned on the right"
|
||||
|
||||
expect(editor.content).to eq <<~HTML.clean_multiline
|
||||
<p><a href="https://blocknot.es" rel="noopener noreferrer" target="_blank">Some content</a></p>
|
||||
<p>More content<strong>Some bold<em>Some italic<u>Some underline</u></em></strong></p>
|
||||
<blockquote>blockquote enabled</blockquote>
|
||||
<div class="ql-code-block-container" spellcheck="false">
|
||||
<div class="ql-code-block">code block enabled</div>
|
||||
</div>
|
||||
<p>Some text<sub>sub text</sub> More text<sup>sup text</sup></p>
|
||||
<p class="ql-align-right">Text aligned on the right</p>
|
||||
HTML
|
||||
end
|
||||
|
||||
it 'updates the field when submitting', :aggregate_failures do
|
||||
editor.toggle_bold
|
||||
editor << 'More content'
|
||||
|
||||
before = '<p>Some content</p>'
|
||||
after = '<p><strong>More content</strong>Some content</p>'
|
||||
expect { submit_button.click }.to change { post.reload.description }.from(before).to(after)
|
||||
|
||||
expect(page).to have_content('was successfully updated')
|
||||
expect(post.reload.description).to eq '<p>Some content...more text</p>'
|
||||
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
|
||||
|
||||
context 'with 2 Quill editors' do
|
||||
it 'updates some HTML content for 2 fields' do
|
||||
visit "/admin/posts/#{post.id}/edit"
|
||||
let(:edit_page) do
|
||||
path = edit_admin_post_path(post)
|
||||
Admin::Posts::EditPage.new(path: path)
|
||||
end
|
||||
let(:first_editor) { edit_page.lookup_editor(editor_container: '#post_description_input') }
|
||||
let(:second_editor) { edit_page.lookup_editor(editor_container: '#post_summary_input') }
|
||||
|
||||
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('#post_summary_input .ql-editor').click
|
||||
find('#post_summary_input .ql-toolbar .ql-italic').click
|
||||
find('#post_summary_input .ql-editor').base.send_keys('Summary text')
|
||||
find('[type="submit"]').click
|
||||
post.reload
|
||||
before do
|
||||
edit_page.load
|
||||
end
|
||||
|
||||
expect(post.description).to eq '<p>Some content...<strong>more text</strong></p>'
|
||||
expect(post.summary).to eq '<p><em>Summary text</em></p>'
|
||||
it 'updates some HTML content for 2 fields', :aggregate_failures do
|
||||
# Check the initial states
|
||||
expect(first_editor.content).to eq('<p>Some content</p>')
|
||||
expect(second_editor.content).to eq('<p>Post summary</p>')
|
||||
|
||||
# Add some content to both the editors
|
||||
first_editor.toggle_bold
|
||||
first_editor << 'Some bold'
|
||||
|
||||
second_editor.toggle_italic
|
||||
second_editor << 'Some italic'
|
||||
|
||||
# Check that both the fields change
|
||||
before = '<p>Some content</p>'
|
||||
after = '<p><strong>Some bold</strong>Some content</p>'
|
||||
expect { submit_button.click }.to change { post.reload.description }.from(before).to(after)
|
||||
|
||||
expect(post.summary).to eq '<p><em>Some italic</em>Post summary</p>'
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a Quill editor in a nested resource' do
|
||||
it 'updates some HTML content of a new nested resource' do
|
||||
visit "/admin/authors/#{author.id}/edit"
|
||||
let(:edit_page) do
|
||||
path = edit_admin_author_path(author)
|
||||
Admin::Authors::EditPage.new(path: path)
|
||||
end
|
||||
let(:submit_button) { find('#author_submit_action [type="submit"]') }
|
||||
|
||||
expect(page).to have_css('.posts.has_many_container .ql-editor', text: 'Some content...')
|
||||
find('.posts.has_many_container .has_many_add').click
|
||||
expect(page).to have_css('.posts.has_many_container .ql-editor', count: 2)
|
||||
before do
|
||||
post
|
||||
edit_page.load
|
||||
end
|
||||
|
||||
fill_in('author[posts_attributes][1][title]', with: 'A new post')
|
||||
find('#author_posts_attributes_1_description_input .ql-editor').base.send_keys('new post text')
|
||||
find('[type="submit"]').click
|
||||
it 'updates some HTML content of a new nested resource', :aggregate_failures do
|
||||
click_on 'Add New Post'
|
||||
|
||||
expect(page).to have_content('was successfully updated')
|
||||
expect(author.posts.last.description).to eq '<p>new post text</p>'
|
||||
first_editor = edit_page.lookup_editor(editor_container: '#author_posts_attributes_0_description_input')
|
||||
expect(first_editor.content).to eq('<p>Some content</p>')
|
||||
|
||||
fill_in('author[posts_attributes][1][title]', with: 'Some title')
|
||||
second_editor = edit_page.lookup_editor(editor_container: '#author_posts_attributes_1_description_input')
|
||||
second_editor.toggle_underline
|
||||
second_editor << 'Some underline'
|
||||
|
||||
expect { submit_button.click }.to change(Post, :count).by(1)
|
||||
expect(Post.last.description).to eq '<p><u>Some underline</u></p>'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,10 +1,65 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe 'Quill JS', type: :system do
|
||||
RSpec.describe 'Quill JS' do
|
||||
it 'has a Javascript function defined and returns the version', :aggregate_failures do
|
||||
visit '/admin/posts'
|
||||
|
||||
expect(page.evaluate_script('typeof Quill')).to eq 'function'
|
||||
expect(page.evaluate_script('Quill.version')).to eq(ActiveAdmin::QuillEditor::QUILL_VERSION)
|
||||
end
|
||||
|
||||
describe '.getQuillEditors' do
|
||||
let(:author) { Author.create!(email: 'some_email@example.com', name: 'John Doe', age: 30) }
|
||||
let!(:post) { Post.create!(title: 'Test', author: author, description: '') }
|
||||
|
||||
before do
|
||||
path = edit_admin_post_path(post)
|
||||
Admin::Posts::EditPage.new(path: path).load
|
||||
end
|
||||
|
||||
it "returns the available editors", :aggregate_failures do
|
||||
editors_count = page.evaluate_script('window.getQuillEditors().length')
|
||||
expect(editors_count).to eq 2
|
||||
|
||||
expected_element = find('#post_summary > .ql-container')
|
||||
first_editor = page.evaluate_script('window.getQuillEditors()[0].container')
|
||||
expect(first_editor).to eq expected_element
|
||||
|
||||
expected_element = find('#post_description > .ql-container')
|
||||
first_editor = page.evaluate_script('window.getQuillEditors()[1].container')
|
||||
expect(first_editor).to eq expected_element
|
||||
end
|
||||
end
|
||||
|
||||
describe '.getQuillEditorByIndex' do
|
||||
let(:author) { Author.create!(email: 'some_email@example.com', name: 'John Doe', age: 30) }
|
||||
let!(:post) { Post.create!(title: 'Test', author: author, description: '') }
|
||||
|
||||
before do
|
||||
path = edit_admin_post_path(post)
|
||||
Admin::Posts::EditPage.new(path: path).load
|
||||
end
|
||||
|
||||
it "returns the expected editor instance" do
|
||||
expected_element = find('#post_description > .ql-container')
|
||||
editor = page.evaluate_script('window.getQuillEditorByIndex(1).container')
|
||||
expect(editor).to eq expected_element
|
||||
end
|
||||
end
|
||||
|
||||
describe '.getQuillEditorByElementId' do
|
||||
let(:author) { Author.create!(email: 'some_email@example.com', name: 'John Doe', age: 30) }
|
||||
let!(:post) { Post.create!(title: 'Test', author: author, description: '') }
|
||||
|
||||
before do
|
||||
path = edit_admin_post_path(post)
|
||||
Admin::Posts::EditPage.new(path: path).load
|
||||
end
|
||||
|
||||
it "returns the expected editor instance" do
|
||||
expected_element = find('#post_description > .ql-container')
|
||||
editor = page.evaluate_script('window.getQuillEditorByElementId("post_description").container')
|
||||
expect(editor).to eq expected_element
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Ссылка в новой задаче
Block a user