cm-admin 0.2.0 → 0.3.0

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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +12 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +6 -1
  6. data/Gemfile.lock +118 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +6 -40
  9. data/app/assets/images/logo.png +0 -0
  10. data/{lib/generators/cm_admin/templates/assets/stylesheets → app/assets/stylesheets/cm_admin}/base/auth.scss +16 -6
  11. data/app/assets/stylesheets/cm_admin/base/common.scss +237 -0
  12. data/app/assets/stylesheets/cm_admin/base/filters.scss +199 -0
  13. data/app/assets/stylesheets/cm_admin/base/form.scss +262 -0
  14. data/app/assets/stylesheets/cm_admin/base/main-nav.scss +47 -0
  15. data/app/assets/stylesheets/cm_admin/base/navbar.scss +67 -0
  16. data/app/assets/stylesheets/cm_admin/base/quicksearch.scss +69 -0
  17. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +61 -0
  18. data/app/assets/stylesheets/cm_admin/base/show.scss +54 -0
  19. data/app/assets/stylesheets/cm_admin/base/sidebar.scss +225 -0
  20. data/app/assets/stylesheets/cm_admin/base/table.scss +303 -0
  21. data/app/assets/stylesheets/cm_admin/base/tabs.scss +26 -0
  22. data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +26 -0
  23. data/app/assets/stylesheets/cm_admin/components/_alerts.scss +101 -0
  24. data/app/assets/stylesheets/cm_admin/components/_buttons.scss +135 -0
  25. data/app/assets/stylesheets/cm_admin/components/_dropdown-popup.scss +141 -0
  26. data/app/assets/stylesheets/cm_admin/components/_input.scss +274 -0
  27. data/app/assets/stylesheets/cm_admin/components/_modal.scss +34 -0
  28. data/app/assets/stylesheets/cm_admin/components/_range.scss +20 -0
  29. data/app/assets/stylesheets/cm_admin/components/_status-tag.scss +67 -0
  30. data/app/assets/stylesheets/cm_admin/components/index.scss +7 -0
  31. data/app/assets/stylesheets/cm_admin/dependency/bootstrap.min.css +7 -0
  32. data/app/assets/stylesheets/cm_admin/helpers/_mixins.scss +20 -0
  33. data/app/assets/stylesheets/cm_admin/helpers/_variable.scss +86 -0
  34. data/app/assets/stylesheets/cm_admin/helpers/index.scss +2 -0
  35. data/app/controllers/cm_admin/application_controller.rb +6 -0
  36. data/app/controllers/cm_admin/exports_controller.rb +16 -0
  37. data/app/controllers/cm_admin/main_controller.rb +8 -0
  38. data/app/helpers/cm_admin/application_helper.rb +11 -0
  39. data/app/javascript/packs/cm_admin/application.js +9 -0
  40. data/app/javascript/packs/cm_admin/filters.js +32 -0
  41. data/app/javascript/packs/cm_admin/scaffolds.js +14 -0
  42. data/app/views/cm_admin/main/_cm_pagy_nav.html.slim +23 -0
  43. data/app/views/cm_admin/main/_filters.html.slim +10 -0
  44. data/app/views/cm_admin/main/_table.html.slim +59 -0
  45. data/app/views/cm_admin/main/_top_navbar.html.slim +25 -0
  46. data/app/views/cm_admin/main/dashboard.html.slim +1 -0
  47. data/app/views/cm_admin/main/edit.html.slim +19 -0
  48. data/app/views/cm_admin/main/index.html.slim +9 -0
  49. data/app/views/cm_admin/main/new.html.slim +22 -0
  50. data/app/views/cm_admin/main/show.html.slim +13 -0
  51. data/app/views/layouts/_left_sidebar_nav.html.slim +30 -0
  52. data/app/views/layouts/cm_admin.html.slim +18 -0
  53. data/bin/console +1 -0
  54. data/bin/webpack +18 -0
  55. data/bin/webpack-dev-server +18 -0
  56. data/cm_admin.gemspec +20 -31
  57. data/{lib → config}/.DS_Store +0 -0
  58. data/config/initializers/active_record_extension.rb +9 -0
  59. data/config/routes.rb +18 -0
  60. data/config/webpack/development.js +5 -0
  61. data/config/webpack/environment.js +12 -0
  62. data/config/webpack/production.js +5 -0
  63. data/config/webpack/test.js +5 -0
  64. data/config/webpacker.yml +92 -0
  65. data/lib/c.png +0 -0
  66. data/lib/cm_admin.rb +31 -2
  67. data/lib/cm_admin/constants.rb +33 -0
  68. data/lib/cm_admin/engine.rb +38 -0
  69. data/lib/cm_admin/model.rb +262 -0
  70. data/lib/cm_admin/models/action.rb +22 -0
  71. data/lib/cm_admin/models/actions/blocks.rb +25 -0
  72. data/lib/cm_admin/models/blocks.rb +19 -0
  73. data/lib/cm_admin/models/column.rb +16 -0
  74. data/lib/cm_admin/models/export.rb +43 -0
  75. data/lib/cm_admin/models/field.rb +14 -0
  76. data/lib/cm_admin/models/filter.rb +30 -0
  77. data/lib/cm_admin/utils.rb +67 -0
  78. data/lib/cm_admin/version.rb +1 -1
  79. data/lib/cm_admin/view_helpers.rb +72 -0
  80. data/lib/cm_admin/view_helpers/field_column_helper.rb +23 -0
  81. data/lib/cm_admin/view_helpers/form_field_helper.rb +16 -0
  82. data/lib/cm_admin/view_helpers/form_helper.rb +55 -0
  83. data/lib/cm_admin/view_helpers/navigation_helper.rb +18 -0
  84. data/lib/cm_admin/view_helpers/page_info_helper.rb +21 -0
  85. data/lib/generators/cm_admin/install_generator.rb +10 -32
  86. data/lib/generators/cm_admin/templates/cm_admin_initializer.rb +4 -0
  87. data/lib/tasks/webpack_install.rake +63 -0
  88. data/package.json +18 -0
  89. data/postcss.config.js +12 -0
  90. data/yarn-error.log +44 -0
  91. data/yarn.lock +6903 -0
  92. metadata +123 -48
  93. data/CODE_OF_CONDUCT.md +0 -74
  94. data/lib/generators/cm_admin/USAGE +0 -8
  95. data/lib/generators/cm_admin/templates/assets/images/cm.png +0 -0
  96. data/lib/generators/cm_admin/templates/assets/stylesheets/application.css.scss +0 -33
  97. data/lib/generators/cm_admin/templates/assets/stylesheets/base/_variable.scss +0 -14
  98. data/lib/generators/cm_admin/templates/assets/stylesheets/base/form.scss +0 -125
  99. data/lib/generators/cm_admin/templates/assets/stylesheets/base/input-styles.scss +0 -72
  100. data/lib/generators/cm_admin/templates/assets/stylesheets/base/main-nav.scss +0 -79
  101. data/lib/generators/cm_admin/templates/assets/stylesheets/base/scaffold.scss +0 -95
  102. data/lib/generators/cm_admin/templates/assets/stylesheets/base/show.scss +0 -88
  103. data/lib/generators/cm_admin/templates/assets/stylesheets/base/sidebar.scss +0 -69
  104. data/lib/generators/cm_admin/templates/assets/stylesheets/base/table.scss +0 -246
  105. data/lib/generators/cm_admin/templates/layouts/_navbar.html.slim +0 -8
  106. data/lib/generators/cm_admin/templates/layouts/_side_navbar.html.slim +0 -12
  107. data/lib/generators/cm_admin/templates/layouts/application.html.slim +0 -20
  108. data/lib/generators/cm_admin/templates/layouts/initializer.rb +0 -2
  109. data/lib/generators/cm_admin/templates/views/_form.erb +0 -67
  110. data/lib/generators/cm_admin/templates/views/_table.erb +0 -22
  111. data/lib/generators/cm_admin/templates/views/edit.erb +0 -10
  112. data/lib/generators/cm_admin/templates/views/index.erb +0 -11
  113. data/lib/generators/cm_admin/templates/views/new.erb +0 -10
  114. data/lib/generators/cm_admin/templates/views/reset_password.erb +0 -12
  115. data/lib/generators/cm_admin/templates/views/show.erb +0 -18
  116. data/lib/generators/cm_admin/templates/views/sign_in.erb +0 -18
  117. data/lib/generators/cm_admin/view_generator.rb +0 -78
