cm-admin 0.6.6 → 0.6.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0644c45e1ae1e807b94e66341d607778f8ca9fbe456a1d741d34db0cf5489550
4
- data.tar.gz: 3cb2975b1c28a7cf6e150c16bb4e235750e02fb2ce39df110a4b2bb0b17f6a7c
3
+ metadata.gz: 49fd7ed0a9a218cb0daf20adbc60425aef06257f63c540142c378f753a46fd2e
4
+ data.tar.gz: 3bf484aae8a7a29d83dedbcb4164c0ce97f7081ee0b7d4acea6d4ea704e83cbb
5
5
  SHA512:
6
- metadata.gz: 412c8867112a3241b3e71b9049473f437bcc99950cf9c286495d5bd85b25459446a3465d150703cf4056c49daadfa1dd556eb0172e873cab2d665090c9d9c66c
7
- data.tar.gz: ec362ed640f95dd335b653d6040c904d40b53fb941eeb7f0eeefe94bf3d38910fdbdf5a00fb68b5b303ab15b578b680d0ed79cd764748813ef70b3556d138666
6
+ metadata.gz: 3f9a3fea9d9a14718bf34ed7a4eb8e7081fbac8f05d6c945f7e81d46a43de63c2bde20ef4e8c97db013609b8950d07a5db82221b73fc3a925293004438fee209
7
+ data.tar.gz: ab11a6578e525cc1cdb6315b025d8fbcdb686e616a9cbac25a196f86d9ad470792ea7e8a03b0257b89d082d638c9854f1f19211d3fac74e2a3312618e4cec3f4
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # CmAdmin
2
2
 
3
- New CmAdmin gem
3
+ An admin gem for Ruby on Rails application. Get your admin panel setup running quickly.
4
4
 
5
5
  ## Installation
6
6
 
