cm-admin 1.0.2 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linters.yml +6 -2
  3. data/.gitignore +1 -1
  4. data/.stylelintrc.json +3 -0
  5. data/Gemfile.lock +19 -18
  6. data/app/assets/javascripts/cm_admin/application.js +1 -0
  7. data/app/assets/javascripts/cm_admin/exports.js +1 -1
  8. data/app/assets/javascripts/cm_admin/scaffolds.js +5 -1
  9. data/app/assets/javascripts/cm_admin/shared_scaffolds.js +132 -0
  10. data/app/assets/stylesheets/cm_admin/base/auth.scss +113 -0
  11. data/app/assets/stylesheets/cm_admin/base/common.scss +2 -2
  12. data/app/assets/stylesheets/cm_admin/base/form.scss +4 -0
  13. data/app/assets/stylesheets/cm_admin/base/table.scss +2 -1
  14. data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +2 -0
  15. data/app/assets/stylesheets/cm_admin/dependency/flatpickr.min.css +13 -0
  16. data/app/assets/stylesheets/cm_admin/helpers/_mixins.scss +1 -1
  17. data/app/assets/stylesheets/cm_admin/pages/history_page.scss +49 -0
  18. data/app/controllers/cm_admin/resource_controller.rb +31 -7
  19. data/app/javascript/packs/cm_admin/application.js +1 -0
  20. data/app/javascript/packs/cm_admin/scaffolds.js +1 -136
  21. data/app/views/cm_admin/main/_nested_fields.html.slim +1 -1
  22. data/app/views/cm_admin/main/_nested_table_form.html.slim +2 -2
  23. data/app/views/cm_admin/main/_tabs.html.slim +5 -1
  24. data/app/views/cm_admin/main/associated_show.html.slim +1 -1
  25. data/app/views/cm_admin/main/history.html.slim +17 -0
  26. data/app/views/cm_admin/main/new.html.slim +2 -5
  27. data/app/views/cm_admin/main/show.html.slim +1 -1
  28. data/app/views/layouts/_left_sidebar_nav.html.slim +15 -19
  29. data/app/views/layouts/cm_admin.html.slim +2 -1
  30. data/config/routes.rb +9 -1
  31. data/lib/cm_admin/constants.rb +4 -0
  32. data/lib/cm_admin/model.rb +2 -2
  33. data/lib/cm_admin/models/action.rb +2 -1
  34. data/lib/cm_admin/models/dsl_method.rb +17 -19
  35. data/lib/cm_admin/models/section.rb +38 -0
  36. data/lib/cm_admin/version.rb +1 -1
  37. data/lib/cm_admin/view_helpers/form_helper.rb +55 -30
  38. data/lib/cm_admin/view_helpers/page_info_helper.rb +8 -0
  39. data/lib/generators/cm_admin/templates/application_policy.rb +4 -0
  40. data/package-lock.json +61 -61
  41. data/package.json +1 -1
  42. data/yarn.lock +64 -46
  43. metadata +8 -5
  44. data/.github/workflows/.stylelintrc.json +0 -3
  45. data/lib/cm_admin/models/cm_show_section.rb +0 -19
  46. data/tmp/cache/webpacker/last-compilation-digest-development +0 -1
@@ -9,6 +9,7 @@ require('flatpickr')
9
9
  require("jgrowl")
10
10
  require("trix")
11
11
  require('./scaffolds.js')
12
+ require('/app/assets/javascripts/cm_admin/shared_scaffolds.js')
12
13
  require('/app/assets/javascripts/cm_admin/form_validation.js')
13
14
  require('/app/assets/javascripts/cm_admin/quick_search.js')
14
15
  require('/app/assets/javascripts/cm_admin/filters.js')
