cm-admin 1.1.7 → 1.1.8
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 +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
|