cm-admin 0.4.3 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/cm_admin/scaffold.scss +10 -0
- data/app/views/cm_admin/main/_associated_table.html.slim +1 -1
- data/app/views/cm_admin/main/_nested_fields.html.slim +6 -5
- data/app/views/cm_admin/main/_nested_table_form.html.slim +3 -2
- data/app/views/cm_admin/main/_table.html.slim +12 -9
- data/app/views/cm_admin/main/_top_navbar.html.slim +9 -4
- data/app/views/cm_admin/main/associated_index.html.slim +2 -2
- data/app/views/layouts/_custom_action_modals.html.slim +9 -0
- data/app/views/layouts/cm_admin.html.slim +8 -4
- data/cm_admin.gemspec +2 -2
- data/config/routes.rb +2 -2
- data/lib/cm_admin/engine.rb +2 -0
- data/lib/cm_admin/model.rb +15 -7
- data/lib/cm_admin/models/action.rb +6 -2
- data/lib/cm_admin/models/controller_method.rb +1 -1
- data/lib/cm_admin/models/dsl_method.rb +16 -3
- data/lib/cm_admin/version.rb +1 -1
- data/lib/cm_admin/view_helpers/form_helper.rb +2 -2
- data/lib/cm_admin/view_helpers/page_info_helper.rb +7 -2
- 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: bcbb26a08fa072ec95a1363e72c63ebfad6a1c661d303d50af5379f2f5bce0b1
|
4
|
+
data.tar.gz: 2f2526862a9312a48f768eb001ba52f6365182e105556136e2e763e96e21484a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8d834bc6b9716aeef9b5c82137106c9aae52afd435ef384e7543be09fd4f18cb3f593374aebf5d840c9d17f7d0ecb99a9c9066508a1645fdff32d433d9ef983
|
7
|
+
data.tar.gz: c21ae398e2d2542186251a98bc706e203164e70319e841041527122358cd9cf3162620d8b860570b5f288f2ba1734c73a2a3a83da917c8b159120ad28c8febae
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.admin-table-index
|
2
2
|
.table-top
|
3
|
-
p.table-top__total-count = "#{@associated_ar_object.pagy.count} #{@associated_model
|
3
|
+
p.table-top__total-count = "#{@associated_ar_object.pagy.count} #{@associated_model&.ar_model&.table_name} found"
|
4
4
|
.table-top__column-action
|
5
5
|
button.secondary-btn.column-btn data-target="#columnActionModal" data-toggle="modal" type="button"
|
6
6
|
span
|
@@ -1,7 +1,8 @@
|
|
1
1
|
.nested-fields
|
2
2
|
- @model.available_fields[action_name.to_sym][assoc_name].each do |field|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
.row
|
4
|
+
.col-sm-10
|
5
|
+
= input_field_for_column(f, field)
|
6
|
+
.col-sm-2
|
7
|
+
- if @reflections.select {|x| x if x.name == assoc_name}.first.macro == :has_many
|
8
|
+
= link_to_remove_association "x", f
|
@@ -1,6 +1,7 @@
|
|
1
|
-
|
1
|
+
.nested-field-wrapper
|
2
|
+
label.field-label = table_name.to_s.titleize
|
2
3
|
= f.fields_for table_name do |record|
|
3
4
|
= render partial: '/cm_admin/main/nested_fields', locals: { f: record, assoc_name: table_name }
|
4
5
|
- if @reflections.select {|x| x if x.name == table_name}.first.macro == :has_many
|
5
6
|
.links
|
6
|
-
= link_to_add_association "
|
7
|
+
= link_to_add_association "+ Add #{table_name.to_s.titleize}", f, table_name, partial: '/cm_admin/main/nested_fields', render_options: {locals: { assoc_name: table_name }}
|
@@ -1,13 +1,12 @@
|
|
1
1
|
.admin-table-index
|
2
2
|
.table-top
|
3
3
|
p.table-top__total-count = "#{@ar_object.pagy.count} #{@model.ar_model.table_name} found"
|
4
|
-
.table-top__column-action
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
// .table-top__column-action
|
5
|
+
// button.secondary-btn.column-btn data-bs-target="#columnActionModal" data-bs-toggle="modal"
|
6
|
+
// span
|
7
|
+
// i.fa.fa-columns.bolder
|
8
|
+
// span
|
9
|
+
// i.fa.fa-angle-down
|
11
10
|
.new-admin-table.scrollable
|
12
11
|
table.cm-table
|
13
12
|
thead.cm-table__header
|
@@ -23,9 +22,13 @@
|
|
23
22
|
td.check-box-space
|
24
23
|
span
|
25
24
|
input.cm-checkbox type="checkbox"
|
26
|
-
- @model.available_fields[:index].
|
25
|
+
- @model.available_fields[:index].each_with_index do |column, index|
|
27
26
|
td.text-ellipsis
|
28
|
-
span class="#{column.cm_css_class}"
|
27
|
+
span class="#{column.cm_css_class}"
|
28
|
+
- if index == 0
|
29
|
+
= link_to ar_object.send(column.field_name), "/cm_admin/#{ar_object.model_name.collection}/#{ar_object.id}"
|
30
|
+
- else
|
31
|
+
= show_field_value(ar_object, column)
|
29
32
|
td.row-action-cell
|
30
33
|
.row-action-tool
|
31
34
|
button.secondary-btn.tool-btn type="button"
|
@@ -24,8 +24,13 @@
|
|
24
24
|
a.primary-btn.ml-2 href="#{page_url('new')}"
|
25
25
|
| Add
|
26
26
|
- @model.available_actions.select{|act| act if act.route_type == 'collection'}.each do |custom_action|
|
27
|
-
|
28
|
-
|
27
|
+
- if custom_action.display_type == :button
|
28
|
+
= link_to custom_action.name.titleize, @model.ar_model.table_name + '/' + custom_action.path, class: 'primary-btn ml-2', method: custom_action.verb
|
29
|
+
- elsif custom_action.display_type == :modal
|
30
|
+
= link_to custom_action.name.titleize, '', class: 'primary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
|
31
|
+
- elsif @model.current_action.name == 'show' || @action.layout_type == "cm_association_show"
|
29
32
|
- @model.available_actions.select{|act| act if act.route_type == 'member'}.each do |custom_action|
|
30
|
-
- if custom_action.display_if.call(@ar_object)
|
31
|
-
= link_to custom_action.name, custom_action.path.gsub(':id', params[:id]), class: 'primary-btn ml-2', method: custom_action.verb
|
33
|
+
- if custom_action.display_type == :button && custom_action.display_if.call(@ar_object)
|
34
|
+
= link_to custom_action.name.titleize, custom_action.path.gsub(':id', params[:id]), class: 'primary-btn ml-2', method: custom_action.verb
|
35
|
+
- elsif custom_action.display_type == :modal && custom_action.display_if.call(@ar_object)
|
36
|
+
= link_to custom_action.name.titleize, '', class: 'primary-btn ml-2', data: { bs_toggle: "modal", bs_target: "##{custom_action.name.classify}Modal" }
|
@@ -0,0 +1,9 @@
|
|
1
|
+
- @model.available_actions.select{|act| act if act.route_type == 'collection' && act.display_type == :modal}.each do |custom_action|
|
2
|
+
.modal.fade id="#{custom_action.name.classify}Modal" aria-hidden="true" aria-labelledby="exampleModalLabel" tabindex="1"
|
3
|
+
.modal-dialog
|
4
|
+
.modal-content
|
5
|
+
.modal-header
|
6
|
+
h5#exampleModalLabel.modal-title = custom_action.name.classify
|
7
|
+
button.btn-close aria-label="Close" data-bs-dismiss="modal" type="button"
|
8
|
+
.modal-body
|
9
|
+
= render partial: custom_action.partial
|
@@ -10,6 +10,8 @@ html
|
|
10
10
|
= stylesheet_pack_tag 'cm_admin/application', 'data-turbolinks-track': 'reload'
|
11
11
|
link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" /
|
12
12
|
= javascript_pack_tag 'cm_admin/application', 'data-turbolinks-track': 'reload'
|
13
|
+
= javascript_include_tag 'cm_admin/custom', 'data-turbolinks-track': 'reload'
|
14
|
+
= stylesheet_link_tag 'cm_admin/custom', media: 'all', 'data-turbolinks-track': 'reload'
|
13
15
|
script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"
|
14
16
|
script src="https://raw.githack.com/SortableJS/Sortable/master/Sortable.js"
|
15
17
|
body
|
@@ -19,7 +21,7 @@ html
|
|
19
21
|
.cm-admin
|
20
22
|
= render 'layouts/left_sidebar_nav'
|
21
23
|
.panel-area
|
22
|
-
- if defined?(@action) && @action&.layout_type.to_s == 'cm_association_show'
|
24
|
+
- if defined?(@action) && (@action&.layout_type.to_s == 'cm_association_show' || @action.parent == "show")
|
23
25
|
.show-page.page-container
|
24
26
|
.show-page__tabs.sticky-container
|
25
27
|
.cm-tabs-bar
|
@@ -27,16 +29,18 @@ html
|
|
27
29
|
== render 'cm_admin/main/tabs'
|
28
30
|
.show-page__inner.scrollable
|
29
31
|
= yield
|
30
|
-
- elsif defined?(@action) && @action&.layout_type.to_s == 'cm_association_index'
|
32
|
+
- elsif defined?(@action) && (@action&.layout_type.to_s == 'cm_association_index' || @action.parent == "index")
|
31
33
|
.show-page.page-container
|
32
34
|
.show-page__tabs.sticky-container
|
33
35
|
.cm-tabs-bar
|
34
36
|
== render 'cm_admin/main/top_navbar'
|
35
37
|
== render 'cm_admin/main/tabs'
|
36
|
-
- if @associated_model.filters.present?
|
38
|
+
- if @associated_model && @associated_model.filters.present?
|
37
39
|
.index-page__filters
|
38
40
|
== render partial: 'cm_admin/main/filters', locals: { filters: @associated_model.filters }
|
39
41
|
= yield
|
40
42
|
- else
|
41
43
|
= yield
|
42
|
-
= render 'layouts/flash_message'
|
44
|
+
= render 'layouts/flash_message'
|
45
|
+
= render 'layouts/custom_action_modals'
|
46
|
+
|
data/cm_admin.gemspec
CHANGED
@@ -3,8 +3,8 @@ require_relative 'lib/cm_admin/version'
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = "cm-admin"
|
5
5
|
spec.version = CmAdmin::VERSION
|
6
|
-
spec.authors = ["sajinmp", "anbublacky", "
|
7
|
-
spec.email = ["sajinprasadkm@gmail.com", "anbublacky@gmail.com"]
|
6
|
+
spec.authors = ["sajinmp", "anbublacky", "AdityaTiwari2102"]
|
7
|
+
spec.email = ["sajinprasadkm@gmail.com", "anbublacky@gmail.com", "taditya.tiwari007@gmail.com"]
|
8
8
|
|
9
9
|
spec.summary = %q{This is an admin panel gem}
|
10
10
|
spec.description = %q{This is an admin panel gem}
|
data/config/routes.rb
CHANGED
@@ -10,9 +10,9 @@ CmAdmin::Engine.routes.draw do
|
|
10
10
|
|
11
11
|
# Defining action routes for each model
|
12
12
|
CmAdmin.cm_admin_models.each do |model|
|
13
|
-
model.available_actions.each do |act|
|
13
|
+
model.available_actions.sort_by {|act| act.class}.each do |act|
|
14
14
|
scope model.name.tableize do
|
15
|
-
send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}")
|
15
|
+
send(act.verb, act.path.present? ? act.path : act.name, to: "#{model.name.underscore}##{act.name}", as: "#{model.name.underscore}_#{act.name}")
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/lib/cm_admin/engine.rb
CHANGED
data/lib/cm_admin/model.rb
CHANGED
@@ -92,7 +92,6 @@ module CmAdmin
|
|
92
92
|
# If model is User, controller will be UsersController
|
93
93
|
def define_controller
|
94
94
|
klass = Class.new(CmAdmin::ApplicationController) do
|
95
|
-
|
96
95
|
$available_actions.each do |action|
|
97
96
|
define_method action.name.to_sym do
|
98
97
|
|
@@ -100,8 +99,11 @@ module CmAdmin
|
|
100
99
|
@model = CmAdmin::Model.find_by(name: controller_name.classify)
|
101
100
|
@model.params = params
|
102
101
|
@action = CmAdmin::Models::Action.find_by(@model, name: action_name)
|
102
|
+
@model.current_action = @action
|
103
103
|
@ar_object = @model.try(@action.parent || action_name, params)
|
104
104
|
@ar_object, @associated_model, @associated_ar_object = @model.custom_controller_action(action_name, params.permit!) if !@ar_object.present? && params[:id].present?
|
105
|
+
aar_model = request.url.split('/')[-2].classify.constantize if params[:aar_id]
|
106
|
+
@associated_ar_object = aar_model.find(params[:aar_id]) if params[:aar_id]
|
105
107
|
nested_tables = @model.available_fields[:new].except(:fields).keys
|
106
108
|
nested_tables += @model.available_fields[:edit].except(:fields).keys
|
107
109
|
@reflections = @model.ar_model.reflect_on_all_associations
|
@@ -126,13 +128,19 @@ module CmAdmin
|
|
126
128
|
else
|
127
129
|
format.html { render '/cm_admin/main/new' }
|
128
130
|
end
|
129
|
-
elsif action.
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
131
|
+
elsif action.action_type == :custom
|
132
|
+
if action.child_records
|
133
|
+
format.html { render action.layout }
|
134
|
+
elsif action.display_type == :page
|
135
|
+
data = @action.parent == "index" ? @ar_object.data : @ar_object
|
136
|
+
format.html { render action.partial }
|
134
137
|
else
|
135
|
-
|
138
|
+
if @action.code_block.call(@ar_object)
|
139
|
+
redirect_url = @action.redirection_url || request.referrer || "/cm_admin/#{@model.ar_model.table_name}/#{@ar_object.id}"
|
140
|
+
format.html { redirect_to redirect_url }
|
141
|
+
else
|
142
|
+
format.html { redirect_to request.referrer }
|
143
|
+
end
|
136
144
|
end
|
137
145
|
elsif action.layout.present?
|
138
146
|
if request.xhr? && action.partial.present?
|
@@ -4,7 +4,9 @@ module CmAdmin
|
|
4
4
|
module Models
|
5
5
|
class Action
|
6
6
|
include Actions::Blocks
|
7
|
-
attr_accessor :name, :verb, :layout_type, :layout, :partial, :path, :page_title, :page_description,
|
7
|
+
attr_accessor :name, :verb, :layout_type, :layout, :partial, :path, :page_title, :page_description,
|
8
|
+
:child_records, :is_nested_field, :nested_table_name, :parent, :display_if, :route_type, :code_block,
|
9
|
+
:display_type, :action_type, :redirection_url
|
8
10
|
|
9
11
|
def initialize(attributes = {}, &block)
|
10
12
|
if attributes[:layout_type].present? && attributes[:layout].nil? && attributes[:partial].nil?
|
@@ -25,7 +27,9 @@ module CmAdmin
|
|
25
27
|
|
26
28
|
def set_default_values
|
27
29
|
self.is_nested_field = false
|
28
|
-
self.display_if = true
|
30
|
+
self.display_if = lambda { |arg| return true }
|
31
|
+
self.display_type = :button
|
32
|
+
self.action_type = :default
|
29
33
|
end
|
30
34
|
|
31
35
|
class << self
|
@@ -65,7 +65,7 @@ module CmAdmin
|
|
65
65
|
nested_fields = nested_tables.map {|table|
|
66
66
|
Hash[
|
67
67
|
table.to_s + '_attributes',
|
68
|
-
table.to_s.
|
68
|
+
table.to_s.classify.constantize.columns.map(&:name).reject { |i| CmAdmin::REJECTABLE_FIELDS.include?(i) }.map(&:to_sym) + [:id, :_destroy]
|
69
69
|
]
|
70
70
|
}
|
71
71
|
permittable_fields += nested_fields
|
@@ -3,6 +3,13 @@ module CmAdmin
|
|
3
3
|
module DslMethod
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
+
def cm_page(name: nil, partial: nil, path: nil, route_type: nil, page_title: nil, display_type: :button, &block)
|
7
|
+
action = CmAdmin::Models::CustomAction.new(name: name, verb: :get, partial: partial, path: path, route_type: route_type, display_type: display_type, &block)
|
8
|
+
@available_actions << action
|
9
|
+
# @available_actions << CmAdmin::Models::CustomAction.new(name: name, verb: 'get', layout: 'cm_admin', partial: partial, path: path, parent: self.current_action.name, route_type: route_type, page_title: page_title, display_type: display_type, &block)
|
10
|
+
# @current_action = CmAdmin::Models::CustomAction.find_by(self, name: name)
|
11
|
+
end
|
12
|
+
|
6
13
|
def cm_index(page_title: nil ,page_description: nil, &block)
|
7
14
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'index')
|
8
15
|
@current_action.page_title = page_title
|
@@ -49,7 +56,9 @@ module CmAdmin
|
|
49
56
|
@current_action = CmAdmin::Models::Action.find_by(self, name: 'show')
|
50
57
|
@available_tabs << CmAdmin::Models::Tab.new(tab_name, '', &block)
|
51
58
|
else
|
52
|
-
action = CmAdmin::Models::Action.new(name: custom_action.to_s, verb: :get, path: ':id/'+custom_action,
|
59
|
+
action = CmAdmin::Models::Action.new(name: custom_action.to_s, verb: :get, path: ':id/'+custom_action,
|
60
|
+
layout_type: layout_type, layout: layout, partial: partial, child_records: associated_model,
|
61
|
+
action_type: :custom, display_type: :page)
|
53
62
|
@available_actions << action
|
54
63
|
@current_action = action
|
55
64
|
@available_tabs << CmAdmin::Models::Tab.new(tab_name, custom_action, &block)
|
@@ -109,8 +118,12 @@ module CmAdmin
|
|
109
118
|
# end
|
110
119
|
# end
|
111
120
|
# end
|
112
|
-
def custom_action(name: nil, verb: nil, layout: nil, partial: nil, path: nil, display_if: lambda { |arg| return true }, route_type: nil, &block)
|
113
|
-
|
121
|
+
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)
|
122
|
+
action = CmAdmin::Models::CustomAction.new(
|
123
|
+
name: name, verb: verb, layout: layout, layout_type: layout_type, partial: partial, path: path,
|
124
|
+
parent: self.current_action.name, display_type: display_type, display_if: display_if,
|
125
|
+
action_type: :custom, route_type: route_type, &block)
|
126
|
+
@available_actions << action
|
114
127
|
# self.class.class_eval(&block)
|
115
128
|
end
|
116
129
|
|
data/lib/cm_admin/version.rb
CHANGED
@@ -22,7 +22,7 @@ module CmAdmin
|
|
22
22
|
|
23
23
|
def form_with_all_fields(resource, method)
|
24
24
|
columns = resource.class.columns.dup
|
25
|
-
table_name = resource.
|
25
|
+
table_name = resource.model_name.collection
|
26
26
|
columns.reject! { |i| REJECTABLE.include?(i.name) }
|
27
27
|
url = CmAdmin::Engine.mount_path + "/#{table_name}/#{resource.id}"
|
28
28
|
set_form_for_fields(resource, columns, url, method)
|
@@ -30,7 +30,7 @@ module CmAdmin
|
|
30
30
|
|
31
31
|
def form_with_mentioned_fields(resource, available_fields, method)
|
32
32
|
# columns = resource.class.columns.select { |i| available_fields.map(&:field_name).include?(i.name.to_sym) }
|
33
|
-
table_name = resource.
|
33
|
+
table_name = resource.model_name.collection
|
34
34
|
# columns.reject! { |i| REJECTABLE.include?(i.name) }
|
35
35
|
url = CmAdmin::Engine.mount_path + "/#{table_name}/#{resource.id}"
|
36
36
|
set_form_for_fields(resource, available_fields, url, method)
|
@@ -6,8 +6,10 @@ module CmAdmin
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def action_title
|
9
|
-
|
10
|
-
|
9
|
+
show_action = CmAdmin::Models::Action.find_by(@model, name: 'show')
|
10
|
+
title = @model.current_action.page_title || show_action.page_title
|
11
|
+
if title
|
12
|
+
title = (title.class == Symbol) ? @ar_object.send(title) : title
|
11
13
|
else
|
12
14
|
title = "#{@model.name}"
|
13
15
|
case action_name
|
@@ -24,8 +26,11 @@ module CmAdmin
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def action_description
|
29
|
+
show_action = CmAdmin::Models::Action.find_by(@model, name: 'show')
|
27
30
|
if @model.current_action.page_description
|
28
31
|
title = @model.current_action.page_description
|
32
|
+
elsif show_action.page_description
|
33
|
+
title = show_action.page_description
|
29
34
|
else
|
30
35
|
title = "#{@model.name}"
|
31
36
|
case action_name
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cm-admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sajinmp
|
8
8
|
- anbublacky
|
9
|
-
-
|
9
|
+
- AdityaTiwari2102
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-
|
13
|
+
date: 2022-02-10 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: pagy
|
@@ -86,6 +86,7 @@ description: This is an admin panel gem
|
|
86
86
|
email:
|
87
87
|
- sajinprasadkm@gmail.com
|
88
88
|
- anbublacky@gmail.com
|
89
|
+
- taditya.tiwari007@gmail.com
|
89
90
|
executables: []
|
90
91
|
extensions: []
|
91
92
|
extra_rdoc_files: []
|
@@ -152,6 +153,7 @@ files:
|
|
152
153
|
- app/views/cm_admin/main/new.html.slim
|
153
154
|
- app/views/cm_admin/main/show.html.slim
|
154
155
|
- app/views/cm_admin/static/error_401.html.slim
|
156
|
+
- app/views/layouts/_custom_action_modals.html.slim
|
155
157
|
- app/views/layouts/_flash_message.html.slim
|
156
158
|
- app/views/layouts/_left_sidebar_nav.html.slim
|
157
159
|
- app/views/layouts/_quick_links.html.slim
|