fancygrid 1.1.0 → 2.0.0

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.
Files changed (95) hide show
  1. data/CHANGELOG +9 -2
  2. data/Gemfile +6 -9
  3. data/Gemfile.lock +88 -103
  4. data/README.md +226 -0
  5. data/ROADMAP +0 -1
  6. data/Rakefile +2 -2
  7. data/VERSION +1 -1
  8. data/app/views/fancygrid/controls.html.haml +34 -0
  9. data/app/views/fancygrid/fancygrid.html.haml +18 -0
  10. data/app/views/fancygrid/search.html.haml +24 -0
  11. data/app/views/fancygrid/sort.html.haml +8 -0
  12. data/app/views/fancygrid/table.html.haml +25 -0
  13. data/config/locales/fancygrid.de.yml +17 -19
  14. data/config/locales/fancygrid.en.yml +14 -17
  15. data/fancygrid.gemspec +48 -88
  16. data/lib/assets/javascripts/fancygrid.js +425 -0
  17. data/lib/assets/javascripts/fancygrid.min.js +15 -0
  18. data/lib/assets/stylesheets/fancygrid.css +177 -0
  19. data/lib/fancygrid.rb +63 -44
  20. data/lib/fancygrid/column.rb +165 -0
  21. data/lib/fancygrid/controller/helper.rb +46 -0
  22. data/lib/fancygrid/grid.rb +171 -317
  23. data/lib/fancygrid/node.rb +85 -490
  24. data/lib/fancygrid/object_wrapper.rb +24 -0
  25. data/lib/fancygrid/orm/active_record.rb +39 -0
  26. data/lib/fancygrid/orm/sql_generator.rb +127 -0
  27. data/lib/fancygrid/view/helper.rb +44 -0
  28. data/lib/fancygrid/view_state.rb +161 -0
  29. data/spec/column_spec.rb +29 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +48 -0
  31. data/spec/dummy/app/views/application/index.html.haml +11 -0
  32. data/spec/dummy/app/views/layouts/application.html.erb +1 -1
  33. data/spec/dummy/config/application.rb +1 -1
  34. data/spec/dummy/config/environments/development.rb +2 -2
  35. data/spec/dummy/config/environments/test.rb +2 -2
  36. data/spec/dummy/config/routes.rb +3 -2
  37. data/spec/dummy/db/development.sqlite3 +0 -0
  38. data/spec/dummy/db/schema.rb +26 -0
  39. data/spec/dummy/public/javascripts/jquery-1.4.2.js +6240 -0
  40. data/spec/dummy/public/javascripts/jquery-fancygrid.js +425 -0
  41. data/spec/dummy/public/javascripts/jquery-ui.js +41 -0
  42. data/spec/dummy/public/stylesheets/fancygrid.css +183 -0
  43. data/spec/node_spec.rb +79 -301
  44. data/spec/spec_helper.rb +0 -29
  45. data/spec/view_state_spec.rb +91 -0
  46. metadata +124 -137
  47. data/.bundle/config +0 -2
  48. data/README.rdoc +0 -299
  49. data/app/views/fancygrid/_cells.html.haml +0 -13
  50. data/app/views/fancygrid/base/controls.html.haml +0 -40
  51. data/app/views/fancygrid/base/list_frame.html.haml +0 -37
  52. data/app/views/fancygrid/base/search.html.haml +0 -33
  53. data/app/views/fancygrid/base/sort.html.haml +0 -20
  54. data/app/views/fancygrid/base/table_frame.html.haml +0 -45
  55. data/config/initializers/fancygrid.rb +0 -67
  56. data/lib/fancygrid/helper.rb +0 -129
  57. data/lib/fancygrid/query_generator.rb +0 -340
  58. data/lib/fancygrid/view.rb +0 -148
  59. data/lib/generators/install_generator.rb +0 -61
  60. data/lib/generators/views_generator.rb +0 -25
  61. data/lib/version.rb +0 -0
  62. data/public/images/fancygrid/add.png +0 -0
  63. data/public/images/fancygrid/clear.png +0 -0
  64. data/public/images/fancygrid/ddn.png +0 -0
  65. data/public/images/fancygrid/dn.png +0 -0
  66. data/public/images/fancygrid/dots.png +0 -0
  67. data/public/images/fancygrid/loading.gif +0 -0
  68. data/public/images/fancygrid/magnifier.png +0 -0
  69. data/public/images/fancygrid/next.png +0 -0
  70. data/public/images/fancygrid/order.png +0 -0
  71. data/public/images/fancygrid/prev.png +0 -0
  72. data/public/images/fancygrid/reload.png +0 -0
  73. data/public/images/fancygrid/remove.png +0 -0
  74. data/public/images/fancygrid/spacer.gif +0 -0
  75. data/public/images/fancygrid/submit.png +0 -0
  76. data/public/images/fancygrid/th_bg.png +0 -0
  77. data/public/images/fancygrid/up.png +0 -0
  78. data/public/images/fancygrid/uup.png +0 -0
  79. data/public/javascripts/fancygrid.js +0 -477
  80. data/public/javascripts/fancygrid.min.js +0 -17
  81. data/public/stylesheets/fancygrid.css +0 -289
  82. data/public/stylesheets/fancygrid.scss +0 -302
  83. data/spec/dummy/log/development.log +0 -0
  84. data/spec/dummy/log/production.log +0 -0
  85. data/spec/dummy/log/server.log +0 -0
  86. data/spec/dummy/log/test.log +0 -1026
  87. data/spec/dummy/public/javascripts/application.js +0 -2
  88. data/spec/dummy/public/javascripts/controls.js +0 -965
  89. data/spec/dummy/public/javascripts/dragdrop.js +0 -974
  90. data/spec/dummy/public/javascripts/effects.js +0 -1123
  91. data/spec/dummy/public/javascripts/prototype.js +0 -6001
  92. data/spec/dummy/public/javascripts/rails.js +0 -175
  93. data/spec/grid_spec.rb +0 -15
  94. data/spec/integration/navigation_spec.rb +0 -9
  95. data/spec/query_generator_spec.rb +0 -358