@@ -19,139 +19,4 @@ $(document).on('turbolinks:load', function () {
19
19
  var headerElemHeight = $('.page-top-bar').height() + 64
20
20
  var calculatedHeight = "calc(100vh - " + headerElemHeight+"px"+")"
21
21
  $('.new-admin-table').css("maxHeight", calculatedHeight);
22
- });
23
-
24
- $(document).on("keypress keyup blur", "[data-behaviour='decimal-only'], [data-behaviour='filter'][data-filter-type='range']", function (e) {
25
- var charCode = (e.which) ? e.which : e.keyCode
26
- if (charCode > 31 && (charCode != 46 &&(charCode < 48 || charCode > 57)))
27
- return false;
28
- return true;
29
- });
30
-
31
- $(document).on("keypress keyup blur", "[data-behaviour='integer-only']", function (event) {
32
- $(this).val($(this).val().replace(/[^\d].+/, ""));
33
- if ((event.which < 48 || event.which > 57)) {
34
- event.preventDefault();
35
- }
36
- });
37
-
38
- $(document).on('click', '.row-action-cell', function(e) {
39
- e.stopPropagation();
40
- if ($(this).hasClass('opacity-1')) {
41
- $('.row-action-cell').removeClass('opacity-1')
42
- } else {
43
- $('.row-action-cell').removeClass('opacity-1')
44
- $(this).addClass('opacity-1');
45
- }
46
- if ($(this).find('.table-export-popup').hasClass('hidden')) {
47
- return $(this).find('.table-export-popup').removeClass('hidden');
48
- } else {
49
- return $(this).find('.table-export-popup').addClass('hidden');
50
- }
51
- });
52
-
53
-
54
- $(document).on('click', '.drawer-btn', function(e) {
55
- e.stopPropagation();
56
- drawer_el = $(this).parent().closest('.drawer').find('.cm-drawer')
57
- if (drawer_el.hasClass('hidden')) {
58
- drawer_el.removeClass('hidden');
59
- drawer_container = drawer_el.find('.drawer-container')
60
- if (drawer_container.hasClass('drawer-slide-out')) {
61
- drawer_container.removeClass('drawer-slide-out');
62
- }
63
- drawer_container.addClass('drawer-slide-in');
64
- } else {
65
- return drawer_el.addClass('hidden');
66
- }
67
- });
68
-
69
- $(document).on('click', '.drawer-close', function(e) {
70
- e.stopPropagation();
71
- $('.drawer-container').removeClass('drawer-slide-in');
72
- $('.drawer-container').addClass('drawer-slide-out');
73
- setTimeout(() => {
74
- $('.cm-drawer').addClass('hidden');
75
- }, 300);
76
- });
77
-
78
- $(document).on('change', '[data-field-type="linked-field"]', function(e) {
79
- e.stopPropagation();
80
- params = {}
81
- params[$(this).data('field-name')] = $(this).val()
82
- request_url = $(this).data('target-url') + '?' + $.param(params);
83
- console.log(request_url)
84
- $.ajax(request_url, {
85
- type: 'GET',
86
- success: function(data) {
87
- apply_response_to_field(data)
88
- },
89
- error: function(jqxhr, textStatus, errorThrown) {
90
- alert('Something went wrong. Please try again later.\n' + errorThrown);
91
- }
92
- });
93
- });
94
-
95
- function apply_response_to_field(response) {
96
- $.each(response['fields'], function(key, value) {
97
- switch(value['target_type']) {
98
- case 'select':
99
- update_options_in_select(value['target_value'])
100
- break;
101
- case 'input':
102
- update_options_input_value(value['target_value'])
103
- break;
104
- case 'toggle_visibility':
105
- toggle_field_visibility(value['target_value'])
106
- }
107
- })
108
- }
109
-
110
- function update_options_input_value(field_obj) {
111
- input_tag = $('#' + field_obj['table'] + '_' + field_obj['field_name'])
112
- input_tag.val(field_obj['field_value'])
113
- }
114
-
115
- function update_options_in_select(field_obj) {
116
- select_tag = $('#' + field_obj['table'] + '_' + field_obj['field_name'])
117
- select_tag.empty();
118
- $.each(field_obj['field_value'], function(key, value) {
119
- select_tag.append($("<option></option>")
120
- .attr("value", value[1]).text(value[0]));
121
- });
122
- }
123
-
124
- function toggle_field_visibility(field_obj) {
125
- element = $('#' + field_obj['table'] + '_' + field_obj['field_name'])
126
- element.closest('.input-wrapper').toggleClass('hidden')
127
- }
128
-
129
- $(document).on('cocoon:after-insert', '.nested-field-wrapper', function(e) {
130
- e.stopPropagation();
131
- replaceAccordionTitle($(this))
132
- });
133
-
134
- $(document).on('cocoon:after-remove', '.nested-field-wrapper', function(e) {
135
- e.stopPropagation();
136
- replaceAccordionTitle($(this))
137
- });
138
-
139
- $(document).ready( function () {
140
- $('.nested-field-wrapper').each(function() {
141
- replaceAccordionTitle($(this))
142
- })
143
- });
144
-
145
- var replaceAccordionTitle = function(element) {
146
- var i = 0;
147
- var table_name = $(element).data('table-name')
148
- var model_name = $(element).data('model-name')
149
- $(element).find('.accordion-item:visible').each(function() {
150
- i++;
151
- var accordion_title = model_name + ' ' + i
152
- var accordion_id = table_name + '-' + i
153
- $(this).find('.accordion-button').text(accordion_title);
154
- $(this).find('.accordion-button').attr('data-bs-target', '#' + accordion_id);
155
- $(this).find('.accordion-collapse').attr('id', accordion_id);
156
- });
157
- }
22
+ });
@@ -1,4 +1,4 @@
1
- - fields = @model.available_fields[ action(action_name) ][assoc_name]
1
+ - fields = section.nested_table_fields[assoc_name]
2
2
  - if fields.count == 1
