model_info 0.0.6 → 0.0.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/README.rdoc +5 -39
- data/Rakefile +1 -1
- data/app/controllers/model_info/application_controller.rb +17 -8
- data/app/controllers/model_info/associations_controller.rb +50 -18
- data/app/controllers/model_info/downloads_controller.rb +18 -8
- data/app/controllers/model_info/models_controller.rb +36 -32
- data/app/helpers/model_info/associations_helper.rb +43 -0
- data/app/helpers/model_info/models_helper.rb +57 -0
- data/app/views/layouts/model_info/_header.html.erb +4 -4
- data/app/views/layouts/model_info/_models_header.html.erb +6 -3
- data/app/views/layouts/model_info/application.html.erb +2 -2
- data/app/views/model_info/associations/edit.html.erb +9 -14
- data/app/views/model_info/associations/index.html.erb +24 -32
- data/app/views/model_info/associations/new.html.erb +10 -18
- data/app/views/model_info/associations/show.html.erb +8 -19
- data/app/views/model_info/models/display.html.erb +25 -29
- data/app/views/model_info/models/edit.html.erb +9 -14
- data/app/views/model_info/models/new.html.erb +10 -18
- data/app/views/model_info/models/show.html.erb +8 -19
- data/app/views/model_info/shared/_flash_messages.html.erb +15 -0
- data/app/views/model_info/shared/_form.html.erb +15 -0
- data/app/views/model_info/shared/_show.html.erb +18 -0
- data/config/routes.rb +2 -0
- data/lib/model_info.rb +1 -1
- data/lib/model_info/engine.rb +10 -0
- data/lib/model_info/version.rb +1 -1
- metadata +30 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c92fd753c984c611f1f6126f0b6665bc749f5c1
|
4
|
+
data.tar.gz: 6fb95331e4a1c2180e8f297c07aaabd07b96f715
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e9bb0441873c38e750a69f9b0ff0d180ec704d5846cad9a439296d5bdb461824c0374ecc4d8a3da03d114157d12e316558e72d7728d76a1f2e06ac4857c0a87
|
7
|
+
data.tar.gz: da6e65c3fdb797f3d496f385a09ba7583f62fe7a08595521455aca483f427eb835eb258c8b48349b81340b2106a532b98efef0c5736f1517462279b4258f63c8
|
data/README.rdoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= ModelInfo
|
2
2
|
|
3
|
-
ModelInfo
|
4
|
-
|
3
|
+
ModelInfo provides the UI interface for the CRUD of all models (including engine's) and their associated models.
|
4
|
+
It also provides you the download link for CSV and JSON format of Model's data.
|
5
5
|
== Installation
|
6
6
|
|
7
7
|
Add this line to your application's Gemfile:
|
@@ -14,42 +14,8 @@ And then execute:
|
|
14
14
|
|
15
15
|
== Usage
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
<tt> mount ModelInfo::Engine => '/model_info' </tt>
|
20
|
-
|
21
|
-
Then to go to the dashboard hit the url as:
|
22
|
-
|
23
|
-
your_application_url */model_info/models* you will get all models of your application
|
24
|
-
|
25
|
-
== Downloads
|
26
|
-
|
27
|
-
You can download *CSV* *JSON* and *XML* formats of your model and associated model.
|
28
|
-
|
29
|
-
== Working Status
|
30
|
-
|
31
|
-
The download option for PDF, EXCEL and DOCX would be provided in an initializer file to make it true or false and also I will provide site logo and title option in an initializer file.
|
32
|
-
|
33
|
-
Flash notification will be implemented with *pnotify* gem.
|
34
|
-
|
35
|
-
== Bugs
|
36
|
-
|
37
|
-
This engine breaks on polymorphic association.
|
38
|
-
|
39
|
-
I am not handling the exceptions so it will break if you will fill bad data or something a model validates upon.
|
40
|
-
|
41
|
-
If your are using *devise* or *active_admin* then you need to be aware of layout and making it redirect to the page you want if there is any url hit without user login
|
42
|
-
|
43
|
-
for example:
|
44
|
-
|
45
|
-
<tt>
|
46
|
-
layout :determine_layout
|
47
|
-
|
48
|
-
protected
|
49
|
-
def determine_layout
|
50
|
-
current_user.nil? ? "devise":"application"
|
51
|
-
end
|
52
|
-
</tt>
|
17
|
+
After successful installation of gem the UI interface will be available on
|
53
18
|
|
54
|
-
|
19
|
+
your_application_url */model_info/models*
|
55
20
|
|
21
|
+
example: localhost:3000/model_info
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
14
14
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
15
|
end
|
16
16
|
|
17
|
-
APP_RAKEFILE = File.expand_path(
|
17
|
+
APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
|
18
18
|
load 'rails/tasks/engine.rake'
|
19
19
|
|
20
20
|
|
@@ -1,23 +1,32 @@
|
|
1
1
|
module ModelInfo
|
2
2
|
class ApplicationController < ::ApplicationController
|
3
|
+
#========================= Example =================================#
|
4
|
+
#class Employee < ApplicationRecord
|
5
|
+
# has_many :projects
|
6
|
+
#end
|
7
|
+
#============================ Naming Conventions ====================#
|
8
|
+
# model_class 'Employee'
|
9
|
+
# model_name 'employee'
|
10
|
+
# model_object_id '1'
|
11
|
+
# model_data '#<Employee id: 1, name: "rooh", salary: 138001, month: "jan", created_at: "2018-08-29 07:47:43", updated_at: "2018-09-12 09:35:09", manager_id: 8, lock_version: 4>'
|
12
|
+
# associated_model_class 'Project'
|
13
|
+
# associated_model_name 'projects'
|
14
|
+
# associated_model_object_id '1'
|
15
|
+
# associated_model_data '#<Project id: nil, name: nil, employee_id: 1, created_at: nil, updated_at: nil, properties: nil>'
|
16
|
+
|
17
|
+
before_action :models_tab
|
3
18
|
|
4
19
|
private
|
5
20
|
def models_tab
|
6
21
|
array=[], @model_array=[]
|
7
22
|
Rails.application.eager_load!
|
8
|
-
array=ActiveRecord::Base.descendants.collect{|x| x.to_s if x.table_exists?}.compact
|
23
|
+
array=ActiveRecord::Base.descendants.collect { |x| x.to_s if x.table_exists? }.compact
|
9
24
|
array.each do |x|
|
10
|
-
if
|
25
|
+
if x.split('::').last.split('_').first != 'HABTM'
|
11
26
|
@model_array.push(x)
|
12
27
|
end
|
13
28
|
@model_array.delete('ActiveRecord::SchemaMigration')
|
14
29
|
end
|
15
30
|
end
|
16
|
-
|
17
|
-
def fetch_model_name
|
18
|
-
params.each do |k, v|
|
19
|
-
@model_name = k.to_s if params[k].is_a?(Hash)
|
20
|
-
end
|
21
|
-
end
|
22
31
|
end
|
23
32
|
end
|
@@ -2,48 +2,80 @@ require_dependency "model_info/application_controller"
|
|
2
2
|
|
3
3
|
module ModelInfo
|
4
4
|
class AssociationsController < ApplicationController
|
5
|
-
before_action :
|
6
|
-
before_action :
|
5
|
+
before_action :set_variables_in_session, only: [:index]
|
6
|
+
before_action :set_instance_variables
|
7
|
+
before_action :set_associated_model_data, only: [:show, :edit, :update]
|
7
8
|
|
8
9
|
def new
|
9
|
-
@model_data
|
10
|
-
@associated_data=@model_data.send(params[:associated_model]).build
|
10
|
+
@associated_model_data = @model_data.send(@associated_model_name).build
|
11
11
|
end
|
12
12
|
|
13
13
|
def index
|
14
|
-
@
|
15
|
-
@
|
16
|
-
@
|
17
|
-
|
14
|
+
@macro, @page = params[:macro], params[:page]
|
15
|
+
@associated_model_data = @model_data.send(@associated_model_name)
|
16
|
+
if @macro == 'has_one' || @macro == 'belongs_to'
|
17
|
+
@associated_model_pagination = 1
|
18
|
+
else
|
19
|
+
@associated_model_pagination = @associated_model_data.page(params[:page]).per(10)
|
20
|
+
end
|
18
21
|
end
|
19
22
|
|
20
23
|
def create
|
21
|
-
@
|
22
|
-
|
24
|
+
@associated_model_data = @model_data.send(@associated_model_name).build(permit_params)
|
25
|
+
if @associated_model_data.save
|
26
|
+
redirect_to association_show_path(associated_model_object_id: @associated_model_data.id)
|
27
|
+
else
|
28
|
+
flash[:error] = @associated_model_data.errors.full_messages
|
29
|
+
redirect_back(fallback_location: request.referrer)
|
30
|
+
end
|
23
31
|
end
|
24
32
|
|
25
33
|
def show
|
26
|
-
@associated_model_class=params[:associated_model_class].constantize
|
27
|
-
@single_associated_data=@associated_model_class.find(params[:data])
|
28
34
|
end
|
29
35
|
|
30
36
|
def edit
|
31
|
-
@single_associated_data=params[:associated_model_class].constantize.find(params[:data])
|
32
37
|
end
|
33
38
|
|
34
39
|
def update
|
35
|
-
|
36
|
-
|
40
|
+
if @associated_model_data.update(permit_params)
|
41
|
+
redirect_to association_show_path(associated_model_object_id: params[:associated_model_object_id])
|
42
|
+
else
|
43
|
+
flash[:error] = @associated_model_data.errors.full_messages
|
44
|
+
redirect_back(fallback_location: request.referrer)
|
45
|
+
end
|
37
46
|
end
|
38
47
|
|
39
48
|
def destroy
|
40
|
-
|
41
|
-
|
49
|
+
@associated_model_class.find(params[:associated_model_object_id]).destroy
|
50
|
+
redirect_back(fallback_location: request.referrer)
|
42
51
|
end
|
43
52
|
|
44
53
|
private
|
54
|
+
def set_variables_in_session
|
55
|
+
session['param_set'] =
|
56
|
+
{
|
57
|
+
model_class: params[:model_class],
|
58
|
+
model_object_id: params[:model_object_id],
|
59
|
+
associated_model_class: params[:associated_model_class],
|
60
|
+
associated_model_name: params[:associated_model_name]
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
def set_instance_variables
|
65
|
+
@model_class = (session[:param_set][:model_class] || session['param_set']['model_class']).constantize
|
66
|
+
@model_name = @model_class.to_s.downcase
|
67
|
+
@model_object_id = session[:param_set][:model_object_id] || session['param_set']['model_object_id']
|
68
|
+
@model_data = @model_class.find(@model_object_id)
|
69
|
+
@associated_model_class = (session[:param_set][:associated_model_class] || session['param_set']['associated_model_class']).constantize
|
70
|
+
@associated_model_name = session[:param_set][:associated_model_name] || session['param_set']['associated_model_name']
|
71
|
+
end
|
72
|
+
|
73
|
+
def set_associated_model_data
|
74
|
+
@associated_model_data = @associated_model_class.find(params[:associated_model_object_id])
|
75
|
+
end
|
76
|
+
|
45
77
|
def permit_params
|
46
|
-
params.require(@
|
78
|
+
params.require(@associated_model_class.to_s.downcase).permit!
|
47
79
|
end
|
48
80
|
end
|
49
81
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require_dependency "model_info/application_controller"
|
2
2
|
module ModelInfo
|
3
3
|
class DownloadsController < ApplicationController
|
4
|
-
|
4
|
+
before_action :set_model_instance
|
5
|
+
before_action :authenticate_request
|
5
6
|
|
6
7
|
def download_csv
|
7
8
|
csv_string = CSV.generate do |csv|
|
8
|
-
csv <<
|
9
|
+
csv << @model_class.column_names
|
9
10
|
@model_data.each do |model|
|
10
11
|
values = model.attributes.values
|
11
12
|
csv.add_row values
|
@@ -13,33 +14,42 @@ module ModelInfo
|
|
13
14
|
end
|
14
15
|
send_data csv_string,
|
15
16
|
:type => 'text/csv; charset=iso-8859-1; header=present',
|
16
|
-
:disposition => "attachment; filename=#{
|
17
|
+
:disposition => "attachment; filename=#{@model_name}-#{DateTime.now}.csv"
|
17
18
|
end
|
18
19
|
|
19
20
|
def download_json
|
20
21
|
send_data @model_data.to_json,
|
21
22
|
:type => 'text/json; charset=iso-8859-1; header=present',
|
22
|
-
:disposition => "attachment; filename=#{
|
23
|
+
:disposition => "attachment; filename=#{@model_name}-#{DateTime.now}.json"
|
23
24
|
end
|
24
25
|
|
25
26
|
def download_xml
|
26
27
|
send_data @model_data.to_xml,
|
27
28
|
:type => 'text/xml; charset=iso-8859-1; header=present',
|
28
|
-
:disposiftion => "attachment; filename=#{
|
29
|
+
:disposiftion => "attachment; filename=#{@model_name}-#{DateTime.now}.xml"
|
29
30
|
end
|
30
31
|
|
31
32
|
private
|
32
33
|
|
34
|
+
def set_model_instance
|
35
|
+
@model_class = params[:model_class].try(:constantize)
|
36
|
+
@model_name = @model_class.to_s.downcase
|
37
|
+
end
|
38
|
+
|
33
39
|
def authenticate_request
|
34
|
-
params[:
|
40
|
+
if params[:associated_model_name]
|
41
|
+
fetch_associated_model_data
|
42
|
+
else
|
43
|
+
fetch_model_data
|
44
|
+
end
|
35
45
|
end
|
36
46
|
|
37
47
|
def fetch_model_data
|
38
|
-
@model_data =
|
48
|
+
@model_data = @model_class.all
|
39
49
|
end
|
40
50
|
|
41
51
|
def fetch_associated_model_data
|
42
|
-
@model_data =
|
52
|
+
@model_data = @model_class.find(params[:model_object_id]).send(params[:associated_model_name])
|
43
53
|
end
|
44
54
|
end
|
45
55
|
end
|
@@ -1,58 +1,62 @@
|
|
1
|
-
require_dependency
|
1
|
+
require_dependency 'model_info/application_controller'
|
2
2
|
|
3
3
|
module ModelInfo
|
4
4
|
class ModelsController < ApplicationController
|
5
|
-
before_action :
|
6
|
-
before_action :
|
7
|
-
|
8
|
-
def index
|
9
|
-
redirect_to model_display_url(model_class: @model_array.first)
|
10
|
-
end
|
11
|
-
|
5
|
+
before_action :model_class_and_name
|
6
|
+
before_action :set_model_data, only: [:show, :edit, :update]
|
7
|
+
|
12
8
|
def display
|
13
|
-
@model_class, @page = params[:model_class],params[:page]
|
9
|
+
@model_class, @page = params[:model_class] || @model_array.try(:first), params[:page] || 1
|
14
10
|
@model_pagination = @model_class.constantize.page(@page).per(10)
|
15
11
|
end
|
16
|
-
|
12
|
+
|
17
13
|
def new
|
18
|
-
@model_class = params[:model_class].constantize
|
19
14
|
@model_data = @model_class.new
|
20
15
|
end
|
21
|
-
|
16
|
+
|
22
17
|
def create
|
23
|
-
@
|
24
|
-
@
|
25
|
-
|
26
|
-
redirect_to model_show_path(model_class: @model_class, model_object_id: @model_class.last.id)
|
18
|
+
@model_data = @model_class.new(permit_params)
|
19
|
+
if @model_data.save
|
20
|
+
redirect_to model_show_path(model_class: @model_class, model_object_id: @model_data.id)
|
27
21
|
else
|
28
|
-
|
22
|
+
flash[:error] = @model_data.errors.full_messages
|
23
|
+
redirect_back(fallback_location: request.referrer)
|
29
24
|
end
|
30
25
|
end
|
31
|
-
|
26
|
+
|
32
27
|
def edit
|
33
|
-
@model_class=params[:model_class].constantize
|
34
|
-
@model_data=@model_class.find(params[:model_object_id])
|
35
28
|
end
|
36
|
-
|
29
|
+
|
37
30
|
def show
|
38
|
-
@model_class=params[:model_class].constantize
|
39
|
-
@model_data=@model_class.find(params[:model_object_id])
|
40
31
|
end
|
41
|
-
|
32
|
+
|
42
33
|
def update
|
43
|
-
|
44
|
-
|
34
|
+
if @model_data.update(permit_params)
|
35
|
+
redirect_to model_show_path(model_class: @model_class, model_object_id: @model_data.id)
|
36
|
+
else
|
37
|
+
flash[:error] = @model_data.errors.full_messages
|
38
|
+
redirect_back(fallback_location: request.referrer)
|
39
|
+
end
|
45
40
|
end
|
46
|
-
|
41
|
+
|
47
42
|
def destroy
|
48
|
-
|
49
|
-
|
43
|
+
@model_class.find(params[:model_object_id]).destroy
|
44
|
+
redirect_back(fallback_location: request.referrer)
|
50
45
|
end
|
51
|
-
|
46
|
+
|
52
47
|
private
|
53
|
-
|
48
|
+
|
54
49
|
def permit_params
|
55
50
|
params.require(@model_name).permit!
|
56
51
|
end
|
52
|
+
|
53
|
+
def model_class_and_name
|
54
|
+
@model_class = params[:model_class].try(:constantize)
|
55
|
+
@model_name = @model_class.to_s.downcase
|
56
|
+
end
|
57
|
+
|
58
|
+
def set_model_data
|
59
|
+
@model_data=@model_class.find(params[:model_object_id])
|
60
|
+
end
|
57
61
|
end
|
58
|
-
end
|
62
|
+
end
|
@@ -1,4 +1,47 @@
|
|
1
1
|
module ModelInfo
|
2
2
|
module AssociationsHelper
|
3
|
+
|
4
|
+
def associated_model_column_names
|
5
|
+
@associated_model_class.column_names
|
6
|
+
end
|
7
|
+
|
8
|
+
def association_download_param
|
9
|
+
{
|
10
|
+
associated_model_name: @associated_model_name,
|
11
|
+
model_class: @model_class,
|
12
|
+
model_object_id: @model_object_id
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def association_actions(associated_model_data)
|
17
|
+
content_tag :td do
|
18
|
+
concat link_to 'View',
|
19
|
+
association_show_path(page: @page, associated_model_object_id: associated_model_data),
|
20
|
+
class: 'btn btn-info'
|
21
|
+
concat ' '
|
22
|
+
concat link_to 'Edit',
|
23
|
+
association_edit_path(associated_model_object_id: associated_model_data),
|
24
|
+
class: 'btn btn-warning'
|
25
|
+
concat ' '
|
26
|
+
concat link_to 'Delete',
|
27
|
+
association_destroy_path(associated_model_object_id: associated_model_data),
|
28
|
+
method: :delete,
|
29
|
+
data: {confirm: 'Are you sure?'},
|
30
|
+
class: 'btn btn-danger'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def association_download_actions
|
35
|
+
if @associated_model_class.any?
|
36
|
+
content_tag :div, class: 'association_downloads' do
|
37
|
+
capture do
|
38
|
+
concat 'Download Associated Model Data: '
|
39
|
+
concat link_to 'CSV', download_csv_path(association_download_param), format: :csv
|
40
|
+
concat ' '
|
41
|
+
concat link_to 'JSON', download_json_path(association_download_param), format: :json
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
3
46
|
end
|
4
47
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module ModelInfo
|
2
|
+
module ModelsHelper
|
3
|
+
|
4
|
+
def model_column_names
|
5
|
+
@model_class.constantize.column_names
|
6
|
+
end
|
7
|
+
|
8
|
+
def model_reflection_on_associations
|
9
|
+
@model_class.constantize.reflect_on_all_associations
|
10
|
+
end
|
11
|
+
|
12
|
+
def model_column_value(model_data, model_column_name)
|
13
|
+
column_value = model_data.send(model_column_name.to_sym)
|
14
|
+
column_value.class =='String' ? column_value.truncate(14) : column_value.to_s.truncate(14)
|
15
|
+
end
|
16
|
+
|
17
|
+
def model_actions(model_data)
|
18
|
+
content_tag :td, class: 'model_action' do
|
19
|
+
capture do
|
20
|
+
concat link_to 'View', model_show_path(model_class: @model_class, model_object_id: model_data.id, page: @page), class: 'btn btn-info'
|
21
|
+
concat link_to 'Edit', model_edit_path(model_class: @model_class, model_object_id: model_data.id), class: 'btn btn-warning'
|
22
|
+
concat link_to 'Delete', model_destroy_path(model_class: @model_class, model_object_id: model_data.id), method: :delete, data: {confirm: 'Are you sure?'}, class: 'btn btn-danger'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def model_download_actions
|
28
|
+
if @model_class.constantize.any?
|
29
|
+
content_tag :div, class: 'model_downloads' do
|
30
|
+
capture do
|
31
|
+
concat 'Download: '
|
32
|
+
concat link_to 'CSV', download_csv_path(model_class: @model_class), format: :csv
|
33
|
+
concat ' '
|
34
|
+
concat link_to 'JSON', download_json_path(model_class: @model_class), format: :json
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# associations_hash = {
|
41
|
+
# [:projects, :has_many]=>"Project",
|
42
|
+
# [:histories, :has_many]=>"History",
|
43
|
+
# [:subordinates, :has_many]=>"Employee"
|
44
|
+
# }
|
45
|
+
def associations_hash
|
46
|
+
relationship_hash ={}, active_record_name=[], klass_name=[]
|
47
|
+
model_reflection_on_associations.each do |reflection|
|
48
|
+
if reflection.options[:polymorphic]
|
49
|
+
active_record_name.push(reflection.active_record.name)
|
50
|
+
else
|
51
|
+
klass_name.push(reflection.klass.name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
relationship_hash = model_reflection_on_associations.map { |x| [x.name, x.macro] }.zip(active_record_name+klass_name).inject({}) { |h, e| h[e.first] = e.last; h }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
<nav class=
|
2
|
-
<div class=
|
3
|
-
<div class=
|
4
|
-
|
1
|
+
<nav class='navbar navbar-default navbar-static-top'>
|
2
|
+
<div class='container-fluid'>
|
3
|
+
<div class='navbar-header'>
|
4
|
+
<%= link_to 'ModelInfo', root_path, class: 'navbar-brand' %>
|
5
5
|
</div>
|
6
6
|
</div>
|
7
7
|
</nav>
|
@@ -1,5 +1,8 @@
|
|
1
|
-
<ul class=
|
1
|
+
<ul class='nav nav-tabs'>
|
2
2
|
<% for model_class in @model_array %>
|
3
|
-
<li id="<%= model_class %>"><%= link_to model_class,
|
3
|
+
<li class='models_tab' id="<%= model_class %>"><%= link_to model_class, model_display_path(model_class: model_class) %></li>
|
4
4
|
<% end %>
|
5
|
-
</ul>
|
5
|
+
</ul>
|
6
|
+
<script>
|
7
|
+
$('#'+'<%= @model_class %>').addClass('active');
|
8
|
+
</script>
|
@@ -2,11 +2,11 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>ModelInfo</title>
|
5
|
-
<%= stylesheet_link_tag
|
5
|
+
<%= stylesheet_link_tag "model_info/application", media: "all" %>
|
6
6
|
<%= javascript_include_tag "model_info/application" %>
|
7
7
|
<%= csrf_meta_tags %>
|
8
8
|
<%= render :partial => 'layouts/model_info/header' %>
|
9
|
-
<%= render :partial => 'layouts/model_info/models_header'%>
|
9
|
+
<%= render :partial => 'layouts/model_info/models_header' %>
|
10
10
|
</head>
|
11
11
|
|
12
12
|
<body>
|
@@ -1,14 +1,9 @@
|
|
1
|
-
<h3>Update Your Associated Data of <%=
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
</div>
|
11
|
-
<% end %>
|
12
|
-
<%= f.submit 'Save Changes', class:"btn btn-primary" %>
|
13
|
-
<% end %>
|
14
|
-
</div>
|
1
|
+
<h3>Update Your Associated Data of <%= @associated_model_class %> </h3>
|
2
|
+
<%= render partial: 'model_info/shared/form',
|
3
|
+
locals:
|
4
|
+
{
|
5
|
+
model_class: @associated_model_class,
|
6
|
+
model_data: @associated_model_data,
|
7
|
+
url: association_update_path(associated_model_object_id: @associated_model_data.id),
|
8
|
+
}
|
9
|
+
%>
|
@@ -1,55 +1,47 @@
|
|
1
|
-
<div class=
|
2
|
-
<h3 class=
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
<div class='top_block col-md-12'>
|
2
|
+
<h3 class='pull-left'>Associated Data of <%= @model_class %> to <%= @associated_model_class %></h3>
|
3
|
+
|
4
|
+
<div class='pull-right'>
|
5
|
+
<% unless @macro == 'has_one' || @macro == 'belongs_to' %>
|
6
|
+
<b><%= link_to 'Create associative record', association_new_path, class: 'btn btn-success' %></b>
|
6
7
|
<% end %>
|
7
8
|
</div>
|
8
9
|
</div>
|
9
|
-
|
10
|
+
|
11
|
+
<table class='table table-hover'>
|
10
12
|
<tr>
|
11
|
-
<%
|
12
|
-
<th><%=
|
13
|
+
<% associated_model_column_names.each do |column_name| %>
|
14
|
+
<th><%= column_name %></th>
|
13
15
|
<% end %>
|
14
16
|
<th>Actions</th>
|
15
17
|
</tr>
|
16
|
-
<% if @macro ==
|
17
|
-
<% unless @
|
18
|
+
<% if @macro == 'has_one' || @macro== 'belongs_to' %>
|
19
|
+
<% unless @associated_model_data.nil? %>
|
18
20
|
<tr>
|
19
|
-
<%
|
21
|
+
<% associated_model_column_names.each do |d| %>
|
20
22
|
<td>
|
21
|
-
<%= @
|
23
|
+
<%= @associated_model_data.send(d).class=='String' ? @associated_model_data.send(d).truncate(14) : @associated_model_data.send(d).to_s.truncate(14) %>
|
22
24
|
</td>
|
23
|
-
<%end%>
|
24
|
-
|
25
|
-
<%= link_to 'view', association_show_path(associated_model_class: @associated_model_class, page: @page, data: @associated_data.id), class: 'btn btn-info' %>
|
26
|
-
<%= link_to 'edit', association_edit_path(model_class: @model_class,model_object_id: @model_object_id,associated_model: @associated_model,associated_model_class: @associated_model_class, page: @page, data: @associated_data.id), class: 'btn btn-warning' %>
|
27
|
-
<%= link_to 'delete', association_destroy_path(model_class: @model_class,model_object_id: @model_object_id,associated_model: @associated_model,associated_model_class: @associated_model_class,data: @associated_data.id), method: :delete , data: {confirm: "Are you sure?"}, class: 'btn btn-danger' %>
|
28
|
-
</td>
|
25
|
+
<% end %>
|
26
|
+
<%= association_actions(@associated_model_data) %>
|
29
27
|
</tr>
|
30
28
|
<% end %>
|
31
29
|
<% else %>
|
32
30
|
<% @associated_model_pagination.each do |y| %>
|
33
31
|
<tr>
|
34
|
-
<%
|
32
|
+
<% associated_model_column_names.each do |k| %>
|
35
33
|
<td>
|
36
|
-
<%= y.send(k.to_sym).class=='String' ?y.send(k.to_sym).truncate(14):y.send(k.to_sym).to_s.truncate(14) %>
|
34
|
+
<%= y.send(k.to_sym).class=='String' ? y.send(k.to_sym).truncate(14) : y.send(k.to_sym).to_s.truncate(14) %>
|
37
35
|
</td>
|
38
36
|
<% end %>
|
39
|
-
|
40
|
-
<%= link_to 'view', association_show_path(associated_model_class: @associated_model_class, data: y, page: @page), class: 'btn btn-info' %>
|
41
|
-
<%= link_to 'edit', association_edit_path(model_class: @model_class,model_object_id: @model_object_id,associated_model: @associated_model,associated_model_class: @associated_model_class, data: y, page: @page), class: 'btn btn-warning' %>
|
42
|
-
<%= link_to 'delete', association_destroy_path(associated_model_class: @associated_model_class, data: y.id), data: {confirm: "Are you sure?"}, method: :delete ,class: 'btn btn-danger' %>
|
43
|
-
</td>
|
37
|
+
<%= association_actions(y) %>
|
44
38
|
</tr>
|
45
39
|
<% end %>
|
46
40
|
</table>
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
</div>
|
52
|
-
<div class="clearfix"></div>
|
41
|
+
|
42
|
+
<%= association_download_actions %>
|
43
|
+
|
44
|
+
<div class='clearfix'></div>
|
53
45
|
<%= paginate @associated_model_pagination %>
|
54
|
-
<%=
|
46
|
+
<%= rel_next_prev_link_tags @associated_model_pagination unless @associated_model_pagination.empty? %>
|
55
47
|
<% end %>
|
@@ -1,22 +1,14 @@
|
|
1
|
-
<h3>Add New Record in <%=
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
<%= hidden_field_tag :model_object_id, params[:model_object_id]%>
|
11
|
-
<div class="form-group">
|
12
|
-
<%= f.text_field associated_model_column, :class => 'form-control'%>
|
13
|
-
</div>
|
14
|
-
</div>
|
15
|
-
<% end %>
|
16
|
-
<%= f.submit 'Save Changes', class:"btn btn-primary" %>
|
17
|
-
<% end %>
|
18
|
-
</div>
|
1
|
+
<h3>Add New Record in <%= @model_class %> </h3>
|
2
|
+
<%= render partial: 'model_info/shared/form',
|
3
|
+
locals:
|
4
|
+
{
|
5
|
+
model_class: @associated_model_class,
|
6
|
+
model_data: @associated_model_data,
|
7
|
+
url: association_create_path,
|
8
|
+
new: true
|
9
|
+
}
|
19
10
|
|
11
|
+
%>
|
20
12
|
|
21
13
|
|
22
14
|
|
@@ -1,19 +1,8 @@
|
|
1
|
-
<h3>View Your Associated Data of <%=
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
<th><%= associated_model_column %></th>
|
10
|
-
<td><%= @single_associated_data.send(associated_model_column) %></td>
|
11
|
-
</tr>
|
12
|
-
<% end %>
|
13
|
-
<tr>
|
14
|
-
<th>Actions</th>
|
15
|
-
<td>
|
16
|
-
<%= link_to 'Back', :back %>
|
17
|
-
</td>
|
18
|
-
</tr>
|
19
|
-
</table>
|
1
|
+
<h3>View Your Associated Data of <%= @associated_model_class %></h3>
|
2
|
+
<%= render partial: 'model_info/shared/show',
|
3
|
+
locals:
|
4
|
+
{
|
5
|
+
model_class: @associated_model_class,
|
6
|
+
model_data: @associated_model_data
|
7
|
+
}
|
8
|
+
%>
|
@@ -1,55 +1,51 @@
|
|
1
|
-
<div class=
|
2
|
-
<h3 class=
|
3
|
-
|
4
|
-
|
1
|
+
<div class='top_block col-md-12'>
|
2
|
+
<h3 class='pull-left'><%= @model_class %></h3>
|
3
|
+
|
4
|
+
<div class='pull-right'>
|
5
|
+
<b><%= link_to 'Add new Record', model_new_path(model_class: @model_class), class: 'btn btn-success' %></b>
|
5
6
|
</div>
|
6
7
|
</div>
|
7
|
-
|
8
|
+
|
9
|
+
<table class='table table-hover'>
|
8
10
|
<tr>
|
9
|
-
<%
|
10
|
-
<th><%=
|
11
|
+
<% model_column_names.each do |column_name| %>
|
12
|
+
<th><%= column_name %></th>
|
11
13
|
<% end %>
|
12
14
|
<th>Actions</th>
|
13
15
|
<th>Association Relationship</th>
|
14
16
|
</tr>
|
15
17
|
<% @model_pagination.each do |model_data| %>
|
16
18
|
<tr>
|
17
|
-
<%
|
19
|
+
<% model_column_names.each do |model_column_name| %>
|
18
20
|
<td>
|
19
|
-
<%= model_data
|
21
|
+
<%= model_column_value(model_data, model_column_name) %>
|
20
22
|
</td>
|
21
23
|
<% end %>
|
22
|
-
|
23
|
-
<%= link_to 'View', model_show_path(model_class: @model_class, model_object_id: model_data.id, page: @page), class: 'btn btn-info' %>
|
24
|
-
<%= link_to 'Edit', model_edit_path(model_class: @model_class, model_object_id: model_data.id), class: 'btn btn-warning' %>
|
25
|
-
<%= link_to 'Delete', model_destroy_path(model_class: @model_class, model_object_id: model_data.id), method: :delete, data: {confirm: "Are you sure?"}, class: 'btn btn-danger' %>
|
26
|
-
</td>
|
24
|
+
<%= model_actions(model_data) %>
|
27
25
|
<td>
|
28
|
-
<%
|
29
|
-
|
30
|
-
<% reflection.options[:polymorphic] ? a1.push(reflection.active_record.name) : a2.push(reflection.klass.name) %>
|
31
|
-
<% end %>
|
32
|
-
<% relationship_hash = @model_class.constantize.reflect_on_all_associations.map{|x| [x.name, x.macro]}.zip(a1+a2).inject({}){|h,e| h[e.first] = e.last; h}%>
|
33
|
-
|
34
|
-
<% if relationship_hash.empty? %>
|
35
|
-
<%= 'Sorry no relationship!'%>
|
26
|
+
<% if associations_hash.empty? %>
|
27
|
+
<%= "Sorry no association exist for #{@model_class}" %>
|
36
28
|
<% else %>
|
37
|
-
<%
|
38
|
-
<%= link_to "#{
|
29
|
+
<% associations_hash.each do |association_name_and_macro, model_class| %>
|
30
|
+
<%= link_to "#{association_name_and_macro.last} #{association_name_and_macro.first} |",
|
31
|
+
associations_index_path(associated_model_name: association_name_and_macro.first,
|
32
|
+
model_object_id: model_data.id,
|
33
|
+
model_class: @model_class,
|
34
|
+
associated_model_class: model_class,
|
35
|
+
macro: association_name_and_macro.last) %>
|
39
36
|
<% end %>
|
40
37
|
<% end %>
|
41
38
|
</td>
|
42
39
|
</tr>
|
43
40
|
<% end %>
|
44
41
|
</table>
|
45
|
-
|
46
|
-
<%=
|
47
|
-
<%= link_to 'XML', download_xml_path(model_class: @model_class), format: :xml %>
|
42
|
+
|
43
|
+
<%= model_download_actions %>
|
48
44
|
|
49
45
|
<nav>
|
50
|
-
<ul class=
|
46
|
+
<ul class='pagination'>
|
51
47
|
<li><%= paginate @model_pagination %></li>
|
52
|
-
<%=
|
48
|
+
<%= rel_next_prev_link_tags @model_pagination unless @model_pagination.empty? %>
|
53
49
|
</ul>
|
54
50
|
</nav>
|
55
51
|
|
@@ -1,14 +1,9 @@
|
|
1
|
-
<h3>Update Your <%= @model_class
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
</div>
|
11
|
-
<% end %>
|
12
|
-
<%= f.submit 'Save Changes', class:"btn btn-primary" %>
|
13
|
-
<% end %>
|
14
|
-
</div>
|
1
|
+
<h3>Update Your <%= @model_class %> Data</h3>
|
2
|
+
<%= render partial: 'model_info/shared/form',
|
3
|
+
locals:
|
4
|
+
{
|
5
|
+
model_class: @model_class,
|
6
|
+
model_data: @model_data,
|
7
|
+
url: model_update_path(model_object_id: @model_data.id)
|
8
|
+
}
|
9
|
+
%>
|
@@ -1,21 +1,13 @@
|
|
1
|
-
<h3>Add New Record in <%= @model_class
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
</div>
|
12
|
-
</div>
|
13
|
-
<% end %>
|
14
|
-
<%= f.submit 'Create Record', class:"btn btn-primary" %>
|
15
|
-
<% end %>
|
16
|
-
</div>
|
17
|
-
|
18
|
-
|
1
|
+
<h3>Add New Record in <%= @model_class %> </h3>
|
2
|
+
<%= render partial: 'model_info/shared/form',
|
3
|
+
locals:
|
4
|
+
{
|
5
|
+
model_class: @model_class,
|
6
|
+
model_data: @model_data,
|
7
|
+
url: model_create_path,
|
8
|
+
new: true
|
9
|
+
}
|
10
|
+
%>
|
19
11
|
|
20
12
|
|
21
13
|
|
@@ -1,19 +1,8 @@
|
|
1
|
-
<h3>View Your <%= @model_class
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
<th><%= model_column_name %></th>
|
10
|
-
<td><%= @model_data.send(model_column_name) %></td>
|
11
|
-
</tr>
|
12
|
-
<% end %>
|
13
|
-
<tr>
|
14
|
-
<th>Actions</th>
|
15
|
-
<td>
|
16
|
-
<%= link_to 'Back', :back %>
|
17
|
-
</td>
|
18
|
-
</tr>
|
19
|
-
</table>
|
1
|
+
<h3>View Your <%= @model_class %> Data</h3>
|
2
|
+
<%= render partial: 'model_info/shared/show',
|
3
|
+
locals:
|
4
|
+
{
|
5
|
+
model_class: @model_class,
|
6
|
+
model_data: @model_data
|
7
|
+
}
|
8
|
+
%>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<div class='flash_messages'>
|
2
|
+
<%= content_tag(:div, :class => 'alert alert-danger') do %>
|
3
|
+
<%= content_tag :ul do %>
|
4
|
+
<% flash.each do |key, value| %>
|
5
|
+
<% if value.is_a?(Array) %>
|
6
|
+
<% flash[key].each do |error| %>
|
7
|
+
<%= content_tag :li, error %>
|
8
|
+
<% end %>
|
9
|
+
<% else %>
|
10
|
+
<%= content_tag :li, value %>
|
11
|
+
<% end %>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
15
|
+
</div>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= render 'model_info/shared/flash_messages' unless flash.empty? %>
|
2
|
+
<div class='jumbotron'>
|
3
|
+
<%= form_for model_data, url: url, method: local_assigns[:new] ? :post : :patch do |f| %>
|
4
|
+
<% (model_data.class.column_names - %w(id serialized_options created_at updated_at)).each do |attribute| %>
|
5
|
+
<div class='form-group'>
|
6
|
+
<%= f.label attribute %>
|
7
|
+
<%= hidden_field_tag :model_class, model_class %>
|
8
|
+
<div class='form-group'>
|
9
|
+
<%= f.text_field attribute, :class => 'form-control' %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
<%= f.submit local_assigns[:new] ? 'Create Record' : 'Save Changes', class: 'btn btn-primary' %>
|
14
|
+
<% end %>
|
15
|
+
</div>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<table class='table table-hover table-bordered'>
|
2
|
+
<tr>
|
3
|
+
<th>Attribute</th>
|
4
|
+
<th>Value</th>
|
5
|
+
</tr>
|
6
|
+
<% model_class.column_names.each do |model_column_name| %>
|
7
|
+
<tr>
|
8
|
+
<th><%= model_column_name %></th>
|
9
|
+
<td><%= model_data.send(model_column_name) %></td>
|
10
|
+
</tr>
|
11
|
+
<% end %>
|
12
|
+
<tr>
|
13
|
+
<th>Actions</th>
|
14
|
+
<td>
|
15
|
+
<%= link_to 'Back', :back %>
|
16
|
+
</td>
|
17
|
+
</tr>
|
18
|
+
</table>
|
data/config/routes.rb
CHANGED
data/lib/model_info.rb
CHANGED
data/lib/model_info/engine.rb
CHANGED
@@ -3,5 +3,15 @@ require 'csv'
|
|
3
3
|
module ModelInfo
|
4
4
|
class Engine < ::Rails::Engine
|
5
5
|
isolate_namespace ModelInfo
|
6
|
+
|
7
|
+
initializer 'model_info', before: :load_config_initializers do |app|
|
8
|
+
Rails.application.routes.append do
|
9
|
+
mount ModelInfo::Engine, at: '/model_info'
|
10
|
+
end
|
11
|
+
|
12
|
+
config.paths['db/migrate'].expanded.each do |expanded_path|
|
13
|
+
Rails.application.config.paths['db/migrate'] << expanded_path
|
14
|
+
end
|
15
|
+
end
|
6
16
|
end
|
7
17
|
end
|
data/lib/model_info/version.rb
CHANGED
metadata
CHANGED
@@ -1,32 +1,46 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: model_info
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nitanshu verma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bootstrap
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.1'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: kaminari
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- - "
|
31
|
+
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
33
|
+
version: '1.1'
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
|
-
- - "
|
38
|
+
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
27
|
-
description: ModelInfo
|
28
|
-
|
29
|
-
|
40
|
+
version: '1.1'
|
41
|
+
description: ModelInfo provides the UI interface for the CRUD of all models (including
|
42
|
+
engine's) and their associated models. It also enables the admin to download the
|
43
|
+
CSV and JSON format data of all the Models and their associated Models.
|
30
44
|
email:
|
31
45
|
- nitanshu1991@gmail.com
|
32
46
|
executables: []
|
@@ -51,6 +65,7 @@ files:
|
|
51
65
|
- app/controllers/model_info/models_controller.rb
|
52
66
|
- app/helpers/model_info/application_helper.rb
|
53
67
|
- app/helpers/model_info/associations_helper.rb
|
68
|
+
- app/helpers/model_info/models_helper.rb
|
54
69
|
- app/views/layouts/model_info/_header.html.erb
|
55
70
|
- app/views/layouts/model_info/_models_header.html.erb
|
56
71
|
- app/views/layouts/model_info/application.html.erb
|
@@ -62,6 +77,9 @@ files:
|
|
62
77
|
- app/views/model_info/models/edit.html.erb
|
63
78
|
- app/views/model_info/models/new.html.erb
|
64
79
|
- app/views/model_info/models/show.html.erb
|
80
|
+
- app/views/model_info/shared/_flash_messages.html.erb
|
81
|
+
- app/views/model_info/shared/_form.html.erb
|
82
|
+
- app/views/model_info/shared/_show.html.erb
|
65
83
|
- config/routes.rb
|
66
84
|
- lib/model_info.rb
|
67
85
|
- lib/model_info/engine.rb
|
@@ -87,8 +105,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
105
|
version: '0'
|
88
106
|
requirements: []
|
89
107
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.4.
|
108
|
+
rubygems_version: 2.4.6
|
91
109
|
signing_key:
|
92
110
|
specification_version: 4
|
93
|
-
summary: ModelInfo provides the CRUD of all
|
111
|
+
summary: ModelInfo provides the UI interface for the CRUD of all models (including
|
112
|
+
engine's) and their associated models.
|
94
113
|
test_files: []
|