cm-admin 0.8.9 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/.stylelintrc.json +3 -0
  3. data/.github/workflows/linters.yml +31 -0
  4. data/Gemfile +5 -1
  5. data/Gemfile.lock +24 -11
  6. data/app/assets/stylesheets/cm_admin/base/auth.scss +1 -1
  7. data/app/assets/stylesheets/cm_admin/base/common.scss +3 -3
  8. data/app/assets/stylesheets/cm_admin/base/filters.scss +11 -17
  9. data/app/assets/stylesheets/cm_admin/base/form.scss +119 -50
  10. data/app/assets/stylesheets/cm_admin/base/main-nav.scss +3 -7
  11. data/app/assets/stylesheets/cm_admin/base/navbar.scss +3 -2
  12. data/app/assets/stylesheets/cm_admin/base/quicksearch.scss +4 -6
  13. data/app/assets/stylesheets/cm_admin/base/scaffold.scss +47 -2
  14. data/app/assets/stylesheets/cm_admin/base/show.scss +11 -9
  15. data/app/assets/stylesheets/cm_admin/base/sidebar.scss +9 -19
  16. data/app/assets/stylesheets/cm_admin/base/table.scss +258 -325
  17. data/app/assets/stylesheets/cm_admin/base/tabs.scss +1 -2
  18. data/app/assets/stylesheets/cm_admin/components/_buttons.scss +19 -6
  19. data/app/assets/stylesheets/cm_admin/components/_drawer.scss +4 -8
  20. data/app/assets/stylesheets/cm_admin/components/_dropdown-popup.scss +1 -2
  21. data/app/assets/stylesheets/cm_admin/components/_input.scss +1 -1
  22. data/app/assets/stylesheets/cm_admin/components/_status-tag.scss +3 -2
  23. data/app/assets/stylesheets/cm_admin/helpers/_variable.scss +4 -0
  24. data/app/assets/stylesheets/cm_admin/scaffold.scss +2 -2
  25. data/app/controllers/cm_admin/resource_controller.rb +4 -2
  26. data/app/javascript/packs/cm_admin/filters.js +1 -1
  27. data/app/javascript/packs/cm_admin/scaffolds.js +34 -1
  28. data/app/views/cm_admin/main/_actions_dropdown.html.slim +2 -2
  29. data/app/views/cm_admin/main/_associated_table.html.slim +20 -21
  30. data/app/views/cm_admin/main/_member_custom_action_modal.html.slim +1 -1
  31. data/app/views/cm_admin/main/_nested_fields.html.slim +26 -9
  32. data/app/views/cm_admin/main/_nested_table_form.html.slim +9 -10
  33. data/app/views/cm_admin/main/_table.html.slim +13 -14
  34. data/app/views/cm_admin/main/_tabs.html.slim +1 -1
  35. data/app/views/cm_admin/main/associated_index.html.slim +4 -5
  36. data/app/views/cm_admin/main/index.html.slim +13 -14
  37. data/app/views/cm_admin/main/show.html.slim +2 -2
  38. data/app/views/layouts/cm_admin.html.slim +5 -5
  39. data/lib/cm_admin/model.rb +6 -1
  40. data/lib/cm_admin/models/action.rb +1 -1
  41. data/lib/cm_admin/models/column.rb +16 -3
  42. data/lib/cm_admin/models/dsl_method.rb +17 -4
  43. data/lib/cm_admin/models/field.rb +7 -1
  44. data/lib/cm_admin/models/filter.rb +1 -1
  45. data/lib/cm_admin/models/utils/associations.rb +25 -0
  46. data/lib/cm_admin/version.rb +1 -1
  47. data/lib/cm_admin/view_helpers/field_display_helper.rb +21 -1
  48. data/lib/cm_admin/view_helpers/page_info_helper.rb +11 -3
  49. data/package-lock.json +2868 -229
  50. data/package.json +2 -0
  51. data/tmp/cache/webpacker/last-compilation-digest-development +1 -1
  52. data/yarn.lock +1656 -48
  53. metadata +5 -2
@@ -77,10 +77,23 @@ module CmAdmin
77
77
  def column(field_name, options={})
78
78
  @available_fields[@current_action.name.to_sym] ||= []