3
3
  .nested-single-field.nested-fields
4
4
  - fields.each do |field|
@@ -3,7 +3,7 @@
3
3
  .accordion.nested-form-accordion
4
4
  = f.fields_for table_name do |record|
5
5
  - if record.object.persisted?
6
- = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name }
6
+ = render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name, section: section }
7
7
  - if @reflections.select {|x| x if x.name == table_name}.first.macro == :has_many
8
8
  .links
9
- = 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 }}, class: 'd-inline-block secondary-btn mt-2'
9
+ = 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, section: section }}, class: 'd-inline-block secondary-btn mt-2'
@@ -4,4 +4,8 @@ ul.nav.nav-pills
4
4
  - if nav_item.custom_action.empty? || (nav_item.custom_action.present? && policy([:cm_admin, @model.name.classify.constantize]).send(:"#{nav_item.custom_action}?"))
5
5
  li.nav-item
6
6
  - nav_item_action_name = nav_item.custom_action.present? ? nav_item.custom_action : 'show'
7
- = link_to tab_display_name(nav_item.nav_item_name), cm_admin.send("#{@ar_object.model_name.singular}_#{nav_item_action_name}_path", @ar_object.id), class: "nav-link #{ nav_item_action_name == action_name ? 'active' : ''}"
7
+ = link_to tab_display_name(nav_item.nav_item_name), cm_admin.send("#{@ar_object.model_name.singular}_#{nav_item_action_name}_path", @ar_object.id), class: "nav-link #{ nav_item_action_name == action_name ? 'active' : ''}"
8
+ // current_action_name is defined when action trail is added to that model
9
+ - if defined?(@ar_object.current_action_name)
10
+ li.nav-item
11
+ = link_to 'History', cm_admin.send("#{@ar_object.model_name.singular}_history_path", @ar_object.id), class: "nav-link #{ action_name == 'history' ? 'active' : ''}"
@@ -2,5 +2,5 @@
2
2
  .info-section
3
3
  p.section-heading = section.section_name
4
4
  .paper
5
- - section.available_section_fields.each do |field|
5
+ - section.section_fields.each do |field|
6
6
  = show_field(@associated_ar_object, field)
@@ -0,0 +1,17 @@
1
+ .show-page.cm-page-container
2
+ .show-page__tabs.sticky-container.page-top-bar
3
+ .cm-tabs-bar
4
+ == render 'cm_admin/main/top_navbar'
5
+ == render 'cm_admin/main/tabs'
6
+ .show-page__inner.scrollable
7
+ .history-box
8
+ - @ar_object.action_trails.each do |at|
9
+ .history-item
10
+ .profile-pic
11
+ img alt=("profile") src="https://www.pngitem.com/pimgs/m/264-2647677_avatar-icon-human-user-avatar-svg-hd-png.png"
12
+ .history-info
13
+ span.bold-text = at.actor.first_name
14
+ span.normal-text = at.trail_type.titleize
15
+ span.normal-text the
16
+ span.bold-text = at.entity_type
17
+ span.light-text = at.created_at.strftime("%B")
@@ -15,8 +15,5 @@
15
15
  ul
