rails_com 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/Rakefile +4 -17
  4. data/app/assets/images/image-square.png +0 -0
  5. data/app/assets/javascripts/rails_com/application.js +43 -1
  6. data/{lib/assets/javascripts/input-attachment.js → app/assets/javascripts/rails_com/attachment.js} +24 -150
  7. data/app/assets/javascripts/rails_com/picture.js +17 -0
  8. data/app/controllers/{active_storage → active_storage_ext/admin}/attachments_controller.rb +2 -2
  9. data/app/controllers/active_storage_ext/admin/base_controller.rb +4 -0
  10. data/app/controllers/active_storage_ext/admin/blob_defaults_controller.rb +54 -0
  11. data/app/controllers/active_storage_ext/admin/blobs_controller.rb +48 -0
  12. data/app/controllers/active_storage_ext/audios_controller.rb +24 -0
  13. data/app/controllers/concerns/rails_common_api.rb +50 -0
  14. data/app/controllers/concerns/rails_common_xhr.rb +15 -0
  15. data/app/helpers/rails_com/active_helper.rb +21 -9
  16. data/app/helpers/rails_com/assets_helper.rb +57 -23
  17. data/app/helpers/rails_com/format_helper.rb +2 -2
  18. data/app/helpers/rails_com/time_helper.rb +2 -1
  19. data/app/models/active_storage/blob_default.rb +5 -0
  20. data/app/models/application_record.rb +3 -0
  21. data/app/models/{state_machine.rb → concerns/state_machine.rb} +0 -0
  22. data/app/views/{active_storage → active_storage_ext/admin}/attachments/destroy.js.erb +0 -0
  23. data/app/views/active_storage_ext/admin/blob_defaults/_form.html.erb +7 -0
  24. data/app/views/active_storage_ext/admin/blob_defaults/_search_form.html.erb +7 -0
  25. data/app/views/active_storage_ext/admin/blob_defaults/edit.html.erb +9 -0
  26. data/app/views/active_storage_ext/admin/blob_defaults/index.html.erb +48 -0
  27. data/app/views/active_storage_ext/admin/blob_defaults/new.html.erb +9 -0
  28. data/app/views/active_storage_ext/admin/blob_defaults/show.html.erb +10 -0
  29. data/app/views/active_storage_ext/admin/blobs/_search_form.html.erb +9 -0
  30. data/app/views/active_storage_ext/admin/blobs/destroy.js.erb +1 -0
  31. data/app/views/active_storage_ext/admin/blobs/index.html.erb +51 -0
  32. data/app/views/active_storage_ext/admin/blobs/new.html.erb +13 -0
  33. data/app/views/active_storage_ext/admin/blobs/show.html.erb +10 -0
  34. data/app/views/active_storage_ext/attachments/_default_image_item.html.erb +6 -0
  35. data/app/views/active_storage_ext/attachments/_image_item.html.erb +6 -0
  36. data/app/views/{active_storage → active_storage_ext}/attachments/_list.html.erb +1 -4
  37. data/app/views/{active_storage → active_storage_ext}/attachments/_list_edit.html.erb +1 -1
  38. data/app/views/{active_storage → active_storage_ext}/attachments/_list_form.html.erb +8 -8
  39. data/app/views/{active_storage → active_storage_ext}/attachments/_video_item.html.erb +0 -0
  40. data/app/views/active_storage_ext/audios/show.html.erb +5 -0
  41. data/config/locales/en.yml +2 -1
  42. data/config/locales/zh.yml +2 -1
  43. data/config/routes.rb +13 -6
  44. data/db/migrate/20181012025833_rails_com_init.rb +13 -0
  45. data/lib/mina/sidekiq.rb +3 -1
  46. data/lib/rails_com.rb +3 -1
  47. data/lib/rails_com/config.rb +2 -1
  48. data/lib/rails_com/core_ext/array.rb +2 -2
  49. data/lib/rails_com/core_ext/date.rb +3 -2
  50. data/lib/rails_com/engine.rb +3 -5
  51. data/lib/rails_com/helpers/model_helper.rb +10 -8
  52. data/lib/rails_com/rails_ext/activestorage_attached.rb +1 -1
  53. data/lib/rails_com/rails_ext/attached_macros.rb +21 -0
  54. data/lib/rails_com/rails_ext/attachment_transfer.rb +3 -1
  55. data/lib/rails_com/rails_ext/errors.rb +4 -0
  56. data/lib/rails_com/rails_ext/template_renderer.rb +15 -0
  57. data/lib/rails_com/utils/babel.rb +38 -0
  58. data/lib/rails_com/utils/time_helper.rb +9 -4
  59. data/lib/rails_com/version.rb +2 -2
  60. data/lib/templates/erb/scaffold/edit.html.erb.tt +2 -2
  61. data/lib/templates/erb/scaffold/new.html.erb.tt +2 -2
  62. data/lib/templates/erb/scaffold/show.html.erb.tt +2 -2
  63. metadata +39 -14
  64. data/app/assets/javascripts/rails_com/common.js +0 -38
  65. data/app/controllers/concerns/the_common_api.rb +0 -41
  66. data/app/views/active_storage/attachments/_image_item.html.erb +0 -6