@@ -0,0 +1,183 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
4
+ font-size: 13px;
5
+ line-height: 18px;
6
+ }
7
+
8
+ .fg-control-bar{
9
+ list-style: none;
10
+ display: block;
11
+ text-align: center;
12
+ margin: 0px;
13
+ padding: 5px;
14
+ }
15
+
16
+ .fg-control-bar li{
17
+ display: inline;
18
+ }
19
+
20
+ tr.fg-search td .fg-search-criterion{
21
+ border: 1px solid #ccc;
22
+ padding: 3px;
23
+ }
24
+ tr.fg-search td .fg-search-criterion input,
25
+ tr.fg-search td .fg-search-criterion select{
26
+ border: 0px;
27
+ padding: 0px;
28
+ width: 100%;
29
+ outline: none;
30
+ -webkit-appearance:scrollbarbutton-down;
31
+ }
32
+ tr.fg-search td .fg-search-criterion select:focus;{
33
+ outline: none;
34
+ }
35
+
36
+ tr.fg-header th.fg-orderable{
37
+ background-position: 50% 0%;
38
+ background-repeat: no-repeat;
39
+ cursor: pointer;
40
+ }
41
+ tr.fg-header th.fg-orderable[fg-sort-order=asc]{
42
+ background-image: url(
43
+ data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAECAYAAACzzX7wAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACRJREFUeNpiYEACkZER/0GYARuASoAxhiJkSQxF2CSRFQEEGADl3xw9oxw7tQAAAABJRU5ErkJggg==
44
+ );
45
+ }
46
+ tr.fg-header th.fg-orderable:hover[fg-sort-order=asc]{
47
+ background-image: url(
48
+ data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAMAAAB1GNVPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADNQTFRF1NTUfX190dHRtLS0l5eXQEBAR0dH1dXVREREr6+v2dnZn5+fbGxseXl5RkZGzMzM////BUSGAAAAABF0Uk5T/////////////////////wAlrZliAAAAJklEQVR42mIQEBBgA2IGAQEORh4QzcrLycwtwMDHwsTPwMUOEGAAFi0BOZt2IEwAAAAASUVORK5CYII=
49
+ );
50
+ }
51
+ tr.fg-header th.fg-orderable[fg-sort-order=desc]{
52
+ background-image: url(
53
+ data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAEAgMAAADOo5ZjAAAACVBMVEUAAAAAAABZWVjux8MkAAAAAXRSTlMAQObYZgAAABRJREFUeNpjmBrGoBrBwJnAwNQAAA+QAlRLCPc3AAAAAElFTkSuQmCC
54
+ );
55
+ }
56
+ tr.fg-header th.fg-orderable:hover[fg-sort-order=desc]{
57
+ background-image: url(
58
+ data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAMAAAB1GNVPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFfX19xMTEbW1ttLS0jo6OREREr6+vycnJj4+Pubm5jIyMlpaWsLCwoKCg1NTU////gVMa/AAAABB0Uk5T////////////////////AOAjXRkAAAAmSURBVHjaYmBl4GLhZeNh4Gfi5mTn42fg5+dg5OMH0fzMQAwQYAAQZgEsd9uAdAAAAABJRU5ErkJggg==
59
+ );
60
+ }
61
+
62
+ .fg-control-bar [class^="fg-button"],
63
+ .fg-search [class^="fg-button"]{
64
+ cursor: pointer;
65
+ display: inline-block;
66
+ width: 14px;
67
+ height: 14px;
68
+ vertical-align: text-top;
69
+ background-image: url(
70
+ data:image/png;base64,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
71
+ );
72
+
73
+ background-position: 14px 14px;
74
+ background-repeat: no-repeat;
75
+ *margin-right: .3em;
76
+ }
77
+ .fg-control-bar .fg-button-search,
78
+ .fg-search .fg-button-refresh{
79
+ background-position: -48px 0;
80
+ }
81
+ .fg-search .fg-button-add-criterion{
82
+ background-position: 0 -96px;
83
+ }
84
+ .fg-search .fg-button-remove-criterion{
85
+ background-position: -24px -96px;
86
+ }
87
+
88
+ .fg-control-bar .fg-button-prev{
89
+ background-position: -432px -72px;
90
+ }
91
+ .fg-control-bar .fg-button-next{
92
+ background-position: -456px -72px;
93
+ }
94
+ .fg-control-bar .fg-button-clear,
95
+ .fg-search .fg-button-clear{
96
+ background-position: -456px 0;
97
+ }
98
+ .fg-control-bar .fg-button-refresh{
99
+ background-position: -240px -24px;
100
+ }
101
+ .fg-control-bar .fg-button-sort{
102
+ background-position: -264px -24px;
103
+ }
104
+
105
+ .fg-container input,
106
+ .fg-container select{
107
+ padding: 3px 5px;
108
+ border: 1px solid #CCCCCC;
109
+ }
110
+ .fg-container input{
111
+ padding: 4px 5px;
112
+ }
113
+ .fg-control-bar input.fg-current-page{
114
+ width: 25px;
115
+ text-align: right;
116
+ }
117
+
118
+ .fg-control-bar .separator{
119
+ border-left: 1px solid #ccc;
120
+ margin: 0px 5px;
121
+ }
122
+
123
+ .fg-sort-window{
124
+ background-color: black;
125
+ }
126
+
127
+ .fg-sort-content{
128
+ background-color: white;
129
+ }
130
+
131
+ .fg-sort-content .fg-sortable{
132
+ list-style : none;
133
+ padding-left: 10px;
134
+ }
135
+ .fg-sort-content .fg-sort-item{
136
+ cursor : move;
137
+ }
138
+ .fg-sort-content input[type=submit]{
139
+ width: 100%;
140
+ }
141
+
142
+ /*
143
+ *
144
+ */
145
+ .fg-container table{
146
+ width: 100%;
147
+ border-collapse: collapse;
148
+ border-spacing: 0;
149
+ border: 1px solid #ddd;
150
+ *border-collapse: collapsed;
151
+ }
152
+
153
+ .fg-container th, .fg-container td {
154
+ padding: 8px;
155
+ line-height: 18px;
156
+ text-align: left;
157
+ border-top: 1px solid #ddd;
158
+ }
159
+
160
+ .fg-container th + th,
161
+ .fg-container td + td,
162
+ .fg-container th + td,
163
+ .fg-container td + th {
164
+ border-left: 1px solid #ddd;
165
+ }
166
+
167
+ .fg-container tbody tr:nth-child(odd) td,
168
+ .fg-container tbody tr:nth-child(odd) th {
169
+ background-color: #f9f9f9;
170
+ }
171
+
172
+ .fg-search-controls,
173
+ .fg-search-criteria{
174
+ margin: 0px;
175
+ padding: 0px;
176
+ list-style: none;
177
+ }
178
+ .fg-search-criteria li{
179
+ margin-top: 5px;
180
+ }
181
+ ul.fg-search-controls li{
182
+ display: inline-block;
183
+ }
data/spec/node_spec.rb CHANGED
@@ -1,326 +1,104 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Fancygrid::Node do
4
-
5
- # builds a test structure with
6
- # 14 leafs
7
- # 3 nodes
8
- # 3 levels
9
- #
10
- # tickets
11
- # +- title
12
- # +- description
13
- # +- status
14
- # +- is_finished?
15
- # +- actions
16
- # +- project_id
17
- # +- project
18
- # +- title
19
- # +- class
20
- # +- actions
21
- # +- id
22
- # +- foo
23
- # +- title
24
- # +- foo
25
- # +- bar
26
- # +- id
27
- #
28
- def build_testgrid
29
- grid = Fancygrid::Grid.new(:ticket)
30
- grid.attributes(:title, :description, :status)
31
- grid.methods(:is_finished?)
32
- grid.rendered(:actions)
33
- grid.hidden(:project_id)
34
- grid.columns_for(:project) do |p|
35
- p.attributes(:title)
36
- p.methods(:class)
37
- p.rendered(:actions)
38
- p.hidden(:id)
39
-
40
- p.columns_for(:foo, Project) do |f|
41
- f.attributes(:title)
42
- f.methods(:foo)
43
- f.rendered(:bar)
44
- f.hidden(:id)
45
- end
46
- end
47
-
48
- return grid
49
- end
50
-
51
- it "should build a fancygrid tree" do
52
-
53
- grid = build_testgrid
54
- grid.children.length.should be 7
55
- grid.leafs.length.should be 14
56
-
57
- end
58
-
59
- it "should find node by path" do
60
-
61
- grid = build_testgrid
62
- grid.find_by_path("ticket").name.should == :ticket
63
- grid.find_by_path("ticket.title").name.should == :title
64
- grid.find_by_path("ticket.description").name.should == :description
65
- grid.find_by_path("ticket.status").name.should == :status
66
- grid.find_by_path("ticket.is_finished?").name.should == :is_finished?
67
- grid.find_by_path("ticket.actions").name.should == :actions
68
- grid.find_by_path("ticket.project_id").name.should == :project_id
69
-
70
- grid.find_by_path("ticket.project").name.should == :project
71
- grid.find_by_path("ticket.project.title").name.should == :title
72
- grid.find_by_path("ticket.project.class").name.should == :class
73
- grid.find_by_path("ticket.project.actions").name.should == :actions
74
- grid.find_by_path("ticket.project.id").name.should == :id
75
-
76
- grid.find_by_path("ticket.project.foo").name.should == :foo
77
- grid.find_by_path("ticket.project.foo.title").name.should == :title
78
- grid.find_by_path("ticket.project.foo.foo").name.should == :foo
79
- grid.find_by_path("ticket.project.foo.bar").name.should == :bar
80
- grid.find_by_path("ticket.project.foo.id").name.should == :id
81
-
82
- end
83
-
84
- it "should have a fancygrid instance as root" do
85
-
86
- grid = build_testgrid
87
- grid.find_by_path("ticket").root.should be(grid)
88
- grid.find_by_path("ticket.title").root.should be(grid)
89
- grid.find_by_path("ticket.description").root.should be(grid)
90
- grid.find_by_path("ticket.status").root.should be(grid)
91
- grid.find_by_path("ticket.is_finished?").root.should be(grid)
92
- grid.find_by_path("ticket.actions").root.should be(grid)
93
- grid.find_by_path("ticket.project_id").root.should be(grid)
94
-
95
- grid.find_by_path("ticket.project").root.should be(grid)
96
- grid.find_by_path("ticket.project.title").root.should be(grid)
97
- grid.find_by_path("ticket.project.class").root.should be(grid)
98
- grid.find_by_path("ticket.project.actions").root.should be(grid)
99
- grid.find_by_path("ticket.project.id").root.should be(grid)
100
-
101
- grid.find_by_path("ticket.project.foo").root.should be(grid)
102
- grid.find_by_path("ticket.project.foo.title").root.should be(grid)
103
- grid.find_by_path("ticket.project.foo.foo").root.should be(grid)
104
- grid.find_by_path("ticket.project.foo.bar").root.should be(grid)
105
- grid.find_by_path("ticket.project.foo.id").root.should be(grid)
106
-
107
- end
108
-
109
- it "should be a leaf if has no children" do
110
-
111
- grid = build_testgrid
112
- grid.find_by_path("ticket").is_leaf?.should be(false)
113
- grid.find_by_path("ticket.title").is_leaf?.should be(true)
114
- grid.find_by_path("ticket.description").is_leaf?.should be(true)
115
- grid.find_by_path("ticket.status").is_leaf?.should be(true)
116
- grid.find_by_path("ticket.is_finished?").is_leaf?.should be(true)
117
- grid.find_by_path("ticket.actions").is_leaf?.should be(true)
118
- grid.find_by_path("ticket.project_id").is_leaf?.should be(true)
119
-
120
- grid.find_by_path("ticket.project").is_leaf?.should be(false)
121
- grid.find_by_path("ticket.project.title").is_leaf?.should be(true)
122
- grid.find_by_path("ticket.project.class").is_leaf?.should be(true)
123
- grid.find_by_path("ticket.project.actions").is_leaf?.should be(true)
124
- grid.find_by_path("ticket.project.id").is_leaf?.should be(true)
125
-
126
- grid.find_by_path("ticket.project.foo").is_leaf?.should be(false)
127
- grid.find_by_path("ticket.project.foo.title").is_leaf?.should be(true)
128
- grid.find_by_path("ticket.project.foo.foo").is_leaf?.should be(true)
129
- grid.find_by_path("ticket.project.foo.bar").is_leaf?.should be(true)
130
- grid.find_by_path("ticket.project.foo.id").is_leaf?.should be(true)
131
-
132
- end
133
-
134
- it "should have a tag name if is a leaf" do
135
-
136
- grid = build_testgrid
137
- grid.find_by_path("ticket").tag_name.should == nil
138
- grid.find_by_path("ticket.title").tag_name.should == "tickets[title]"
139
- grid.find_by_path("ticket.description").tag_name.should == "tickets[description]"
140
- grid.find_by_path("ticket.status").tag_name.should == "tickets[status]"
141
- grid.find_by_path("ticket.is_finished?").tag_name.should == "tickets[is_finished?]"
142
- grid.find_by_path("ticket.actions").tag_name.should == "tickets[actions]"
143
- grid.find_by_path("ticket.project_id").tag_name.should == "tickets[project_id]"
144
-
145
- grid.find_by_path("ticket.project").tag_name.should == nil
146
- grid.find_by_path("ticket.project.title").tag_name.should == "projects[title]"
147
- grid.find_by_path("ticket.project.class").tag_name.should == "projects[class]"
148
- grid.find_by_path("ticket.project.actions").tag_name.should == "projects[actions]"
149
- grid.find_by_path("ticket.project.id").tag_name.should == "projects[id]"
150
-
151
- grid.find_by_path("ticket.project.foo").tag_name.should == nil
152
- grid.find_by_path("ticket.project.foo.title").tag_name.should == "projects[title]"
153
- grid.find_by_path("ticket.project.foo.foo").tag_name.should == "projects[foo]"
154
- grid.find_by_path("ticket.project.foo.bar").tag_name.should == "projects[bar]"
155
- grid.find_by_path("ticket.project.foo.id").tag_name.should == "projects[id]"
156
-
157
- end
158
-
159
- it "should have a select name if is a leaf and is selectable" do
160
-
161
- grid = build_testgrid
162
- grid.find_by_path("ticket").select_name.should == nil
163
- grid.find_by_path("ticket.title").select_name.should == "tickets.title"
164
- grid.find_by_path("ticket.description").select_name.should == "tickets.description"
165
- grid.find_by_path("ticket.status").select_name.should == "tickets.status"
166
- grid.find_by_path("ticket.is_finished?").select_name.should == nil
167
- grid.find_by_path("ticket.actions").select_name.should == nil
168
- grid.find_by_path("ticket.project_id").select_name.should == "tickets.project_id"
169
-
170
- grid.find_by_path("ticket.project").select_name.should == nil
171
- grid.find_by_path("ticket.project.title").select_name.should == "projects.title"
172
- grid.find_by_path("ticket.project.class").select_name.should == nil
173
- grid.find_by_path("ticket.project.actions").select_name.should == nil
174
- grid.find_by_path("ticket.project.id").select_name.should == "projects.id"
175
-
176
- grid.find_by_path("ticket.project.foo").select_name.should == nil
177
- grid.find_by_path("ticket.project.foo.title").select_name.should == "projects.title"
178
- grid.find_by_path("ticket.project.foo.foo").select_name.should == nil
179
- grid.find_by_path("ticket.project.foo.bar").select_name.should == nil
180
- grid.find_by_path("ticket.project.foo.id").select_name.should == "projects.id"
181
-
182
- end
183
4
 