@@ -31,6 +31,7 @@ You can find more detailed documentation [here](https://github.com/commutatus/cm
31
31
  ## Demo
32
32
 
33
33
  For demo check [here](http://cm-admin.labs.commutatus.com/admin/users/)
34
+ For demo repo check [here](https://github.com/commutatus/cm-admin-panel-demo)
34
35
 
35
36
  ## Development
36
37
 
@@ -199,9 +199,10 @@
199
199
  margin-left: 2px;
200
200
  }
201
201
 
202
- .text-ellipsis div {
203
- overflow: hidden;
202
+ .text-ellipsis {
204
203
  text-overflow: ellipsis;
204
+ white-space: nowrap;
205
+ overflow: hidden;
205
206
  }
206
207
 
207
208
  @keyframes shakeError {
@@ -81,6 +81,16 @@
81
81
  }
82
82
  }
83
83
 
84
+ .select2 {
85
+ &.error {
86
+ border: 1px solid $error-clr;
87
+ border-radius: 5px;
88
+ &:focus {
89
+ outline: 3px auto rgba(248, 54, 54, 0.3);
90
+ }
91
+ }
92
+ }
93
+
84
94
  .file-upload-wrapper {
85
95
  display: inline-flex;
86
96
  align-items: center;
@@ -8,7 +8,7 @@ module CmAdmin
8
8
  class ExportsController < ApplicationController
9
9
 
10
10
  def export
11
- file_path = CmAdmin::Models::Export.generate_excel(params[:class_name], params[:columns], helpers)
11
+ file_path = CmAdmin::Models::Export.generate_excel(params[:class_name], params, helpers)
12
12
  send_file file_path, disposition: 'attachment'
13
13
  end
14
14
 
@@ -8,8 +8,10 @@ require("bootstrap")
8
8
  require('flatpickr')
9
9
  require("jgrowl")
10
10
  require('./scaffolds.js')
11
+ require('./form_validation.js')
11
12
  require('./quick_search.js')
12
13
  require('./filters.js')
14
+ require('./exports.js')
13
15
 
14
16
  import jQuery from 'jquery'
15
17
  window.$ = jQuery
@@ -0,0 +1,6 @@
1
+ $(document).on('click', '.export-to-file-btn', function(e) {
2
+ e.preventDefault();
3
+ query_param = window.location.href.split("?")[1]
4
+ $('#export-to-file-form').get(0).setAttribute('action', '/cm_admin/export_to_file.js?' + query_param);
5
+ $("#export-to-file-form").submit();
6
+ });
@@ -0,0 +1,37 @@
1
+ $(document).on('turbolinks:load', function () {
2
+ $(document).on('click', '.form_submit', function(e) {
3
+ e.preventDefault();
4
+ var submit = [];
5
+ var form_class = $(this).data('form-class');
6
+ $("." + form_class + " input.required, ." + form_class + " textarea.required").each(function() {
7
+ $(this).removeClass('error');
8
+ if ($(this).val().trim().length === 0) {
9
+ $(this).addClass('error');
10
+ window.scrollTo(top);
11
+ submit.push(true);
12
+ }
13
+ });
14
+ $("." + form_class + " select.required").each(function() {
15
+ $(this).removeClass('error');
16
+ if ($(this).val().trim().length === 0) {
17
+ $(this).parent().find('.select2').addClass('error');
18
+ window.scrollTo(top);
19
+ submit.push(true);
20
+ }
21
+ });
22
+ $('.nested_input_validation').each(function() {
23
+ var class_name;
24
+ class_name = $(this).data('class-name');
25
+ $(this).parents(':nth(1)').find('.' + class_name).addClass('hidden');
26
+ if ($(this).val().trim().length === 0) {
27
+ $(this).parents(':nth(1)').find('.' + class_name).removeClass('hidden');
28
+ window.scrollTo(top);
29
+ submit.push(true);
30
+ }
31
+ });
32
+ if (submit.length === 0) {
33
+ $('.' + form_class).submit();
34
+ return $('.form_submit').button('loading');
35
+ }
36
+ });
37
+ });
@@ -2,11 +2,11 @@
2
2
  .table-top
3
3
  p.table-top__total-count = "#{@associated_ar_object.pagy.count} #{@action.child_records.to_s.gsub('_', ' ')} found"
4
4
  .table-top__column-action
5
- button.secondary-btn.column-btn data-target="#columnActionModal" data-toggle="modal" type="button"
6
- span
7
- i.fa.fa-columns.bolder
8
- span
9
- i.fa.fa-angle-down
5
+ / button.secondary-btn.column-btn data-target="#columnActionModal" data-toggle="modal" type="button"
6
+ / span
7
+ / i.fa.fa-columns.bolder
8
+ / span
9
+ / i.fa.fa-angle-down
10
10
 
11
11
  .new-admin-table.scrollable
12
12
  table.cm-table
@@ -26,8 +26,8 @@
26
26
  / span
27
27
  / input.cm-checkbox type="checkbox"
28
28
  - @model.available_fields[@action.name.to_sym].each do |column|
29
- td
30
- span class="#{column.cm_css_class} text-ellipsis" = show_field_value(ar_object, column)
29
+ td class="text-ellipsis"
30
+ span class="#{column.cm_css_class}" = show_field_value(ar_object, column)
31
31
  - associated_model_actions = @associated_model && @associated_model.available_actions.select{|act| act if act.route_type == 'member'}
32
32
  - if associated_model_actions.present?
33
33
  td.row-action-cell
@@ -46,10 +46,13 @@
46
46
  - if custom_action.display_if.call(ar_object)
47
47
  .popup-option
48
48
  - if custom_action.display_type == :button
49
- = link_to custom_action.name.titleize, custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb
49
+ = link_to cm_admin.send("#{@associated_model.name.underscore}_index_path") + '/' + custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb do
50
+ span
51
+ i class="#{custom_action.icon_name}"
52
+ = custom_action.name.humanize
50
53
  - elsif custom_action.display_type == :modal
51
- = link_to custom_action.name.titleize, '', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal-#{ar_object.id.to_s}" }
52
-
54
+ = link_to custom_action.name.humanize, '', data: { bs_toggle: 'modal', bs_target: "##{custom_action.name.classify}Modal-#{ar_object.id.to_s}" }
55
+
53
56
  .cm-pagination
54
57
  .cm-pagination__lhs Showing #{@associated_ar_object.pagy.from} to #{@associated_ar_object.pagy.to} out of #{@associated_ar_object.pagy.count}
55
58
  .cm-pagination__rhs
@@ -57,11 +60,11 @@
57
60
 
58
61
  - @associated_ar_object.data.each do |ar_object|
59
62
  - @associated_model && @associated_model.available_actions.select{|act| act if (act.route_type == 'member' && act.display_type == :modal)}.each do |custom_action|
60
- .modal.fade id="#{custom_action.name.classify}Modal-#{ar_object.id.to_s}" aria-hidden="true" aria-labelledby="#{custom_action.name.classify}ModalLabel" tabindex="1"
63
+ .modal.fade id="#{custom_action.name.classify}Modal-#{ar_object.id.to_s}" aria-hidden='true' aria-labelledby="#{custom_action.name.classify}ModalLabel" tabindex='1'
61
64
  .modal-dialog
62
65
  .modal-content
63
66
  .modal-header
64
67
  h5.modal-title id="#{custom_action.name.classify}ModalLabel" = custom_action.name.classify
65
- button.btn-close aria-label="Close" data-bs-dismiss="modal" type="button"
68
+ button.btn-close aria-label='Close' data-bs-dismiss='modal'
66
69
  .modal-body
67
- = render partial: custom_action.partial, locals: { ar_object: ar_object }
70
+ = render partial: custom_action.partial, locals: { ar_object: ar_object }
@@ -1,7 +1,10 @@
1
1
  .nested-field-wrapper
2
2
  label.field-label = table_name.to_s.titleize
3
+ - initialized_record_count = 1
3
4
  = f.fields_for table_name do |record|
4
- = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name }
5
+ - if record.object.persisted? || initialized_record_count == 1
6
+ = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name }
7
+ - initialized_record_count += 1 if record.object.new_record?
5
8
  - if @reflections.select {|x| x if x.name == table_name}.first.macro == :has_many
6
9
  .links
7
10
  = link_to_add_association "+ Add #{table_name.to_s.titleize}", f, table_name, partial: '/cm_admin/main/nested_fields', render_options: {locals: { assoc_name: table_name }}
@@ -53,11 +53,11 @@
53
53
  - custom_actions.each do |custom_action|
54
54
  - if custom_action.name.present? && has_valid_policy(@model.name, custom_action.name)
55
55
  - if custom_action.display_if.call(ar_object)
56
- = link_to cm_admin.send("#{@model.name.downcase}_index_path") + '/' + custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb do
56
+ = link_to cm_admin.send("#{@model.name.underscore}_index_path") + '/' + custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb do
57
57
  .popup-option
58
58
  span
59
59
  i class="#{custom_action.icon_name}"
60
- = custom_action.name.titleize
60
+ = custom_action.name.humanize
61
61
 
62
62
  .cm-pagination
63
63
  .cm-pagination__lhs Showing #{@ar_object.pagy.from} to #{@ar_object.pagy.to} out of #{@ar_object.pagy.count}
@@ -26,10 +26,6 @@ module CmAdmin
26
26
  :current_action, :params, :filters, :available_tabs, :icon_name
27
27
  attr_reader :name, :ar_model, :is_visible_on_sidebar
28
28
 
29
- # Class variable for storing all actions
30
- # CmAdmin::Model.all_actions
31
- singleton_class.send(:attr_accessor, :all_actions)
32
-
33
29
  def initialize(entity, &block)
34
30
  @name = entity.name
35
31
  @ar_model = entity
@@ -44,14 +40,10 @@ module CmAdmin
44
40
  instance_eval(&block) if block_given?
45
41
  actions unless @actions_set
46
42
  $available_actions = @available_actions.dup
47
- self.class.all_actions.push(@available_actions)
48
43
  define_controller
49
44
  end
50
45
 
51
46
  class << self
52
- def all_actions
53
- @all_actions || []
54
- end
55
47
 
56
48
  def find_by(search_hash)
57
49
  CmAdmin.config.cm_admin_models.find { |x| x.name == search_hash[:name] }
@@ -97,6 +89,15 @@ module CmAdmin
97
89
  @icon_name = name
98
90
  end
99
91
 
92
+ def filter_params(params)
93
+ # OPTIMIZE: Need to check if we can permit the filter_params in a better way
94
+ date_columns = @filters.select{|x| x.filter_type.eql?(:date)}.map(&:db_column_name)
95
+ range_columns = @filters.select{|x| x.filter_type.eql?(:range)}.map(&:db_column_name)
96
+ single_select_columns = @filters.select{|x| x.filter_type.eql?(:single_select)}.map(&:db_column_name)
97
+ multi_select_columns = @filters.select{|x| x.filter_type.eql?(:multi_select)}.map{|x| Hash["#{x.db_column_name}", []]}
98
+
99
+ params.require(:filters).permit(:search, date: date_columns, range: range_columns, single_select: single_select_columns, multi_select: multi_select_columns) if params[:filters]
100
+ end
100
101
 
101
102
  private
102
103
 
@@ -185,14 +186,6 @@ module CmAdmin
185
186
  CmAdmin.const_set "#{@name}Controller", klass
186
187
  end
187
188
 
188
- def filter_params(params)
189
- # OPTIMIZE: Need to check if we can permit the filter_params in a better way
190
- date_columns = @filters.select{|x| x.filter_type.eql?(:date)}.map(&:db_column_name)
191
- range_columns = @filters.select{|x| x.filter_type.eql?(:range)}.map(&:db_column_name)
192
- single_select_columns = @filters.select{|x| x.filter_type.eql?(:single_select)}.map(&:db_column_name)
193
- multi_select_columns = @filters.select{|x| x.filter_type.eql?(:multi_select)}.map{|x| Hash["#{x.db_column_name}", []]}
194
-
195
- params.require(:filters).permit(:search, date: date_columns, range: range_columns, single_select: single_select_columns, multi_select: multi_select_columns) if params[:filters]
196
- end
189
+
197
190
  end
198
191
  end
@@ -27,30 +27,6 @@ module CmAdmin
27
27
  self.tag_class = {}
28
28
  end
29
29
 
30
- #formatting value for different data types
31
- def self.format_data_type(column, value)
32
- case column.column_type
33
- when :string
34
- if column.format.present?
35
- column.format = [column.format] if column.format.is_a? String
36
- column.format.each do |formatter|
37
- value = value.send(formatter)
38
- end
39
- end
40
- when :datetime
41
- format_value = column.format.present? ? column.format.to_s : '%d/%m/%Y'
42
- value = value.strftime(format_value)
43
- when :enum
44
- value = value.titleize
45
- when :decimal
46
- round_to = column.round.present? ? column.round.to_i : 2
47
- value = value.round(round_to)
48
- when :custom
49
-
50
- end
51
- return value
52
- end
53
-
54
30
  class << self
55
31
  def find_by(model, search_hash)
56
32
  model.available_fields.find { |i| i.name == search_hash[:name] }
@@ -3,18 +3,10 @@ module CmAdmin
3
3
  module DslMethod
4
4
  extend ActiveSupport::Concern
5
5
 
6
- def cm_page(name: nil, partial: nil, path: nil, route_type: nil, page_title: nil, display_type: :button, &block)
7
- action = CmAdmin::Models::CustomAction.new(name: name, verb: :get, partial: partial, path: path, route_type: route_type, display_type: display_type, &block)
8
- @available_actions << action
9
- # @available_actions << CmAdmin::Models::CustomAction.new(name: name, verb: 'get', layout: 'cm_admin', partial: partial, path: path, parent: self.current_action.name, route_type: route_type, page_title: page_title, display_type: display_type, &block)
10
- # @current_action = CmAdmin::Models::CustomAction.find_by(self, name: name)
11
- end
12
-
13
6
  def cm_index(page_title: nil, page_description: nil, partial: nil, &block)
14
7
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'index')
15
8
  @current_action.set_values(page_title, page_description, partial)
