hyper_admin 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e9475b5186237711fecfe84516e04248294387a
4
- data.tar.gz: 80d813f2e0fd46afcf048359be4fbabe8456fb0e
3
+ metadata.gz: ca64683cb272c25b4eeb5007b084ae000c24eefc
4
+ data.tar.gz: 9c413d53f02d48973e763d79e22e3c17ed41092e
5
5
  SHA512:
6
- metadata.gz: 325d4cc11d35e4fac39906de0f243a2484d6d807b6511a90f7e14ffb3ddc7592dee770d92b9cd6bcc1fe5b7b8a003d4f8d2073afe84e33947cca3b7ecaf49ed6
7
- data.tar.gz: 8823ce1e2af1897966f4aad4fa4ce6c4ec96f2e63bbf4566cf9a3a92c455388411483923a9b63abade68da052714027f01058d3a4d17b006f1951d6b8a259625
6
+ metadata.gz: 5f4762f95187e6c9528cdaddaa7fc3ab92ee08515396aa08c59d818b3994c9cda96423ed5480251f67819904ce3867904732e97c94428be671c1b281ec021b0c
7
+ data.tar.gz: 504312af56071a2148ed7d36c83df58b254592c8ef761e2b9058f284fca5ad7823b647592bfa0210fe79f39e0ea258817aea4c9b58f67325d4d5772e92c93401
@@ -0,0 +1,2 @@
1
+ //= require jquery
2
+ //= require jquery_ujs
@@ -1,4 +1,12 @@
1
1
  module HyperAdmin
2
2
  class ApplicationController < ActionController::Base
3
+ before_action :load_all_resource_classes
4
+
5
+ protected
6
+
7
+ def load_all_resource_classes
8
+ collection = ::HyperAdmin.application.resources
9
+ @resource_classes = collection.resources.values.map(&:resource_class)
10
+ end
3
11
  end
4
12
  end