184
- it "have a css class if is a leaf" do
185
-
186
- grid = build_testgrid
187
- grid.find_by_path("ticket").css_class.should == nil
188
- grid.find_by_path("ticket.title").css_class.should == "tickets title fg-orderable"
189
- grid.find_by_path("ticket.description").css_class.should == "tickets description fg-orderable"
190
- grid.find_by_path("ticket.status").css_class.should == "tickets status fg-orderable"
191
- grid.find_by_path("ticket.is_finished?").css_class.should == "tickets is_finished?"
192
- grid.find_by_path("ticket.actions").css_class.should == "tickets actions"
193
- grid.find_by_path("ticket.project_id").css_class.should == "tickets project_id fg-orderable"
194
-
195
- grid.find_by_path("ticket.project").css_class.should == nil
196
- grid.find_by_path("ticket.project.title").css_class.should == "projects title fg-orderable"
197
- grid.find_by_path("ticket.project.class").css_class.should == "projects class"
198
- grid.find_by_path("ticket.project.actions").css_class.should == "projects actions"
199
- grid.find_by_path("ticket.project.id").css_class.should == "projects id fg-orderable"
200
-
201
- grid.find_by_path("ticket.project.foo").css_class.should == nil
202
- grid.find_by_path("ticket.project.foo.title").css_class.should == "projects title fg-orderable"
203
- grid.find_by_path("ticket.project.foo.foo").css_class.should == "projects foo"
204
- grid.find_by_path("ticket.project.foo.bar").css_class.should == "projects bar"
205
- grid.find_by_path("ticket.project.foo.id").css_class.should == "projects id fg-orderable"
206
-
5
+ class DummyClass
6
+ def self.table_name; "dummy_table"; end;
207
7
  end