16
9
  yield
17
- # action.instance_eval(&block)
18
10
  end
19
11
 
20
12
  def cm_show(page_title: nil, page_description: nil, partial: nil, &block)
@@ -2,24 +2,29 @@ module CmAdmin
2
2
  module Models
3
3
  class Export
4
4
  class << self
5
- def generate_excel(klass_name, columns = [], helpers)
5
+ def generate_excel(klass_name, params, helpers)
6
6
  klass = klass_name.constantize
7
+ columns = params[:columns] || []
8
+ # filter_params = params[:filters]
7
9
  model = CmAdmin::Model.find_by({name: klass_name})
8
- records = get_records(klass, model, columns, helpers)
10
+ # records = get_records(klass, model, columns, helpers)
11
+ records = "CmAdmin::#{klass_name}Policy::Scope".constantize.new(Current.user, klass).resolve
12
+ filtered_data = CmAdmin::Models::Filter.filtered_data(model.filter_params(params), records, model.filters)
13
+ formatted_data = format_records(filtered_data, model, columns, helpers)
9
14
  file_path = "#{Rails.root}/tmp/#{klass}_data_#{DateTime.now.strftime("%Y-%m-%d_%H-%M-%S")}.xlsx"
10
- create_workbook(records, columns, file_path)
15
+ create_workbook(formatted_data, columns, file_path)
11
16
  return file_path
