cm-admin 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dcd2e766f902e8045d4eba1ae60067d6636477625f6a51a7ce896c0e446ad8bc
4
- data.tar.gz: d1ef041f20245116d4dafc04629b75768245a77b0f042e038675516e60692206
3
+ metadata.gz: 42bd38332aef8d07ca35563f166f706ece3c2da88fa5e22278694da5377bb983
4
+ data.tar.gz: 292d897394afa6ee6be6a1a1a970e88e77b7d9762d6859c86bafc273de20f619
5
5
  SHA512:
6
- metadata.gz: 1e152f94b559e7f12d9d0d6cb82688d293c6a799fe0ade4b503c0dc2e8edc0337864741b7a7ae50e8ddcd7e175cc1813125f0409b5f62880fac3c386cae30638
7
- data.tar.gz: d7b610b2ff1f329a09d3a31564f7f0d35bd5799803bcbdd31f15faad311803e516b6b828037524161993d139fabed9b08ef508cb2214a7dae6f2b74cb834dd32
6
+ metadata.gz: 29548bef18b577c1507ce3404a8055c3083d196c4ecaf03e62e1ccd1a9b9fa46ed128c411f95c3446fa8b95a50c245ad04d94c4a131a8b46d95bc41252e3953f
7
+ data.tar.gz: 4df3cd6b9d6d3a006798a58a292dfac7f77deaff586e622499d2474525c8060e10e4746993b53ed6f9d70d3a635acfab056ffa6ed418d9e5f5f1e4f4152b7c62
data/Gemfile.lock CHANGED
@@ -54,7 +54,7 @@ GEM
54
54
  method_source (1.0.0)
55
55
  mini_portile2 (2.8.0)
56
56
  minitest (5.15.0)
57
- nokogiri (1.13.3)
57
+ nokogiri (1.13.4)
58
58
  mini_portile2 (~> 2.8.0)
59
59
  racc (~> 1.4)
60
60
  pagy (4.11.0)
@@ -18,7 +18,6 @@
18
18
 
19
19
  &__table-container {
20
20
  padding: 20px;
21
- height: 100%;
22
21
  }
23
22
 
