dormouse 0.0.1.a1 → 0.0.1.a2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +2 -0
- data/app/views/dormouse/layouts/dormouse.html.erb +9 -2
- data/app/views/dormouse/views/form.html.erb +6 -0
- data/app/views/dormouse/views/list.html.erb +1 -1
- data/lib/dormouse.rb +4 -0
- data/lib/dormouse/action_controller.rb +61 -3
- data/lib/dormouse/dsl.rb +4 -0
- data/lib/dormouse/manifest.rb +4 -0
- data/lib/dormouse/menu.rb +75 -0
- data/lib/dormouse/tab.rb +18 -0
- data/lib/dormouse/version.rb +1 -1
- data/lib/dormouse/views/form.rb +15 -0
- data/lib/dormouse/widgets.rb +3 -1
- data/lib/dormouse/widgets/has_many.rb +13 -0
- metadata +5 -2
data/CHANGELOG.md
CHANGED
@@ -4,11 +4,18 @@
|
|
4
4
|
<title>Dormouse</title>
|
5
5
|
<%= stylesheet_link_tag :all %>
|
6
6
|
<%= javascript_include_tag :defaults %>
|
7
|
-
<%#= csrf_meta_tag %>
|
8
7
|
</head>
|
9
8
|
<body>
|
10
9
|
|
11
|
-
|
10
|
+
<ul id="menu">
|
11
|
+
<% Dormouse.menu.each do |item| %>
|
12
|
+
<li><%= link_to item.name, item.url %></li>
|
13
|
+
<% end %>
|
14
|
+
</ul>
|
15
|
+
|
16
|
+
<div id="content">
|
17
|
+
<%= yield %>
|
18
|
+
</div>
|
12
19
|
|
13
20
|
</body>
|
14
21
|
</html>
|
data/lib/dormouse.rb
CHANGED
@@ -5,6 +5,10 @@ module Dormouse
|
|
5
5
|
require 'dormouse/manifest'
|
6
6
|
require 'dormouse/property'
|
7
7
|
require 'dormouse/dsl'
|
8
|
+
require 'dormouse/menu'
|
9
|
+
require 'dormouse/tab'
|
10
|
+
require 'dormouse/widgets'
|
11
|
+
require 'dormouse/views'
|
8
12
|
|
9
13
|
require 'dormouse/active_record'
|
10
14
|
require 'dormouse/action_controller'
|
@@ -15,7 +15,32 @@ module Dormouse::ActionController
|
|
15
15
|
def self.build_routes(manifest, map)
|
16
16
|
name = manifest.resource.to_s.split('::').last.tableize
|
17
17
|
controller = manifest.controller_class.to_s.sub(/Controller$/, '')
|
18
|
-
|
18
|
+
|
19
|
+
map.resources name.to_sym, :controller => controller do |subresource|
|
20
|
+
manifest.each do |property|
|
21
|
+
|
22
|
+
next unless property.resource
|
23
|
+
build_sub_routes(manifest, property, property.resource.manifest, subresource)
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.build_sub_routes(parent, property, manifest, map)
|
30
|
+
return unless property.type == :has_many and !property.options[:inline]
|
31
|
+
controller = manifest.controller_class
|
32
|
+
controller.potential_parents[property.name.to_sym] = parent
|
33
|
+
controller = controller.to_s.sub(/Controller$/, '')
|
34
|
+
|
35
|
+
options = { :controller => controller, :only => [:index, :new] }
|
36
|
+
map.resources property.name.to_sym, options do |map|
|
37
|
+
manifest.each do |property|
|
38
|
+
|
39
|
+
next unless property.resource
|
40
|
+
build_sub_routes(manifest, property, property.resource.manifest, map)
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
19
44
|
end
|
20
45
|
|
21
46
|
end
|
@@ -25,17 +50,24 @@ module Dormouse::ActionController::Actions
|
|
25
50
|
def self.included(base)
|
26
51
|
base.class_eval do
|
27
52
|
helper_method :manifest
|
53
|
+
before_filter :lookup_parent, :only => [:index, :new]
|
28
54
|
end
|
29
55
|
end
|
30
56
|
|
31
57
|
def index
|
32
|
-
|
58
|
+
collection = (@parent ? @parent.__send__(@parent_association).all : nil)
|
59
|
+
manifest.render_list(self, collection)
|
33
60
|
end
|
34
61
|
|
35
|
-
def
|
62
|
+
def show
|
36
63
|
manifest.render_form(self)
|
37
64
|
end
|
38
65
|
|
66
|
+
def new
|
67
|
+
object = (@parent ? @parent.__send__(@parent_association).build : nil)
|
68
|
+
manifest.render_form(self, object)
|
69
|
+
end
|
70
|
+
|
39
71
|
def edit
|
40
72
|
manifest.render_form(self)
|
41
73
|
end
|
@@ -54,6 +86,15 @@ module Dormouse::ActionController::Actions
|
|
54
86
|
redirect_to manifest.collection_url
|
55
87
|
rescue ActiveRecord::RecordInvalid => e
|
56
88
|
manifest.render_form(self, e.record)
|
89
|
+
rescue ActiveRecord::RecordNotFound => e
|
90
|
+
redirect_to manifest.collection_url
|
91
|
+
end
|
92
|
+
|
93
|
+
def destroy
|
94
|
+
manifest.resource.find(params[:id]).destroy
|
95
|
+
redirect_to manifest.collection_url
|
96
|
+
rescue ActiveRecord::RecordNotFound => e
|
97
|
+
redirect_to manifest.collection_url
|
57
98
|
end
|
58
99
|
|
59
100
|
private
|
@@ -62,10 +103,27 @@ private
|
|
62
103
|
self.class.manifest
|
63
104
|
end
|
64
105
|
|
106
|
+
def lookup_parent
|
107
|
+
self.class.potential_parents.each do |association, manifest|
|
108
|
+
param = manifest.resource.to_s.split('::').last.underscore + '_id'
|
109
|
+
if params[param]
|
110
|
+
@parent_manifest = manifest
|
111
|
+
@parent = manifest.resource.find(params[param])
|
112
|
+
@parent_association = association
|
113
|
+
break
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
65
118
|
end
|
66
119
|
|
67
120
|
module Dormouse::ActionController::Meta
|
68
121
|
|
69
122
|
attr_accessor :manifest
|
123
|
+
attr_reader :potential_parents
|
124
|
+
|
125
|
+
def potential_parents
|
126
|
+
@potential_parents ||= {}
|
127
|
+
end
|
70
128
|
|
71
129
|
end
|
data/lib/dormouse/dsl.rb
CHANGED
@@ -23,6 +23,10 @@ class Dormouse::DSL
|
|
23
23
|
@manifest.style = (name || 'dormouse')
|
24
24
|
end
|
25
25
|
|
26
|
+
def menu(name, options={})
|
27
|
+
Dormouse::menu.register(name, @manifest, options)
|
28
|
+
end
|
29
|
+
|
26
30
|
# set the primary name for a model. The primary name is the name shown in lists, select boxes and grids as the link to the details.
|
27
31
|
def primary_name(property)
|
28
32
|
set(property, :primary => true)
|
data/lib/dormouse/manifest.rb
CHANGED
@@ -0,0 +1,75 @@
|
|
1
|
+
class Dormouse::Menu
|
2
|
+
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@items = {}
|
7
|
+
@order = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def each
|
11
|
+
@order.each do |name|
|
12
|
+
yield @items[name]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def register(name, manifest, options={})
|
17
|
+
name = name.to_s
|
18
|
+
|
19
|
+
@order.push name unless @order.include?(name)
|
20
|
+
@items[name] = Dormouse::Menu::Item.new(name, manifest, options)
|
21
|
+
|
22
|
+
order!
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def order!
|
30
|
+
@items.each do |name, item|
|
31
|
+
@order.delete(name)
|
32
|
+
|
33
|
+
case
|
34
|
+
when hook = item.order_options[:before]
|
35
|
+
idx = @order.index(hook.to_s) || @order.size
|
36
|
+
@order.insert(idx, name)
|
37
|
+
when hook = item.order_options[:after]
|
38
|
+
idx = @order.index(hook.to_s) || @order.size
|
39
|
+
@order.insert(idx, name)
|
40
|
+
when item.order_options[:top]
|
41
|
+
@order.unshift(name)
|
42
|
+
when item.order_options[:bottom]
|
43
|
+
@order.push(name)
|
44
|
+
else
|
45
|
+
@order.push(name)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
class Dormouse::Menu::Item
|
53
|
+
|
54
|
+
def initialize(name, manifest, options={})
|
55
|
+
@name, @manifest, @options = name, manifest, options
|
56
|
+
|
57
|
+
@order_options = @options.slice(:before, :after, :top, :bottom)
|
58
|
+
@options.except!(:before, :after, :top, :bottom)
|
59
|
+
end
|
60
|
+
|
61
|
+
attr_reader :name, :manifest, :options, :order_options, :url
|
62
|
+
|
63
|
+
def url
|
64
|
+
@manifest.collection_url
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
module Dormouse
|
70
|
+
|
71
|
+
def self.menu
|
72
|
+
@menu ||= Dormouse::Menu.new
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/lib/dormouse/tab.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
class Dormouse::Tab
|
2
|
+
|
3
|
+
def initialize(manifest, property)
|
4
|
+
@manifest, @property = manifest, property
|
5
|
+
end
|
6
|
+
|
7
|
+
attr_reader :manifest, :property
|
8
|
+
|
9
|
+
def name
|
10
|
+
@name ||= @property.resource.to_s.humanize.pluralize
|
11
|
+
end
|
12
|
+
|
13
|
+
def url_for_object(object)
|
14
|
+
@suffix ||= @property.resource.to_s.split('::').last.tableize
|
15
|
+
"#{manifest.object_url(object)}/#{@suffix}"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/lib/dormouse/version.rb
CHANGED
data/lib/dormouse/views/form.rb
CHANGED
@@ -4,6 +4,7 @@ class Dormouse::Views::Form < Dormouse::Views::Base
|
|
4
4
|
manifest = self.manifest
|
5
5
|
|
6
6
|
widgets = self.widgets
|
7
|
+
tabs = self.tabs
|
7
8
|
|
8
9
|
object ||= begin
|
9
10
|
if id = @controller.params[:id]
|
@@ -16,6 +17,7 @@ class Dormouse::Views::Form < Dormouse::Views::Base
|
|
16
17
|
controller_eval do
|
17
18
|
@object = object
|
18
19
|
@widgets = widgets
|
20
|
+
@tabs = tabs
|
19
21
|
render :template => "#{manifest.style}/views/form", :layout => "#{manifest.style}/layouts/dormouse"
|
20
22
|
end
|
21
23
|
end
|
@@ -30,4 +32,17 @@ class Dormouse::Views::Form < Dormouse::Views::Base
|
|
30
32
|
end
|
31
33
|
end
|
32
34
|
|
35
|
+
def tabs
|
36
|
+
@tabs ||= begin
|
37
|
+
manifest.inject([]) do |memo, property|
|
38
|
+
|
39
|
+
if property.type == :has_many and !property.options[:inline]
|
40
|
+
memo << Dormouse::Tab.new(manifest, property)
|
41
|
+
end
|
42
|
+
|
43
|
+
memo
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
33
48
|
end
|
data/lib/dormouse/widgets.rb
CHANGED
@@ -2,7 +2,7 @@ module Dormouse::Widgets
|
|
2
2
|
|
3
3
|
class << self
|
4
4
|
def [](name)
|
5
|
-
@widget_types[name.to_sym]
|
5
|
+
(@widget_types ||= {})[name.to_sym]
|
6
6
|
end
|
7
7
|
|
8
8
|
def []=(name, klass)
|
@@ -23,6 +23,8 @@ module Dormouse::Widgets
|
|
23
23
|
require 'dormouse/widgets/float'
|
24
24
|
require 'dormouse/widgets/decimal'
|
25
25
|
require 'dormouse/widgets/timestamp'
|
26
|
+
|
27
|
+
require 'dormouse/widgets/has_many'
|
26
28
|
require 'dormouse/widgets/belongs_to'
|
27
29
|
|
28
30
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Dormouse::Widgets::HasMany < Dormouse::Widgets::Base
|
2
|
+
|
3
|
+
property_type :has_many
|
4
|
+
|
5
|
+
def render(object, options={})
|
6
|
+
return unless @property.options[:inline]
|
7
|
+
|
8
|
+
value = object.__send__(@property.name)
|
9
|
+
locals = options.merge( :value => value, :object => object, :property => @property, :manifest => @manifest, :target => @property.resource.manifest )
|
10
|
+
view_eval { render :partial => "#{manifest.style}/widgets/has_many", :locals => locals }
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 0
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.0.1.
|
9
|
+
- a2
|
10
|
+
version: 0.0.1.a2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Simon Menke
|
@@ -47,7 +47,9 @@ files:
|
|
47
47
|
- lib/dormouse/active_record.rb
|
48
48
|
- lib/dormouse/dsl.rb
|
49
49
|
- lib/dormouse/manifest.rb
|
50
|
+
- lib/dormouse/menu.rb
|
50
51
|
- lib/dormouse/property.rb
|
52
|
+
- lib/dormouse/tab.rb
|
51
53
|
- lib/dormouse/version.rb
|
52
54
|
- lib/dormouse/views/base.rb
|
53
55
|
- lib/dormouse/views/form.rb
|
@@ -60,6 +62,7 @@ files:
|
|
60
62
|
- lib/dormouse/widgets/datetime.rb
|
61
63
|
- lib/dormouse/widgets/decimal.rb
|
62
64
|
- lib/dormouse/widgets/float.rb
|
65
|
+
- lib/dormouse/widgets/has_many.rb
|
63
66
|
- lib/dormouse/widgets/integer.rb
|
64
67
|
- lib/dormouse/widgets/simple.rb
|
65
68
|
- lib/dormouse/widgets/string.rb
|