12
17
  end
13
18
 
14
- def get_records(klass, model, columns, helpers)
15
- records = klass
19
+
20
+ def format_records(records, model, columns, helpers)
16
21
  custom_fields = model.available_fields[:index].map{|field| field if field.field_type == :custom}.compact
17
22
  normal_fields = model.available_fields[:index].map{|field| field unless field.field_type == :custom}.compact
18
23
  deserialized_columns = CmAdmin::Utils.deserialize_csv_columns(columns, :as_json_params)
19
24
  # This includes isn't recursve, a full solution should be recursive
20
25
  records_arr = []
21
26
  records.includes(deserialized_columns[:include].keys).find_each do |record|
22
- record_hash = record.as_json({only: normal_fields.map(&:field_name)})
27
+ record_hash = record.as_json({only: columns.map(&:to_sym)})
23
28
  custom_fields.each do |field|
24
29
  record_hash[field.field_name.to_sym] = helpers.send(field.helper_method, record, field.field_name)
25
30
  end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = "0.6.6"
2
+ VERSION = "0.6.9"
3
3
  end
@@ -25,43 +25,41 @@ module CmAdmin
25
25
  end
26
26
 
27
27
  def show_field_value(ar_object, field)
28
- content_tag(:span) do
29
- case field.field_type || :string
30
- when :integer
31
- ar_object.send(field.field_name).to_s
32
- when :decimal
33
- ar_object.send(field.field_name).to_f.round(field.precision).to_s if ar_object.send(field.field_name)
34
- when :string
28
+ case field.field_type || :string
29
+ when :integer
30
+ ar_object.send(field.field_name).to_s
31
+ when :decimal
32
+ ar_object.send(field.field_name).to_f.round(field.precision).to_s if ar_object.send(field.field_name)
33
+ when :string
34
+ ar_object.send(field.field_name).to_s
35
+ when :datetime
36
+ ar_object.send(field.field_name).strftime(field.format || "%d/%m/%Y").to_s if ar_object.send(field.field_name)
37
+ when :text
38
+ ar_object.send(field.field_name)
39
+ when :custom
40
+ send(field.helper_method, ar_object, field.field_name)
41
+ when :link
42
+ if field.custom_link
43
+ link = field.custom_link
44
+ else
45
+ link = ar_object.send(field.field_name)
46
+ end
47
+ content_tag :a, href: link do
35
48
  ar_object.send(field.field_name).to_s