@@ -0,0 +1,76 @@
1
+ module HyperAdmin
2
+ class ResourceController < ApplicationController
3
+ before_action :set_resource_class
4
+ before_action :permit_params, only: [ :create, :update ]
5
+
6
+ def index
7
+ @resources = resource_class.all
8
+ render 'admin/resources/index', layout: layout
9
+ end
10
+
11
+ def show
12
+ @resource = resource
13
+ render 'admin/resources/show', layout: layout
14
+ end
15
+
16
+ def new
17
+ @resource = resource_class.new
18
+ render 'admin/resources/new', layout: layout
19
+ end
20
+
21
+ def edit
22
+ @resource = resource
23
+ render 'admin/resources/edit', layout: layout
24
+ end
25
+
26
+ def create
27
+ @resource = @resource_class.new params[@resource_class.model_name.param_key]
28
+
29
+ if @resource.save
30
+ redirect_to [ :admin, @resource ]
31
+ else
32
+ render "admin/resources/new", layout: layout
33
+ end
34
+ end
35
+
36
+ def update
37
+ @resource = @resource_class.find params[:id]
38
+
39
+ if @resource.update params[@resource_class.model_name.param_key]
40
+ redirect_to [ :admin, @resource ]
41
+ else
42
+ render "admin/resources/edit", layout: layout
43
+ end
44
+ end
45
+
46
+ def destroy
47
+ @resource = @resource_class.find params[:id]
48
+
49
+ @resource.destroy
50
+
51
+ redirect_to [ :admin, @resource_class ]
52
+ end
53
+
54
+ def resource
55
+ resource_class.find params[:id]
56
+ end
57
+
58
+ def resource_class
59
+ raise "This method must be overridden"
60
+ end
61
+
62
+ protected
63
+
64
+ def set_resource_class
65
+ @resource_class = resource_class
66
+ end
67
+
68
+ def permit_params
69
+ params.permit!
70
+ end
71
+
72
+ def layout
73
+ 'hyper_admin/application'
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,27 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <%= form_for [ :admin, resource ], html: { class: 'form-horizontal' } do |form| %>
4
+ <%
5
+ attributes = resource.attributes.delete_if do |k, v|
6
+ k.to_sym.in? [ :id, :created_at, :updated_at ]
7
+ end
8
+ %>
9
+ <% attributes.each do |key, val| %>
10
+ <div class="form-group">
11
+ <%= form.label key, class: "col-sm-2 control-label" %>
12
+ <div class="col-sm-10">
13
+ <%= form.text_field key, class: "form-control",
14
+ placeholder: resource_class.human_attribute_name(key) %>
15
+ </div>
16
+ </div>
17
+ <% end %>
18
+
19
+ <div class="form-group">
20
+ <div class="col-sm-offset-2 col-sm-10">
21
+ <button type="submit" class="btn btn-primary">Submit</button>
22
+ <%= link_to "Cancel", [ :admin, resource_class ], class: "btn btn-danger" %>
23
+ </div>
24
+ </div>
25
+ <% end %>
26
+ </div>
27
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <h1>Edit <%= @resource_class.model_name.singular %></h1>
5
+ </header>
6
+ </div>
7
+ </div>
8
+
9
+ <%= render "admin/resources/form", resource_class: @resource_class, resource: @resource %>
@@ -0,0 +1,39 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <div class="pull-right">
5
+ <%= link_to "Create new",[ :new, :admin, @resource_class.model_name.singular_route_key ], class: "btn btn-lg btn-success" %>
6
+ </div>
7
+ <h1>All <%= @resource_class.model_name.plural %></h1>
8
+ </header>
9
+ </div>
10
+ </div>
11
+
12
+ <div class="row">
13
+ <div class="col-xs-12">
14
+ <table class="table table-striped">
15
+ <thead>
16
+ <tr>
17
+ <% @resource_class.attribute_names.each do |attr| %>
18
+ <th><%= @resource_class.human_attribute_name attr %></th>
19
+ <% end %>
20
+ <th>&nbsp;</th>
21
+ </tr>
22
+ </thead>
23
+ <tbody>
24
+ <% @resources.each do |resource| %>
25
+ <tr>
26
+ <% resource.attributes.values.each do |attr| %>
27
+ <td><%= attr %></th>
28
+ <% end %>
29
+ <td>
30
+ <%= link_to "Show", [ :admin, resource ] %>
31
+ <%= link_to "Edit", [ :edit, :admin, resource ] %>
32
+ <%= link_to "Destroy", [ :admin, resource ], method: :delete %>
33
+ </td>
34
+ </tr>
35
+ <% end %>
36
+ </tbody>
37
+ </table>
38
+ </div>
39
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <h1>New <%= @resource_class.model_name.singular %></h1>
5
+ </header>
6
+ </div>
7
+ </div>
8
+
9
+ <%= render "admin/resources/form", resource_class: @resource_class, resource: @resource %>
@@ -0,0 +1,25 @@
1
+ <div class="row">
2
+ <div class="col-xs-12">
3
+ <header class="page-header">
4
+ <div class="pull-right">
5
+ <%= link_to "Edit", [ :edit, :admin, @resource ], class: "btn btn-lg btn-default" %>
6
+ <%= link_to "Destroy", [ :admin, @resource ], class: "btn btn-lg btn-danger", method: :delete %>
7
+ </div>
8
+
9
+ <h1><%= @resource.to_s %></h1>
10
+ </header>
11
+ </div>
12
+ </div>
13
+
14
+ <div class="row">
15
+ <div class="col-xs-12">
16
+ <div class="well">
17
+ <dl class="dl-horizontal">
18
+ <% @resource.attributes.each do |key, value| %>
19
+ <dt><%= @resource_class.human_attribute_name key %></dt>
20
+ <dd><%= value %></dd>
21
+ <% end %>
22
+ </dl>
23
+ </div>
24
+ </div>
25
+ </div>
@@ -3,6 +3,7 @@
3
3
  <head>
4
4
  <title>HyperAdmin</title>
5
5
 
6
+ <%= stylesheet_link_tag "//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" %>
6
7
  <%= stylesheet_link_tag "hyper_admin/application", media: :all %>
7
8
  <%= javascript_include_tag "hyper_admin/application" %>
8
9
 
@@ -10,7 +11,25 @@
10
11
  </head>
11
12
  <body>
12
13
 
13
- <%= yield %>
14
+ <nav class="navbar navbar-default">
15
+ <div class="container-fluid">
16
+ <div class="navbar-header">
17
+ <a class="navbar-brand" href="/admin">Admin</a>
18
+
19
+ <ul class="nav navbar-nav">
20
+ <% @resource_classes.each do |resource_class| %>
21
+ <li class="<%= "active" if params[:controller] == "admin/#{resource_class.model_name.plural}" %>">
22
+ <%= link_to resource_class.model_name.human(count: 2), [ :admin, resource_class ] %>
23
+ </li>
24
+ <% end %>
25
+ </ul>
26
+ </div>
27
+ </div>
28
+ </nav>
29
+
30
+ <div class="container-fluid">
31
+ <%= yield %>
32
+ </div>
14
33
 