208
8
 
209
- it "should have an i18n path if is a leaf" do
9
+ describe "#initialize" do
10
+ it "should call #to_s on name attribute" do
11
+ Fancygrid::Node.new(nil, :project).name.should == "project"
12
+ end
210
13
 
211
- grid = build_testgrid
212
- grid.find_by_path("ticket").i18n_path.should == nil
213
- grid.find_by_path("ticket.title").i18n_path.should_not be nil
214
- grid.find_by_path("ticket.description").i18n_path.should_not be nil
215
- grid.find_by_path("ticket.status").i18n_path.should_not be nil
216
- grid.find_by_path("ticket.is_finished?").i18n_path.should_not be nil
217
- grid.find_by_path("ticket.actions").i18n_path.should_not be nil
218
- grid.find_by_path("ticket.project_id").i18n_path.should_not be nil
14
+ it "should resolve resource class" do
15
+ Fancygrid::Node.new(nil, :project).resource_class.should == Project
16
+ end
219
17
 
220
- grid.find_by_path("ticket.project").i18n_path.should == nil
221
- grid.find_by_path("ticket.project.title").i18n_path.should_not be nil
222
- grid.find_by_path("ticket.project.class").i18n_path.should_not be nil
223
- grid.find_by_path("ticket.project.actions").i18n_path.should_not be nil
224
- grid.find_by_path("ticket.project.id").i18n_path.should_not be nil
18
+ it "should resolve table name" do
19
+ Fancygrid::Node.new(nil, :project).table_name.should == "projects"
20
+ end
225
21
 