16
16
  - @ar_object.errors.full_messages.each do |error_message|
17
17
  li = error_message
18
- .form-container
19
- p.form-title
20
- | Section heading
21
- .form-container__inner
22
- = generate_form(@ar_object.class.name.constantize.new, @model)
18
+
19
+ = generate_form(@ar_object.class.name.constantize.new, @model)
@@ -12,5 +12,5 @@
12
12
  .info-section
13
13
  p.section-heading = section.section_name
14
14
  .paper
15
- - section.available_section_fields.each do |field|
15
+ - section.section_fields.each do |field|
16
16
  = show_field(@ar_object, field)
@@ -12,23 +12,19 @@
12
12
 
13
13
  .sidebar-menu__tabs-wrapper
14
14
 
15
-
16
- .sidebar__footer
17
- .profile-name
18
- span.profile-avatar J
19
- | John Doe
20
- .profile-popup.hidden
21
- .profile-info
22
- .profile-info__left
23
- p.name-text John Doe
24
- p.email-text johndoe@commutatus.com
25
- .profile-info__right J
26
- .page-options
27
- = link_to '/', class: 'page-link'
28
- | Profile
29
- = link_to '', class: 'page-link'
30
- | Settings
31
- .auth-option
32
- = link_to '/sign-out', method: :delete, class: 'auth-link'
33
- | Logout
15
+ - if defined?(user_full_name)
16
+ .sidebar__footer
17
+ .menu-item
18
+ .profile-name
19
+ span.profile-avatar J
20
+ | #{user_full_name}
21
+ .profile-popup.hidden
22
+ .profile-info
23
+ .profile-info__left
24
+ p.name-text = user_full_name
25
+ p.email-text = current_user.email
26
+ .profile-info__right
27
+ .auth-option
28
+ = link_to destroy_user_session_path, method: :delete, class: 'auth-link', data: { turbo_method: :delete }
29
+ | Logout
34
30
  = render 'layouts/quick_links'
@@ -36,7 +36,8 @@ html
36
36
  .show-page__tabs.sticky-container.page-top-bar
37
37
  .cm-tabs-bar
38
38
  == render 'cm_admin/main/top_navbar'
39
- == render 'cm_admin/main/tabs'
39
+ - if @ar_object.model_name
40
+ == render 'cm_admin/main/tabs'
40
41
  - if @associated_model && @associated_model.filters.present?
41
42
  .filters-bar
42
43
  == render partial: 'cm_admin/main/filters', locals: { filters: @associated_model.filters }
data/config/routes.rb CHANGED
@@ -16,9 +16,17 @@ CmAdmin::Engine.routes.draw do
16
16
  send(:post, 'import', to: "#{model.name.underscore}#import", as: "#{model.name.underscore}_import")
17
17
  end
18
18
  end
19
+
19
20
  model.available_actions.sort_by {|act| act.name}.each do |act|
20
21
  scope model.name.tableize do
21
- send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}", as: "#{model.name.underscore}_#{act.name}")
22
+ # Define route only when action trail related field is present
23
+ if act.name == 'history'
24
+ if defined?(model.ar_model.new.current_action_name)
25
+ send(:get, ':id/history', to: "#{model.name.underscore}#history", as: "#{model.name.underscore}_history")
26
+ end
27
+ else
28
+ send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}", as: "#{model.name.underscore}_#{act.name}")
29
+ end
22
30
  end
23
31
  end
24
32
  end
@@ -28,6 +28,10 @@ module CmAdmin
28
28
  verb: :delete,
29
29
  path: ':id'
30
30
  },
31
+ history: {
32
+ verb: :get,
33
+ path: ':id/history'
34
+ },
31
35
  custom_action: {
32
36
  verb: :post
33
37
  }
@@ -8,7 +8,7 @@ require_relative 'models/blocks'
8
8
  require_relative 'models/column'
9
9
  require_relative 'models/filter'
10
10
  require_relative 'models/export'
11
- require_relative 'models/cm_show_section'
11
+ require_relative 'models/section'
12
12
  require_relative 'models/tab'