15
34
  </body>
16
35
  </html>
data/lib/hyper_admin.rb CHANGED
@@ -1,4 +1,22 @@
1
+ require 'jquery-rails'
2
+
1
3
  require 'hyper_admin/engine'
4
+ require 'hyper_admin/application'
2
5
 
3
6
  module HyperAdmin
7
+ class << self
8
+
9
+ delegate :register, to: :application
10
+ delegate :routes, to: :application
11
+ delegate :setup, to: :application
12
+
13
+ def application
14
+ @application ||= HyperAdmin::Application.new
15
+ end
16
+
17
+ def config
18
+ application.setup
19
+ end
20
+
21
+ end
4
22
  end
@@ -0,0 +1,62 @@
1
+ require 'hyper_admin/resource_collection'
2
+ require 'hyper_admin/router'
3
+
4
+ module Admin; end
5
+
6
+ module HyperAdmin
7
+ class Application
8
+ attr_reader :resources
9
+
10
+ def setup
11
+ @resources = ResourceCollection.new
12
+
13
+ prevent_rails_autoloading_load_paths
14
+ end
15
+
16
+ def register(resource_class)
17
+ resource = @resources.add resource_class
18
+ create_resource_controller resource
19
+ end
20
+
21
+ def routes(rails_router)
22
+ load_files
23
+
24
+ router.apply rails_router
25
+ end
26
+
27
+ private
28
+
29
+ def load_paths
30
+ [File.expand_path('app/admin', Rails.root)]
31
+ end
32
+
33
+ def router
34
+ @router ||= Router.new(self)
35
+ end
36
+
37
+ def admin_files
38
+ load_paths.map do |path|
39
+ Dir["#{path}/**/*.rb"]
40
+ end.flatten
41
+ end
42
+
43
+ def load_files
44
+ admin_files.each { |file| load file }
45
+ end
46
+
47
+ def prevent_rails_autoloading_load_paths
48
+ ActiveSupport::Dependencies.autoload_paths -= load_paths
49
+ Rails.application.config.eager_load_paths -= load_paths
50
+ end
51
+
52
+ def create_resource_controller(resource)
53
+ ctrl = Class.new HyperAdmin::ResourceController do
54
+ define_method :resource_class do
55
+ resource.resource_class
56
+ end
57
+ end
58
+
59
+ Admin.const_set resource.controller_name, ctrl
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,17 @@
1
+ module HyperAdmin
2
+ class Resource
3
+ attr_reader :resource_class
4
+
5
+ def initialize(resource_class)
6
+ @resource_class = resource_class
7
+ end
8
+
9
+ def resource_name
10
+ @resource_class.model_name
11
+ end
12
+
13
+ def controller_name
14
+ "#{resource_name.plural.camelize}Controller"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ require 'hyper_admin/resource'
2
+
3
+ module HyperAdmin
4
+ class ResourceCollection
5
+ attr_reader :resources
6
+
7
+ def initialize
8
+ @resources = {}
9
+ end
10
+
11
+ def add(resource_class)
12
+ resource = Resource.new(resource_class)
13
+ @resources[resource_class.model_name] = resource
14
+
15
+ resource
16
+ end
17
+
18
+ def each(&block)
19
+ @resources.values.each(&block)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module HyperAdmin
2
+ class Router
3
+ def initialize(application)
4
+ @application = application
5
+ end
6
+
7
+ def apply(rails_router)
8
+ define_resource_routes rails_router
9
+ end
10
+
11
+ private
12
+
13
+ def define_resource_routes(router)
14
+ router.instance_exec @application.resources do |_resources|
15
+ self.namespace 'admin' do
16
+ _resources.each do |resource|
17
+ self.resources resource.resource_name.route_key
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module HyperAdmin
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -0,0 +1 @@
1
+ HyperAdmin.register Article
@@ -0,0 +1 @@
1
+ HyperAdmin.register Person
@@ -0,0 +1,9 @@
1
+ class Article < ActiveRecord::Base
2
+
3
+ validates :title, presence: true
4
+
5
+ def to_s
6
+ title
7
+ end
8
+
9
+ end
@@ -0,0 +1,2 @@
1
+ class Person < ActiveRecord::Base
2
+ end
@@ -0,0 +1 @@
1
+ HyperAdmin.config # TODO :: more to come
@@ -21,3 +21,29 @@
21
21
 