@@ -0,0 +1,14 @@
1
+ module CmAdmin
2
+ module Models
3
+ class Field
4
+ attr_accessor :field_name, :label, :header
5
+
6
+ def initialize(field_name, attributes = {})
7
+ @field_name = field_name
8
+ attributes.each do |key, value|
9
+ self.send("#{key.to_s}=", value)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ module CmAdmin
2
+ module Models
3
+ class Filter
4
+ attr_accessor :db_column_name, :filter_type, :placeholder, :collection, :multiselect, :checked
5
+
6
+ VALID_FILTER_TYPES = Set[:checkbox, :date, :dropdown, :range, :search].freeze
7
+
8
+ def initialize(db_column_name:, filter_type:, options: {})
9
+ raise TypeError, "Can't have array of multiple columns for #{filter_type} filter" if db_column_name.is_a?(Array) && db_column_name.size > 1 && !filter_type.to_sym.eql?(:search)
10
+ raise ArgumentError, "Kindly select a valid filter type like #{VALID_FILTER_TYPES.sort.to_sentence(last_word_connector: ', or ')} instead of #{filter_type} for column #{db_column_name}" unless VALID_FILTER_TYPES.include?(filter_type.to_sym)
11
+ @db_column_name, @filter_type = structure_data(db_column_name, filter_type)
12
+ options.each do |key, value|
13
+ self.send("#{key.to_s}=", value)
14
+ end
15
+ end
16
+
17
+ def structure_data(db_column_name, filter_type)
18
+ filter_type = filter_type.is_a?(Array) ? filter_type[0].to_sym : filter_type.to_sym
19
+
20
+ case filter_type
21
+ when :search
22
+ db_column_name = (Array.new << db_column_name).flatten.map(&:to_sym)
23
+ else
24
+ db_column_name = db_column_name.is_a?(Array) ? db_column_name[0].to_sym : db_column_name.to_sym
25
+ end
26
+ [db_column_name, filter_type]
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,67 @@
1
+ module CmAdmin::Utils
2
+ class << self
3
+ def serialize_csv_columns(*columns, **hashes)
4
+ # Turns an arbitrary list of args and kwargs into a list of params to be used in a form
5
+ # For example, turns CmAdmin::Utils.serialize_csv_columns(:a, :b, c: [:d, e: :h], f: :g)
6
+ # into [:a, :b, "c/d", "c/e/h", "f/g"]
7
+ columns.map(&:to_s) + hashes.map do |key, value|
8
+ serialize_csv_columns(*value).map do |column|
9
+ "#{key}/#{column}"
10
+ end
11
+ end.reduce([], :+)
12
+ end
13
+
14
+ def deserialize_csv_columns(list, method)
15
+ # Does the opposite operation of serialize_csv_columns
16
+ list.reduce(recursive_hash) do |acc, item|
17
+ tokens = item.to_s.split('/')
18
+ send(method, acc, tokens.shift, tokens)
19
+ end
20
+ end
21
+
22
+ def recursive_hash
23
+ func = ->(h, k) { h[k] = Hash.new(&func) }
24
+ # This hash creates a new hash, infinitely deep, whenever a value is not found
25
+ # recursive_hash[:a][:b][:c][:d] will never fail
26
+ Hash.new(&func)
27
+ end
28
+
29
+ def as_json_params(hash, key, tokens)
30
+ hash.empty? && hash = { only: [], methods: [], include: recursive_hash }
31
+ if tokens.empty?
32
+ # base case
33
+ hash[:methods] << key
34
+ else
35
+ # recursive case
36
+ # hash[:associations] ||= {}
37
+ hash[:include][key] = as_json_params(hash[:include][key], tokens.shift, tokens)
38
+ end
39
+ hash
40
+ end
41
+
42
+ def flatten_hash(hash, prefix="", separator="_")
43
+ hash.reduce({}) do |acc, item|
44
+ case item[1]
45
+ when Hash
46
+ acc.merge(flatten_hash(item[1], "#{prefix}#{item[0]}#{separator}"))
47
+ else
48
+ acc.merge("#{prefix}#{item[0]}" => item[1])
49
+ end
50
+ end
51
+ end
52
+
53
+ def base(hash, key, tokens) # recursive
54
+ hash.empty? && hash = { columns: [], associations: recursive_hash }
55
+ if tokens.empty?
56
+ # base case
57
+ hash[:columns] << key
58
+ else
59
+ # recursive case
60
+ # hash[:associations] ||= {}
61
+ hash[:associations][key] = base(hash[:associations][key], tokens.shift, tokens)
62
+ end
63
+ hash
64
+ end
65
+
66
+ end
67
+ end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,72 @@
1
+ module CmAdmin
2
+ module ViewHelpers
3
+ Dir[File.expand_path("view_helpers", __dir__) + "/*.rb"].each { |f| require f }
4
+
5
+ include PageInfoHelper
6
+ include NavigationHelper
7
+ include FormHelper
8
+ include ColumnFieldHelper
9
+ include ActionView::Helpers::FormTagHelper
10
+ include ActionView::Helpers::TagHelper
11
+
12
+ def exportable(klass, html_class: [])
13
+ tag.a "Export as excel", class: html_class.append("filter-btn modal-btn mr-2"), data: {toggle: "modal", target: "#exportmodal"} do
14
+ concat tag.i class: 'fa fa-download'
15
+ concat tag.span " Export"
16
+ end
17
+ end
18
+
19
+ def column_pop_up(klass, required_filters = nil)
20
+ tag.div class: "modal fade form-modal", id: "exportmodal", role: "dialog", aria: {labelledby: "exportModal"} do
21
+ tag.div class: "modal-dialog modal-lg", role: "document" do
22
+ tag.div class: "modal-content" do
23
+ concat pop_ups(klass, required_filters)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def pop_ups(klass, required_filters)
30
+ tag.div do
31
+ concat pop_up_header
32
+ concat pop_up_body(klass, required_filters)
33
+ end
34
+ end
35
+
36
+ def pop_up_header
37
+ tag.div class: "modal-header" do
38
+ tag.button type: "button", class: "close", data: {dismiss: "modal"}, aria: {label: "Close"} do
39
+ tag.span "X", aria: {hidden: "true"}
40
+ end
41
+ tag.h4 "Select columns to export", class: "modal-title", id: "exportModal"
42
+ end
43
+ end
44
+
45
+ def pop_up_body(klass, required_filters)
46
+ tag.div class: "modal-body" do
47
+ form_tag '/cm_admin/export_to_file.js', id: 'export-to-file-form', style: "width: 100%;", class:"cm-admin-csv-export-form" do
48
+ concat hidden_field_tag 'class_name', klass.name.to_s, id: 'export-to-file-klass'
49
+ concat checkbox_row(klass)
50
+ concat tag.hr
51
+ concat submit_tag 'Export', class: 'btn btn-primary btn-bordered export-to-file-btn'
52
+ end
53
+ end
54
+ end
55
+
56
+ def checkbox_row(klass)
57
+ tag.div class: "row" do
58
+ CmAdmin::Models::Export.exportable_columns(klass).each do |column_path|
59
+ concat create_checkbox(column_path)
60
+ end
61
+ end
62
+ end
63
+
64
+ def create_checkbox(column_path)
65
+ tag.div class: "col-md-4" do
66
+ concat check_box_tag "columns[]", column_path, id: column_path.to_s.gsub('/', '-')
67
+ concat " " + column_path.to_s.gsub('/', '_').humanize
68
+ end
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,23 @@
1
+ module CmAdmin
2
+ module ViewHelpers
3
+ module ColumnFieldHelper
4
+
5
+ def column_for_field_helper(ar_object, column)
6
+ value = ar_object.send(column.db_column_name)
7
+ case column.column_type
8
+ when :datetime
9
+ if column.format.present?
10
+ value = ar_object.send(column.db_column_name).strftime(column.format)
11
+ else
12
+ value = ar_object.send(column.db_column_name).strftime("%d/%m/%Y")
13
+ end
14
+ if column.prefix.present?
15
+ value = column.prefix.to_s + ' ' + value
16
+ end
17
+ end
18
+ return value
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module CmAdmin
2
+ module ViewHelpers
3
+ module FormFieldHelper
4
+ def input_field_for_column(f, field)
5
+ case field.type
6
+ when :integer
7
+ return f.number_field field.name, class: 'normal-input'
8
+ when :string
9
+ return f.text_field field.name, class: 'normal-input'
10
+ when :text
11
+ return f.text_area field.name, class: 'normal-input'
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,55 @@
1
+ require_relative 'form_field_helper'
2
+ module CmAdmin
3
+ module ViewHelpers
4
+ module FormHelper
5
+ include FormFieldHelper
6
+ REJECTABLE = %w(id created_at updated_at)
7
+
8
+ def generate_form(resource, cm_model)
9
+ if resource.new_record?
10
+ action = :new
11
+ method = :post
12
+ else
13
+ action = :edit
14
+ method = :patch
15
+ end
16
+ if cm_model.available_fields[action].empty?
17
+ return form_with_all_fields(resource, method)
18
+ else
19
+ return form_with_mentioned_fields(resource, cm_model.available_fields[:edit], method)
20
+ end
21
+ end
22
+
23
+ def form_with_all_fields(resource, method)
24
+ columns = resource.class.columns.dup
25
+ table_name = resource.class.table_name
26
+ columns.reject! { |i| REJECTABLE.include?(i.name) }
27
+ url = CmAdmin::Engine.mount_path + "/#{table_name}/#{resource.id}"
28
+ set_form_for_fields(resource, columns, url, method)
29
+ end
30
+
31
+ def form_with_mentioned_fields(resource, available_fields, method)
32
+ columns = resource.class.columns.select { |i| available_fields.include?(i.name.to_sym) }
33
+ table_name = resource.class.table_name
34
+ columns.reject! { |i| REJECTABLE.include?(i.name) }
35
+ url = CmAdmin::Engine.mount_path + "/#{table_name}/#{resource.id}"
36
+ set_form_for_fields(resource, columns, url, method)
37
+ end
38
+
39
+ def set_form_for_fields(resource, columns, url, method)
40
+ form_for(resource, url: url, method: method) do |f|
41
+ columns.each do |field|
42
+ concat f.label field.name, class: 'field-label'
43
+ concat tag.br
44
+ concat input_field_for_column(f, field)
45
+ concat tag.p resource.errors[field.name].first if resource.errors[field.name].present?
46
+ concat tag.br
47
+ concat tag.br
48
+ end
49
+ concat tag.br
50
+ concat f.submit 'Save', class: 'cta-btn mt-3'
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,18 @@
1
+ require 'pagy'
2
+ module CmAdmin
3
+ module ViewHelpers
4
+ module NavigationHelper
5
+ include Pagy::Frontend
6
+ def sidebar_navigation
7
+ CmAdmin.cm_admin_models.map { |model|
8
+ path = CmAdmin::Engine.mount_path + '/' + model.name.underscore.pluralize
9
+ "<a href=#{path}><div class='menu-item'>
10
+ <span class='menu-icon'><i class='fa fa-th-large'></i></span>
11
+ #{model.name}
12
+ </div></a>".html_safe
13
+ }.join.html_safe
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ module CmAdmin
2
+ module ViewHelpers
3
+ module PageInfoHelper
4
+ def page_title
5
+ @action.title || @model.title || "#{@model.ar_model.name} | #{@action.name&.titleize} | Admin"
6
+ end
7
+
8
+ def page_url(action_name=@action.name, ar_object=nil)
9
+ base_path = CmAdmin::Engine.mount_path + '/' + @model.name.downcase.pluralize
10
+ case action_name
11
+ when 'index'
12
+ base_path
13
+ when 'new'
14
+ base_path + '/new'
15
+ when 'edit'
16
+ base_path + "/#{ar_object.id}" + '/edit'
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,36 +1,14 @@
1
- module CmAdmin
2
- class InstallGenerator < Rails::Generators::Base
3
- source_root File.expand_path('templates', __dir__)
4
-
5
- desc <<-DESC.strip_heredoc
6
- Generates layout for the entire admin panel
7
-
8
- For example:
9
- rails g cm_admin:install
10
-
11
- It copies the respectively layout files and the necessary asset files.
12
-
13
- DESC
1
+ require 'rails/generators'
14
2
 
