dormouse 0.0.1.a1 → 0.0.1.a2
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/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
|