22
22
  en:
23
23
  hello: "Hello world"
24
+
25
+ activerecord:
26
+ models:
27
+ article:
28
+ one: Blog post
29
+ other: Blog posts
30
+
31
+ person:
32
+ one: Person
33
+ other: People
34
+
35
+ attributes:
36
+ common: &common
37
+ id: ID
38
+ created_at: Creation date
39
+ updated_at: Last updated
40
+
41
+ article:
42
+ <<: *common
43
+ title: Title
44
+ body: Body text
45
+
46
+ person:
47
+ <<: *common
48
+ first_name: First name
49
+ last_name: Last name
@@ -1,3 +1,3 @@
1
1
  Rails.application.routes.draw do
2
- mount HyperAdmin::Engine, at: '/admin'
2
+ HyperAdmin.routes self
3
3
  end
@@ -0,0 +1,10 @@
1
+ class CreateArticles < ActiveRecord::Migration
2
+ def change
3
+ create_table :articles do |t|
4
+ t.string :title
5
+ t.text :body
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ class CreatePeople < ActiveRecord::Migration
2
+ def change
3
+ create_table :people do |t|
4
+ t.string :first_name
5
+ t.string :last_name
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -11,6 +11,20 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 0) do
14
+ ActiveRecord::Schema.define(version: 20140826220715) do
15
+
16
+ create_table "articles", force: true do |t|
17
+ t.string "title"
18
+ t.text "body"
19
+ t.datetime "created_at"
20
+ t.datetime "updated_at"
21
+ end
22
+
23
+ create_table "people", force: true do |t|
24
+ t.string "first_name"
25
+ t.string "last_name"
26
+ t.datetime "created_at"
27
+ t.datetime "updated_at"
28
+ end
15
29
 
16
30
  end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+
3
+ factory :article do
4
+ title 'Lorem ipsum'
5
+ body 'Lorem ipsum dolor sit amet. Consectetur adipiscing elit.'
6
+ end
7
+
8
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+
3
+ factory :person do
4
+ first_name "Ronnie"
5
+ last_name "Coleman"
6
+ end
7
+
8
+ end
@@ -0,0 +1,4 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Article, type: :model do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe Person, type: :model do
4
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sindre Moen
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jquery-rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: coveralls
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -135,19 +149,33 @@ files:
135
149
  - app/assets/javascripts/hyper_admin/application.js
136
150
  - app/assets/stylesheets/hyper_admin/application.css
137
151
  - app/controllers/hyper_admin/application_controller.rb
152
+ - app/controllers/hyper_admin/resource_controller.rb
138
153
  - app/helpers/hyper_admin/application_helper.rb
154
+ - app/views/admin/resources/_form.html.erb
155
+ - app/views/admin/resources/edit.html.erb
156
+ - app/views/admin/resources/index.html.erb
157
+ - app/views/admin/resources/new.html.erb
158
+ - app/views/admin/resources/show.html.erb
139
159
  - app/views/layouts/hyper_admin/application.html.erb
140
160
  - config/routes.rb
141
161
  - config/spring.rb
142
162
  - lib/hyper_admin.rb
163
+ - lib/hyper_admin/application.rb
143
164
  - lib/hyper_admin/engine.rb
165
+ - lib/hyper_admin/resource.rb
166
+ - lib/hyper_admin/resource_collection.rb
167
+ - lib/hyper_admin/router.rb
144
168
  - lib/hyper_admin/version.rb
145
169
  - spec/controllers/hyper_admin/application_controller_spec.rb
146
170
  - spec/dummy/Rakefile
171
+ - spec/dummy/app/admin/article.rb
172
+ - spec/dummy/app/admin/person.rb
147
173
  - spec/dummy/app/assets/javascripts/application.js
148
174
  - spec/dummy/app/assets/stylesheets/application.css
149
175
  - spec/dummy/app/controllers/application_controller.rb
150
176
  - spec/dummy/app/helpers/application_helper.rb