226
- grid.find_by_path("ticket.project.foo").i18n_path.should == nil
227
- grid.find_by_path("ticket.project.foo.title").i18n_path.should_not be nil
228
- grid.find_by_path("ticket.project.foo.foo").i18n_path.should_not be nil
229
- grid.find_by_path("ticket.project.foo.bar").i18n_path.should_not be nil
230
- grid.find_by_path("ticket.project.foo.id").i18n_path.should_not be nil
22
+ it "should override resource class" do
23
+ node = Fancygrid::Node.new(nil, :project, {
24
+ :class => DummyClass
25
+ })
26
+
27
+ node.resource_class.should == DummyClass
28
+ node.table_name.should == "dummy_table"
29
+ end
231
30
 
232
- end
31
+ it "should override table name" do
32
+ node = Fancygrid::Node.new(nil, :project, { :table_name => "some_table_name" })
33
+ node.table_name.should == "some_table_name"
34
+ end
233
35
 
234
- it "should have a trace path" do
235
-
236
- grid = build_testgrid
237
- grid.find_by_path("ticket").trace_path.should == "ticket"
238
- grid.find_by_path("ticket.title").trace_path.should == "ticket.title"
239
- grid.find_by_path("ticket.description").trace_path.should == "ticket.description"
240
- grid.find_by_path("ticket.status").trace_path.should == "ticket.status"
241
- grid.find_by_path("ticket.is_finished?").trace_path.should == "ticket.is_finished?"
242
- grid.find_by_path("ticket.actions").trace_path.should == "ticket.actions"
243
- grid.find_by_path("ticket.project_id").trace_path.should == "ticket.project_id"
244
-
245
- grid.find_by_path("ticket.project").trace_path.should == "ticket.project"
246
- grid.find_by_path("ticket.project.title").trace_path.should == "ticket.project.title"
247
- grid.find_by_path("ticket.project.class").trace_path.should == "ticket.project.class"
248
- grid.find_by_path("ticket.project.actions").trace_path.should == "ticket.project.actions"
249
- grid.find_by_path("ticket.project.id").trace_path.should == "ticket.project.id"
250
-
251
- grid.find_by_path("ticket.project.foo").trace_path.should == "ticket.project.foo"
252
- grid.find_by_path("ticket.project.foo.title").trace_path.should == "ticket.project.foo.title"
253
- grid.find_by_path("ticket.project.foo.foo").trace_path.should == "ticket.project.foo.foo"
254
- grid.find_by_path("ticket.project.foo.bar").trace_path.should == "ticket.project.foo.bar"
255
- grid.find_by_path("ticket.project.foo.id").trace_path.should == "ticket.project.foo.id"
256
-
36
+ it "should be the root node when initialized without parent" do
37
+ node = Fancygrid::Node.new(nil, :project)
38
+ node.root.should be node
39
+ node.root?.should be true
40
+ end
257
41
  end