@@ -0,0 +1,24 @@
1
+ class ActiveStorageExt::AudiosController < RailsCom.config.app_class.constantize
2
+ before_action :set_video, only: [:show, :transfer]
3
+ before_action do
4
+ ActiveStorage::Current.host = request.base_url
5
+ end
6
+
7
+ def show
8
+ expires_in ActiveStorage::Blob.service.url_expires_in
9
+ end
10
+
11
+ def transfer
12
+ attached = @attachment.transfer_faststart
13
+ @video = attached.blob
14
+
15
+ flash[:notice] = 'well done!'
16
+ render 'show'
17
+ end
18
+
19
+ private
20
+ def set_video
21
+ @audio = ActiveStorage::Blob.find(params[:id])
22
+ end
23
+
24
+ end
@@ -0,0 +1,50 @@
1
+ module RailsCommonApi
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ rescue_from 'StandardError' do |exp|
6
+ puts nil, exp.full_message(highlight: true, order: :top)
7
+ render json: { code: 500, error: { class: exp.class.inspect }, message: exp.message }, status: 500
8
+ end
9
+
10
+ rescue_from 'ActiveRecord::RecordNotFound' do |exp|
11
+ puts nil, exp.full_message(highlight: true, order: :top)
12
+ render json: { code: 404, error: { class: exp.class.inspect }, message: exp.message }, status: 404
13
+ end
14
+
15
+ rescue_from 'ActionController::ForbiddenError' do |exp|
16
+ puts nil, exp.full_message(highlight: true, order: :top)
17
+ render json: { code: 403, error: { class: exp.class.inspect }, message: exp.message }, status: 403
18
+ end
19
+
20
+ rescue_from 'ActionController::UnauthorizedError' do |exp|
21
+ puts nil, exp.full_message(highlight: true, order: :top)
22
+ render json: { code: 401, error: { class: exp.class.inspect }, message: exp.message }, status: 401
23
+ end
24
+
25
+ rescue_from 'ActionController::ParameterMissing' do |exp|
26
+ puts nil, exp.full_message(highlight: true, order: :top)
27
+ render json: { code: 400, error: { class: exp.class.inspect }, message: exp.message }, status: 400
28
+ end
29
+ end
30
+
31
+ def process_errors(model)
32
+ render json: {
33
+ code: 406,
34
+ error: model.errors.as_json(full_messages: true),
35
+ message: model.errors.full_messages.join("\n")
36
+ }, status: 200
37
+ end
38
+
39
+ def render *args
40
+ options = args.extract_options!
41
+
42
+ if options[:json]
43
+ options[:json].merge! code: 200
44
+ end
45
+
46
+ args << options
47
+ super *args
48
+ end
49
+
50
+ end
@@ -0,0 +1,15 @@
1
+ module RailsCommonXhr
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+
6
+ end
7
+
8
+ # process_js
9
+ def process_js
10
+ if self.request.xhr?
11
+ self.response.body = Babel.transform(self.response.body)
12
+ end
13
+ end
14
+
15
+ end
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  module RailsCom::ActiveHelper
3
3
 