177
+ - spec/dummy/app/models/article.rb
178
+ - spec/dummy/app/models/person.rb
151
179
  - spec/dummy/app/views/layouts/application.html.erb
152
180
  - spec/dummy/bin/bundle
153
181
  - spec/dummy/bin/rails
@@ -164,6 +192,7 @@ files:
164
192
  - spec/dummy/config/initializers/backtrace_silencers.rb
165
193
  - spec/dummy/config/initializers/cookies_serializer.rb
166
194
  - spec/dummy/config/initializers/filter_parameter_logging.rb
195
+ - spec/dummy/config/initializers/hyper_admin.rb
167
196
  - spec/dummy/config/initializers/inflections.rb
168
197
  - spec/dummy/config/initializers/mime_types.rb
169
198
  - spec/dummy/config/initializers/session_store.rb
@@ -172,6 +201,8 @@ files:
172
201
  - spec/dummy/config/routes.rb
173
202
  - spec/dummy/config/secrets.yml
174
203
  - spec/dummy/db/development.sqlite3
204
+ - spec/dummy/db/migrate/20140825171947_create_articles.rb
205
+ - spec/dummy/db/migrate/20140826220715_create_people.rb
175
206
  - spec/dummy/db/schema.rb
176
207
  - spec/dummy/db/test.sqlite3
177
208
  - spec/dummy/log/development.log
@@ -180,6 +211,10 @@ files:
180
211
  - spec/dummy/public/422.html
181
212
  - spec/dummy/public/500.html
182
213
  - spec/dummy/public/favicon.ico
214
+ - spec/dummy/spec/factories/articles.rb
215
+ - spec/dummy/spec/factories/people.rb
216
+ - spec/dummy/spec/models/article_spec.rb
217
+ - spec/dummy/spec/models/person_spec.rb
183
218
  - spec/dummy/tmp/cache/assets/development/sass/9e456cee4bd5ae2c5d0cc761be2251d8df6c08d6/application.css.sassc
184
219
  - spec/dummy/tmp/cache/assets/development/sass/9e456cee4bd5ae2c5d0cc761be2251d8df6c08d6/forms.css.sassc
185
220
  - spec/dummy/tmp/cache/assets/development/sprockets/01924c706dd1b7de217f342099dcfa3f
@@ -317,6 +352,8 @@ summary: An awesome admin solution for Rails
317
352
  test_files:
318
353
  - spec/dummy/db/schema.rb
319
354
  - spec/dummy/db/development.sqlite3
355
+ - spec/dummy/db/migrate/20140825171947_create_articles.rb
356
+ - spec/dummy/db/migrate/20140826220715_create_people.rb
320
357
  - spec/dummy/db/test.sqlite3
321
358
  - spec/dummy/bin/rake
322
359
  - spec/dummy/bin/bundle
@@ -432,17 +469,26 @@ test_files:
432
469
  - spec/dummy/Rakefile
433
470
  - spec/dummy/log/development.log
434
471
  - spec/dummy/log/test.log
472
+ - spec/dummy/app/admin/person.rb
473
+ - spec/dummy/app/admin/article.rb
435
474
  - spec/dummy/app/assets/stylesheets/application.css
436
475
  - spec/dummy/app/assets/javascripts/application.js
437
476
  - spec/dummy/app/controllers/application_controller.rb
438
477
  - spec/dummy/app/views/layouts/application.html.erb
439
478
  - spec/dummy/app/helpers/application_helper.rb
479
+ - spec/dummy/app/models/person.rb
480
+ - spec/dummy/app/models/article.rb
481
+ - spec/dummy/spec/factories/articles.rb
482
+ - spec/dummy/spec/factories/people.rb
483
+ - spec/dummy/spec/models/article_spec.rb
484
+ - spec/dummy/spec/models/person_spec.rb
440
485
  - spec/dummy/public/favicon.ico
441
486
  - spec/dummy/public/422.html
442
487
  - spec/dummy/public/404.html
443
488
  - spec/dummy/public/500.html
444
489
  - spec/dummy/config/initializers/mime_types.rb
445
490
  - spec/dummy/config/initializers/assets.rb
491
+ - spec/dummy/config/initializers/hyper_admin.rb
446
492
  - spec/dummy/config/initializers/wrap_parameters.rb
447
493
  - spec/dummy/config/initializers/cookies_serializer.rb
448
494
  - spec/dummy/config/initializers/session_store.rb