24
23
  .admin-table {
@@ -77,13 +76,14 @@
77
76
  overflow: auto;
78
77
  margin-top: 40px;
79
78
  margin-bottom: 50px;
80
- height: 280px;
79
+ height: calc(100vh - 365px);
81
80
  .cm-table {
82
81
  table-layout: fixed;
83
82
  position: relative;
84
83
  min-width: fit-content;
85
84
  border-collapse: collapse;
86
85
  border: 1px solid $grey-lighter-clr;
86
+ border-top-width: 0;
87
87
  border-radius: $radius-8;
88
88
  &__header {
89
89
  .header-row {
@@ -91,6 +91,7 @@
91
91
  width: 100%;
92
92
  position: relative;
93
93
  box-shadow: inset 0px -1px 0px rgba(148, 151, 155, 0.15);
94
+ border-top: 1px solid $grey-lighter-clr;
94
95
  th {
95
96
  @include font($size: $t6-text, $color: $ink-lighter-clr, $weight: bold);
96
97
  text-transform: uppercase;
@@ -129,7 +130,7 @@
129
130
  // height: 335px;
130
131
  display: block;
131
132
  position: relative;
132
- width: 100%;
133
+ width: 100%;
133
134
  .body-row {
134
135
  border-bottom: 1.21px solid rgb(240, 239, 239);
135
136
  td:nth-child(2){
@@ -138,7 +139,7 @@
138
139
  z-index: 2;
139
140
  background-color: #fff;
140
141
  }
141
-
142
+
142
143
  &:nth-last-child(1) {
143
144
  box-shadow: none;
144
145
  }
@@ -190,7 +191,6 @@
190
191
  justify-content: center;
191
192
  height: 100%;
192
193
  .popup-card {
193
- width:fit-content;
194
194
  .popup-option {
195
195
  a {
196
196
  font-weight: 500;
@@ -210,8 +210,8 @@
210
210
  }
211
211
  }
212
212
  .cm-table > thead {
213
- position:sticky;
214
- top:0;
213
+ position: sticky;
214
+ top: 0;
215
215
  background-color: #fff;
216
216
  z-index: 3;
217
217
  }
@@ -4,26 +4,12 @@
4
4
  font-size: $t4-text;
5
5
  line-height: 22px;
6
6
  padding: 4px;
7
- &.default-0 {
8
- color: $primary-text-clr;
9
- background: $grey-lighter-clr;
10
- }
11
- &.default-1 {
7
+ color: $primary-text-clr;
8
+ background: $grey-lighter-clr;
9
+ &.success {
12
10
  color: $green-regular-clr;
13
11
  background: $green-lightest-clr;
14
12
  }
15
- &.default-2 {
16
- color: $yellow-regular-clr;
17
- background: $yellow-lightest-clr;
18
- }
19
- &.default-3 {
20
- color: $red-regular-clr;
21
- background: $red-lightest-clr;
22
- }
23
- &.default-4 {
24
- color: $blue-regular-clr;
25
- background: $blue-lightest-clr;
26
- }
27
13
  }
28
14
 
29
15
  .filter-chip {
@@ -12,38 +12,43 @@
12
12
  table.cm-table
13
13
  thead.cm-table__header
14
14
  tr.header-row
15
- th.check-box-space
16
- span
17
- input.cm-checkbox type="checkbox"
15
+ // To be added once bulk-select is finalized
16
+ / th.check-box-space
17
+ / span
18
+ / input.cm-checkbox type="checkbox"
18
19
  - @model.available_fields[@action.name.to_sym].each do |column|
19
20
  th = column.header
20
21
  tbody.cm-table__body
21
22
  - @associated_ar_object.data.each do |ar_object|
22
23
  tr.body-row
23
- td.check-box-space
24
- span
25
- input.cm-checkbox type="checkbox"
24
+ // To be added once bulk-select is finalized
25
+ / td.check-box-space
26
+ / span
27
+ / input.cm-checkbox type="checkbox"
26
28
  - @model.available_fields[@action.name.to_sym].each do |column|
27
29
  td
28
30
  span class="#{column.cm_css_class} text-ellipsis" = show_field_value(ar_object, column)
29
- td.row-action-cell
30
- .row-action-tool
31
- button.secondary-btn.tool-btn type="button"
32
- span
33
- i.fa.fa-bars.bolder
34
- span
35
- i.fa.fa-angle-down
36
- .popup-card.table-export-popup.hidden
37
- .popup-option
38
- a href="#{page_url('edit', ar_object)}"
39
- | Edit
40
- - @associated_model && @associated_model.available_actions.select{|act| act if act.route_type == 'member'}.each do |custom_action|
41
- - if custom_action.display_if.call(ar_object)
42
- .popup-option
43
- - if custom_action.display_type == :button
44
- = link_to custom_action.name.titleize, custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb
45
- - elsif custom_action.display_type == :modal
46
- = link_to custom_action.name.titleize, '', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal-#{ar_object.id.to_s}" }
31
+ - associated_model_actions = @associated_model && @associated_model.available_actions.select{|act| act if act.route_type == 'member'}
32
+ - if associated_model_actions.present?
33
+ td.row-action-cell
34
+ .row-action-tool
35
+ button.secondary-btn.tool-btn type="button"
36
+ span
37
+ i.fa.fa-bars.bolder
38
+ span
39
+ i.fa.fa-angle-down
40
+ .popup-card.table-export-popup.hidden
41
+ // To be added once the associated model has edit actions
42
+ / .popup-option
43
+ / a href="#{page_url('edit', ar_object)}"
44
+ / | Edit
45
+ - associated_model_actions.each do |custom_action|
46
+ - if custom_action.display_if.call(ar_object)
47
+ .popup-option
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
50
+ - 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}" }
47
52
 
48
53
  .cm-pagination
49
54
  .cm-pagination__lhs Showing #{@associated_ar_object.pagy.from} to #{@associated_ar_object.pagy.to} out of #{@associated_ar_object.pagy.count}
@@ -11,17 +11,18 @@
11
11
  table.cm-table
12
12
  thead.cm-table__header
13
13
  tr.header-row
14
- th.check-box-space
15
- span
16
- input.cm-checkbox type="checkbox"
14
+ // Select all checkbox feature to be added later
15
+ / th.check-box-space
16
+ / span
17
+ / input.cm-checkbox type="checkbox"
17
18
  - @model.available_fields[:index].each do |column|
18
19
  th = column.header
19
20
  tbody.cm-table__body
20
21
  - @ar_object.data.each do |ar_object|
21
22
  tr.body-row
22
- td.check-box-space
23
- span
24
- input.cm-checkbox type="checkbox"
23
+ / td.check-box-space
24
+ / span
25
+ / input.cm-checkbox type="checkbox"
25
26
  - @model.available_fields[:index].each_with_index do |column, index|
26
27
  td.text-ellipsis
27
28
  span class="#{column.field_type.to_s} #{column.cm_css_class} "
@@ -45,12 +46,18 @@
45
46
  .popup-card.table-export-popup.hidden
46
47
  - if edit_action.any? && policy([:cm_admin, @model.name.classify.constantize]).edit?
47
48
  = link_to "#{page_url('edit', ar_object)}" do
48
- .popup-option Edit
49
+ .popup-option
50
+ span
51
+ i.fa.fa-edit
52
+ | Edit
49
53
  - custom_actions.each do |custom_action|
50
54
  - if custom_action.name.present? && has_valid_policy(@model.name, custom_action.name)
51
55
  - if custom_action.display_if.call(ar_object)
52
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
53
- .popup-option = custom_action.name.titleize
57
+ .popup-option
58
+ span
59
+ i class="#{custom_action.icon_name}"
60
+ = custom_action.name.titleize
54
61
 
55
62
  .cm-pagination
56
63
  .cm-pagination__lhs Showing #{@ar_object.pagy.from} to #{@ar_object.pagy.to} out of #{@ar_object.pagy.count}
@@ -6,4 +6,4 @@
6
6
  $.jGrowl("#{flash[:success]}", {theme: 'success'})
7
7
  - elsif flash[:alert].present?
8
8
  javascript:
9
- $.jGrowl("#{flash[:alert]}", {theme: 'error'})
9
+ $.jGrowl("#{flash[:alert].html_safe}", {theme: 'error'})
@@ -15,9 +15,6 @@ html
15
15
  script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"
16
16
  script src="https://raw.githack.com/SortableJS/Sortable/master/Sortable.js"
17
17
  body
18
- - flash.each do |type, msg|
19
- .alert class="alert-#{type}"
20
- = msg
21
18
  .cm-admin
22
19
  = render 'layouts/left_sidebar_nav'
23
20
  .panel-area
@@ -41,6 +38,6 @@ html
41
38
  = yield
42
39
  - else
43
40
  = yield
44
- = render 'layouts/flash_message'
41
+ = render 'layouts/cm_flash_message'
45
42
  = render 'layouts/custom_action_modals'
46
43
 
@@ -139,10 +139,15 @@ module CmAdmin
139
139
  format.html { render '/cm_admin/main/'+action_name }
140
140
  end
141
141
  elsif %w(create update destroy).include?(action_name)
142
+ if %w(create update).include?(action_name)
143
+ redirect_url = CmAdmin::Engine.mount_path + "/#{@model.name.underscore.pluralize}/#{@ar_object.id}"
144
+ else
145
+ redirect_url = CmAdmin::Engine.mount_path + "/#{@model.name.underscore.pluralize}"
146
+ end
142
147
  if @ar_object.save
143
- format.html { redirect_to CmAdmin::Engine.mount_path + "/#{@model.name.underscore.pluralize}" }
148
+ format.html { redirect_to redirect_url, notice: "#{action_name.titleize} #{@ar_object.class.name.downcase} is successful" }
144
149
  else
145
- format.html { render '/cm_admin/main/new' }
150
+ format.html { render '/cm_admin/main/new', notice: "#{action_name.titleize} #{@ar_object.class.name.downcase} is unsuccessful" }
146
151
  end
147
152
  elsif action.action_type == :custom
148
153
  if action.child_records
@@ -151,11 +156,13 @@ module CmAdmin
151
156
  data = @action.parent == "index" ? @ar_object.data : @ar_object
152
157
  format.html { render action.partial }
153
158
  else
154
- if @action.code_block.call(@ar_object)
159
+ ar_object = @action.code_block.call(@ar_object)
160
+ if ar_object.errors.empty?
155
161
  redirect_url = @model.current_action.redirection_url || @action.redirection_url || request.referrer || "/cm_admin/#{@model.ar_model.table_name}/#{@ar_object.id}"
156
- format.html { redirect_to redirect_url }
162
+ format.html { redirect_to redirect_url, notice: "#{@action.name.titleize} is successful" }
157
163
  else
158
- format.html { redirect_to request.referrer }
164
+ error_messages = @ar_object.errors.full_messages.map{|error_message| "<li>#{error_message}</li>"}.join
165
+ format.html { redirect_to request.referrer, alert: "<b>#{@action.name.titleize} is unsuccessful</b><br /><ul>#{error_messages}</ul>" }
159
166
  end
160
167
  end
161
168
  elsif action.layout.present?
@@ -6,7 +6,7 @@ module CmAdmin
6
6
  include Actions::Blocks
7
7
  attr_accessor :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
9
+ :display_type, :action_type, :redirection_url, :sort_direction, :sort_column, :icon_name
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.icon_name = 'fa fa-th-large'
37
38
  end
38
39
 
39
40
  def set_values(page_title, page_description, partial)
@@ -2,7 +2,7 @@ module CmAdmin
2
2
  module Models
3
3
  class Column
4
4
  attr_accessor :field_name, :field_type, :header, :format, :prefix, :suffix, :exportable, :round,
5
- :cm_css_class, :link, :url, :custom_method, :helper_method, :managable, :lockable, :drawer_partial
5
+ :cm_css_class, :link, :url, :custom_method, :helper_method, :managable, :lockable, :drawer_partial, :tag_class
6
6
 
7
7
  def initialize(field_name, attributes = {})
8
8
  @field_name = field_name
@@ -24,6 +24,7 @@ module CmAdmin
24
24
  self.exportable = true
25
25
  self.managable = true
26
26
  self.lockable = false
27
+ self.tag_class = {}
27
28
  end
28
29
 
29
30
  #formatting value for different data types
@@ -115,11 +115,11 @@ module CmAdmin
115
115
  # end
116
116
  # end
117
117
  # end
118
- 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, &block)
118
+ 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)
119
119
  action = CmAdmin::Models::CustomAction.new(
120
120
  name: name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
121
121
  parent: self.current_action.name, display_type: display_type, display_if: display_if,
122
- action_type: :custom, route_type: route_type, &block)
122
+ action_type: :custom, route_type: route_type, icon_name: icon_name, &block)
123
123
  @available_actions << action
124
124
  # self.class.class_eval(&block)
125
125
  end
@@ -1,3 +1,3 @@
1
1
  module CmAdmin
2
- VERSION = "0.6.3"
2
+ VERSION = "0.6.4"
3
3
  end
@@ -51,7 +51,8 @@ module CmAdmin
51
51
  when :enum
52
52
  ar_object.send(field.field_name).to_s.titleize
53
53
  when :tag
54
- content_tag :span, class: "status-tag default-#{ar_object.send(field.field_name.to_s + '_before_type_cast')}" do
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
55
56
  ar_object.send(field.field_name).to_s.upcase
56
57
  end
57
58
  when :attachment
@@ -5,21 +5,21 @@ module CmAdmin
5
5
  value = field.custom_value || f.object.send(field.field_name)
6
6
  case field.input_type
7
7
  when :integer
8
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: 'integer-only'}
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' }
9
9
  when :decimal
10
- return f.number_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: 'decimal-only'}
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' }
11
11
  when :string
12
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value
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('_', ' ')}"
13
13
  when :single_select
14
- return f.select field.field_name, options_for_select(field.collection || []), {}, class: 'normal-input select-2', disabled: field.disabled
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
15
15
  when :multi_select
16
- return f.select field.field_name, options_for_select(field.collection || []), {}, class: 'normal-input select-2', disabled: field.disabled, multiple: true
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
17
17
  when :date
18
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: 'date-only'}
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' }
19
19
  when :date_time
