cm-admin 0.5.4 → 0.5.7
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/app/assets/stylesheets/cm_admin/base/table.scss +68 -6
- data/app/assets/stylesheets/cm_admin/components/_drawer.scss +90 -0
- data/app/assets/stylesheets/cm_admin/components/index.scss +1 -0
- data/app/javascript/packs/cm_admin/scaffolds.js +25 -0
- data/app/views/cm_admin/main/_drawer.html.slim +13 -0
- data/app/views/cm_admin/main/_table.html.slim +22 -16
- data/app/views/cm_admin/main/_top_navbar.html.slim +4 -5
- data/app/views/cm_admin/main/associated_index.html.slim +1 -1
- data/app/views/cm_admin/main/index.html.slim +1 -0
- data/lib/cm_admin/model.rb +8 -2
- data/lib/cm_admin/models/action.rb +5 -1
- data/lib/cm_admin/models/cm_show_section.rb +0 -2
- data/lib/cm_admin/models/column.rb +1 -1
- data/lib/cm_admin/models/controller_method.rb +10 -7
- data/lib/cm_admin/models/dsl_method.rb +29 -10
- data/lib/cm_admin/models/form_field.rb +1 -0
- data/lib/cm_admin/version.rb +1 -1
- data/lib/cm_admin/view_helpers/field_display_helper.rb +6 -1
- data/lib/cm_admin/view_helpers/form_helper.rb +2 -2
- data/lib/cm_admin/view_helpers/navigation_helper.rb +3 -3
- data/tmp/cache/webpacker/last-compilation-digest-development +1 -1
- data/yarn.lock +6 -6
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4005c7711af2f931298a2054cd527de1a67a92a42deaecd8fb71b37fbcdc5fb2
|
4
|
+
data.tar.gz: 8fa616289069247a2418896b7ac2cb4f6ca5ec1dfc121d5a06cececb9c3a5242
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82d898a13ff420a9c3e7b9df6f9daca9174df4bc3587c879cac1817cdbdcb5e812562f81a7e5ed8716729da466da5240037e3d7bca36900d5efb355859c4ca1a
|
7
|
+
data.tar.gz: 29a54f03bb2aaa0cec4aa0fecaef373376e94a4e6e47e67219245ae257f2f2774ad388e9a4b8b9510a23d45f130fc9a6703128403b512256525d2197dae292a0
|
@@ -5,6 +5,13 @@
|
|
5
5
|
background-color: $white;
|
6
6
|
overflow: auto;
|
7
7
|
|
8
|
+
.sticky-container {
|
9
|
+
z-index: 4;
|
10
|
+
.cm-filters-v2 {
|
11
|
+
padding: 16px 24px 36px 24px;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
8
15
|
&__filters {
|
9
16
|
// If you want to overwrite filters styles ---> add styles here
|
10
17
|
}
|
@@ -65,10 +72,12 @@
|
|
65
72
|
}
|
66
73
|
}
|
67
74
|
|
75
|
+
|
68
76
|
.new-admin-table {
|
69
77
|
overflow: auto;
|
70
78
|
margin-top: 40px;
|
71
79
|
margin-bottom: 50px;
|
80
|
+
height: 280px;
|
72
81
|
.cm-table {
|
73
82
|
table-layout: fixed;
|
74
83
|
position: relative;
|
@@ -79,8 +88,8 @@
|
|
79
88
|
&__header {
|
80
89
|
.header-row {
|
81
90
|
display: block;
|
82
|
-
position: relative;
|
83
91
|
width: 100%;
|
92
|
+
position: relative;
|
84
93
|
box-shadow: inset 0px -1px 0px rgba(148, 151, 155, 0.15);
|
85
94
|
th {
|
86
95
|
@include font($size: $t6-text, $color: $ink-lighter-clr, $weight: bold);
|
@@ -89,10 +98,22 @@
|
|
89
98
|
max-width: 200px;
|
90
99
|
padding: 12px 16px 12px 16px;
|
91
100
|
}
|
101
|
+
th:nth-child(2){
|
102
|
+
position: sticky;
|
103
|
+
left: 38px;
|
104
|
+
z-index: 2;
|
105
|
+
background-color: #fff;
|
106
|
+
border-bottom: 1.21px solid rgb(240, 239, 239);
|
107
|
+
}
|
92
108
|
.check-box-space {
|
109
|
+
position: sticky;
|
110
|
+
left: 0;
|
93
111
|
min-width: fit-content;
|
94
112
|
max-width: fit-content;
|
95
113
|
padding: 12px 8px 12px 16px;
|
114
|
+
z-index: 2;
|
115
|
+
background-color: #fff;
|
116
|
+
border-bottom: 1.21px solid rgb(240, 239, 239);
|
96
117
|
span {
|
97
118
|
vertical-align: text-top;
|
98
119
|
}
|
@@ -100,24 +121,47 @@
|
|
100
121
|
}
|
101
122
|
}
|
102
123
|
&__body {
|
124
|
+
// display: block;
|
125
|
+
// overflow: auto;
|
126
|
+
// overflow-x: hidden;
|
127
|
+
// position: relative;
|
128
|
+
// width: 100%;
|
129
|
+
// height: 335px;
|
103
130
|
display: block;
|
104
131
|
position: relative;
|
105
|
-
width: 100%;
|
106
|
-
|
107
|
-
|
132
|
+
width: 100%;
|
133
|
+
.body-row {
|
134
|
+
border-bottom: 1.21px solid rgb(240, 239, 239);
|
135
|
+
td:nth-child(2){
|
136
|
+
position: sticky;
|
137
|
+
left: 38px;
|
138
|
+
z-index: 2;
|
139
|
+
background-color: #fff;
|
140
|
+
}
|
141
|
+
|
108
142
|
&:nth-last-child(1) {
|
109
143
|
box-shadow: none;
|
110
144
|
}
|
111
145
|
&:hover {
|
112
146
|
background-color: $grey-lighter-clr;
|
147
|
+
td:nth-child(1) {
|
148
|
+
background-color: $grey-lighter-clr;
|
149
|
+
}
|
150
|
+
td:nth-child(2) {
|
151
|
+
background-color: $grey-lighter-clr;
|
152
|
+
}
|
113
153
|
.row-action-cell {
|
114
154
|
opacity: 1;
|
115
155
|
}
|
116
156
|
}
|
117
157
|
.check-box-space {
|
158
|
+
position: sticky;
|
159
|
+
left: 0;
|
118
160
|
min-width: fit-content;
|
119
161
|
max-width: fit-content;
|
120
162
|
padding: 16px 8px 16px 16px;
|
163
|
+
z-index: 2;
|
164
|
+
background-color: #fff;
|
121
165
|
span {
|
122
166
|
vertical-align: text-top;
|
123
167
|
}
|
@@ -145,6 +189,17 @@
|
|
145
189
|
align-items: center;
|
146
190
|
justify-content: center;
|
147
191
|
height: 100%;
|
192
|
+
.popup-card {
|
193
|
+
width:fit-content;
|
194
|
+
.popup-option {
|
195
|
+
a {
|
196
|
+
font-weight: 500;
|
197
|
+
font-size: 14px;
|
198
|
+
line-height: 22px;
|
199
|
+
color: #1D2129;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
}
|
148
203
|
.tool-btn {
|
149
204
|
background-color: transparent;
|
150
205
|
border: none;
|
@@ -154,15 +209,20 @@
|
|
154
209
|
}
|
155
210
|
}
|
156
211
|
}
|
212
|
+
.cm-table > thead {
|
213
|
+
position:sticky;
|
214
|
+
top:0;
|
215
|
+
background-color: #fff;
|
216
|
+
z-index: 3;
|
217
|
+
}
|
157
218
|
}
|
158
219
|
|
159
220
|
.admin-table-index {
|
160
|
-
|
161
221
|
position: fixed;
|
162
222
|
width: calc(100% - 285px);
|
163
223
|
left: 245px;
|
164
224
|
background-color: #fff;
|
165
|
-
z-index:
|
225
|
+
z-index: 4;
|
166
226
|
.table-sticky-top {
|
167
227
|
position: sticky;
|
168
228
|
top: 254px;
|
@@ -172,6 +232,8 @@
|
|
172
232
|
justify-content: space-between;
|
173
233
|
align-items: center;
|
174
234
|
padding-bottom: 16px;
|
235
|
+
margin-top: -20px;
|
236
|
+
background-color: #fff;
|
175
237
|
&__total-count {
|
176
238
|
font-size: $t4-text;
|
177
239
|
line-height: 22px;
|
@@ -0,0 +1,90 @@
|
|
1
|
+
@import "../helpers/index.scss";
|
2
|
+
|
3
|
+
.cm-drawer {
|
4
|
+
position: fixed;
|
5
|
+
top: 0;
|
6
|
+
right: 0;
|
7
|
+
bottom: 0;
|
8
|
+
left: 0;
|
9
|
+
width: 100%;
|
10
|
+
height: 100%;
|
11
|
+
z-index: 5;
|
12
|
+
background-color: rgba(0, 0, 0, .7);
|
13
|
+
&__container {
|
14
|
+
position: relative;
|
15
|
+
width: 360px;
|
16
|
+
height: 100%;
|
17
|
+
background: $white;
|
18
|
+
box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.16);
|
19
|
+
.header {
|
20
|
+
display: flex;
|
21
|
+
align-items: center;
|
22
|
+
justify-content: space-between;
|
23
|
+
padding: 24px;
|
24
|
+
background: #F8F9FA;
|
25
|
+
&__lhs {
|
26
|
+
.title {
|
27
|
+
font-family: $primary-font;
|
28
|
+
font-size: $t1-text;
|
29
|
+
font-weight: 600;
|
30
|
+
line-height: 28px;
|
31
|
+
color: $primary-text-clr;
|
32
|
+
margin-bottom: 8px;
|
33
|
+
}
|
34
|
+
.description {
|
35
|
+
font-family: $primary-font;
|
36
|
+
font-size: $t4-text;
|
37
|
+
line-height: 22px;
|
38
|
+
color: $primary-text-clr;
|
39
|
+
margin-bottom: 0;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
&__rhs {
|
43
|
+
color: $ink-lighter-clr;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
.body {
|
47
|
+
padding: 24px;
|
48
|
+
.info-text {
|
49
|
+
font-family: $primary-font;
|
50
|
+
font-size: $t4-text;
|
51
|
+
line-height: 22px;
|
52
|
+
color: $primary-text-clr;
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
.drawer-slide-in {
|
59
|
+
animation: slideInLeft .3s ease-in forwards;
|
60
|
+
}
|
61
|
+
|
62
|
+
.drawer-slide-out {
|
63
|
+
animation: slideOutLeft .3s ease-in forwards;
|
64
|
+
}
|
65
|
+
|
66
|
+
@keyframes slideInLeft {
|
67
|
+
0% {
|
68
|
+
left: -400px;
|
69
|
+
opacity: 0;
|
70
|
+
}
|
71
|
+
100% {
|
72
|
+
left: 0;
|
73
|
+
opacity: 1;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
@keyframes slideOutLeft {
|
78
|
+
0% {
|
79
|
+
left: 0;
|
80
|
+
opacity: 1;
|
81
|
+
}
|
82
|
+
100% {
|
83
|
+
left: -400px;
|
84
|
+
opacity: 0;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
.drawer {
|
89
|
+
cursor: pointer;
|
90
|
+
}
|
@@ -40,4 +40,29 @@ $(document).on('click', '.row-action-cell', function(e) {
|
|
40
40
|
} else {
|
41
41
|
return $(this).find('.table-export-popup').addClass('hidden');
|
42
42
|
}
|
43
|
+
});
|
44
|
+
|
45
|
+
|
46
|
+
$(document).on('click', '.drawer-btn', function(e) {
|
47
|
+
e.stopPropagation();
|
48
|
+
drawer_el = $(this).parent().closest('.drawer').find('.cm-drawer')
|
49
|
+
if (drawer_el.hasClass('hidden')) {
|
50
|
+
drawer_el.removeClass('hidden');
|
51
|
+
drawer_container = drawer_el.find('.drawer-container')
|
52
|
+
if (drawer_container.hasClass('drawer-slide-out')) {
|
53
|
+
drawer_container.removeClass('drawer-slide-out');
|
54
|
+
}
|
55
|
+
drawer_container.addClass('drawer-slide-in');
|
56
|
+
} else {
|
57
|
+
return drawer_el.addClass('hidden');
|
58
|
+
}
|
59
|
+
});
|
60
|
+
|
61
|
+
$(document).on('click', '.drawer-close', function(e) {
|
62
|
+
e.stopPropagation();
|
63
|
+
$('.drawer-container').removeClass('drawer-slide-in');
|
64
|
+
$('.drawer-container').addClass('drawer-slide-out');
|
65
|
+
setTimeout(() => {
|
66
|
+
$('.cm-drawer').addClass('hidden');
|
67
|
+
}, 300);
|
43
68
|
});
|
@@ -0,0 +1,13 @@
|
|
1
|
+
.cm-drawer.hidden
|
2
|
+
.cm-drawer__container#drawer-container
|
3
|
+
.header
|
4
|
+
.header__lhs
|
5
|
+
h2.title Review
|
6
|
+
p.description Theresa Webb
|
7
|
+
.header__rhs
|
8
|
+
i.fa.fa-times.drawer-close.pointer
|
9
|
+
.body
|
10
|
+
p.info-text
|
11
|
+
| It was really an amazing experience being an Unschooler. Its really different from other e-learning websites in every aspects like certification, providing internship opportunities and many more. I am going to recommend Unschool for sure!
|
12
|
+
|
13
|
+
|
@@ -24,26 +24,32 @@
|
|
24
24
|
input.cm-checkbox type="checkbox"
|
25
25
|
- @model.available_fields[:index].each_with_index do |column, index|
|
26
26
|
td.text-ellipsis
|
27
|
-
span class="#{column.cm_css_class}"
|
27
|
+
span class="#{column.field_type.to_s} #{column.cm_css_class} "
|
28
28
|
- if index == 0
|
29
29
|
= link_to ar_object.send(column.field_name), "/cm_admin/#{ar_object.model_name.collection}/#{ar_object.id}"
|
30
30
|
- else
|
31
31
|
= show_field_value(ar_object, column)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
.
|
40
|
-
.
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
32
|
+
- if column.field_type == :drawer
|
33
|
+
= render partial: column.drawer_partial, locals: { ar_object: ar_object}
|
34
|
+
|
35
|
+
- edit_action = @model.available_actions.select{|act| act if act.action_type.eql?(:default) && act.name.eql?('edit')}
|
36
|
+
- custom_actions = @model.available_actions.select{|act| act if act.route_type == 'member' && [:button, :modal].include?(act.display_type)}
|
37
|
+
- if custom_actions.any? || edit_action.any?
|
38
|
+
td.row-action-cell
|
39
|
+
.row-action-tool
|
40
|
+
button.secondary-btn.tool-btn type="button"
|
41
|
+
span
|
42
|
+
i.fa.fa-bars.bolder
|
43
|
+
span
|
44
|
+
i.fa.fa-angle-down
|
45
|
+
.popup-card.table-export-popup.hidden
|
46
|
+
- if edit_action.any?
|
47
|
+
= link_to "#{page_url('edit', ar_object)}" do
|
48
|
+
.popup-option Edit
|
49
|
+
- custom_actions.each do |custom_action|
|
50
|
+
- if custom_action.display_if.call(ar_object)
|
51
|
+
= link_to custom_action.path.gsub(':id', ar_object.id.to_s), method: custom_action.verb do
|
52
|
+
.popup-option = custom_action.name.titleize
|
47
53
|
|
48
54
|
.cm-pagination
|
49
55
|
.cm-pagination__lhs Showing #{@ar_object.pagy.from} to #{@ar_object.pagy.to} out of #{@ar_object.pagy.count}
|
@@ -20,9 +20,9 @@
|
|
20
20
|
li
|
21
21
|
.popup-option.pointer data-bs-toggle='modal' data-bs-target='#exportmodal'
|
22
22
|
span Export
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
- new_action = @model.available_actions.select{|act| act if act.action_type.eql?(:default) && act.name.eql?('new')}
|
24
|
+
- if new_action.any?
|
25
|
+
= link_to 'Add', "#{page_url('new')}", class: 'primary-btn ml-2'
|
26
26
|
- @model.available_actions.select{|act| act if act.route_type == 'collection'}.each do |custom_action|
|
27
27
|
- if custom_action.display_type == :button
|
28
28
|
= link_to custom_action.name.titleize, @model.ar_model.table_name + '/' + custom_action.path, class: 'primary-btn ml-2', method: custom_action.verb
|
@@ -37,5 +37,4 @@
|
|
37
37
|
|
38
38
|
- edit_action = @model.available_actions.select{|act| act if act.action_type.eql?(:default) && act.name.eql?('edit')}
|
39
39
|
- if edit_action.any?
|
40
|
-
|
41
|
-
= "Edit #{@model.name}"
|
40
|
+
= link_to "Edit #{@model.name}", "#{page_url('edit', @ar_object)}", class: 'primary-btn ml-2'
|
data/lib/cm_admin/model.rb
CHANGED
@@ -21,7 +21,8 @@ module CmAdmin
|
|
21
21
|
include Models::Blocks
|
22
22
|
include Models::DslMethod
|
23
23
|
include Models::ControllerMethod
|
24
|
-
attr_accessor :available_actions, :actions_set, :available_fields, :permitted_fields,
|
24
|
+
attr_accessor :available_actions, :actions_set, :available_fields, :permitted_fields,
|
25
|
+
:current_action, :params, :filters, :available_tabs, :icon_name
|
25
26
|
attr_reader :name, :ar_model, :is_visible_on_sidebar
|
26
27
|
|
27
28
|
# Class variable for storing all actions
|
@@ -32,6 +33,7 @@ module CmAdmin
|
|
32
33
|
@name = entity.name
|
33
34
|
@ar_model = entity
|
34
35
|
@is_visible_on_sidebar = true
|
36
|
+
@icon_name = 'fa fa-th-large'
|
35
37
|
@available_actions ||= []
|
36
38
|
@current_action = nil
|
37
39
|
@available_tabs ||= []
|
@@ -59,7 +61,7 @@ module CmAdmin
|
|
59
61
|
current_action = CmAdmin::Models::Action.find_by(self, name: action_name.to_s)
|
60
62
|
if current_action
|
61
63
|
@current_action = current_action
|
62
|
-
@ar_object = @ar_model.find(params[:id])
|
64
|
+
@ar_object = @ar_model.name.classify.constantize.find(params[:id])
|
63
65
|
if @current_action.child_records
|
64
66
|
child_records = @ar_object.send(@current_action.child_records)
|
65
67
|
@associated_model = CmAdmin::Model.find_by(name: @ar_model.reflect_on_association(@current_action.child_records).klass.name)
|
@@ -90,6 +92,10 @@ module CmAdmin
|
|
90
92
|
@is_visible_on_sidebar = visible_option
|
91
93
|
end
|
92
94
|
|
95
|
+
def set_icon(name)
|
96
|
+
@icon_name = name
|
97
|
+
end
|
98
|
+
|
93
99
|
|
94
100
|
private
|
95
101
|
|
@@ -6,7 +6,9 @@ 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
|
9
|
+
:display_type, :action_type, :redirection_url, :sort_direction, :sort_column
|
10
|
+
|
11
|
+
VALID_SORT_DIRECTION = Set[:asc, :desc].freeze
|
10
12
|
|
11
13
|
def initialize(attributes = {}, &block)
|
12
14
|
if attributes[:layout_type].present? && attributes[:layout].nil? && attributes[:partial].nil?
|
@@ -30,6 +32,8 @@ module CmAdmin
|
|
30
32
|
self.display_if = lambda { |arg| return true }
|
31
33
|
self.display_type = :button
|
32
34
|
self.action_type = :default
|
35
|
+
self.sort_column = :created_at
|
36
|
+
self.sort_direction = :desc
|
33
37
|
end
|
34
38
|
|
35
39
|
class << self
|
@@ -7,12 +7,10 @@ module CmAdmin
|
|
7
7
|
def initialize(section_name, &block)
|
8
8
|
@available_section_fields = []
|
9
9
|
@section_name = section_name
|
10
|
-
puts "-- reached here --"
|
11
10
|
instance_eval(&block)
|
12
11
|
end
|
13
12
|
|
14
13
|
def field(field_name, options={})
|
15
|
-
puts "For printing field #{field_name}"
|
16
14
|
@available_section_fields << CmAdmin::Models::Field.new(field_name, options)
|
17
15
|
end
|
18
16
|
end
|
@@ -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
|
5
|
+
:cm_css_class, :link, :url, :custom_method, :helper_method, :managable, :lockable, :drawer_partial
|
6
6
|
|
7
7
|
def initialize(field_name, attributes = {})
|
8
8
|
@field_name = field_name
|
@@ -7,23 +7,23 @@ module CmAdmin
|
|
7
7
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
|
8
8
|
@ar_object = @ar_model.find(params[:id])
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def index(params)
|
12
12
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'index')
|
13
13
|
# Based on the params the filter and pagination object to be set
|
14
14
|
@ar_object = filter_by(params, nil, filter_params(params))
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def new(params)
|
18
18
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'new')
|
19
19
|
@ar_object = @ar_model.new
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def edit(params)
|
23
23
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'edit')
|
24
24
|
@ar_object = @ar_model.find(params[:id])
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def update(params)
|
28
28
|
@ar_object = @ar_model.find(params[:id])
|
29
29
|
@ar_object.assign_attributes(resource_params(params))
|
@@ -41,6 +41,8 @@ module CmAdmin
|
|
41
41
|
sort_direction = %w[asc desc].include?(sort_params[:sort_direction]) ? sort_params[:sort_direction] : "asc"
|
42
42
|
sort_params = {sort_column: sort_column, sort_direction: sort_direction}
|
43
43
|
records = self.name.constantize.where(nil) if records.nil?
|
44
|
+
records = records.order("#{current_action.sort_column} #{current_action.sort_direction}")
|
45
|
+
|
44
46
|
final_data = CmAdmin::Models::Filter.filtered_data(filter_params, records, @filters)
|
45
47
|
pagy, records = pagy(final_data)
|
46
48
|
filtered_result.data = records
|
@@ -50,7 +52,7 @@ module CmAdmin
|
|
50
52
|
# filtered_result.facets.sort = sort_params
|
51
53
|
return filtered_result
|
52
54
|
end
|
53
|
-
|
55
|
+
|
54
56
|
def resource_params(params)
|
55
57
|
permittable_fields = @permitted_fields || @ar_model.columns.map(&:name).reject { |i| CmAdmin::REJECTABLE_FIELDS.include?(i) }.map(&:to_sym)
|
56
58
|
permittable_fields += @ar_model.reflect_on_all_attachments.map {|x|
|
@@ -62,15 +64,16 @@ module CmAdmin
|
|
62
64
|
}.compact
|
63
65
|
nested_tables = self.available_fields[:new].except(:fields).keys
|
64
66
|
nested_tables += self.available_fields[:edit].except(:fields).keys
|
65
|
-
nested_fields = nested_tables.map {|table|
|
67
|
+
nested_fields = nested_tables.uniq.map {|table|
|
66
68
|
Hash[
|
67
69
|
table.to_s + '_attributes',
|
68
70
|
table.to_s.classify.constantize.columns.map(&:name).reject { |i| CmAdmin::REJECTABLE_FIELDS.include?(i) }.map(&:to_sym) + [:id, :_destroy]
|
69
71
|
]
|
70
72
|
}
|
71
73
|
permittable_fields += nested_fields
|
74
|
+
@ar_model.columns.map { |col| permittable_fields << col.name.split('_cents') if col.name.include?('_cents') }
|
72
75
|
params.require(self.name.underscore.to_sym).permit(*permittable_fields)
|
73
76
|
end
|
74
77
|
end
|
75
78
|
end
|
76
|
-
end
|
79
|
+
end
|
@@ -24,14 +24,14 @@ module CmAdmin
|
|
24
24
|
@current_action.page_description = page_description
|
25
25
|
yield
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
def cm_edit(page_title: nil,page_description: nil, &block)
|
29
29
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'edit')
|
30
30
|
@current_action.page_title = page_title
|
31
31
|
@current_action.page_description = page_description
|
32
32
|
yield
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def cm_new(page_title: nil,page_description: nil,&block)
|
36
36
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'new')
|
37
37
|
@current_action.page_title = page_title
|
@@ -44,13 +44,13 @@ module CmAdmin
|
|
44
44
|
@current_action.page_title = title
|
45
45
|
end
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def page_description(description)
|
49
49
|
if @current_action
|
50
50
|
@current_action.page_description = description
|
51
51
|
end
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def tab(tab_name, custom_action, associated_model: nil, layout_type: nil, layout: nil, partial: nil, &block)
|
55
55
|
if custom_action.to_s == ''
|
56
56
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
|
@@ -65,12 +65,12 @@ module CmAdmin
|
|
65
65
|
end
|
66
66
|
yield if block
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
def cm_show_section(section_name, &block)
|
70
70
|
@available_fields[@current_action.name.to_sym] ||= []
|
71
71
|
@available_fields[@current_action.name.to_sym] << CmAdmin::Models::CmShowSection.new(section_name, &block)
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
def form_field(field_name, options={}, arg=nil)
|
75
75
|
unless @current_action.is_nested_field
|
76
76
|
@available_fields[@current_action.name.to_sym][:fields] << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
|
@@ -79,23 +79,24 @@ module CmAdmin
|
|
79
79
|
@available_fields[@current_action.name.to_sym][@current_action.nested_table_name] << CmAdmin::Models::FormField.new(field_name, options[:input_type], options)
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
def nested_form_field(field_name, &block)
|
84
84
|
@current_action.is_nested_field = true
|
85
85
|
@current_action.nested_table_name = field_name
|
86
86
|
yield
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
def column(field_name, options={})
|
90
90
|
@available_fields[@current_action.name.to_sym] ||= []
|
91
91
|
if @available_fields[@current_action.name.to_sym].select{|x| x.lockable}.size > 0 && options[:lockable]
|
92
92
|
raise "Only one column can be locked in a table."
|
93
93
|
end
|
94
|
+
|
94
95
|
unless @available_fields[@current_action.name.to_sym].map{|x| x.field_name.to_sym}.include?(field_name)
|
95
96
|
@available_fields[@current_action.name.to_sym] << CmAdmin::Models::Column.new(field_name, options)
|
96
97
|
end
|
97
98
|
end
|
98
|
-
|
99
|
+
|
99
100
|
def all_db_columns(options={})
|
100
101
|
field_names = self.instance_variable_get(:@ar_model)&.columns&.map{|x| x.name.to_sym}
|
101
102
|
if options.include?(:exclude) && field_names
|
@@ -130,6 +131,24 @@ module CmAdmin
|
|
130
131
|
def filter(db_column_name, filter_type, options={})
|
131
132
|
@filters << CmAdmin::Models::Filter.new(db_column_name: db_column_name, filter_type: filter_type, options: options)
|
132
133
|
end
|
134
|
+
|
135
|
+
def sort_direction(direction = :desc)
|
136
|
+
raise ArgumentError, "Select a valid sort direction like #{CmAdmin::Models::Action::VALID_SORT_DIRECTION.join(' or ')} instead of #{direction}" unless CmAdmin::Models::Action::VALID_SORT_DIRECTION.include?(direction.to_sym.downcase)
|
137
|
+
|
138
|
+
@current_action.sort_direction = direction.to_sym if @current_action
|
139
|
+
end
|
140
|
+
|
141
|
+
def sort_column(column = :created_at)
|
142
|
+
model = if @current_action.child_records
|
143
|
+
CmAdmin::Model.find_by(name: @current_action.child_records.to_s.classify)
|
144
|
+
else
|
145
|
+
self
|
146
|
+
end
|
147
|
+
db_columns = model.instance_variable_get(:@ar_model)&.columns&.map{|x| x.name.to_sym}
|
148
|
+
raise "Sorting for custom column #{column} does not exist." unless db_columns.include?(column.to_sym)
|
149
|
+
|
150
|
+
@current_action.sort_column = column.to_sym if @current_action
|
151
|
+
end
|
133
152
|
end
|
134
153
|
end
|
135
|
-
end
|
154
|
+
end
|
data/lib/cm_admin/version.rb
CHANGED
@@ -43,10 +43,15 @@ module CmAdmin
|
|
43
43
|
ar_object.send(field.field_name).to_s.titleize
|
44
44
|
when :tag
|
45
45
|
content_tag :span, class: "status-tag default-#{ar_object.send(field.field_name.to_s + '_before_type_cast')}" do
|
46
|
-
ar_object.send(field.field_name).to_s.
|
46
|
+
ar_object.send(field.field_name).to_s.upcase
|
47
47
|
end
|
48
48
|
when :attachment
|
49
49
|
concat show_attachment_value(ar_object, field)
|
50
|
+
when :drawer
|
51
|
+
content_tag :span do
|
52
|
+
concat content_tag(:span, truncate(ar_object.send(field.field_name).to_s, length: 25))
|
53
|
+
concat content_tag(:a, " View", class: "drawer-btn")
|
54
|
+
end
|
50
55
|
end
|
51
56
|
end
|
52
57
|
end
|
@@ -44,10 +44,10 @@ module CmAdmin
|
|
44
44
|
if field.input_type.eql?(:hidden)
|
45
45
|
concat input_field_for_column(f, field)
|
46
46
|
else
|
47
|
-
concat f.label field.
|
47
|
+
concat f.label field.label, class: 'field-label'
|
48
48
|
concat tag.br
|
49
49
|
concat(content_tag(:div, class: "datetime-wrapper") do
|
50
|
-
concat input_field_for_column(f, field)
|
50
|
+
concat input_field_for_column(f, field)
|
51
51
|
end)
|
52
52
|
concat tag.p resource.errors[field.field_name].first if resource.errors[field.field_name].present?
|
53
53
|
end
|
@@ -11,16 +11,16 @@ module CmAdmin
|
|
11
11
|
content_tag(:a, href: path) do
|
12
12
|
content_tag(:div, class: 'menu-item') do
|
13
13
|
content_tag(:span, class: 'menu-icon') do
|
14
|
-
concat tag.i class:
|
14
|
+
concat tag.i class: "#{model.icon_name}"
|
15
15
|
end +
|
16
|
-
model.name
|
16
|
+
model.name.pluralize
|
17
17
|
end
|
18
18
|
end
|
19
19
|
elsif navigation_type == "quick_links"
|
20
20
|
content_tag(:a, href: path, class: 'visible') do
|
21
21
|
content_tag(:div, class: 'result-item') do
|
22
22
|
content_tag(:span) do
|
23
|
-
concat tag.i class:
|
23
|
+
concat tag.i class: "#{model.icon_name}"
|
24
24
|
end +
|
25
25
|
content_tag(:span) do
|
26
26
|
model.name
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
07d558738c316293586496817b2bccbf6430b5bd
|
data/yarn.lock
CHANGED
@@ -2941,9 +2941,9 @@ flush-write-stream@^1.0.0:
|
|
2941
2941
|
readable-stream "^2.3.6"
|
2942
2942
|
|
2943
2943
|
follow-redirects@^1.0.0:
|
2944
|
-
version "1.14.
|
2945
|
-
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.
|
2946
|
-
integrity sha512-
|
2944
|
+
version "1.14.8"
|
2945
|
+
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
|
2946
|
+
integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
|
2947
2947
|
|
2948
2948
|
for-in@^1.0.2:
|
2949
2949
|
version "1.0.2"
|
@@ -6589,9 +6589,9 @@ urix@^0.1.0:
|
|
6589
6589
|
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
|
6590
6590
|
|
6591
6591
|
url-parse@^1.4.3, url-parse@^1.5.1:
|
6592
|
-
version "1.5.
|
6593
|
-
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.
|
6594
|
-
integrity sha512-
|
6592
|
+
version "1.5.10"
|
6593
|
+
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
|
6594
|
+
integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
|
6595
6595
|
dependencies:
|
6596
6596
|
querystringify "^2.1.1"
|
6597
6597
|
requires-port "^1.0.0"
|
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.5.
|
4
|
+
version: 0.5.7
|
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-
|
13
|
+
date: 2022-03-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: pagy
|
@@ -116,6 +116,7 @@ files:
|
|
116
116
|
- app/assets/stylesheets/cm_admin/cm_admin.css.scss
|
117
117
|
- app/assets/stylesheets/cm_admin/components/_alerts.scss
|
118
118
|
- app/assets/stylesheets/cm_admin/components/_buttons.scss
|
119
|
+
- app/assets/stylesheets/cm_admin/components/_drawer.scss
|
119
120
|
- app/assets/stylesheets/cm_admin/components/_dropdown-popup.scss
|
120
121
|
- app/assets/stylesheets/cm_admin/components/_input.scss
|
121
122
|
- app/assets/stylesheets/cm_admin/components/_modal.scss
|
@@ -139,6 +140,7 @@ files:
|
|
139
140
|
- app/javascript/stylesheets/cm_admin/application.scss
|
140
141
|
- app/views/cm_admin/main/_associated_table.html.slim
|
141
142
|
- app/views/cm_admin/main/_cm_pagy_nav.html.slim
|
143
|
+
- app/views/cm_admin/main/_drawer.html.slim
|
142
144
|
- app/views/cm_admin/main/_filters.html.slim
|
143
145
|
- app/views/cm_admin/main/_nested_fields.html.slim
|
144
146
|
- app/views/cm_admin/main/_nested_table_form.html.slim
|
@@ -228,7 +230,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
228
230
|
- !ruby/object:Gem::Version
|
229
231
|
version: '0'
|
230
232
|
requirements: []
|
231
|
-
rubygems_version: 3.
|
233
|
+
rubygems_version: 3.2.32
|
232
234
|
signing_key:
|
233
235
|
specification_version: 4
|
234
236
|
summary: This is an admin panel gem
|