258
42
 
259
-
260
- it "should get attributes from model" do
261
- ticket = Ticket.new({
262
- :title => "ticket title",
263
- :description => "ticket description",
264
- :status => "ticket status",
265
- :project => Project.new({ :title => "project title" })
266
- })
43
+ describe "#columns_for" do
267
44
 
268
- grid = build_testgrid
269
- grid.find_by_path("ticket.title").value_from(ticket).should == "ticket title"
270
- grid.find_by_path("ticket.description").value_from(ticket).should == "ticket description"
271
- grid.find_by_path("ticket.status").value_from(ticket).should == "ticket status"
272
- grid.find_by_path("ticket.project.title").value_from(ticket).should == "project title"
45
+ it "should add child node connect with parent" do
46
+ node1 = Fancygrid::Node.new(nil, :project)
47
+ node2 = node1.columns_for :ticket
273
48
 
274
- end
275
-
276
- it "should pass the visible option to node" do
49
+ node2.parent.should be node1
50
+ node1.children.should include node2
51
+ end
277
52
 
278
- grid = Fancygrid::Grid.new(:ticket)
279
- grid.column(:title, :visible => true )
280
- grid.find_by_path("ticket.title").visible.should be true
53
+ it "should propagate the root node" do
54
+ node1 = Fancygrid::Node.new(nil, :project)
55
+ node2 = node1.columns_for :ticket
56
+
57
+ node1.root?.should be true
58
+ node2.root?.should be false
59
+
60
+ node1.root.should be node2.root
61
+ end
281
62
 
