cm-admin 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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