13
13
  require_relative 'models/dsl_method'
14
14
  require 'pagy'
@@ -36,7 +36,7 @@ module CmAdmin
36
36
  @additional_permitted_fields ||= []
37
37
  @current_action = nil
38
38
  @available_tabs ||= []
39
- @available_fields ||= {index: [], show: [], edit: {fields: []}, new: {fields: []}}
39
+ @available_fields ||= {index: [], show: [], edit: [], new: []}
40
40
  @params = nil
41
41
  @filters ||= []
42
42
  instance_eval(&block) if block_given?
@@ -6,7 +6,7 @@ module CmAdmin
6
6
  include Actions::Blocks
7
7
  attr_accessor :name, :display_name, :verb, :layout_type, :layout, :partial, :path, :page_title, :page_description,
8
8
  :child_records, :is_nested_field, :nested_table_name, :parent, :display_if, :route_type, :code_block,
9
- :display_type, :action_type, :redirection_url, :sort_direction, :sort_column, :icon_name
9
+ :display_type, :action_type, :redirection_url, :sort_direction, :sort_column, :icon_name, :scopes
10
10
 
11
11
  VALID_SORT_DIRECTION = Set[:asc, :desc].freeze
12
12
 
@@ -34,6 +34,7 @@ module CmAdmin
34
34
  self.action_type = :default
35
35
  self.sort_column = :created_at
36
36
  self.sort_direction = :desc
37
+ self.scopes ||= []
37
38
  self.icon_name = 'fa fa-th-large'
38
39
  end
39
40
 
@@ -39,6 +39,12 @@ module CmAdmin
39
39
  end
40
40
  end
41
41
 
42
+ def scope_list(scopes=[])
43
+ return unless @current_action
44
+
45
+ @current_action.scopes = scopes
46
+ end
47
+
42
48
  def tab(tab_name, custom_action, associated_model: nil, layout_type: nil, layout: nil, partial: nil, display_if: nil, &block)
43
49
  if custom_action.to_s == ''
44
50
  @current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
@@ -54,24 +60,14 @@ module CmAdmin
54
60
  yield if block
55
61
  end
56
62
 
57
- def cm_show_section(section_name, display_if: nil, &block)
63
+ def cm_section(section_name, display_if: nil, &block)
58
64
  @available_fields[@current_action.name.to_sym] ||= []
59
- @available_fields[@current_action.name.to_sym] << CmAdmin::Models::CmShowSection.new(section_name, display_if, &block)
60
- end
61
-
62
- def form_field(field_name, options={}, arg=nil)
63
- unless @current_action.is_nested_field
64
- @available_fields[@current_action.name.to_sym][:fields] << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
65
- else
66
- @available_fields[@current_action.name.to_sym][@current_action.nested_table_name] ||= []
67
- @available_fields[@current_action.name.to_sym][@current_action.nested_table_name] << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
68
- end
65
+ @available_fields[@current_action.name.to_sym] << CmAdmin::Models::Section.new(section_name, @current_action, @model, display_if, &block)
69
66
  end
70
67
 
71
- def nested_form_field(field_name, &block)
72
- @current_action.is_nested_field = true
73
- @current_action.nested_table_name = field_name
74
- yield
68
+ # This method is deprecated. Use cm_section instead.
69
+ def cm_show_section(section_name, display_if: nil, &block)
70
+ cm_section(section_name, display_if: display_if, &block)
75
71
  end
76
72
 
77
73
  def column(field_name, options={})
@@ -120,11 +116,13 @@ module CmAdmin
120
116
  # end
121
117
  # end
122
118
  # end
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)
119
+ def custom_action(name: nil, page_title: nil, page_description: 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)
124
120
  action = CmAdmin::Models::CustomAction.new(
125
- name: name, display_name: display_name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
126
- parent: self.current_action.name, display_type: display_type, display_if: display_if,
127
- action_type: :custom, route_type: route_type, icon_name: icon_name, &block)
121
+ page_title: page_title, page_description: page_description,
122
+ name: name, display_name: display_name, verb: verb, layout: layout,
123
+ layout_type: layout_type, partial: partial, path: path,
124
+ parent: self.current_action.name, display_type: display_type, display_if: display_if,
125
+ action_type: :custom, route_type: route_type, icon_name: icon_name, &block)
128
126
  @available_actions << action