282
- grid = Fancygrid::Grid.new(:ticket)
283
- grid.column(:title, :visible => false )
284
- grid.find_by_path("ticket.title").visible.should be false
63
+ it "#should create and yield Fancygrid::Node" do
64
+ node = Fancygrid::Node.new(nil, :project, {})
65
+ node.columns_for :project do |inner|
66
+ inner.class.should == Fancygrid::Node
67
+ end
68
+ node.children.count.should be 1
69
+ end
285
70
  end
286
-
287
- it "should pass the formatable option to node" do
288
-
289
- grid = Fancygrid::Grid.new(:ticket)
290
- grid.column(:title, :formatable => true )
291
- grid.find_by_path("ticket.title").formatable.should be true
71
+
72
+ describe "#column" do
73
+ it "should create a Fancygrid::Column and add as child" do
74
+ node = Fancygrid::Node.new(nil, :project, {})
75
+ node.column(:project).class.should == Fancygrid::Column
76
+ end
292
77
 
293
- grid = Fancygrid::Grid.new(:ticket)
294
- grid.column(:title, :formatable => false )
295
- grid.find_by_path("ticket.title").formatable.should be false
78
+ it "should add a child" do
79
+ node = Fancygrid::Node.new(nil, :project, {})
80
+ node.children.count.should be 0
81
+ node.column(:project)
82
+ node.children.count.should be 1
83
+ end
296
84
  end