4
- # active_assert('notice' == 'notice', expected: 'ui info message', unexpected: 'ui negative message')
4
+ #
5
+ # return by assert return
6
+ # active_assert('notice' == 'notice', expected: 'ui info message', unexpected: 'ui negative message')
7
+ # #=> 'ui info message'
5
8
  def active_assert(assert, expected: 'item active', unexpected: 'item')
6
9
  if assert
7
10
  expected
@@ -10,8 +13,10 @@ module RailsCom::ActiveHelper
10
13
  end
11
14
  end
12
15
 
13
- # active_asserts('active': true, expected: false)
14
- def active_asserts(join: true, **options)
16
+ # return value by each keys which is true
17
+ # active_asserts(active: true, item: false)
18
+ # #=> 'active'
19
+ def active_asserts(join = true, **options)
15
20
  keys = options.select { |_, v| v }.keys
16
21
 
17
22
  if join
@@ -21,12 +26,17 @@ module RailsCom::ActiveHelper
21
26
  end
22
27
  end
23
28
 
24
- # paths: active_helper paths: '/work/employees' or active_helper paths: ['/work/employees']
25
- # controllers: active_helper controllers: 'xxx' or active_helper controllers: ['xxx1', 'admin/xxx2']
26
- # modules: active_helper modules: 'admin/oa'
27
- # action: active_helper 'work/employee': ['index', 'show']
28
- # params: active_params state: 'xxx'
29
- # active_helper controller: 'users', action: 'show', id: 371
29
+ # See examples bellow:
30
+ # paths:
31
+ # active_helper paths: '/work/employees' or active_helper paths: ['/work/employees']
32
+ # controllers:
33
+ # active_helper controllers: 'xxx' or active_helper controllers: ['xxx1', 'admin/xxx2']
34
+ # modules:
35
+ # active_helper modules: 'admin/oa'
36
+ # action:
37
+ # active_helper 'work/employee': ['index', 'show']
38
+ # params:
39
+ # active_helper controller: 'users', action: 'show', id: 371
30
40
  def active_helper(paths: [], controllers: [], modules: [], active_class: 'item active', item_class: 'item', **options)
31
41
  check_parameters = options.delete(:check_parameters)
32
42
 
@@ -56,6 +66,8 @@ module RailsCom::ActiveHelper
56
66
  item_class
57
67
  end
58
68
 
69
+ # return value by params
70
+ # active_params state: 'xxx'
59
71
  def active_params(active_class: 'item active', item_class: 'item', **options)
60
72
  options.select { |_, v| v.present? }.each do |k, v|
61
73
  if params[k].to_s == v.to_s
@@ -1,42 +1,76 @@
1
1
  # frozen_string_literal: true
2
2
  module RailsCom::AssetsHelper
3
3
 
4
- def js_load(filename = nil, **options)
5
- filename ||= "controllers/#{controller_path}/#{action_name}"
6
- paths = assets_load_path(filename)
4
+ # Assets path: app/assets/javascripts/controllers
5
+ # Packs Path: app/javascript/packs/javascripts
6
+ def js_load(**options)
7
+ ext = ['.js', '.js.erb'] + Array(options.delete(:ext))
8
+ suffix = options.delete(:suffix)
7
9
 
8
- if paths.any? { |path| File.exist?(path) }
9
- javascript_include_tag filename, options
10
+ asset_filename = "controllers/#{controller_path}/#{action_name}"
11
+ if suffix
12
+ asset_filename += ['.', suffix].join
10
13
  end