36
- when :datetime
37
- ar_object.send(field.field_name).strftime(field.format || "%d/%m/%Y").to_s if ar_object.send(field.field_name)
38
- when :text
39
- ar_object.send(field.field_name)
40
- when :custom
41
- send(field.helper_method, ar_object, field.field_name)
42
- when :link
43
- if field.custom_link
44
- link = field.custom_link
45
- else
46
- link = ar_object.send(field.field_name)
47
- end
48
- content_tag :a, href: link do
49
- ar_object.send(field.field_name).to_s
50
- end
51
- when :enum
52
- ar_object.send(field.field_name).to_s.titleize
53
- when :tag
54
- tag_class = field.tag_class.dig("#{ar_object.send(field.field_name.to_s)}".to_sym).to_s
55
- content_tag :span, class: "status-tag #{tag_class}" do
56
- ar_object.send(field.field_name).to_s.upcase
57
- end
58
- when :attachment
59
- concat show_attachment_value(ar_object, field)
60
- when :drawer
61
- content_tag :span do
62
- concat content_tag(:span, truncate(ar_object.send(field.field_name).to_s, length: 25))
63
- concat content_tag(:span, 'View', class: 'drawer-btn')
64
- end
49
+ end
50
+ when :enum
51
+ ar_object.send(field.field_name).to_s.titleize
52
+ when :tag
53
+ tag_class = field.tag_class.dig("#{ar_object.send(field.field_name.to_s)}".to_sym).to_s
54
+ content_tag :span, class: "status-tag #{tag_class}" do
55
+ ar_object.send(field.field_name).to_s.upcase
56
+ end
57
+ when :attachment
58
+ show_attachment_value(ar_object, field)
59
+ when :drawer
60
+ content_tag :div, class: 'd-flex' do
61
+ concat content_tag(:div, ar_object.send(field.field_name).to_s, class: 'text-ellipsis')
62
+ concat content_tag(:div, 'View', class: 'drawer-btn')
65
63
  end
