overlook 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/app/assets/images/.DS_Store +0 -0
- data/app/assets/images/admin/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/admin/glyphicons-halflings.png +0 -0
- data/app/assets/javascripts/.DS_Store +0 -0
- data/app/assets/javascripts/admin/bootstrap.js +7 -0
- data/app/assets/javascripts/admin.js.coffee +3 -0
- data/app/assets/stylesheets/.DS_Store +0 -0
- data/app/assets/stylesheets/admin/.DS_Store +0 -0
- data/app/assets/stylesheets/admin/bootstrap.css +706 -0
- data/app/assets/stylesheets/admin.css +12 -0
- data/app/controllers/.DS_Store +0 -0
- data/app/controllers/admin/application_controller.rb +3 -0
- data/app/controllers/admin/articles_controller.rb +82 -0
- data/app/controllers/admin/users_controller.rb +76 -0
- data/app/helpers/.DS_Store +0 -0
- data/app/helpers/admin/application_helper.rb +26 -0
- data/app/views/.DS_Store +0 -0
- data/app/views/kaminari/admin/_gap.html.erb +8 -0
- data/app/views/kaminari/admin/_next_page.html.erb +11 -0
- data/app/views/kaminari/admin/_page.html.erb +12 -0
- data/app/views/kaminari/admin/_paginator.html.erb +23 -0
- data/app/views/kaminari/admin/_prev_page.html.erb +11 -0
- data/app/views/layouts/.DS_Store +0 -0
- data/app/views/layouts/admin.html.erb +30 -0
- data/lib/generators/overlook/.DS_Store +0 -0
- data/lib/generators/overlook/admin/admin_generator.rb +60 -0
- data/lib/generators/overlook/admin/templates/breadcrumb.html.erb +14 -0
- data/lib/generators/overlook/admin/templates/controller.rb +82 -0
- data/lib/generators/overlook/admin/templates/destroy.js.erb +1 -0
- data/lib/generators/overlook/admin/templates/edit.html.erb +12 -0
- data/lib/generators/overlook/admin/templates/form.html.erb +21 -0
- data/lib/generators/overlook/admin/templates/index.html.erb +44 -0
- data/lib/generators/overlook/admin/templates/new.html.erb +12 -0
- data/lib/generators/overlook/admin/templates/partial.html.erb +30 -0
- data/lib/generators/overlook/admin/templates/show.html.erb +17 -0
- data/lib/generators/overlook/admin/templates/sidebar.html.erb +30 -0
- data/lib/generators/overlook/install/USAGE +5 -0
- data/lib/generators/overlook/install/install_generator.rb +15 -0
- data/lib/generators/overlook/install/templates/assets/images/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/assets/images/admin/glyphicons-halflings-white.png +0 -0
- data/lib/generators/overlook/install/templates/assets/images/admin/glyphicons-halflings.png +0 -0
- data/lib/generators/overlook/install/templates/assets/javascripts/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/assets/javascripts/admin/bootstrap.js +7 -0
- data/lib/generators/overlook/install/templates/assets/javascripts/admin.js.coffee +3 -0
- data/lib/generators/overlook/install/templates/assets/stylesheets/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/assets/stylesheets/admin/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/assets/stylesheets/admin/bootstrap.css +706 -0
- data/lib/generators/overlook/install/templates/assets/stylesheets/admin.css +12 -0
- data/lib/generators/overlook/install/templates/controllers/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/controllers/admin/application_controller.rb +3 -0
- data/lib/generators/overlook/install/templates/controllers/admin/articles_controller.rb +82 -0
- data/lib/generators/overlook/install/templates/controllers/admin/users_controller.rb +76 -0
- data/lib/generators/overlook/install/templates/helpers/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/helpers/admin/application_helper.rb +26 -0
- data/lib/generators/overlook/install/templates/views/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/views/kaminari/admin/_gap.html.erb +8 -0
- data/lib/generators/overlook/install/templates/views/kaminari/admin/_next_page.html.erb +11 -0
- data/lib/generators/overlook/install/templates/views/kaminari/admin/_page.html.erb +12 -0
- data/lib/generators/overlook/install/templates/views/kaminari/admin/_paginator.html.erb +23 -0
- data/lib/generators/overlook/install/templates/views/kaminari/admin/_prev_page.html.erb +11 -0
- data/lib/generators/overlook/install/templates/views/layouts/.DS_Store +0 -0
- data/lib/generators/overlook/install/templates/views/layouts/admin.html.erb +30 -0
- data/lib/overlook/version.rb +3 -0
- data/lib/overlook.rb +5 -0
- data/overlook.gemspec +25 -0
- metadata +157 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*= require admin/bootstrap
|
|
3
|
+
*= require_self
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
body { padding-top: 60px; }
|
|
7
|
+
div.sidebar { padding: 8px 0; }
|
|
8
|
+
td.options div.btn-group { width: 110px; }
|
|
9
|
+
table.table td { vertical-align: middle; }
|
|
10
|
+
td.center { text-align: center; }
|
|
11
|
+
td.right { text-align: right; }
|
|
12
|
+
|
|
Binary file
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'csv'
|
|
2
|
+
|
|
3
|
+
class Admin::ArticlesController < Admin::ApplicationController
|
|
4
|
+
# filters
|
|
5
|
+
before_filter :load_article, only: [:show, :edit, :update, :destroy]
|
|
6
|
+
|
|
7
|
+
# index
|
|
8
|
+
def index
|
|
9
|
+
@articles = Article.search(params[:q]).sorty(params)
|
|
10
|
+
|
|
11
|
+
respond_to do |format|
|
|
12
|
+
format.html do
|
|
13
|
+
@articles = @articles.page(params[:page])
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
format.csv do
|
|
17
|
+
data = CSV.generate do |csv|
|
|
18
|
+
columns = Article.columns.map(&:name)
|
|
19
|
+
csv << columns.map(&:titleize)
|
|
20
|
+
|
|
21
|
+
@articles.map do |article|
|
|
22
|
+
csv << columns.map{|c| article.send(c)}
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
filename = "articles-#{Time.now.strftime('%d-%m-%Y')}.csv"
|
|
27
|
+
send_data(data, filename: filename, type: 'text/csv')
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# show
|
|
33
|
+
def show
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# new
|
|
38
|
+
def new
|
|
39
|
+
@article = Article.new
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# create
|
|
43
|
+
def create
|
|
44
|
+
@article = Article.new(params[:article])
|
|
45
|
+
|
|
46
|
+
if @article.save
|
|
47
|
+
redirect_to admin_articles_url, notice: "Article has been created"
|
|
48
|
+
else
|
|
49
|
+
render :new
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# edit
|
|
54
|
+
def edit
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# update
|
|
59
|
+
def update
|
|
60
|
+
if @article.update_attributes(params[:article])
|
|
61
|
+
redirect_to admin_articles_url, notice: "Article has been updated"
|
|
62
|
+
else
|
|
63
|
+
render :edit
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# destroy
|
|
68
|
+
def destroy
|
|
69
|
+
@article.destroy
|
|
70
|
+
|
|
71
|
+
respond_to do |format|
|
|
72
|
+
format.html { redirect_to :back, notice: "Article has been deleted" }
|
|
73
|
+
format.js
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
protected
|
|
78
|
+
|
|
79
|
+
def load_article
|
|
80
|
+
@article = Article.find(params[:id])
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'csv'
|
|
2
|
+
|
|
3
|
+
class Admin::UsersController < Admin::ApplicationController
|
|
4
|
+
# filters
|
|
5
|
+
before_filter :load_user, only: [:edit, :update, :destroy]
|
|
6
|
+
|
|
7
|
+
# index
|
|
8
|
+
def index
|
|
9
|
+
@users = User.search(params[:q]).sorty(params)
|
|
10
|
+
|
|
11
|
+
respond_to do |format|
|
|
12
|
+
format.html do
|
|
13
|
+
@users = @users.page(params[:page])
|
|
14
|
+
end
|
|
15
|
+
format.csv do
|
|
16
|
+
data = CSV.generate do |csv|
|
|
17
|
+
columns = User.columns.map(&:name)
|
|
18
|
+
csv << columns.map(&:titleize)
|
|
19
|
+
|
|
20
|
+
@users.map do |user|
|
|
21
|
+
csv << columns.map{|c| user.send(c)}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
filename = "users-#{Time.now.strftime('%d-%m-%Y')}.csv"
|
|
26
|
+
send_data(data, filename: filename, type: 'text/csv')
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# new
|
|
32
|
+
def new
|
|
33
|
+
@user = User.new
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# create
|
|
37
|
+
def create
|
|
38
|
+
@user = User.new(params[:user])
|
|
39
|
+
|
|
40
|
+
if @user.save
|
|
41
|
+
redirect_to admin_users_url, notice: "User has been created"
|
|
42
|
+
else
|
|
43
|
+
render :new
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# edit
|
|
48
|
+
def edit
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# update
|
|
53
|
+
def update
|
|
54
|
+
if @user.update_attributes(params[:user])
|
|
55
|
+
redirect_to admin_users_url, notice: "User has been updated"
|
|
56
|
+
else
|
|
57
|
+
render :edit
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# destroy
|
|
62
|
+
def destroy
|
|
63
|
+
@user.destroy
|
|
64
|
+
|
|
65
|
+
respond_to do |format|
|
|
66
|
+
format.html { redirect_to :back, notice: "User has been deleted" }
|
|
67
|
+
format.js
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
protected
|
|
72
|
+
|
|
73
|
+
def load_user
|
|
74
|
+
@user = User.find(params[:id])
|
|
75
|
+
end
|
|
76
|
+
end
|
|
Binary file
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Admin::ApplicationHelper
|
|
2
|
+
def flash_messages
|
|
3
|
+
classes = { notice: 'success', warning: 'warning', error: 'error' }
|
|
4
|
+
|
|
5
|
+
output = flash.map do |name, message|
|
|
6
|
+
if message.present?
|
|
7
|
+
class_name = ['alert', "alert-#{classes[name]}"].join(' ')
|
|
8
|
+
message << '<a class="close" data-dismiss="alert">×</a>'
|
|
9
|
+
|
|
10
|
+
content_tag(:div, class: 'span12') do
|
|
11
|
+
content_tag(:div, raw(message), class: class_name)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
raw(output.join)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def nav(name)
|
|
20
|
+
class_name = params[:controller].eql?("admin/#{name}") ? 'active' : nil
|
|
21
|
+
|
|
22
|
+
content_tag(:li, class: class_name) do
|
|
23
|
+
link_to(name.to_s.titleize, "/admin/#{name}")
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/app/views/.DS_Store
ADDED
|
Binary file
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<%# Non-link tag that stands for skipped pages...
|
|
2
|
+
- available local variables
|
|
3
|
+
current_page: a page object for the currently displayed page
|
|
4
|
+
num_pages: total number of pages
|
|
5
|
+
per_page: number of items to fetch per page
|
|
6
|
+
remote: data-remote
|
|
7
|
+
-%>
|
|
8
|
+
<li class="disabled"><a href="#"><%= raw(t 'views.pagination.truncate') %></a></li>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<%# Link to the "Next" page
|
|
2
|
+
- available local variables
|
|
3
|
+
url: url to the next page
|
|
4
|
+
current_page: a page object for the currently displayed page
|
|
5
|
+
num_pages: total number of pages
|
|
6
|
+
per_page: number of items to fetch per page
|
|
7
|
+
remote: data-remote
|
|
8
|
+
-%>
|
|
9
|
+
<li class="<%= 'disabled' if current_page.last? %>">
|
|
10
|
+
<%= link_to raw("»"), url, :rel => 'next', :remote => remote %>
|
|
11
|
+
</li>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<%# Link showing page number
|
|
2
|
+
- available local variables
|
|
3
|
+
page: a page object for "this" page
|
|
4
|
+
url: url to this page
|
|
5
|
+
current_page: a page object for the currently displayed page
|
|
6
|
+
num_pages: total number of pages
|
|
7
|
+
per_page: number of items to fetch per page
|
|
8
|
+
remote: data-remote
|
|
9
|
+
-%>
|
|
10
|
+
<li class="<%= 'active' if page.current? %>">
|
|
11
|
+
<%= link_to page, url, opts = { :remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
|
|
12
|
+
</li>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<%# The container tag
|
|
2
|
+
- available local variables
|
|
3
|
+
current_page: a page object for the currently displayed page
|
|
4
|
+
num_pages: total number of pages
|
|
5
|
+
per_page: number of items to fetch per page
|
|
6
|
+
remote: data-remote
|
|
7
|
+
paginator: the paginator that renders the pagination tags inside
|
|
8
|
+
-%>
|
|
9
|
+
<%= paginator.render do -%>
|
|
10
|
+
<div class="pagination pagination-centered">
|
|
11
|
+
<ul>
|
|
12
|
+
<%= prev_page_tag unless current_page.first? %>
|
|
13
|
+
<% each_page do |page| -%>
|
|
14
|
+
<% if page.left_outer? || page.right_outer? || page.inside_window? -%>
|
|
15
|
+
<%= page_tag page %>
|
|
16
|
+
<% elsif !page.was_truncated? -%>
|
|
17
|
+
<%= gap_tag %>
|
|
18
|
+
<% end -%>
|
|
19
|
+
<% end -%>
|
|
20
|
+
<%= next_page_tag unless current_page.last? %>
|
|
21
|
+
</ul>
|
|
22
|
+
</div>
|
|
23
|
+
<% end -%>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<%# Link to the "Previous" page
|
|
2
|
+
- available local variables
|
|
3
|
+
url: url to the previous page
|
|
4
|
+
current_page: a page object for the currently displayed page
|
|
5
|
+
num_pages: total number of pages
|
|
6
|
+
per_page: number of items to fetch per page
|
|
7
|
+
remote: data-remote
|
|
8
|
+
-%>
|
|
9
|
+
<li class="<%= 'disabled' if current_page.first? %>">
|
|
10
|
+
<%= link_to raw("«"), url, :rel => 'prev', :remote => remote %>
|
|
11
|
+
</li>
|
|
Binary file
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title><%= @page_title || 'Admin' %></title>
|
|
6
|
+
<%= stylesheet_link_tag "admin", media: "all" %>
|
|
7
|
+
<%= csrf_meta_tags %>
|
|
8
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div class="navbar navbar-fixed-top">
|
|
12
|
+
<div class="navbar-inner">
|
|
13
|
+
<div class="container">
|
|
14
|
+
<a class="brand" href="/admin">Admin</a>
|
|
15
|
+
<ul class="nav">
|
|
16
|
+
<%= nav(:users) %>
|
|
17
|
+
<%= nav(:articles) %>
|
|
18
|
+
</ul>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="container">
|
|
23
|
+
<div class="row">
|
|
24
|
+
<%= flash_messages %>
|
|
25
|
+
<%= yield %>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
<%= javascript_include_tag "admin" %>
|
|
29
|
+
</body>
|
|
30
|
+
</html>
|
|
Binary file
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module Overlook
|
|
2
|
+
class AdminGenerator < Rails::Generators::NamedBase
|
|
3
|
+
# source
|
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
5
|
+
|
|
6
|
+
def add_route
|
|
7
|
+
inject_into_file 'config/routes.rb', "\n resources :#{table_name}", {
|
|
8
|
+
after: /namespace :admin do$/
|
|
9
|
+
}
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def add_navigation
|
|
13
|
+
inject_into_file 'app/views/layouts/admin.html.erb', "\n <%= nav(:#{table_name}) %>", {
|
|
14
|
+
after: /<ul class="nav">/
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def copy_controller_file
|
|
19
|
+
template "controller.rb", "app/controllers/admin/#{plural_file_name}_controller.rb"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def copy_view_files
|
|
23
|
+
template "index.html.erb", "app/views/admin/#{plural_file_name}/index.html.erb"
|
|
24
|
+
template "show.html.erb", "app/views/admin/#{plural_file_name}/show.html.erb"
|
|
25
|
+
template "new.html.erb", "app/views/admin/#{plural_file_name}/new.html.erb"
|
|
26
|
+
template "edit.html.erb", "app/views/admin/#{plural_file_name}/edit.html.erb"
|
|
27
|
+
template "form.html.erb", "app/views/admin/#{plural_file_name}/_form.html.erb"
|
|
28
|
+
template "partial.html.erb", "app/views/admin/#{plural_file_name}/_#{file_name}.html.erb"
|
|
29
|
+
template "sidebar.html.erb", "app/views/admin/#{plural_file_name}/_sidebar.html.erb"
|
|
30
|
+
template "breadcrumb.html.erb", "app/views/admin/#{plural_file_name}/_breadcrumb.html.erb"
|
|
31
|
+
template "destroy.js.erb", "app/views/admin/#{plural_file_name}/destroy.js.erb"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
protected
|
|
35
|
+
|
|
36
|
+
def name_attribute(klass)
|
|
37
|
+
klass = klass.new
|
|
38
|
+
|
|
39
|
+
methods = %w[title name subject login user_name screen_name first_name id].map do |attribute|
|
|
40
|
+
klass.respond_to?(attribute) ? attribute : nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
methods.compact.first
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def listing_columns
|
|
47
|
+
self.columns.select do |column|
|
|
48
|
+
![:text].include?(column.type)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def columns
|
|
53
|
+
columns = class_name.constantize.columns
|
|
54
|
+
|
|
55
|
+
columns.select do |column|
|
|
56
|
+
!column.name[/^id$/]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<ul class="breadcrumb">
|
|
2
|
+
<li><a href="/admin">Admin</a> <span class="divider">/</span></li>
|
|
3
|
+
<%% if params[:action] != 'index' %>
|
|
4
|
+
<%% if params[:action] == 'show' %>
|
|
5
|
+
<li><a href="/admin/<%= table_name %>"><%= plural_name.titleize %></a> <span class="divider">/</span></li>
|
|
6
|
+
<li class="active"><%%= @<%= file_name %>.<%= name_attribute(class_name.constantize) %> %></li>
|
|
7
|
+
<%% else %>
|
|
8
|
+
<li><a href="/admin/<%= table_name %>"><%= plural_name.titleize %></a> <span class="divider">/</span></li>
|
|
9
|
+
<li class="active"><%%= params[:action].titleize %></li>
|
|
10
|
+
<%% end %>
|
|
11
|
+
<%% else %>
|
|
12
|
+
<li class="active"><%= plural_name.titleize %></li>
|
|
13
|
+
<%% end %>
|
|
14
|
+
</ul>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'csv'
|
|
2
|
+
|
|
3
|
+
class Admin::<%= class_name.pluralize %>Controller < Admin::ApplicationController
|
|
4
|
+
# filters
|
|
5
|
+
before_filter :load_<%= file_name %>, only: [:show, :edit, :update, :destroy]
|
|
6
|
+
|
|
7
|
+
# index
|
|
8
|
+
def index
|
|
9
|
+
@<%= table_name %> = <%= class_name %>.search(params[:q]).sorty(params)
|
|
10
|
+
|
|
11
|
+
respond_to do |format|
|
|
12
|
+
format.html do
|
|
13
|
+
@<%= table_name %> = @<%= table_name %>.page(params[:page])
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
format.csv do
|
|
17
|
+
data = CSV.generate do |csv|
|
|
18
|
+
columns = <%= class_name %>.columns.map(&:name)
|
|
19
|
+
csv << columns.map(&:titleize)
|
|
20
|
+
|
|
21
|
+
@<%= table_name %>.map do |<%= file_name %>|
|
|
22
|
+
csv << columns.map{|c| <%= file_name %>.send(c)}
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
filename = "<%= table_name %>-#{Time.now.strftime('%d-%m-%Y')}.csv"
|
|
27
|
+
send_data(data, filename: filename, type: 'text/csv')
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# show
|
|
33
|
+
def show
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# new
|
|
38
|
+
def new
|
|
39
|
+
@<%= file_name %> = <%= class_name %>.new
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# create
|
|
43
|
+
def create
|
|
44
|
+
@<%= file_name %> = <%= class_name %>.new(params[:<%= file_name %>])
|
|
45
|
+
|
|
46
|
+
if @<%= file_name %>.save
|
|
47
|
+
redirect_to admin_<%= table_name %>_url, notice: "<%= human_name %> has been created"
|
|
48
|
+
else
|
|
49
|
+
render :new
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# edit
|
|
54
|
+
def edit
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# update
|
|
59
|
+
def update
|
|
60
|
+
if @<%= file_name %>.update_attributes(params[:<%= file_name %>])
|
|
61
|
+
redirect_to admin_<%= table_name %>_url, notice: "<%= human_name %> has been updated"
|
|
62
|
+
else
|
|
63
|
+
render :edit
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# destroy
|
|
68
|
+
def destroy
|
|
69
|
+
@<%= file_name %>.destroy
|
|
70
|
+
|
|
71
|
+
respond_to do |format|
|
|
72
|
+
format.html { redirect_to :back, notice: "<%= human_name %> has been deleted" }
|
|
73
|
+
format.js
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
protected
|
|
78
|
+
|
|
79
|
+
def load_<%= file_name %>
|
|
80
|
+
@<%= file_name %> = <%= class_name %>.find(params[:id])
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
$('#<%%= dom_id(@<%= file_name %>)%>').remove();
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<%% @page_title = 'Edit <%= singular_name.titleize %>' %>
|
|
2
|
+
|
|
3
|
+
<div class="span9">
|
|
4
|
+
<%%= render 'breadcrumb' %>
|
|
5
|
+
<div class="page-header">
|
|
6
|
+
<h2>Edit <%= singular_name.titleize %></h2>
|
|
7
|
+
</div>
|
|
8
|
+
<%%= render 'form' %>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="span3">
|
|
11
|
+
<%%= render 'sidebar' %>
|
|
12
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%%= simple_form_for([:admin, @<%= file_name %>], html: { multipart: true, class: 'form-horizontal' }) do |f| %>
|
|
2
|
+
<% columns.each do |column| -%>
|
|
3
|
+
<% if column.type == :text -%>
|
|
4
|
+
<%%= f.input :<%= column.name %>, as: :text, input_html: { rows: 10, columns: 100, class: 'span6' } %>
|
|
5
|
+
<% elsif [:string].include?(column.type) -%>
|
|
6
|
+
<%%= f.input :<%= column.name %>, as: :<%= column.type %>, input_html: { class: 'span4' } %>
|
|
7
|
+
<% elsif (association = column.name[/^(.*)_id$/, 1]) -%>
|
|
8
|
+
<%%= f.association :<%= association %>, input_html: { class: 'span2' } %>
|
|
9
|
+
<% elsif [:integer].include?(column.type) -%>
|
|
10
|
+
<%%= f.input :<%= column.name %>, as: :<%= column.type %>, input_html: { class: 'span1' } %>
|
|
11
|
+
<% elsif [:date, :datetime].include?(column.type) -%>
|
|
12
|
+
<%%= f.input :<%= column.name %>, as: :<%= column.type %>, order: [:day, :month, :year], input_html: { class: 'span1' } %>
|
|
13
|
+
<% else -%>
|
|
14
|
+
<%%= f.input :<%= column.name %>, as: :<%= column.type %> %>
|
|
15
|
+
<% end -%>
|
|
16
|
+
<% end -%>
|
|
17
|
+
<div class="form-actions">
|
|
18
|
+
<%%= f.button :submit, class: 'btn btn-primary' %>
|
|
19
|
+
<%%= link_to('Cancel', admin_<%= table_name %>_path, class: 'btn') %>
|
|
20
|
+
</div>
|
|
21
|
+
<%% end %>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<%% @page_title = '<%= plural_name.titleize %>' %>
|
|
2
|
+
|
|
3
|
+
<div class="span9">
|
|
4
|
+
<%%= render 'breadcrumb' %>
|
|
5
|
+
<div class="page-header">
|
|
6
|
+
<h2><%= plural_name.titleize %></h2>
|
|
7
|
+
</div>
|
|
8
|
+
<%% if @<%= table_name %>.present? %>
|
|
9
|
+
<%% if params[:q].present? %>
|
|
10
|
+
<div class="alert">
|
|
11
|
+
Showing search results for <strong><%%= params[:q] %></strong>
|
|
12
|
+
</div>
|
|
13
|
+
<%% end %>
|
|
14
|
+
<table class="table table-striped">
|
|
15
|
+
<thead>
|
|
16
|
+
<tr>
|
|
17
|
+
<% listing_columns.each do |column| -%>
|
|
18
|
+
<% if column.name[/_id$/] -%>
|
|
19
|
+
<th><%%= sorty('<%= (relation = column.name[/^(.*)_id$/, 1]) %>.<%= name_attribute(relation.classify.constantize) %>', label: '<%= column.name[/^(.*)_id$/, 1].titleize %>') %></th>
|
|
20
|
+
<% elsif column.type == :boolean -%>
|
|
21
|
+
<th class="center"><%%= sorty(:<%= column.name %>) %></th>
|
|
22
|
+
<% elsif [:integer, :float].include?(column.type) -%>
|
|
23
|
+
<th class="right"><%%= sorty(:<%= column.name %>) %></th>
|
|
24
|
+
<% else -%>
|
|
25
|
+
<th><%%= sorty(:<%= column.name %>) %></th>
|
|
26
|
+
<% end -%>
|
|
27
|
+
<% end -%>
|
|
28
|
+
<th class="options"></th>
|
|
29
|
+
</tr>
|
|
30
|
+
</thead>
|
|
31
|
+
<tbody>
|
|
32
|
+
<%%= render(@<%= table_name %>) %>
|
|
33
|
+
</tbody>
|
|
34
|
+
</table>
|
|
35
|
+
<%%= paginate(@<%= table_name %>, theme: 'admin') %>
|
|
36
|
+
<%% else %>
|
|
37
|
+
<div class="alert">
|
|
38
|
+
There are currently no <%= plural_name %> <%% if params[:q] %>for <strong><%%= params[:q] %></strong><%% end %>
|
|
39
|
+
</div>
|
|
40
|
+
<%% end %>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="span3">
|
|
43
|
+
<%%= render 'sidebar' %>
|
|
44
|
+
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<%% @page_title = 'New <%= singular_name.titleize %>' %>
|
|
2
|
+
|
|
3
|
+
<div class="span9">
|
|
4
|
+
<%%= render 'breadcrumb' %>
|
|
5
|
+
<div class="page-header">
|
|
6
|
+
<h2>New <%= plural_name.titleize %></h2>
|
|
7
|
+
</div>
|
|
8
|
+
<%%= render 'form' %>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="span3">
|
|
11
|
+
<%%= render 'sidebar' %>
|
|
12
|
+
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<tr id="<%%= dom_id(<%= file_name %>) %>">
|
|
2
|
+
<% listing_columns.each do |column| -%>
|
|
3
|
+
<% if column.name[/email/] -%>
|
|
4
|
+
<td><%%= mail_to(<%= file_name %>.<%= column.name %>) %></td>
|
|
5
|
+
<% elsif column.name[/url|website/] -%>
|
|
6
|
+
<td><%%= link_to(<%= file_name %>.<%= column.name %>, <%= file_name %>.<%= column.name %>, target: '_blank') %></td>
|
|
7
|
+
<% elsif (relation = column.name[/^(.*)_id$/, 1]) -%>
|
|
8
|
+
<td><%%= <%= file_name %>.<%= column.name[/^(.*)_id$/, 1] %>.<%= name_attribute(relation.classify.constantize) %> %></td>
|
|
9
|
+
<% elsif column.type == :date -%>
|
|
10
|
+
<td><%%= <%= file_name %>.<%= column.name %>.strftime('%d/%m/%Y') %></td>
|
|
11
|
+
<% elsif column.type == :datetime -%>
|
|
12
|
+
<td><%%= <%= file_name %>.<%= column.name %>.strftime('%d/%m/%Y %H:%M') %></td>
|
|
13
|
+
<% elsif column.type == :boolean -%>
|
|
14
|
+
<td class="center"><%%= <%= file_name %>.<%= column.name %> ? 'Yes' : 'No' %></td>
|
|
15
|
+
<% elsif column.type == :text -%>
|
|
16
|
+
<td><%%= <%= file_name %>.<%= column.name %>.truncate(30) %></td>
|
|
17
|
+
<% elsif [:integer, :float].include?(column.type) -%>
|
|
18
|
+
<td class="right"><%%= <%= file_name %>.<%= column.name %> %></td>
|
|
19
|
+
<% else -%>
|
|
20
|
+
<td><%%= <%= file_name %>.<%= column.name %> %></td>
|
|
21
|
+
<% end -%>
|
|
22
|
+
<% end -%>
|
|
23
|
+
<td class="options">
|
|
24
|
+
<div class="btn-group">
|
|
25
|
+
<%%= link_to('view', [:admin, <%= file_name %>], class: 'btn btn-mini') %>
|
|
26
|
+
<%%= link_to('edit', [:edit, :admin, <%= file_name %>], class: 'btn btn-mini') %>
|
|
27
|
+
<%%= link_to('delete', [:admin, <%= file_name %>], method: :delete, remote: true, confirm: 'Are you sure?', class: 'btn btn-mini btn-danger') %>
|
|
28
|
+
</div>
|
|
29
|
+
</td>
|
|
30
|
+
</tr>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%% @page_title = '<%= singular_name.titleize %> Details' %>
|
|
2
|
+
|
|
3
|
+
<div class="span9">
|
|
4
|
+
<%%= render 'breadcrumb' %>
|
|
5
|
+
<div class="page-header">
|
|
6
|
+
<h2><%%= @<%= file_name %>.<%= name_attribute(class_name.constantize) %> %></h2>
|
|
7
|
+
</div>
|
|
8
|
+
<dl class="dl-horizontal">
|
|
9
|
+
<% columns.each do |column| -%>
|
|
10
|
+
<dt><%= column.name.humanize %></dt>
|
|
11
|
+
<dd><%%= @<%= file_name %>.<%= column.name %> %></dd>
|
|
12
|
+
<% end -%>
|
|
13
|
+
</dl>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="span3">
|
|
16
|
+
<%%= render 'sidebar' %>
|
|
17
|
+
</div>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<div class="well sidebar">
|
|
2
|
+
<ul class="nav nav-list">
|
|
3
|
+
<li class="nav-header">
|
|
4
|
+
<%= singular_name.titleize %> Options
|
|
5
|
+
</li>
|
|
6
|
+
<li>
|
|
7
|
+
<a href="<%%= admin_<%= table_name %>_path %>"><i class="icon-list"></i> List <%= plural_name %></a>
|
|
8
|
+
</li>
|
|
9
|
+
<li>
|
|
10
|
+
<a href="<%%= new_admin_<%= file_name %>_path %>"><i class="icon-plus"></i> New <%= singular_name %></a>
|
|
11
|
+
</li>
|
|
12
|
+
<li>
|
|
13
|
+
<a href="<%%= admin_<%= table_name %>_path(format: :csv) %>"><i class="icon-download"></i> Download CSV</a>
|
|
14
|
+
</li>
|
|
15
|
+
<%% if params[:action] == 'edit' %>
|
|
16
|
+
<li>
|
|
17
|
+
<a href="<%%= admin_<%= file_name %>_path(@<%= file_name %>) %>"><i class="icon-search"></i> View this <%= singular_name %></a>
|
|
18
|
+
</li>
|
|
19
|
+
<%% end %>
|
|
20
|
+
<%% if params[:action] == 'show' %>
|
|
21
|
+
<li>
|
|
22
|
+
<a href="<%%= edit_admin_<%= file_name %>_path(@<%= file_name %>) %>"><i class="icon-pencil"></i> Edit this <%= singular_name %></a>
|
|
23
|
+
</li>
|
|
24
|
+
<%% end %>
|
|
25
|
+
</ul>
|
|
26
|
+
</div>
|
|
27
|
+
<form class="form-search well" action="<%%= admin_<%= table_name %>_path %>">
|
|
28
|
+
<input type="text" class="input-medium search-query" name="q" value="<%%= params[:q] %>" placeholder="Search <%= plural_name %>...">
|
|
29
|
+
<button type="submit" class="btn btn-primary">Go</button>
|
|
30
|
+
</form>
|