129
127
  # self.class.class_eval(&block)
130
128
  end
@@ -0,0 +1,38 @@
1
+ module CmAdmin
2
+ module Models
3
+ class Section
4
+
5
+ attr_accessor :section_name, :section_fields, :display_if, :current_action, :cm_model, :nested_table_fields
6
+
7
+ def initialize(section_name, current_action, cm_model, display_if, &block)
8
+ @section_fields = []
9
+ @nested_table_fields = {}
10
+ @section_name = section_name
11
+ @current_action = current_action
12
+ @cm_model = cm_model
13
+ @display_if = display_if || lambda { |arg| return true }
14
+ instance_eval(&block)
15
+ end
16
+
17
+ def field(field_name, options={})
18
+ @section_fields << CmAdmin::Models::Field.new(field_name, options)
19
+ end
20
+
21
+ def form_field(field_name, options={}, arg=nil)
22
+ if @current_action.is_nested_field
23
+ @nested_table_fields[@current_action.nested_table_name] ||= []
24
+ @nested_table_fields[@current_action.nested_table_name] << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
25
+ else
26
+ @section_fields << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
27
+ end
28
+ end
29
+
30
+ def nested_form_field(field_name, &block)
31
+ @current_action.is_nested_field = true
32
+ @current_action.nested_table_name = field_name
33
+ yield
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = '1.0.2'
2
+ VERSION = '1.0.5'
3
3
  end
@@ -28,48 +28,73 @@ module CmAdmin
28
28
  set_form_for_fields(resource, columns, url, method)
29
29
  end
30
30
 
31
- def form_with_mentioned_fields(resource, available_fields, method)
31
+ def form_with_mentioned_fields(resource, sections_array, method)
32
32
  # columns = resource.class.columns.select { |i| available_fields.map(&:field_name).include?(i.name.to_sym) }
33
33
  table_name = resource.model_name.collection
34
34
  # columns.reject! { |i| REJECTABLE.include?(i.name) }
35
35
  url = CmAdmin::Engine.mount_path + "/#{table_name}/#{resource.id}"
36
- set_form_for_fields(resource, available_fields, url, method)
36
+ set_form_with_sections(resource, sections_array, url, method)
37
37
  end
38
38
 
39
- def set_form_for_fields(resource, available_fields_hash, url, method)
40
- form_for(resource, url: url, method: method, html: { class: "cm_#{resource.class.name.downcase}_form" } ) do |f|
39
+ def split_form_into_section(resource, form_obj, sections_array)
40
+ content_tag :div do
41
+ sections_array.each do |section|
42
+ concat create_sections(resource, form_obj, section)
43
+ end
44
+ end
45
+ end
46
+
47
+ def create_sections(resource, form_obj, section)
48
+ content_tag :div, class: 'form-container' do
49
+ concat content_tag(:p, section.section_name, class: 'form-title')
50
+ concat set_form_for_fields(resource, form_obj, section)
51
+ end
52
+ end
53
+
54
+ def set_form_for_fields(resource, form_obj, section)
55
+ content_tag(:div, class: 'form-container__inner') do
56
+ section.section_fields.each do |field|
57
+ next unless field.display_if.call(form_obj.object)
58
+
59
+ if field.input_type.eql?(:hidden)
60
+ concat input_field_for_column(form_obj, field)
61
+ else
62
+ concat(content_tag(:div, class: "input-wrapper #{field.disabled ? 'disabled' : ''}") do
63
+ concat form_obj.label field.label, field.label, class: 'field-label'
64
+ concat tag.br
65
+ concat(content_tag(:div, class: 'datetime-wrapper') do
66
+ concat input_field_for_column(form_obj, field)
67
+ end)
68
+ concat tag.p resource.errors[field.field_name].first if resource.errors[field.field_name].present?
69
+ end)
70
+ end
71
+ end
72
+ concat set_nested_form_fields(form_obj, section)
73
+ end
74
+ end
75
+
76
+ def set_nested_form_fields(form_obj, section)
77
+ content_tag(:div) do
78
+ section.nested_table_fields.keys.each do |key|
79
+ concat(render partial: '/cm_admin/main/nested_table_form', locals: {f: form_obj, table_name: key, section: section})
80
+ end
81
+ end
82
+ end
83
+
84
+ def set_form_with_sections(resource, sections_array, url, method)
85
+ form_for(resource, url: url, method: method, html: { class: "cm_#{resource.class.name.downcase}_form" } ) do |form_obj|
41
86
  if params[:referrer]