11
- end
12
-
13
- def css_load(filename = nil, **options)
14
- filename ||= "controllers/#{controller_path}/#{action_name}"
15
- paths = assets_load_path(filename, relative_path: 'app/assets/stylesheets', ext: ['.css', '.css.erb'])
14
+ asset_paths = assets_load_path(asset_filename, relative_path: 'app/assets/javascripts', ext: ext)
16
15
 
17
- if paths.any? { |path| File.exist?(path) }
18
- stylesheet_link_tag filename, options
16
+ pack_filename ||= "javascripts/#{controller_path}/#{action_name}"
17
+ if suffix
18
+ pack_filename += ['-', suffix].join
19
19
  end
20
- end
20
+ pack_paths = assets_load_path(pack_filename, relative_path: 'app/javascript/packs', ext: ext)
21
21
 
22
- def js_pack(filename = nil, **options)
23
- filename ||= "controllers/#{controller_path}/#{action_name}"
24
- paths = assets_load_path(filename, relative_path: 'app/javascript/packs', **options)
22
+ r = []
23
+ if asset_paths.any? { |path| File.exist?(path) }
24
+ r << javascript_include_tag(asset_filename, options)
25
+ end
25
26
 
26
- if paths.any? { |path| File.exist?(path) }
27
- javascript_pack_tag filename, options
27
+ if pack_paths.any? { |path| File.exist?(path) }
28
+ r << javascript_pack_tag(pack_filename, options)
28
29
  end
30
+
31
+ r.join("\n ").html_safe
29
32
  end
30
33
 
31
34
  def js_ready(**options)
32
- js_load("controllers/#{controller_path}/#{action_name}.ready", **options)
35
+ js_load(suffix: 'ready', **options)
33
36
  end
34
37
 
35
- def js_pack_ready(**options)
36
- js_pack("controllers/#{controller_path}/#{action_name}-ready", **options)
38
+ # Assets path: app/assets/stylesheets/controllers
39
+ # Packs Path: app/javascript/packs/stylesheets
40
+ def css_load(**options)
41
+ ext = ['.css', '.css.erb'] + Array(options.delete(:ext))
42
+
43
+ asset_filename = "controllers/#{controller_path}/#{action_name}"
44
+ asset_paths = assets_load_path(asset_filename, relative_path: 'app/assets/stylesheets', ext: ext )
45
+
46
+ pack_filename = "stylesheets/#{controller_path}/#{action_name}"
47
+ pack_paths = assets_load_path(pack_filename, relative_path: 'app/javascript/packs', ext: ext)
48
+
49
+ r = []
50
+ if asset_paths.any? { |path| File.exist?(path) }
51
+ r << stylesheet_link_tag(asset_filename, options)
52
+ end
53
+
54
+ if pack_paths.any? { |path| File.exist?(path) }
55
+
56
+ begin
57
+ rs = stylesheet_pack_tag(pack_filename, options)
58
+ rescue
59
+ rs = nil
60
+ end
61
+
62
+ if rs.is_a?(String)
63
+ r << rs
64
+ else
65
+ r << javascript_pack_tag(pack_filename, options)
66
+ end
67
+ end
68
+
69
+ r.join("\n ").html_safe
37
70
  end
38
71
 
39
- def assets_load_path(filename, relative_path: 'app/assets/javascripts', ext: ['.js', '.js.erb'])
72
+ private
73
+ def assets_load_path(filename, relative_path:, ext:)
40
74
  paths = []
41
75
 
42
76
  file_path = Pathname.new(relative_path).join filename
@@ -54,4 +88,4 @@ module RailsCom::AssetsHelper
54
88
  paths
55
89
  end
56
90
 
57
- end
91
+ end
@@ -25,7 +25,7 @@ module RailsCom::FormatHelper
25
25
  hash_text = text.to_h
26
26
  return simple_format_hash(hash_text, html_options, options)
27
27
  rescue TypeError
28
- return content_tag(:span, text, html_options)
28
+ return text.map { |t| content_tag(:p, t, html_options) }.join("\n").html_safe
29
29
  end
