cm-admin 1.1.7 → 1.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/app/assets/javascripts/cm_admin/scaffolds.js +1 -1
- data/app/assets/stylesheets/cm_admin/base/navbar.scss +3 -2
- data/app/assets/stylesheets/cm_admin/cm_admin.css.scss +1 -0
- data/app/assets/stylesheets/cm_admin/components/_buttons.scss +17 -11
- data/app/assets/stylesheets/cm_admin/dependency/jquery-jgrowl.min.css +1 -0
- data/app/assets/stylesheets/cm_admin/helpers/_variable.scss +31 -30
- data/app/controllers/cm_admin/resource_controller.rb +13 -9
- data/app/views/layouts/_cm_flash_message.html.slim +3 -3
- data/lib/cm_admin/models/filter.rb +55 -29
- data/lib/cm_admin/models/form_field.rb +18 -3
- data/lib/cm_admin/models/utils/helpers.rb +14 -0
- data/lib/cm_admin/version.rb +1 -1
- data/lib/cm_admin/view_helpers/filter_helper.rb +1 -1
- data/lib/cm_admin/view_helpers/form_field_helper.rb +16 -17
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba81abd1bda39ffb9374cd1c93320c6459ffb106ac105fc9b6dabca27c941b2b
|
4
|
+
data.tar.gz: c43d2423a3aed2e123eb058874d0bcf1b8df3c8b09597715a25720514177a93d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b24b0d099f5557d2f6c0cf08ece3efc79129d0bbbcff25b115244cd04eb2ad8e4059bb563e1e63af201c46529a2e15902f8331a8988bec0d62bd3db84655852
|
7
|
+
data.tar.gz: 91b506a984661154df8536ace4bbea58cf67eb22fe13c99f02be6e5e3cd99e1f5565a3f363de974d3c9adf8e7a616912519cdd6155e9a861df42d490e56e9a11
|
data/Gemfile.lock
CHANGED
@@ -16,7 +16,6 @@ import 'bootstrap'
|
|
16
16
|
import '@popperjs/core'
|
17
17
|
import 'flatpickr'
|
18
18
|
import 'jgrowl'
|
19
|
-
jqueryJgrowl()
|
20
19
|
import Select2 from "select2"
|
21
20
|
Select2()
|
22
21
|
|
@@ -37,6 +36,7 @@ document.addEventListener("turbo:load", function () {
|
|
37
36
|
mode: 'range'
|
38
37
|
})
|
39
38
|
$('.select-2').select2();
|
39
|
+
jqueryJgrowl()
|
40
40
|
});
|
41
41
|
|
42
42
|
$(document).on('click', '.menu-item', function(e) {
|
@@ -11,6 +11,7 @@
|
|
11
11
|
padding: 24px;
|
12
12
|
background-color: $white;
|
13
13
|
z-index: 2;
|
14
|
+
gap: 16px;
|
14
15
|
&__lhs {
|
15
16
|
.bread-crumb-area {
|
16
17
|
.breadcrumb-text {
|
@@ -46,12 +47,12 @@
|
|
46
47
|
top: 45px;
|
47
48
|
width: 156px;
|
48
49
|
padding: 8px 0;
|
49
|
-
animation: fadeIn .2s ease-in-out;
|
50
|
+
animation: fadeIn 0.2s ease-in-out;
|
50
51
|
.popup-option {
|
51
52
|
padding: 8px 16px;
|
52
53
|
@include font($size: $t4-text, $color: $primary-text-clr);
|
53
54
|
line-height: 22px;
|
54
|
-
transition: all .2s linear;
|
55
|
+
transition: all 0.2s linear;
|
55
56
|
cursor: pointer;
|
56
57
|
&:hover {
|
57
58
|
background-color: $grey-lighter-clr;
|
@@ -26,6 +26,7 @@
|
|
26
26
|
*= require 'cm_admin/dependency/bootstrap.min'
|
27
27
|
*= require 'cm_admin/dependency/flatpickr.min'
|
28
28
|
*= require 'cm_admin/dependency/fontawesome.all'
|
29
|
+
*= require 'cm_admin/dependency/jquery-jgrowl.min'
|
29
30
|
*= require 'cm_admin/scaffold'
|
30
31
|
*= require_self
|
31
32
|
*/
|
@@ -1,4 +1,4 @@
|
|
1
|
-
@import
|
1
|
+
@import "../helpers/index.scss";
|
2
2
|
|
3
3
|
.cta-btn {
|
4
4
|
padding: 5px 10px;
|
@@ -6,7 +6,8 @@
|
|
6
6
|
background-color: $brand-color;
|
7
7
|
border: none;
|
8
8
|
border-radius: $radius-4;
|
9
|
-
transition: all .2s linear;
|
9
|
+
transition: all 0.2s linear;
|
10
|
+
white-space: nowrap;
|
10
11
|
&:hover {
|
11
12
|
color: $white;
|
12
13
|
background: $cta-hover-gradient;
|
@@ -32,10 +33,11 @@
|
|
32
33
|
background-color: $white;
|
33
34
|
border: 1px solid $brand-color;
|
34
35
|
border-radius: $radius-4;
|
35
|
-
transition: all .2s linear;
|
36
|
+
transition: all 0.2s linear;
|
37
|
+
white-space: nowrap;
|
36
38
|
&:hover {
|
37
39
|
color: $brand-color;
|
38
|
-
background-color:
|
40
|
+
background-color: $brand-hover-color;
|
39
41
|
transform: scale(1.05);
|
40
42
|
}
|
41
43
|
&:focus {
|
@@ -55,11 +57,12 @@
|
|
55
57
|
|
56
58
|
.secondary-btn {
|
57
59
|
padding: 5px 10px;
|
58
|
-
@include font($size: $t4-text, $color: $primary-text-clr, $weight: bold);
|
60
|
+
@include font($size: $t4-text, $color: $primary-text-clr, $weight: bold);
|
59
61
|
background-color: $white;
|
60
62
|
border: 1px solid $ink-regular-clr;
|
61
63
|
border-radius: $radius-4;
|
62
|
-
transition: all .2s linear;
|
64
|
+
transition: all 0.2s linear;
|
65
|
+
white-space: nowrap;
|
63
66
|
&:hover {
|
64
67
|
color: $primary-text-clr;
|
65
68
|
background-color: $grey-light-clr;
|
@@ -82,17 +85,18 @@
|
|
82
85
|
margin: 0 4px 0 8px;
|
83
86
|
}
|
84
87
|
span:nth-child(3) {
|
85
|
-
@include font($size: 10px, $color: $ink-lighter-clr, $weight: bold);
|
88
|
+
@include font($size: 10px, $color: $ink-lighter-clr, $weight: bold);
|
86
89
|
}
|
87
90
|
}
|
88
91
|
|
89
92
|
.gray-border-btn {
|
90
93
|
padding: 5px 10px;
|
91
|
-
@include font($size: $t4-text, $color: $primary-text-clr, $weight: bold);
|
94
|
+
@include font($size: $t4-text, $color: $primary-text-clr, $weight: bold);
|
92
95
|
background-color: $white;
|
93
96
|
border: 1px solid $ink-regular-clr;
|
94
97
|
border-radius: $radius-4;
|
95
|
-
transition: all .2s linear;
|
98
|
+
transition: all 0.2s linear;
|
99
|
+
white-space: nowrap;
|
96
100
|
&:hover {
|
97
101
|
color: $primary-text-clr;
|
98
102
|
background-color: $grey-light-clr;
|
@@ -115,11 +119,12 @@
|
|
115
119
|
|
116
120
|
.ghost-btn {
|
117
121
|
padding: 5px 10px;
|
118
|
-
@include font($size: $t4-text, $color: $primary-text-clr, $weight: bold);
|
122
|
+
@include font($size: $t4-text, $color: $primary-text-clr, $weight: bold);
|
119
123
|
background-color: transparent;
|
120
124
|
border: none;
|
121
125
|
border-radius: $radius-4;
|
122
|
-
transition: all .2s linear;
|
126
|
+
transition: all 0.2s linear;
|
127
|
+
white-space: nowrap;
|
123
128
|
&:hover {
|
124
129
|
color: $primary-text-clr;
|
125
130
|
background: $grey-light-clr;
|
@@ -142,6 +147,7 @@
|
|
142
147
|
.text-btn {
|
143
148
|
border: none;
|
144
149
|
background-color: transparent;
|
150
|
+
white-space: nowrap;
|
145
151
|
&:focus {
|
146
152
|
outline: none;
|
147
153
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
.jGrowl{z-index:9999;color:#fff;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;position:fixed}.jGrowl.top-left{left:0;top:0}.jGrowl.top-right{right:0;top:0}.jGrowl.bottom-left{left:0;bottom:0}.jGrowl.bottom-right{right:0;bottom:0}.jGrowl.center{top:0;width:50%;left:25%}.jGrowl.center .jGrowl-closer,.jGrowl.center .jGrowl-notification{margin-left:auto;margin-right:auto}.jGrowl-notification{background-color:#000;opacity:.9;zoom:1;width:250px;padding:10px;margin:10px;text-align:left;display:none;border-radius:5px;min-height:40px}.jGrowl-notification .ui-state-highlight,.jGrowl-notification .ui-widget-content .ui-state-highlight,.jGrowl-notification .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}.jGrowl-notification .jGrowl-header{font-weight:700;font-size:.85em}.jGrowl-notification .jGrowl-close{background-color:transparent;color:inherit;border:none;z-index:99;float:right;font-weight:700;font-size:1em;cursor:pointer}.jGrowl-closer{background-color:#000;opacity:.9;zoom:1;width:250px;padding:10px;margin:10px;text-align:left;display:none;border-radius:5px;padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:700;text-align:center}.jGrowl-closer .ui-state-highlight,.jGrowl-closer .ui-widget-content .ui-state-highlight,.jGrowl-closer .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}@media print{.jGrowl{display:none}}
|
@@ -1,54 +1,55 @@
|
|
1
1
|
/* ==== Color Variables ==== */
|
2
2
|
|
3
3
|
/* Brand Color */
|
4
|
-
$brand-color: #
|
4
|
+
$brand-color: #6554e0;
|
5
|
+
$brand-hover-color: #e6e4fa;
|
5
6
|
|
6
7
|
/* Semantic Color */
|
7
|
-
$informative-clr: #
|
8
|
-
$error-clr: #
|
9
|
-
$warning-clr: #
|
10
|
-
$positive-clr: #
|
11
|
-
$disabled-clr: #
|
8
|
+
$informative-clr: #2f80ed;
|
9
|
+
$error-clr: #f83636;
|
10
|
+
$warning-clr: #ffc845;
|
11
|
+
$positive-clr: #30c39e;
|
12
|
+
$disabled-clr: #9ca7ae;
|
12
13
|
|
13
14
|
/* Blue Colors */
|
14
|
-
$blue-regular-clr: #
|
15
|
-
$blue-light-clr: #
|
16
|
-
$blue-lightest-clr: #
|
15
|
+
$blue-regular-clr: #2f80ed;
|
16
|
+
$blue-light-clr: #cde1fb;
|
17
|
+
$blue-lightest-clr: #eef5fe;
|
17
18
|
|
18
19
|
/* Red Colors */
|
19
|
-
$red-regular-clr: #
|
20
|
-
$red-light-clr: #
|
21
|
-
$red-lightest-clr: #
|
20
|
+
$red-regular-clr: #f83636;
|
21
|
+
$red-light-clr: #fdcfcf;
|
22
|
+
$red-lightest-clr: #feefef;
|
22
23
|
|
23
24
|
/* Yellow Colors */
|
24
|
-
$yellow-regular-clr: #
|
25
|
-
$yellow-light-clr: #
|
26
|
-
$yellow-lightest-clr: #
|
25
|
+
$yellow-regular-clr: #ffc845;
|
26
|
+
$yellow-light-clr: #ffefc7;
|
27
|
+
$yellow-lightest-clr: #fff8e9;
|
27
28
|
|
28
29
|
/* Green Colors */
|
29
|
-
$green-regular-clr: #
|
30
|
-
$green-light-clr: #
|
31
|
-
$green-lightest-clr: #
|
30
|
+
$green-regular-clr: #30c39e;
|
31
|
+
$green-light-clr: #c1ede2;
|
32
|
+
$green-lightest-clr: #eefaf7;
|
32
33
|
|
33
34
|
/* Grey Colors */
|
34
|
-
$grey-regular-clr: #
|
35
|
-
$grey-light-clr: #
|
36
|
-
$grey-lighter-clr: #
|
37
|
-
$grey-lightest-clr: #
|
35
|
+
$grey-regular-clr: #c7ced5;
|
36
|
+
$grey-light-clr: #d9dee3;
|
37
|
+
$grey-lighter-clr: #f3f4f6;
|
38
|
+
$grey-lightest-clr: #f8f9fa;
|
38
39
|
$grey-dark-clr: #828282;
|
39
40
|
|
40
41
|
/* Ink Colors */
|
41
|
-
$ink-regular-clr: #
|
42
|
-
$ink-light-clr: #
|
43
|
-
$ink-lighter-clr: #
|
44
|
-
$ink-lightest-clr: #
|
42
|
+
$ink-regular-clr: #1d2129;
|
43
|
+
$ink-light-clr: #3b4352;
|
44
|
+
$ink-lighter-clr: #6b7586;
|
45
|
+
$ink-lightest-clr: #9ca7ae;
|
45
46
|
|
46
47
|
/* Text Colors */
|
47
|
-
$primary-text-clr: #
|
48
|
-
$subdued-text-clr: #
|
48
|
+
$primary-text-clr: #1d2129;
|
49
|
+
$subdued-text-clr: #d9dee3;
|
49
50
|
|
50
51
|
/* Common Colors */
|
51
|
-
$white: #
|
52
|
+
$white: #ffffff;
|
52
53
|
$black: #000000;
|
53
54
|
|
54
55
|
// Gradient Colors
|
@@ -56,7 +57,7 @@ $gradient-one: linear-gradient(270deg, $grey-lighter-clr 81.75%, rgba(243, 244,
|
|
56
57
|
$cta-hover-gradient: linear-gradient(0deg, rgba(0, 0, 0, 0.24), rgba(0, 0, 0, 0.24)), $brand-color;
|
57
58
|
|
58
59
|
/* Typography */
|
59
|
-
$primary-font:
|
60
|
+
$primary-font: "Open Sans", sans-serif;
|
60
61
|
$font-size: (
|
61
62
|
24: 24px,
|
62
63
|
18: 18px,
|
@@ -137,15 +137,19 @@ module CmAdmin
|
|
137
137
|
data = @action.parent == "index" ? @ar_object.data : @ar_object
|
138
138
|
format.html { render @action.partial }
|
139
139
|
else
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
140
|
+
begin
|
141
|
+
response_object = @action.code_block.call(@response_object)
|
142
|
+
if response_object.class == Hash
|
143
|
+
format.json { render json: response_object }
|
144
|
+
elsif response_object.errors.empty?
|
145
|
+
redirect_url = @model.current_action.redirection_url || @action.redirection_url || request.referrer || "/cm_admin/#{@model.ar_model.table_name}/#{@response_object.id}"
|
146
|
+
format.html { redirect_to redirect_url, notice: "#{@action.name.titleize} is successful" }
|
147
|
+
else
|
148
|
+
error_messages = response_object.errors.full_messages.map{|error_message| "<li>#{error_message}</li>"}.join
|
149
|
+
format.html { redirect_to request.referrer, alert: "<b>#{@action.name.titleize} is unsuccessful</b><br /><ul>#{error_messages}</ul>" }
|
150
|
+
end
|
151
|
+
rescue => exception
|
152
|
+
format.html { redirect_to request.referrer, alert: "<b>#{@action.name.titleize} is unsuccessful</b><br /><p>#{exception.message}</p>" }
|
149
153
|
end
|
150
154
|
end
|
151
155
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
- if flash[:notice].present?
|
2
2
|
javascript:
|
3
|
-
$.jGrowl("#{flash[:notice]}", {theme: 'notice'})
|
3
|
+
$.jGrowl("#{flash[:notice]}", { theme: 'notice' })
|
4
4
|
- elsif flash[:success].present?
|
5
5
|
javascript:
|
6
|
-
$.jGrowl("#{flash[:success]}", {theme: 'success'})
|
6
|
+
$.jGrowl("#{flash[:success]}", { theme: 'success' })
|
7
7
|
- elsif flash[:alert].present?
|
8
8
|
javascript:
|
9
|
-
$.jGrowl("#{flash[:alert].html_safe}", {theme: 'error'})
|
9
|
+
$.jGrowl("#{flash[:alert].html_safe}", { theme: 'error' })
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require_relative 'utils/helpers'
|
2
|
+
|
1
3
|
module CmAdmin
|
2
4
|
module Models
|
3
5
|
class Filter
|
6
|
+
include Utils::Helpers
|
7
|
+
|
4
8
|
attr_accessor :db_column_name, :filter_type, :placeholder, :collection
|
5
9
|
|
6
10
|
VALID_FILTER_TYPES = Set[:date, :multi_select, :range, :search, :single_select].freeze
|
@@ -8,37 +12,55 @@ module CmAdmin
|
|
8
12
|
def initialize(db_column_name:, filter_type:, options: {})
|
9
13
|
raise TypeError, "Can't have array of multiple columns for #{filter_type} filter" if db_column_name.is_a?(Array) && db_column_name.size > 1 && !filter_type.to_sym.eql?(:search)
|
10
14
|
raise ArgumentError, "Kindly select a valid filter type like #{VALID_FILTER_TYPES.sort.to_sentence(last_word_connector: ', or ')} instead of #{filter_type} for column #{db_column_name}" unless VALID_FILTER_TYPES.include?(filter_type.to_sym)
|
15
|
+
|
11
16
|
@db_column_name, @filter_type = structure_data(db_column_name, filter_type)
|
17
|
+
set_default_values
|
12
18
|
options.each do |key, value|
|
13
|
-
|
19
|
+
send("#{key}=", value)
|
14
20
|
end
|
15
21
|
end
|
16
22
|
|
17
23
|
def structure_data(db_column_name, filter_type)
|
18
24
|
filter_type = filter_type.is_a?(Array) ? filter_type[0].to_sym : filter_type.to_sym
|
19
25
|
|
20
|
-
case filter_type
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
+
db_column_name = case filter_type
|
27
|
+
when :search
|
28
|
+
([] << db_column_name).flatten.map { |x| x.instance_of?(Hash) ? x : x.to_sym }
|
29
|
+
else
|
30
|
+
db_column_name.is_a?(Array) ? db_column_name[0].to_sym : db_column_name.to_sym
|
31
|
+
end
|
26
32
|
[db_column_name, filter_type]
|
27
33
|
end
|
28
34
|
|
35
|
+
# Set default placeholder for the filter.
|
36
|
+
# Date and range filter will not have any placeholder.
|
37
|
+
# Else condition is added for fallback.
|
38
|
+
def set_default_values
|
39
|
+
placeholder = case filter_type
|
40
|
+
when :search
|
41
|
+
'Search'
|
42
|
+
when :single_select, :multi_select
|
43
|
+
"Select/search #{humanized_field_value(db_column_name)}"
|
44
|
+
else
|
45
|
+
"Enter #{humanized_field_value(db_column_name)}"
|
46
|
+
end
|
47
|
+
self.placeholder = placeholder
|
48
|
+
end
|
49
|
+
|
29
50
|
# Methods to filter the records based on the filter type.
|
30
51
|
class << self
|
31
52
|
def filtered_data(filter_params, records, filters)
|
32
53
|
if filter_params
|
33
54
|
filter_params.each do |scope_type, scope_value|
|
34
|
-
scope_name =
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
55
|
+
scope_name = case scope_type
|
56
|
+
when 'date', 'range'
|
57
|
+
'date_and_range'
|
58
|
+
when 'single_select', 'multi_select'
|
59
|
+
'dropdown'
|
60
|
+
else
|
61
|
+
scope_type
|
62
|
+
end
|
63
|
+
records = send("cm_#{scope_name}_filter", scope_value, records, filters) if scope_value.present?
|
42
64
|
end
|
43
65
|
end
|
44
66
|
records
|
@@ -46,15 +68,17 @@ module CmAdmin
|
|
46
68
|
|
47
69
|
def cm_search_filter(scope_value, records, filters)
|
48
70
|
return nil if scope_value.blank?
|
71
|
+
|
49
72
|
table_name = records.table_name
|
50
|
-
filters.select{|x| x if x.filter_type.eql?(:search)}.each do |filter|
|
73
|
+
filters.select { |x| x if x.filter_type.eql?(:search) }.each do |filter|
|
51
74
|
query_variables = []
|
52
75
|
filter.db_column_name.each do |col|
|
53
|
-
|
76
|
+
case col
|
77
|
+
when Symbol
|
54
78
|
query_variables << "#{table_name.pluralize}.#{col}"
|
55
|
-
|
79
|
+
when Hash
|
56
80
|
col.map do |key, value|
|
57
|
-
value.map {|val| query_variables << "#{key.to_s.pluralize}.#{val}" }
|
81
|
+
value.map { |val| query_variables << "#{key.to_s.pluralize}.#{val}" }
|
58
82
|
end
|
59
83
|
end
|
60
84
|
end
|
@@ -62,14 +86,14 @@ module CmAdmin
|
|
62
86
|
terms = terms.map { |e|
|
63
87
|
(e.gsub('*', '%').prepend('%') + '%').gsub(/%+/, '%')
|
64
88
|
}
|
65
|
-
sql =
|
89
|
+
sql = ''
|
66
90
|
query_variables.each.with_index do |column, i|
|
67
91
|
sql.concat("#{column} ILIKE ?")
|
68
|
-
sql.concat(' OR ') unless query_variables.size.eql?(i+1)
|
92
|
+
sql.concat(' OR ') unless query_variables.size.eql?(i + 1)
|
69
93
|
end
|
70
94
|
|
71
|
-
if filter.db_column_name.map{|x| x.is_a?(Hash)}.include?(true)
|
72
|
-
associations_hash = filter.db_column_name.select{|x| x if x.is_a?(Hash)}.last
|
95
|
+
if filter.db_column_name.map { |x| x.is_a?(Hash) }.include?(true)
|
96
|
+
associations_hash = filter.db_column_name.select { |x| x if x.is_a?(Hash) }.last
|
73
97
|
records = records.left_joins(associations_hash.keys).distinct
|
74
98
|
end
|
75
99
|
|
@@ -85,19 +109,21 @@ module CmAdmin
|
|
85
109
|
|
86
110
|
def cm_date_and_range_filter(scope_value, records, filters)
|
87
111
|
return nil if scope_value.nil?
|
112
|
+
|
88
113
|
scope_value.each do |key, value|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
114
|
+
next unless value.present?
|
115
|
+
|
116
|
+
value = value.split(' to ')
|
117
|
+
from = value[0].presence
|
118
|
+
to = value[1].presence
|
119
|
+
records = records.where(key => from..to)
|
95
120
|
end
|
96
121
|
records
|
97
122
|
end
|
98
123
|
|
99
124
|
def cm_dropdown_filter(scope_value, records, filters)
|
100
125
|
return nil if scope_value.nil?
|
126
|
+
|
101
127
|
scope_value.each do |key, value|
|
102
128
|
records = records.where(key => value) if value.present?
|
103
129
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require_relative 'utils/helpers'
|
2
|
+
|
1
3
|
module CmAdmin
|
2
4
|
module Models
|
3
5
|
class FormField
|
6
|
+
include Utils::Helpers
|
7
|
+
|
4
8
|
attr_accessor :field_name, :label, :header, :input_type, :collection, :disabled, :helper_method,
|
5
9
|
:placeholder, :display_if, :html_attr, :target
|
6
10
|
|
@@ -13,9 +17,10 @@ module CmAdmin
|
|
13
17
|
@field_name = field_name
|
14
18
|
set_default_values
|
15
19
|
attributes.each do |key, value|
|
16
|
-
|
20
|
+
send("#{key}=", value)
|
17
21
|
end
|
18
|
-
|
22
|
+
set_default_placeholder
|
23
|
+
self.display_if = lambda { |arg| return true } if display_if.nil?
|
19
24
|
raise ArgumentError, "Kindly select a valid input type like #{VALID_INPUT_TYPES.sort.to_sentence(last_word_connector: ', or ')} instead of #{self.input_type} for form field #{field_name}" unless VALID_INPUT_TYPES.include?(self.input_type.to_sym)
|
20
25
|
end
|
21
26
|
|
@@ -23,10 +28,20 @@ module CmAdmin
|
|
23
28
|
self.disabled = false
|
24
29
|
self.label = self.field_name.to_s.titleize
|
25
30
|
self.input_type = :string
|
26
|
-
self.placeholder = "Enter #{self.field_name.to_s.downcase.gsub('_', ' ')}"
|
27
31
|
self.html_attr = {}
|
28
32
|
self.target = {}
|
29
33
|
end
|
34
|
+
|
35
|
+
def set_default_placeholder
|
36
|
+
return unless placeholder.nil?
|
37
|
+
|
38
|
+
self.placeholder = case input_type&.to_sym
|
39
|
+
when :single_select, :multi_select, :date, :date_time
|
40
|
+
"Select #{humanized_field_value(field_name)}"
|
41
|
+
else
|
42
|
+
"Enter #{humanized_field_value(field_name)}"
|
43
|
+
end
|
44
|
+
end
|
30
45
|
end
|
31
46
|
end
|
32
47
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module CmAdmin
|
2
|
+
module Models
|
3
|
+
module Utils
|
4
|
+
module Helpers
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
# Returns the humanized value of the field.
|
8
|
+
def humanized_field_value(name, capitalize: false)
|
9
|
+
name.to_s.humanize(capitalize: capitalize)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/cm_admin/version.rb
CHANGED
@@ -7,7 +7,7 @@ module CmAdmin
|
|
7
7
|
value = cm_field.helper_method ? send(cm_field.helper_method, form_obj.object, cm_field.field_name) : form_obj.object.send(cm_field.field_name)
|
8
8
|
is_required = form_obj.object._validators[cm_field.field_name].map(&:kind).include?(:presence)
|
9
9
|
required_class = is_required ? 'required' : ''
|
10
|
-
target_action = @model.available_actions.select{|x| x.name == cm_field.target[:action_name].to_s}.first if cm_field.target.present?
|
10
|
+
target_action = @model.available_actions.select { |x| x.name == cm_field.target[:action_name].to_s }.first if cm_field.target.present?
|
11
11
|
send("cm_#{cm_field.input_type}_field", form_obj, cm_field, value, required_class, target_action)
|
12
12
|
end
|
13
13
|
|
@@ -16,7 +16,7 @@ module CmAdmin
|
|
16
16
|
class: "normal-input #{required_class}",
|
17
17
|
disabled: cm_field.disabled,
|
18
18
|
value: value,
|
19
|
-
placeholder:
|
19
|
+
placeholder: cm_field.placeholder,
|
20
20
|
data: { behaviour: 'integer-only' }
|
21
21
|
end
|
22
22
|
|
@@ -25,7 +25,7 @@ module CmAdmin
|
|
25
25
|
class: "normal-input #{required_class}",
|
26
26
|
disabled: cm_field.disabled,
|
27
27
|
value: value,
|
28
|
-
placeholder:
|
28
|
+
placeholder: cm_field.placeholder,
|
29
29
|
data: { behaviour: 'decimal-only' }
|
30
30
|
end
|
31
31
|
|
@@ -34,12 +34,12 @@ module CmAdmin
|
|
34
34
|
class: "normal-input #{required_class}",
|
35
35
|
disabled: cm_field.disabled,
|
36
36
|
value: value,
|
37
|
-
placeholder:
|
37
|
+
placeholder: cm_field.placeholder
|
38
38
|
end
|
39
39
|
|
40
40
|
def cm_single_select_field(form_obj, cm_field, value, required_class, target_action)
|
41
41
|
form_obj.select cm_field.field_name, options_for_select(select_collection_value(form_obj.object, cm_field), form_obj.object.send(cm_field.field_name)),
|
42
|
-
{ include_blank: cm_field.placeholder
|
42
|
+
{ include_blank: cm_field.placeholder },
|
43
43
|
class: "normal-input #{required_class} select-2",
|
44
44
|
disabled: cm_field.disabled,
|
45
45
|
data: {
|
@@ -53,7 +53,7 @@ module CmAdmin
|
|
53
53
|
def cm_multi_select_field(form_obj, cm_field, value, required_class, target_action)
|
54
54
|
form_obj.select cm_field.field_name,
|
55
55
|
options_for_select(select_collection_value(form_obj.object, cm_field), form_obj.object.send(cm_field.field_name)),
|
56
|
-
{ include_blank: cm_field.placeholder
|
56
|
+
{ include_blank: cm_field.placeholder },
|
57
57
|
class: "normal-input #{required_class} select-2",
|
58
58
|
disabled: cm_field.disabled, multiple: true
|
59
59
|
end
|
@@ -63,7 +63,7 @@ module CmAdmin
|
|
63
63
|
class: "normal-input #{required_class}",
|
64
64
|
disabled: cm_field.disabled,
|
65
65
|
value: value&.strftime('%d-%m-%Y'),
|
66
|
-
placeholder:
|
66
|
+
placeholder: cm_field.placeholder,
|
67
67
|
data: { behaviour: 'date-only' }
|
68
68
|
end
|
69
69
|
|
@@ -72,20 +72,20 @@ module CmAdmin
|
|
72
72
|
class: "normal-input #{required_class}",
|
73
73
|
disabled: cm_field.disabled,
|
74
74
|
value: value,
|
75
|
-
placeholder:
|
75
|
+
placeholder: cm_field.placeholder,
|
76
76
|
data: { behaviour: 'date-time' }
|
77
77
|
end
|
78
78
|
|
79
79
|
def cm_text_field(form_obj, cm_field, value, required_class, _target_action)
|
80
80
|
form_obj.text_area cm_field.field_name,
|
81
81
|
class: "normal-input #{required_class}",
|
82
|
-
placeholder:
|
82
|
+
placeholder: cm_field.placeholder
|
83
83
|
end
|
84
84
|
|
85
85
|
def cm_rich_text_field(form_obj, cm_field, value, required_class, _target_action)
|
86
86
|
form_obj.rich_text_area cm_field.field_name,
|
87
87
|
class: "normal-input #{required_class}",
|
88
|
-
placeholder:
|
88
|
+
placeholder: cm_field.placeholder
|
89
89
|
end
|
90
90
|
|
91
91
|
def cm_single_file_upload_field(form_obj, cm_field, _value, required_class, _target_action)
|
@@ -114,16 +114,16 @@ module CmAdmin
|
|
114
114
|
# helper_method argument will accept a method where value can be passed.
|
115
115
|
def select_collection_value(object, cm_field)
|
116
116
|
if cm_field.helper_method
|
117
|
-
|
117
|
+
send(cm_field.helper_method, object, cm_field.field_name)
|
118
118
|
elsif cm_field.collection
|
119
|
-
|
119
|
+
cm_field.collection
|
120
120
|
else
|
121
|
-
|
121
|
+
[]
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
125
|
def format_check_box_options(value, form_obj, cm_field, required_class, target_action)
|
126
|
-
if value.
|
126
|
+
if value.instance_of?(Array)
|
127
127
|
format_check_box_array(value, form_obj, cm_field, required_class, target_action)
|
128
128
|
else
|
129
129
|
form_obj.check_box cm_field.field_name,
|
@@ -131,7 +131,7 @@ module CmAdmin
|
|
131
131
|
class: "normal-input cm-checkbox #{required_class} #{target_action.present? ? 'linked-field-request' : ''}",
|
132
132
|
disabled: cm_field.disabled,
|
133
133
|
data: {
|
134
|
-
field_name: cm_field.field_name,
|
134
|
+
field_name: cm_field.field_name,
|
135
135
|
target_action: target_action&.name,
|
136
136
|
target_url: target_action&.name ? cm_admin.send("#{@model.name.underscore}_#{target_action&.name}_path") : ''
|
137
137
|
}
|
@@ -169,7 +169,6 @@ module CmAdmin
|
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
172
|
-
|
173
172
|
def format_radio_button_options(options, form_obj)
|
174
173
|
content_tag :div do
|
175
174
|
options.each do |val, key|
|
@@ -177,7 +176,7 @@ module CmAdmin
|
|
177
176
|
end
|
178
177
|
end
|
179
178
|
end
|
180
|
-
|
179
|
+
|
181
180
|
def format_radio_option(val, key, form_obj)
|
182
181
|
content_tag :div, class: 'cm-radio-section' do
|
183
182
|
concat format_radio_button(val, form_obj)
|
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: 1.1.
|
4
|
+
version: 1.1.8
|
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: 2023-08-
|
13
|
+
date: 2023-08-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -224,6 +224,7 @@ files:
|
|
224
224
|
- app/assets/stylesheets/cm_admin/dependency/bootstrap.min.css
|
225
225
|
- app/assets/stylesheets/cm_admin/dependency/flatpickr.min.css
|
226
226
|
- app/assets/stylesheets/cm_admin/dependency/fontawesome.all.css
|
227
|
+
- app/assets/stylesheets/cm_admin/dependency/jquery-jgrowl.min.css
|
227
228
|
- app/assets/stylesheets/cm_admin/helpers/_mixins.scss
|
228
229
|
- app/assets/stylesheets/cm_admin/helpers/_variable.scss
|
229
230
|
- app/assets/stylesheets/cm_admin/helpers/index.scss
|
@@ -310,6 +311,7 @@ files:
|
|
310
311
|
- lib/cm_admin/models/section.rb
|
311
312
|
- lib/cm_admin/models/tab.rb
|
312
313
|
- lib/cm_admin/models/utils/associations.rb
|
314
|
+
- lib/cm_admin/models/utils/helpers.rb
|
313
315
|
- lib/cm_admin/utils.rb
|
314
316
|
- lib/cm_admin/version.rb
|
315
317
|
- lib/cm_admin/version_manager.rb
|