42
- concat f.text_field "referrer", class: "normal-input", hidden: true, value: params[:referrer], name: 'referrer'
87
+ concat form_obj.text_field "referrer", class: "normal-input", hidden: true, value: params[:referrer], name: 'referrer'
43
88
  end
44
89
  if params[:polymorphic_name].present?
45
- concat f.text_field params[:polymorphic_name] + '_type', class: "normal-input", hidden: true, value: params[:associated_class].classify
46
- concat f.text_field params[:polymorphic_name] + '_id', class: "normal-input", hidden: true, value: params[:associated_id]
90
+ concat form_obj.text_field params[:polymorphic_name] + '_type', class: "normal-input", hidden: true, value: params[:associated_class].classify
91
+ concat form_obj.text_field params[:polymorphic_name] + '_id', class: "normal-input", hidden: true, value: params[:associated_id]
47
92
  elsif params[:associated_class] && params[:associated_id]
48
- concat f.text_field params[:associated_class] + '_id', class: "normal-input", hidden: true, value: params[:associated_id]
49
- end
50
- available_fields_hash.each do |key, fields_array|
51
- if key == :fields
52
- fields_array.each do |field|
53
- next unless field.display_if.call(f.object)
54
- if field.input_type.eql?(:hidden)
55
- concat input_field_for_column(f, field)
56
- else
57
- concat(content_tag(:div, class: "input-wrapper #{field.disabled ? 'disabled' : ''}") do
58
- concat f.label field.label, field.label, class: "field-label"
59
- concat tag.br
60
- concat(content_tag(:div, class: "datetime-wrapper") do
61
- concat input_field_for_column(f, field)
62
- end)
63
- concat tag.p resource.errors[field.field_name].first if resource.errors[field.field_name].present?
64
- end)
65
- end
66
- end
67
- else
68
- concat(render partial: '/cm_admin/main/nested_table_form', locals: {f: f, table_name: key})
69
- end
93
+ concat form_obj.text_field params[:associated_class] + '_id', class: "normal-input", hidden: true, value: params[:associated_id]
70
94
  end
95
+ concat split_form_into_section(resource, form_obj, sections_array)
71
96
  concat tag.br
72
- concat f.submit 'Save', class: 'cta-btn mt-3 form_submit', data: {form_class: "cm_#{f.object.class.name.downcase}_form"}
97
+ concat form_obj.submit 'Save', class: 'cta-btn mt-3 form_submit', data: {form_class: "cm_#{form_obj.object.class.name.downcase}_form"}
73
98
  end
74
99
  end
75
100
  end
@@ -64,6 +64,8 @@ module CmAdmin
64
64
  custom_action_button(custom_action, current_action_name)
65
65
  when :modal
66
66
  custom_modal_button(custom_action)
67
+ when :page
68
+ link_to custom_action_title(custom_action), "#{@model.ar_model.table_name}/#{custom_action.path}", class: 'secondary-btn ml-2', method: custom_action.verb
67
69
  end
68
70
  end
69
71
  end
@@ -88,6 +90,12 @@ module CmAdmin
88
90
  def tab_display_name(nav_item_name)
89
91
  nav_item_name.instance_of?(Symbol) ? nav_item_name.to_s.titleize : nav_item_name.to_s
90
92
  end
93
+
94
+ def user_full_name
95
+ return false unless current_user
96
+ return current_user.full_name if defined?(current_user.full_name)
97
+ current_user.email.split('@').first
98
+ end
91
99
  end
92
100
  end
93
101
  end
@@ -36,6 +36,10 @@ class ApplicationPolicy
36
36
  false
37
37
  end
38
38
 
39
+ def history?
40
+ create?
41
+ end
42
+
39
43
  class Scope
40
44
  def initialize(user, scope)
41
45
  @user = user