79
79
  if @available_fields[@current_action.name.to_sym].select{|x| x.lockable}.size > 0 && options[:lockable]
80
- raise "Only one column can be locked in a table."
80
+ raise 'Only one column can be locked in a table.'
81
81
  end
82
82
 
83
- unless @available_fields[@current_action.name.to_sym].map{|x| x.field_name.to_sym}.include?(field_name)
83
+ duplicate_columns = @available_fields[@current_action.name.to_sym].filter{|x| x.field_name.to_sym == field_name}
84
+ terminate = false
85
+
86
+ if duplicate_columns.size.positive?
87
+ duplicate_columns.each do |column|
88
+ if options[:field_type].to_s != 'association'
89
+ terminate = true
90
+ elsif options[:field_type].to_s == 'association' && column.association_name.to_s == options[:association_name].to_s
91
+ terminate = true
92
+ end
93
+ end
94
+ end
95
+
96
+ unless terminate
84
97
  @available_fields[@current_action.name.to_sym] << CmAdmin::Models::Column.new(field_name, options)
85
98
  end
86
99
  end
@@ -107,9 +120,9 @@ module CmAdmin
107
120
  # end
108
121
  # end
109
122
  # end
110
- def custom_action(name: nil, verb: nil, layout: nil, layout_type: nil, partial: nil, path: nil, display_type: nil, display_if: lambda { |arg| return true }, route_type: nil, icon_name: 'fa fa-th-large', &block)
123
+ def custom_action(name: nil, display_name: nil, verb: nil, layout: nil, layout_type: nil, partial: nil, path: nil, display_type: nil, display_if: lambda { |arg| return true }, route_type: nil, icon_name: 'fa fa-th-large', &block)
111
124
  action = CmAdmin::Models::CustomAction.new(
112
- name: name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
125
+ name: name, display_name: display_name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
113
126
  parent: self.current_action.name, display_type: display_type, display_if: display_if,
114
127
  action_type: :custom, route_type: route_type, icon_name: icon_name, &block)
115
128
  @available_actions << action
@@ -1,9 +1,13 @@
1
+ require_relative 'utils/associations'
2
+
1
3
  module CmAdmin
2
4
  module Models
3
5
  class Field
6
+ include Utils::Associations
4
7
 
5
8
  attr_accessor :field_name, :label, :header, :field_type, :format, :precision, :height,
6
- :width, :helper_method, :preview, :custom_link, :precision, :prefix, :suffix, :tag_class, :display_if
9
+ :width, :helper_method, :preview, :custom_link, :prefix, :suffix, :tag_class,
10
+ :display_if, :association_name, :association_type
7
11
 
8
12
  def initialize(field_name, attributes = {})
9
13
  @field_name = field_name
@@ -14,6 +18,8 @@ module CmAdmin
14
18
  self.height = 50 if self.field_type == :image && self.height.nil?
15
19
  self.width = 50 if self.field_type == :image && self.width.nil?
16
20
  self.display_if = lambda { |arg| return true } if self.display_if.nil?
21
+
22
+ validation_for_association
17
23
  end
18
24
 
19
25
  def set_default_values
@@ -70,7 +70,7 @@ module CmAdmin
70
70
 
71
71
  if filter.db_column_name.map{|x| x.is_a?(Hash)}.include?(true)
72
72
  associations_hash = filter.db_column_name.select{|x| x if x.is_a?(Hash)}.last
73
- records = records.joins(associations_hash.keys)
73
+ records = records.left_joins(associations_hash.keys).distinct
74
74
  end
75
75
 