20
- return f.text_field field.field_name, class: 'normal-input', disabled: field.disabled, value: value, data: {behaviour: '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' }
21
21
  when :text
22
- return f.text_area field.field_name, class: 'normal-input'
22
+ return f.text_area field.field_name, class: 'normal-input', placeholder: "Enter #{field.field_name.to_s.downcase.gsub('_', ' ')}"
23
23
  when :single_file_upload
24
24
  return f.file_field field.field_name, class: 'normal-input'
25
25
  when :multi_file_upload
data/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "flatpickr": "^4.6.9",
14
14
  "jgrowl": "^1.4.8",
15
15
  "jquery": "^3.6.0",
16
- "moment": "^2.29.1",
16
+ "moment": "^2.29.2",
17
17
  "popper.js": "^1.16.1",
18
18
  "turbolinks": "^5.2.0"
19
19
  },
@@ -1 +1 @@
1
- 07d558738c316293586496817b2bccbf6430b5bd
1
+ d5850cd60f91abe79ff8a84a45a9e24c75cb0e4b
data/yarn.lock CHANGED
@@ -4199,10 +4199,10 @@ mkdirp@^1.0.3, mkdirp@^1.0.4:
4199
4199
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
4200
4200
  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
4201
4201
 
4202
- moment@^2.29.1, moment@^2.9.0:
4203
- version "2.29.1"
4204
- resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
4205
- integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
4202
+ moment@^2.29.2, moment@^2.9.0:
4203
+ version "2.29.2"
4204
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4"
4205
+ integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==
4206
4206
 
4207
4207
  move-concurrently@^1.0.1:
4208
4208
  version "1.0.1"
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.3
4
+ version: 0.6.4
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-04-07 00:00:00.000000000 Z
13
+ date: 2022-04-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: pagy
@@ -171,8 +171,8 @@ files:
171
171
  - app/views/cm_admin/static/dashboard.html.slim
172
172
  - app/views/cm_admin/static/error_401.html.slim
173
173
  - app/views/cm_admin/static/error_403.html.slim
174
+ - app/views/layouts/_cm_flash_message.html.slim
174
175
  - app/views/layouts/_custom_action_modals.html.slim
175
- - app/views/layouts/_flash_message.html.slim
176
176
  - app/views/layouts/_left_sidebar_nav.html.slim
177
177
  - app/views/layouts/_quick_links.html.slim
178
178
  - app/views/layouts/cm_admin.html.slim