66
64
  end
67
65
  end
@@ -3,27 +3,29 @@ module CmAdmin
3
3
  module FormFieldHelper
4
4
  def input_field_for_column(f, field)
5
5
  value = field.custom_value || f.object.send(field.field_name)
6
+ is_required = f.object._validators[field.field_name].map(&:kind).include?(:presence)
7
+ required_class = is_required ? 'required' : ''
6
8
  case field.input_type
7
9
  when :integer
8
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.humanize.downcase}", data: { behaviour: 'integer-only' }
10
+ return f.text_field field.field_name, class: "normal-input #{required_class}", disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.humanize.downcase}", data: { behaviour: 'integer-only' }
9
11
  when :decimal
10
- return f.number_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'decimal-only' }
12
+ return f.number_field field.field_name, class: "normal-input #{required_class}", disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'decimal-only' }
11
13
  when :string
12
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}"
14
+ return f.text_field field.field_name, class: "normal-input #{required_class}", disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}"
13
15
  when :single_select
14
- return f.select field.field_name, options_for_select((field.collection || []), value), {include_blank: "Select #{field.field_name.to_s.downcase.gsub('_', ' ')}"}, class: 'normal-input select-2', disabled: field.disabled
16
+ return f.select field.field_name, options_for_select((field.collection || []), value), {include_blank: "Select #{field.field_name.to_s.downcase.gsub('_', ' ')}"}, class: "normal-input #{required_class} select-2", disabled: field.disabled
15
17
  when :multi_select
16
- return f.select field.field_name, options_for_select((field.collection || []), value), {include_blank: "Select #{field.field_name.to_s.downcase.gsub('_', ' ')}"}, class: 'normal-input select-2', disabled: field.disabled, multiple: true
18
+ return f.select field.field_name, options_for_select((field.collection || []), value), {include_blank: "Select #{field.field_name.to_s.downcase.gsub('_', ' ')}"}, class: "normal-input #{required_class} select-2", disabled: field.disabled, multiple: true
17
19
  when :date
18
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'date-only' }
20
+ return f.text_field field.field_name, class: "normal-input #{required_class}", disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'date-only' }
19
21
  when :date_time
20
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'date-time' }
22
+ return f.text_field field.field_name, class: "normal-input #{required_class}", disabled: field.disabled, value: value, placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}", data: { behaviour: 'date-time' }
21
23
  when :text
22
- return f.text_area field.field_name, class: 'normal-input', placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}"
24
+ return f.text_area field.field_name, class: "normal-input #{required_class}", placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}"
23
25
  when :single_file_upload
24
- return f.file_field field.field_name, class: 'normal-input'
26
+ return f.file_field field.field_name, class: "normal-input #{required_class}"
25
27
  when :multi_file_upload
26
- return f.file_field field.field_name, multiple: true, class: 'normal-input'
28
+ return f.file_field field.field_name, multiple: true, class: "normal-input #{required_class}"
27
29
  when :hidden
28
30
  return f.hidden_field field.field_name, value: field.custom_value
29
31
  end
