cm-admin 0.6.5 → 0.6.8

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: 07c642182c72b7087759f3fbd91c0659a35a18215750100364bbdd9ebafa30c5
4
- data.tar.gz: 7ee59e35a1aa9b219a7648cd9d6c90d716a0aadec1119e4fe8bee2cc367997aa
3
+ metadata.gz: 8601dead14fb3dc0870bf087262dd3d8e52377f52da8c79c5d2ef5ed922a61a6
4
+ data.tar.gz: da9c5dd5ef0f560859234c673100e1fb0ed06c6d50bb9ea05e0cb067928cbbd0
5
5
  SHA512:
6
- metadata.gz: 54be244142003c74f63b7e8ef269749628cd96722d86f604e7687d171f25a98f1e07646e14a6369e10e7023fe12aaf8ffc56f9bd2115408fb891dccfe404357f
7
- data.tar.gz: e937f8ed679eae29efabb5fdaf76f85a6ffe949476c36d6edf8cdd101e0ef603f7c2e22e253df56d5ddfdd5fc1f6e120c8748988886355a82ba27380cb9b982f
6
+ metadata.gz: 227ebd136acf518706de80706f9555a424fa9b18748cf8fe9bcfc6694681bf402acbb9dfa9f669fd91688f236e4aab74e7dfa9737fdc4245faa9f637f479935e
7
+ data.tar.gz: 3f434f1aa0f507c66ec3eed00d880c749125c6a5aa4ae82f52aff4b89ef07331b254fc8baf1474bc4fd79894d215d3bb13e64f24d8ad6d3287abd279eb125907
@@ -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
+ });
@@ -1,4 +1,4 @@
1
- $(document).ready(function(e) {
1
+ $(document).on('turbolinks:load', function () {
2
2
  $('.select-2').select2();
3
3
  flatpickr("[data-behaviour='date-only']", {})
4
4
  flatpickr("[data-behaviour='date-time']", {
@@ -7,10 +7,13 @@ $(document).ready(function(e) {
7
7
  flatpickr("[data-behaviour='filter'][data-filter-type='date']", {
8
8
  mode: 'range'
9
9
  })
10
- Sortable.create($('.columns-list')[0],{
11
- handle: '.dragger',
12
- animation: 150
13
- });
10
+ var el = document.getElementsByClassName('columns-list')
11
+ if(el[0]) {
12
+ Sortable.create(el[0],{
13
+ handle: '.dragger',
14
+ animation: 150
15
+ });
16
+ }
14
17
  });
15
18
 
16
19
  $(document).on("keypress keyup blur", "[data-behaviour='decimal-only'], [data-behaviour='filter'][data-filter-type='range']", function (e) {
@@ -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}
@@ -4,9 +4,12 @@
4
4
  == render 'cm_admin/main/top_navbar'
5
5
  == render 'cm_admin/main/tabs'
6
6
  .show-page__inner.scrollable
7
- - @model.available_fields[:show].each do |section|
8
- .info-section
9
- p.section-heading = section.section_name
10
- .paper
11
- - section.available_section_fields.each do |field|
12
- = show_field(@ar_object, field)
7
+ - if @action.partial
8
+ == render @action.partial
9
+ - else
10
+ - @model.available_fields[:show].each do |section|
11
+ .info-section
12
+ p.section-heading = section.section_name
13
+ .paper
14
+ - section.available_section_fields.each do |field|
15
+ = show_field(@ar_object, field)
@@ -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
 
@@ -161,7 +162,7 @@ module CmAdmin
161
162
  redirect_url = @model.current_action.redirection_url || @action.redirection_url || request.referrer || "/cm_admin/#{@model.ar_model.table_name}/#{@ar_object.id}"
162
163
  format.html { redirect_to redirect_url, notice: "#{@action.name.titleize} is successful" }
163
164
  else
164
- error_messages = @ar_object.errors.full_messages.map{|error_message| "<li>#{error_message}</li>"}.join
165
+ error_messages = ar_object.errors.full_messages.map{|error_message| "<li>#{error_message}</li>"}.join
165
166
  format.html { redirect_to request.referrer, alert: "<b>#{@action.name.titleize} is unsuccessful</b><br /><ul>#{error_messages}</ul>" }
166
167
  end
167
168
  end
@@ -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.5"
2
+ VERSION = "0.6.8"
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
+ concat 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
@@ -6,7 +6,7 @@ module CmAdmin
6
6
  source_root File.expand_path('templates', __dir__)
7
7
 
8
8
  def copy_initializer
9
- copy_file 'cm_admin_initializer.rb', 'config/initializers/cm_admin.rb'
9
+ copy_file 'cm_admin_initializer.rb', 'config/initializers/zcm_admin.rb'
10
10
  copy_file 'custom.js', 'app/assets/javascripts/cm_admin/custom.js'
11
11
  copy_file 'custom.css', 'app/assets/stylesheets/cm_admin/custom.css'
12
12
  copy_file 'application_policy.rb', 'app/policies/application_policy.rb'
@@ -6,6 +6,8 @@ module CmAdmin
6
6
  source_root File.expand_path('templates', __dir__)
7
7
 
8
8
  def copy_policy_files
9
+ cm_model = CmAdmin::Model.find_by({name: file_name})
10
+ raise "cm_admin is not defined inside #{file_name} model" unless cm_model.present?
9
11
  template "policy.rb", "app/policies/cm_admin/#{file_name}_policy.rb"
10
12
  end
11
13
  end
@@ -1,4 +1,4 @@
1
- CmAdmin.setup do |config|
1
+ CmAdmin.configure do |config|
2
2
  # Sets the default layout to be used for admin
3
3
  config.layout = 'admin'
4
4
  end
@@ -1,5 +1,5 @@
1
1
  class CmAdmin::<%= class_name %>Policy < ApplicationPolicy
2
- <%- available_action_names = (CmAdmin::Model.find_by({name: class_name}).available_actions.map{|action| action.name}.uniq - ['custom_action', 'new', 'edit']) %>
2
+ <%- available_action_names = (cm_model.available_actions.map{|action| action.name}.uniq - ['custom_action', 'new', 'edit']) %>
3
3
  <%- available_action_names.each do |action_name| %>
4
4
  def <%= action_name %>?
5
5
  <%= CmAdmin.authorized_roles.map {|role| "@user.#{role}" }.join(' && ') %>
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,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cm-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.5
4
+ version: 0.6.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - sajinmp
8
8
  - anbublacky
9
9
  - AdityaTiwari2102
10
- autorequire:
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2022-04-13 00:00:00.000000000 Z
13
+ date: 2022-05-13 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
@@ -238,7 +239,7 @@ licenses:
238
239
  metadata:
239
240
  homepage_uri: https://github.com/commutatus/cm-admin
240
241
  source_code_uri: https://github.com/commutatus/cm-admin
241
- post_install_message:
242
+ post_install_message:
242
243
  rdoc_options: []
243
244
  require_paths:
244
245
  - lib
@@ -253,8 +254,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
253
254
  - !ruby/object:Gem::Version
254
255
  version: '0'
255
256
  requirements: []
256
- rubygems_version: 3.2.3
257
- signing_key:
257
+ rubygems_version: 3.2.32
258
+ signing_key:
258
259
  specification_version: 4
259
260
  summary: This is an admin panel gem
260
261
  test_files: []
@@ -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