297
-
298
- it "should pass the searchable option to node" do
299
-
300
- grid = Fancygrid::Grid.new(:ticket)
301
- grid.column(:title, :searchable => true )
302
- grid.find_by_path("ticket.title").searchable.should be true
303
-
304
- grid = Fancygrid::Grid.new(:ticket)
305
- grid.column(:title, :searchable => false )
306
- grid.find_by_path("ticket.title").searchable.should be false
85
+
86
+ describe "#column" do
87
+ it "should add multiple columns at once" do
88
+ node = Fancygrid::Node.new(nil, :project, {})
89
+ node.children.count.should be 0
90
+ node.columns :project, :ticket
91
+ node.children.count.should be 2
92
+ end
307
93
  end
308
94
 
309
- it "should pass the human name option to node" do
310
-
311
- grid = Fancygrid::Grid.new(:ticket)
312
- grid.column(:title, :human_name => "custom human name" )
313
- grid.find_by_path("ticket.title").human_name.should == "custom human name"
95
+ it "#name_chain should return all names starting from root inclusive" do
96
+ node = Fancygrid::Node.new(nil, :project, {})
97
+ node.columns_for :ticket do |inner|
98
+ inner.name_chain.should == "project.ticket"
99
+ end
314
100
 
101
+ node.name_chain.should == "project"
315
102
  end
316
103
 
317
- it "should pass the proc option to node" do
318
-
319
- ticket = Ticket.new(:title => "ticket title")
320
-
321
- grid = Fancygrid::Grid.new(:ticket)
322
- grid.column(:title, :proc => Proc.new { |t| t.title } )
323
- grid.find_by_path("ticket.title").proc_block.call(ticket).should == "ticket title"
324
- grid.find_by_path("ticket.title").value_from(ticket).should == "ticket title"
325
- end
326
- end
104
+ end