@@ -37,7 +37,7 @@ module CmAdmin
37
37
  end
38
38
 
39
39
  def set_form_for_fields(resource, available_fields_hash, url, method)
40
- form_for(resource, url: url, method: method) do |f|
40
+ form_for(resource, url: url, method: method, html: { class: "cm_#{resource.class.name.downcase}_form" } ) do |f|
41
41
  available_fields_hash.each do |key, fields_array|
42
42
  if key == :fields
43
43
  fields_array.each do |field|
@@ -59,7 +59,7 @@ module CmAdmin
59
59
  end
60
60
  end
61
61
  concat tag.br
62
- concat f.submit 'Save', class: 'cta-btn mt-3'
62
+ concat f.submit 'Save', class: 'cta-btn mt-3 form_submit', data: {form_class: "cm_#{f.object.class.name.downcase}_form"}
63
63
  end
64
64
  end
65
65
  end
@@ -5,7 +5,6 @@ module CmAdmin
5
5
  include PageInfoHelper
6
6
  include NavigationHelper
7
7
  include FormHelper
8
- include ColumnFieldHelper
9
8
  include FieldDisplayHelper
10
9
  include FilterHelper
11
10
  include ManageColumnPopupHelper
data/yarn.lock CHANGED
@@ -1331,9 +1331,9 @@ async-limiter@~1.0.0:
1331
1331
  integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
1332
1332
 
1333
1333
  async@^2.6.2:
1334
- version "2.6.3"
1335
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
1336
- integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
1334
+ version "2.6.4"
1335
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
1336
+ integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
1337
1337
  dependencies:
1338
1338
  lodash "^4.17.14"
1339
1339
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cm-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.6
4
+ version: 0.6.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - sajinmp
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-05-03 00:00:00.000000000 Z
13
+ date: 2022-05-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: pagy
@@ -148,7 +148,9 @@ files:
148
148
  - app/helpers/cm_admin/application_helper.rb
149
149
  - app/helpers/cm_admin/custom_helper.rb
150
150
  - app/javascript/packs/cm_admin/application.js
151
+ - app/javascript/packs/cm_admin/exports.js
151
152
  - app/javascript/packs/cm_admin/filters.js
153
+ - app/javascript/packs/cm_admin/form_validation.js
152
154
  - app/javascript/packs/cm_admin/quick_search.js
153
155
  - app/javascript/packs/cm_admin/scaffolds.js
154
156
  - app/javascript/stylesheets/cm_admin/application.scss
@@ -212,7 +214,6 @@ files:
212
214
  - lib/cm_admin/utils.rb
213
215
  - lib/cm_admin/version.rb
214
216
  - lib/cm_admin/view_helpers.rb
215
- - lib/cm_admin/view_helpers/column_field_helper.rb
216
217
  - lib/cm_admin/view_helpers/field_display_helper.rb
217
218
  - lib/cm_admin/view_helpers/filter_helper.rb
218
219
  - lib/cm_admin/view_helpers/form_field_helper.rb
@@ -1,29 +0,0 @@
1
- module CmAdmin
2
- module ViewHelpers
3
- module ColumnFieldHelper
4
-
5
- #adds prefix and suffix to a value
6
- def add_prefix_and_suffix_helper(value, prefix, suffix)
7
- "#{prefix} #{value} #{suffix}"
8
- end
9
-
10
- #formats the column value a field
11
- def column_for_field_helper(ar_object, column)
12
- value = ar_object.send(column.db_column_name)
13
- formatted_value = CmAdmin::Models::Column.format_data_type(column, value)
14
- formatted_value = add_prefix_and_suffix_helper(formatted_value, column.prefix, column.suffix)
15
- formatted_value = link_url_value_helper(column, value, formatted_value)
16
- return formatted_value
17
- end
18
-
19
- #column's value is either linked with 'url' attribute's value or its own value
20
- def link_url_value_helper(column, value, formatted_value)
21
- return formatted_value unless column.column_type.to_s == 'link'
22
- link_url_value = column.url.present? ? column.url : value
23
- final_value = "<a href=#{link_url_value}>#{formatted_value}</a>".html_safe
24
- return final_value
25
- end
26
-
27
- end
28
- end
29
- end