15
- def add_required_gems
16
- gem 'slim'
17
- gem 'simple_form'
18
- system("yarn add bootstrap")
19
- system("yarn add @fortawesome/fontawesome-free")
20
- system("yarn add select2")
21
- end
22
-
23
- def copy_layout_file
24
- copy_file "layouts/_side_navbar.html.slim", "app/views/layouts/_side_navbar.html.slim"
25
- copy_file "layouts/_navbar.html.slim", "app/views/layouts/_navbar.html.slim"
26
- remove_file "app/views/layouts/application.html.erb"
27
- copy_file "layouts/application.html.slim", "app/views/layouts/application.html.slim"
28
- end
29
-
30
- def copy_asset_file
31
- copy_file "assets/images/cm.png", "app/assets/images/cm.png"
32
- directory "assets/stylesheets/", "app/assets/stylesheets/"
33
- remove_file "app/assets/stylesheets/application.css"
3
+ module CmAdmin
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('templates', __dir__)
7
+
8
+ def copy_initializer
9
+ copy_file 'cm_admin_initializer.rb', 'config/initializers/cm_admin.rb'
10
+ route 'mount CmAdmin::Engine => "/cm_admin"'
11
+ end
34
12
  end
35
13
  end
36
14
  end
@@ -0,0 +1,4 @@
1
+ CmAdmin.setup do |config|
2
+ # Sets the default layout to be used for admin
3
+ config.layout = 'admin'
4
+ end
@@ -0,0 +1,63 @@
1
+ # desc "Explaining what the task does"
2
+ # task :cm_admin do
3
+ # # Task goes here
4
+ # end
5
+
6
+ def ensure_log_goes_to_stdout
7
+ old_logger = Webpacker.logger
8
+ Webpacker.logger = ActiveSupport::Logger.new(STDOUT)
9
+ yield
10
+ ensure
11
+ Webpacker.logger = old_logger
12
+ end
13
+
14
+ namespace :cm_admin do
15
+ namespace :webpacker do
16
+ desc "Install deps with yarn"
17
+ task :yarn_install do
18
+ Dir.chdir(File.join(__dir__, "../..")) do
19
+ system "yarn install --no-progress --production"
20
+ end
21
+ end
22
+
23
+ desc "Compile JavaScript packs using webpack for production with digests"
24
+ task compile: [:yarn_install, :environment] do
25
+ Webpacker.with_node_env("production") do
26
+ ensure_log_goes_to_stdout do
27
+ if CmAdmin.webpacker.commands.compile
28
+ # Successful compilation!
29
+ else
30
+ # Failed compilation
31
+ exit!
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ def yarn_install_available?
40
+ rails_major = Rails::VERSION::MAJOR
41
+ rails_minor = Rails::VERSION::MINOR
42
+
43
+ rails_major > 5 || (rails_major == 5 && rails_minor >= 1)
44
+ end
45
+
46
+ def enhance_assets_precompile
47
+ # yarn:install was added in Rails 5.1
48
+ deps = yarn_install_available? ? [] : ["cm_admin:webpacker:yarn_install"]
49
+ Rake::Task["assets:precompile"].enhance(deps) do
50
+ Rake::Task["cm_admin:webpacker:compile"].invoke
51
+ end
52
+ end
53
+
54
+ # Compile packs after we've compiled all other assets during precompilation
55
+ skip_webpacker_precompile = %w(no false n f).include?(ENV["WEBPACKER_PRECOMPILE"])
56
+
57
+ unless skip_webpacker_precompile
58
+ if Rake::Task.task_defined?("assets:precompile")
59
+ enhance_assets_precompile
60
+ else
61
+ Rake::Task.define_task("assets:precompile" =>"cm_admin:webpacker:compile")
62
+ end
63
+ end