76
76
  records = records.where(
@@ -0,0 +1,25 @@
1
+ module CmAdmin
2
+ module Models
3
+ module Utils
4
+ module Associations
5
+ extend ActiveSupport::Concern
6
+
7
+ def validation_for_association
8
+ return unless field_type.to_s == "association"
9
+
10
+ raise ArgumentError, 'Expected association_name and association_type to be present' if association_name.nil? || association_type.nil?
11
+
12
+ if association_type.to_s == 'polymorphic'
13
+ raise ArgumentError, "Expected field_name - #{field_name} - to be an array of hash. Eg, [{table_name_1: 'column_name_1'}, {table_name_2: 'column_name_2'}]" unless field_name.is_a?(Array)
14
+
15
+ field_name.each do |element|
16
+ raise ArgumentError, "Expected element #{element} to be a hash. Eg, [{table_name_1: 'column_name_1'}, {table_name_2: 'column_name_2'}]" unless element.is_a?(Hash)
17
+ end
18
+ elsif ['belongs_to', 'has_one'].include? association_type.to_s
19
+ raise ArgumentError, "Expected field_name - #{field_name} to be a String or Symbol" unless field_name.is_a?(Symbol) || field_name.is_a?(String)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = '0.8.9'
2
+ VERSION = '0.9.1'
3
3
  end
@@ -11,7 +11,14 @@ module CmAdmin
11
11
 
12
12
  def show_field_label(ar_object, field)
13
13
  content_tag(:div, class: "info-split__lhs") do
14
- p = field.label.present? ? field.label.to_s : field.field_name.to_s.titleize
14
+ field_label = if field.label.present?
15
+ field.label.to_s
16
+ elsif field.association_type.to_s == "polymorphic"
17
+ ar_object.send(field.association_name).class.to_s.titleize
18
+ else
19
+ field.field_name.to_s.titleize
20
+ end
21
+ p = field_label
15
22
  end
16
23
  end
17
24
 
@@ -73,6 +80,14 @@ module CmAdmin
73
80
  image_tag('https://cm-admin.s3.ap-south-1.amazonaws.com/gem_static_assets/image_not_available.png', height: 50, width: 50)
74
81
  end
75
82
  end
83
+ when :association
84
+ if field.association_type.to_s == 'polymorphic'
85
+ association_name = ar_object.send(field.association_name).class.to_s.underscore
86
+ field_name = find_field_name(field, association_name)
87
+ link_to ar_object.send(field.association_name).send(field_name), cm_admin.send("#{association_name}_show_path", ar_object.send(field.association_name).id)
88
+ elsif ['belongs_to', 'has_one'].include? field.association_type.to_s
89
+ link_to ar_object.send(field.association_name).send(field.field_name), cm_admin.send("#{field.association_name}_show_path", ar_object.send(field.association_name).id)
90
+ end
76
91
  end
77
92
  end
78
93
 
@@ -92,6 +107,11 @@ module CmAdmin
92
107
  end
93
108
  end
94
109
 
110
+ def find_field_name(field, association_name)
111
+ field.field_name.each do |hash|
112
+ return hash[association_name.to_sym] if hash.has_key?(association_name.to_sym)
113
+ end
114
+ end
95
115
  end
96
116
  end
97
117
  end
@@ -71,14 +71,22 @@ module CmAdmin
71
71
 
72
72
  def custom_action_button(custom_action, current_action_name)
73
73
  if current_action_name == "index"
74
- link_to custom_action.name.titleize, @model.ar_model.table_name + '/' + custom_action.path, class: 'secondary-btn ml-2', method: custom_action.verb
74
+ link_to custom_action_title(custom_action), @model.ar_model.table_name + '/' + custom_action.path, class: 'secondary-btn ml-2', method: custom_action.verb
75
75
  elsif current_action_name == "show"
76
- link_to custom_action.name.titleize, custom_action.path.gsub(':id', params[:id]), class: 'secondary-btn ml-2', method: custom_action.verb
76
+ link_to custom_action_title(custom_action), custom_action.path.gsub(':id', params[:id]), class: 'secondary-btn ml-2', method: custom_action.verb
77
77
  end
78
78
  end
79
79
 
80
80
  def custom_modal_button(custom_action)
81
- link_to custom_action.name.titleize, '', class: 'secondary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
81
+ link_to custom_action_title(custom_action), '', class: 'secondary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
82
+ end
83
+
84
+ def custom_action_title(custom_action)
85
+ custom_action.display_name.to_s.presence || custom_action.name.to_s.titleize
86
+ end
87
+
88
+ def tab_display_name(nav_item_name)
89
+ nav_item_name.instance_of?(Symbol) ? nav_item_name.to_s.titleize : nav_item_name.to_s
82
90
  end
83
91
  end
84
92
  end