rails_com 1.2.4 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 %>