30
30
  end
31
31
 
@@ -34,4 +34,4 @@ module RailsCom::FormatHelper
34
34
  super
35
35
  end
36
36
 
37
- end
37
+ end
@@ -12,7 +12,8 @@ module RailsCom::TimeHelper
12
12
  str = ''
13
13
  result.each do |k, v|
14
14
  if v > 0
15
- str << v.to_s << locale.t(k)
15
+ str += v.to_s
16
+ str += locale.t(k)
16
17
  end
17
18
  end
18
19
  str
@@ -0,0 +1,5 @@
1
+ class ActiveStorage::BlobDefault < ApplicationRecord
2
+ self.table_name = 'active_storage_blob_defaults'
3
+ has_one_attached :file
4
+
5
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -0,0 +1,7 @@
1
+ <%= form_with model: [:rails_ext, @blob_default], local: true do |f| %>
2
+ <%= render 'shared/error_messages', target: @blob_default %>
3
+ <%= f.text_field :record_class %>
4
+ <%= f.text_field :name %>
5
+ <%= f.file_field :file %>
6
+ <%= f.submit %>
7
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <%= search_form_with do |f| %>
2
+ <div class="fields">
3
+ <%= f.submit 'Search' %>
4
+ </div>
5
+ <% end %>
6
+
7
+
@@ -0,0 +1,9 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'Back', rails_ext_blob_defaults_path, class: 'section' %>
3
+ <div class="divider"> / </div>
4
+ <div class="active section">Edit</div>
5
+ </div>
6
+
7
+ <div class="ui segment">
8
+ <%= render 'form' %>
9
+ </div>
@@ -0,0 +1,48 @@
1
+ <div class="ui top attached borderless menu">
2
+ <div class="header item">Blob Defaults</div>
3
+ <div class="right menu">
4
+ <div class="item">
5
+ <%= link_to 'New Blob Default', new_rails_ext_blob_default_path, class: 'ui teal button' %>
6
+ </div>
7
+ </div>
8
+ </div>
9
+
10
+ <div class="ui attached segment">
11
+ <%= render 'search_form' %>
12
+ </div>
13
+
14
+ <table class="ui bottom attached table">
15
+ <thead>
16
+ <tr>
17
+ <th><%= ActiveStorage::BlobDefault.human_attribute_name(:id) %></th>
18
+ <th><%= ActiveStorage::BlobDefault.human_attribute_name(:record_class) %></th>
19
+ <th><%= ActiveStorage::BlobDefault.human_attribute_name(:name) %></th>
20
+ <th><%= ActiveStorage::BlobDefault.human_attribute_name(:file) %></th>
21
+ <th></th>
22
+ <th>Actions</th>
23
+ </tr>
24
+ </thead>
25
+ <tbody>
26
+ <% @blob_defaults.each do |blob_default| %>
27
+ <tr>
28
+ <td><%= blob_default.id %></td>
29
+ <td><%= blob_default.record_class %></td>
30
+ <td><%= blob_default.name %></td>
31
+ <td><%= blob_default.file_blob.key if blob_default.file_blob %></td>
32
+ <td>
33
+ <%= render 'active_storage_ext/attachments/list', target: blob_default.file %>
34
+ </td>
35
+ <td class="ui labels">
36
+ <%= link_to edit_rails_ext_blob_default_path(blob_default), data: { tooltip: t('.edit') }, class: 'ui pink mini icon button' do %>
37
+ <i class="pencil alternate icon"></i>
38
+ <% end %>
39
+ <%= link_to rails_ext_blob_default_path(blob_default), method: :delete, data: { tooltip: t('.destroy'), confirm: 'Are you sure?' }, class: 'ui red mini icon button' do %>
40
+ <i class="times icon"></i>
41
+ <% end %>
42
+ </td>
43
+ </tr>
44
+ <% end %>
45
+ </tbody>
46
+ </table>
47
+
48
+ <%= paginate @blob_defaults %>
@@ -0,0 +1,9 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'Back', rails_ext_blob_defaults_path(blob_id: params[:blob_id]), class: 'section' %>
3
+ <div class="divider"> / </div>
4
+ <div class="active section">Add</div>
5
+ </div>
6
+
7
+ <div class="ui segment">
8
+ <%= render 'form' %>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="ui segment breadcrumb">
2
+ <%= link_to 'Back', blob_defaults_path, class: 'section' %>
3
+ <div class="divider"> / </div>
4
+ <div class="active section">Show</div>
5
+ </div>
6
+
7
+ <table class="ui very basic large table">
8
+ <tbody>
9
+ </tbody>
10
+ </table>
@@ -0,0 +1,9 @@
1
+ <%= search_form_with do |f| %>
2
+ <div class="fields">
3
+ <%= f.text_field :key, placeholder: ActiveStorage::Blob.human_attribute_name(:key) %>
4
+ <%= f.text_field :filename, placeholder: ActiveStorage::Blob.human_attribute_name(:filename) %>
5
+ <%= f.submit 'Search' %>
6
+ </div>
7
+ <% end %>
8
+
9
+
@@ -0,0 +1 @@
1
+ $('#attachment_<%= @attachment.id %>').remove();
@@ -0,0 +1,51 @@
1
+ <div class="ui top attached borderless menu">
2
+ <%= link_to 'All', rails_ext_blobs_path, class: active_helper(action: 'index') %>
3
+ <%= link_to 'Unattached', unattached_rails_ext_blobs_path, class: active_helper(action: 'unattached') %>
4
+ <div class="right menu">
5
+ <div class="item">
6
+ <%= link_to 'New ActiveStorage::Blob', new_rails_ext_blob_path, class: 'ui teal button' %>
7
+ </div>
8
+ </div>
9
+ </div>
10
+
11
+ <div class="ui attached segment">
12
+ <%= render 'search_form' %>
13
+ </div>
14
+
15
+ <table class="ui bottom attached table">
16
+ <thead>
17
+ <tr>
18
+ <th><%= ActiveStorage::Blob.human_attribute_name(:id) %></th>
19
+ <th><%= ActiveStorage::Blob.human_attribute_name(:key) %></th>
20
+ <th><%= ActiveStorage::Blob.human_attribute_name(:filename) %></th>
21
+ <th><%= ActiveStorage::Blob.human_attribute_name(:content_type) %></th>
22
+ <th><%= ActiveStorage::Blob.human_attribute_name(:metadata) %></th>
23
+ <th><%= ActiveStorage::Blob.human_attribute_name(:size) %></th>
24
+ <th><%= ActiveStorage::Blob.human_attribute_name(:created_at) %></th>
25
+ <th>Actions</th>
26
+ </tr>
27
+ </thead>
28
+ <tbody>
29
+ <% @blobs.each do |blob| %>
30
+ <tr>
31
+ <td><%= blob.id %></td>
32
+ <td><%= blob.key %></td>
33
+ <td><%= blob.filename %></td>
34
+ <td><%= blob.content_type %></td>
35
+ <td><%= simple_format(blob.metadata) %></td>
36
+ <td><%= number_to_human_size(blob.byte_size) %></td>
37
+ <td><time><%= blob.created_at.to_s(:rfc822) %></time></td>
38
+ <td class="ui labels">
39
+ <%= link_to rails_ext_blob_path(blob), method: :delete, data: { tooltip: t('.destroy'), confirm: 'Are you sure?' }, class: 'ui red mini icon button' do %>
40
+ <i class="times icon"></i>
41
+ <% end %>
42
+ <%= link_to rails_ext_audio_path(blob.id), target: '_blank', method: :delete, data: { tooltip: '默认' }, class: 'ui blue mini icon button' do %>
43
+ <i class="play icon"></i>
44
+ <% end %>
45
+ </td>
46
+ </tr>
47
+ <% end %>
48
+ </tbody>
49
+ </table>
50
+
51
+ <%= paginate @blobs %>