diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Gemfile | 2 | ||||
| -rw-r--r-- | Gemfile.lock | 13 | ||||
| -rw-r--r-- | app/assets/javascripts/admin/records.coffee | 2 | ||||
| -rw-r--r-- | app/assets/stylesheets/admin/layout.scss | 25 | ||||
| -rw-r--r-- | app/controllers/admin/blogs_controller.rb | 2 | ||||
| -rw-r--r-- | app/models/blog.rb | 7 | ||||
| -rw-r--r-- | app/views/admin/blogs/_form.html.haml | 8 | ||||
| -rw-r--r-- | config/deploy.rb | 2 |
9 files changed, 52 insertions, 10 deletions
| diff --git a/.gitignore b/.gitignore index ae472fd..7e20915 100644 --- a/.gitignore +++ b/.gitignore | |||
| @@ -29,5 +29,6 @@ tags | |||
| 29 | *.swo | 29 | *.swo |
| 30 | /public/uploads | 30 | /public/uploads |
| 31 | config/database.yml | 31 | config/database.yml |
| 32 | /storage | ||
| 32 | 33 | ||
| 33 | misc | 34 | misc |
| diff --git a/Gemfile b/Gemfile index 47c1ffa..3044a2f 100644 --- a/Gemfile +++ b/Gemfile | |||
| @@ -80,3 +80,5 @@ gem 'will_paginate', '~> 4.0' | |||
| 80 | gem 'redcarpet' | 80 | gem 'redcarpet' |
| 81 | gem 'rouge' | 81 | gem 'rouge' |
| 82 | gem 'akismet' | 82 | gem 'akismet' |
| 83 | gem 'active_storage_validations' | ||
| 84 | gem "image_processing", ">= 1.2" | ||
| diff --git a/Gemfile.lock b/Gemfile.lock index f60e3d6..4ba3db9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock | |||
| @@ -73,6 +73,11 @@ GEM | |||
| 73 | erubi (~> 1.4) | 73 | erubi (~> 1.4) |
| 74 | rails-dom-testing (~> 2.0) | 74 | rails-dom-testing (~> 2.0) |
| 75 | rails-html-sanitizer (~> 1.1, >= 1.2.0) | 75 | rails-html-sanitizer (~> 1.1, >= 1.2.0) |
| 76 | active_storage_validations (1.0.4) | ||
| 77 | activejob (>= 5.2.0) | ||
| 78 | activemodel (>= 5.2.0) | ||
| 79 | activestorage (>= 5.2.0) | ||
| 80 | activesupport (>= 5.2.0) | ||
| 76 | activejob (7.0.8) | 81 | activejob (7.0.8) |
| 77 | activesupport (= 7.0.8) | 82 | activesupport (= 7.0.8) |
| 78 | globalid (>= 0.3.6) | 83 | globalid (>= 0.3.6) |
| @@ -166,6 +171,9 @@ GEM | |||
| 166 | highline (2.1.0) | 171 | highline (2.1.0) |
| 167 | i18n (1.14.1) | 172 | i18n (1.14.1) |
| 168 | concurrent-ruby (~> 1.0) | 173 | concurrent-ruby (~> 1.0) |
| 174 | image_processing (1.12.2) | ||
| 175 | mini_magick (>= 4.9.5, < 5) | ||
| 176 | ruby-vips (>= 2.0.17, < 3) | ||
| 169 | jbuilder (2.11.5) | 177 | jbuilder (2.11.5) |
| 170 | actionview (>= 5.0.0) | 178 | actionview (>= 5.0.0) |
| 171 | activesupport (>= 5.0.0) | 179 | activesupport (>= 5.0.0) |
| @@ -197,6 +205,7 @@ GEM | |||
| 197 | mimemagic (0.3.10) | 205 | mimemagic (0.3.10) |
| 198 | nokogiri (~> 1) | 206 | nokogiri (~> 1) |
| 199 | rake | 207 | rake |
| 208 | mini_magick (4.12.0) | ||
| 200 | mini_mime (1.1.5) | 209 | mini_mime (1.1.5) |
| 201 | mini_portile2 (2.8.4) | 210 | mini_portile2 (2.8.4) |
| 202 | mini_racer (0.8.0) | 211 | mini_racer (0.8.0) |
| @@ -272,6 +281,8 @@ GEM | |||
| 272 | railties (>= 5.2) | 281 | railties (>= 5.2) |
| 273 | rexml (3.2.6) | 282 | rexml (3.2.6) |
| 274 | rouge (4.1.3) | 283 | rouge (4.1.3) |
| 284 | ruby-vips (2.1.4) | ||
| 285 | ffi (~> 1.12) | ||
| 275 | rubyzip (2.3.2) | 286 | rubyzip (2.3.2) |
| 276 | sassc (2.4.0) | 287 | sassc (2.4.0) |
| 277 | ffi (~> 1.9) | 288 | ffi (~> 1.9) |
| @@ -339,6 +350,7 @@ PLATFORMS | |||
| 339 | ruby | 350 | ruby |
| 340 | 351 | ||
| 341 | DEPENDENCIES | 352 | DEPENDENCIES |
| 353 | active_storage_validations | ||
| 342 | acts-as-taggable-on | 354 | acts-as-taggable-on |
| 343 | akismet | 355 | akismet |
| 344 | audited (~> 5.0) | 356 | audited (~> 5.0) |
| @@ -354,6 +366,7 @@ DEPENDENCIES | |||
| 354 | enumerize | 366 | enumerize |
| 355 | haml | 367 | haml |
| 356 | highline | 368 | highline |
| 369 | image_processing (>= 1.2) | ||
| 357 | jbuilder (~> 2.5) | 370 | jbuilder (~> 2.5) |
| 358 | jquery-rails | 371 | jquery-rails |
| 359 | jquery-ui-rails | 372 | jquery-ui-rails |
| diff --git a/app/assets/javascripts/admin/records.coffee b/app/assets/javascripts/admin/records.coffee index 27cdb78..3862b09 100644 --- a/app/assets/javascripts/admin/records.coffee +++ b/app/assets/javascripts/admin/records.coffee | |||
| @@ -28,3 +28,5 @@ $(document).on "turbolinks:load", -> | |||
| 28 | $(".tags-input input[type=text]").autocomplete({ | 28 | $(".tags-input input[type=text]").autocomplete({ |
| 29 | source: Routes.suggest_tags_path() | 29 | source: Routes.suggest_tags_path() |
| 30 | }) | 30 | }) |
| 31 | $(".image-uploads pre").click -> | ||
| 32 | navigator.clipboard.writeText($(this).text()); | ||
| diff --git a/app/assets/stylesheets/admin/layout.scss b/app/assets/stylesheets/admin/layout.scss index bf15b0d..9585414 100644 --- a/app/assets/stylesheets/admin/layout.scss +++ b/app/assets/stylesheets/admin/layout.scss | |||
| @@ -82,19 +82,16 @@ body { | |||
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | #entry-form { | 84 | #entry-form { |
| 85 | display: flex; | 85 | display: grid; |
| 86 | grid-template-columns: 73% 27%; | ||
| 86 | height: 100%; | 87 | height: 100%; |
| 87 | 88 | ||
| 88 | fieldset { | 89 | fieldset { |
| 89 | border: 0; | 90 | border: 0; |
| 90 | } | 91 | } |
| 91 | 92 | ||
| 92 | #content { | ||
| 93 | width: 77%; | ||
| 94 | } | ||
| 95 | |||
| 96 | #details { | 93 | #details { |
| 97 | width: 23%; | 94 | min-width: 0; |
| 98 | display: flex; | 95 | display: flex; |
| 99 | flex-direction: column; | 96 | flex-direction: column; |
| 100 | padding-left: 0; | 97 | padding-left: 0; |
| @@ -201,6 +198,22 @@ body { | |||
| 201 | border-radius: 5px; | 198 | border-radius: 5px; |
| 202 | padding: .5em; | 199 | padding: .5em; |
| 203 | margin-bottom: 1em; | 200 | margin-bottom: 1em; |
| 201 | |||
| 202 | h4 { | ||
| 203 | margin-top: 0; | ||
| 204 | margin-bottom: 0.5em; | ||
| 205 | } | ||
| 206 | |||
| 207 | img { | ||
| 208 | max-width: 100%; | ||
| 209 | } | ||
| 210 | } | ||
| 211 | |||
| 212 | .image-uploads { | ||
| 213 | pre { | ||
| 214 | overflow: auto; | ||
| 215 | max-width: 100%; | ||
| 216 | } | ||
| 204 | } | 217 | } |
| 205 | 218 | ||
| 206 | .should-create-record-field { | 219 | .should-create-record-field { |
| diff --git a/app/controllers/admin/blogs_controller.rb b/app/controllers/admin/blogs_controller.rb index f0ce519..35f3514 100644 --- a/app/controllers/admin/blogs_controller.rb +++ b/app/controllers/admin/blogs_controller.rb | |||
| @@ -57,7 +57,7 @@ class Admin::BlogsController < Admin::AdminController | |||
| 57 | private | 57 | private |
| 58 | 58 | ||
| 59 | def blog_params | 59 | def blog_params |
| 60 | params.require(:blog).permit(:title, :body, :slug, :published, :published_at, :tag_list, records_attributes: [:description, :_destroy]) | 60 | params.require(:blog).permit(:title, :body, :slug, :published, :published_at, :tag_list, images: [], records_attributes: [:description, :_destroy]) |
| 61 | end | 61 | end |
| 62 | 62 | ||
| 63 | def set_section | 63 | def set_section |
| diff --git a/app/models/blog.rb b/app/models/blog.rb index 362f69f..6db75ec 100644 --- a/app/models/blog.rb +++ b/app/models/blog.rb | |||
| @@ -6,12 +6,15 @@ class Blog < ApplicationRecord | |||
| 6 | has_many :comments | 6 | has_many :comments |
| 7 | belongs_to :user | 7 | belongs_to :user |
| 8 | 8 | ||
| 9 | has_many_attached :images do |attachable| | ||
| 10 | attachable.variant :thumb, resize_to_limit: [300, 300] | ||
| 11 | end | ||
| 12 | |||
| 9 | validates :title, presence: true | 13 | validates :title, presence: true |
| 10 | validates :body, presence: true, if: :published | 14 | validates :body, presence: true, if: :published |
| 11 | validates :slug, presence: true, format: /\A[-a-z0-9]+\z/, if: :published | 15 | validates :slug, presence: true, format: /\A[-a-z0-9]+\z/, if: :published |
| 12 | validates :user, presence: true | 16 | validates :user, presence: true |
| 13 | 17 | validates :images, content_type: ['image/png', 'image/jpeg'] | |
| 14 | has_many_attached :images | ||
| 15 | 18 | ||
| 16 | before_validation :set_draft_title | 19 | before_validation :set_draft_title |
| 17 | before_save :set_published_at | 20 | before_save :set_published_at |
| diff --git a/app/views/admin/blogs/_form.html.haml b/app/views/admin/blogs/_form.html.haml index 625c85e..c3720ba 100644 --- a/app/views/admin/blogs/_form.html.haml +++ b/app/views/admin/blogs/_form.html.haml | |||
| @@ -39,4 +39,12 @@ | |||
| 39 | = builder.label :_destroy, "Create record?" | 39 | = builder.label :_destroy, "Create record?" |
| 40 | .record-description-field | 40 | .record-description-field |
| 41 | = builder.text_area :description, placeholder: "record text" | 41 | = builder.text_area :description, placeholder: "record text" |
| 42 | .details-module.image-uploads | ||
| 43 | %h4 Images | ||
| 44 | - f.object.images.each do |image| | ||
| 45 | = image_tag image.variant(:thumb) | ||
| 46 | = f.hidden_field :images, multiple: true, value: image.signed_id | ||
| 47 | %pre= url_for image | ||
| 48 | %hr | ||
| 49 | = f.file_field :images, multiple: true | ||
| 42 | .details-module= f.submit | 50 | .details-module= f.submit |
| diff --git a/config/deploy.rb b/config/deploy.rb index 05b137d..6c15029 100644 --- a/config/deploy.rb +++ b/config/deploy.rb | |||
| @@ -24,7 +24,7 @@ set :deploy_to, "/srv/www/thoughts" | |||
| 24 | append :linked_files, "config/database.yml", "config/secrets.yml", "config/lingo.yml", "config/akismet.yml", "config/mail.yml" | 24 | append :linked_files, "config/database.yml", "config/secrets.yml", "config/lingo.yml", "config/akismet.yml", "config/mail.yml" |
| 25 | 25 | ||
| 26 | # Default value for linked_dirs is [] | 26 | # Default value for linked_dirs is [] |
| 27 | append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/uploads" | 27 | append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/uploads", "storage" |
| 28 | 28 | ||
| 29 | # Default value for default_env is {} | 29 | # Default value for default_env is {} |
| 30 | # set :default_env, { path: "/opt/ruby/bin:$PATH" } | 30 | # set :default_env, { path: "/opt/ruby/bin:$PATH" } |
