OSDN Git Service

8d9d5cb28c2c0d68b5be2a0a71d418465ca310d9
[pettanr/pettanr.git] / app / assets / javascripts / locmare / list_group / lib / pager.js.coffee
1 class Locmare.ListGroupModule.LibModule.Pager\r
2   @factory: (page_status, params) ->\r
3     pagers = {\r
4       default: Locmare.ListGroupModule.LibModule.PagerModule.Default,\r
5       offset: Locmare.ListGroupModule.LibModule.PagerModule.Offset,\r
6       unlimited: Locmare.ListGroupModule.LibModule.PagerModule.Unlimited,\r
7       more: Locmare.ListGroupModule.LibModule.PagerModule.More\r
8     }\r
9     c = pagers[page_status.type]\r
10     return null if not page_status.total_page\r
11     new c({page_status: page_status, params: params})\r
12   \r
13 class Locmare.ListGroupModule.LibModule.PagerModule\r
14 class Locmare.ListGroupModule.LibModule.PagerModule.Default extends Backbone.View\r
15   tagName: 'ul'\r
16   className: 'pagination'\r
17   \r
18   initialize: (options) ->\r
19     @page_status = options.page_status\r
20     @params = options.params\r
21     @total = @page_status.total\r
22     \r
23     @window_size = 3\r
24     @controller = Manifest.manifest().controllers[@params['controller']]\r
25     @action = @controller.actions[@params['action']]\r
26     @action = @action.original if @action.original\r
27     \r
28     @current_page = @page_status.page\r
29     @per_page = @page_status.page_size\r
30     @total_page = @page_status.total_page\r
31   \r
32   render: () ->\r
33     this.$el.html('')\r
34     if @hasPreviousPage()\r
35       view = new Locmare.ListGroupModule.LibModule.PagerModule.FirstPage({\r
36         parent: this, page: 1, class_name: 'first'\r
37       })\r
38       @listenTo(view, 'navigate', @navigate)\r
39       @listenTo(view, 'page', @click)\r
40       this.$el.append(view.render().el)\r
41     if @hasPreviousPage()\r
42       view = new Locmare.ListGroupModule.LibModule.PagerModule.PrevPage({\r
43         parent: this, page: @current_page - 1, class_name: 'prev'\r
44       })\r
45       @listenTo(view, 'navigate', @navigate)\r
46       @listenTo(view, 'page', @click)\r
47       this.$el.append(view.render().el)\r
48     if @hasPreviousPageGap()\r
49       this.$el.append(\r
50         (new Locmare.ListGroupModule.LibModule.PagerModule.PageGap()).render().el\r
51       )\r
52     _.each @range(), (page) =>\r
53       view = new Locmare.ListGroupModule.LibModule.PagerModule.Page({\r
54         parent: this, page: page, class_name: 'page'\r
55       })\r
56       @listenTo(view, 'navigate', @navigate)\r
57       @listenTo(view, 'page', @click)\r
58       this.$el.append(view.render().el)\r
59     if @hasNextPageGap()\r
60       this.$el.append(\r
61         (new Locmare.ListGroupModule.LibModule.PagerModule.PageGap()).render().el\r
62       )\r
63     if @hasNextPage()\r
64       view = new Locmare.ListGroupModule.LibModule.PagerModule.NextPage({\r
65         parent: this, page: @current_page + 1, class_name: 'next'\r
66       })\r
67       @listenTo(view, 'navigate', @navigate)\r
68       @listenTo(view, 'page', @click)\r
69       this.$el.append(view.render().el)\r
70     if @hasNextPage()\r
71       view = new Locmare.ListGroupModule.LibModule.PagerModule.LastPage({\r
72         parent: this, page: @total_page, class_name: 'last'\r
73       })\r
74       @listenTo(view, 'navigate', @navigate)\r
75       @listenTo(view, 'page', @click)\r
76       this.$el.append(view.render().el)\r
77     rb = new Tag.RowBreak()\r
78     this.$el.append(rb.render().el)\r
79     this\r
80   \r
81   range: () ->\r
82     f = if @hasPreviousPageGap()\r
83       @current_page - @window_size\r
84     else\r
85       1\r
86     t = if @hasNextPageGap()\r
87       @current_page + @window_size\r
88     else\r
89       @total_page\r
90     _.range(f, t)\r
91   \r
92   hasPreviousPage: () ->\r
93     @current_page > 1\r
94   \r
95   hasNextPage: () ->\r
96     @current_page < @total_page\r
97   \r
98   hasPreviousPageGap: () ->\r
99     @current_page > @window_size + 1\r
100   \r
101   hasNextPageGap: () ->\r
102     @total_page - @current_page > @window_size\r
103   \r
104   url: (page) ->\r
105     params = {}\r
106     _.each @params, (v, k) ->  # deep copy\r
107       params[k] = v\r
108     params['page'] = page\r
109     params['page_size'] = @per_page\r
110     @action.url params\r
111   \r
112   click: (page) ->\r
113     @trigger('page', page)\r
114   \r
115   navigate: (url) ->\r
116     @trigger('http_get', url)\r
117   \r
118 class Locmare.ListGroupModule.LibModule.PagerModule.Part extends Backbone.View\r
119   tagName: 'li'\r
120   \r
121   initialize: (options) ->\r
122     @parent = options.parent\r
123     @page = options.page\r
124     @el.className = options.class_name\r
125   \r
126   render: () ->\r
127     if @page == @parent.current_page\r
128       this.$el.html(@content())\r
129     else\r
130       linked_caption = new Tag.A({\r
131         attr: {href: '/' + @url()}, \r
132         content: @content()\r
133       })\r
134       @listenTo(linked_caption, 'click', @click)\r
135       this.$el.html(linked_caption.render().el)\r
136     this\r
137   \r
138   content: () ->\r
139     ''\r
140   \r
141   url: () ->\r
142     @parent.url(@page)\r
143   \r
144   click: () ->\r
145     @trigger('page', @page)\r
146     @trigger('navigate', @url())\r
147   \r
148 class Locmare.ListGroupModule.LibModule.PagerModule.FirstPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
149   \r
150   content: () ->\r
151     '<<'\r
152   \r
153   click: () ->\r
154     @trigger('page', @page)\r
155     @trigger('navigate', @url())\r
156   \r
157 class Locmare.ListGroupModule.LibModule.PagerModule.PrevPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
158   \r
159   content: () ->\r
160     '<'\r
161   \r
162 class Locmare.ListGroupModule.LibModule.PagerModule.PageGap extends Backbone.View\r
163   tagName: 'li'\r
164   className: 'page-gap'\r
165   \r
166   render: () ->\r
167     this.$el.html('...')\r
168     this\r
169   \r
170 class Locmare.ListGroupModule.LibModule.PagerModule.Page extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
171   \r
172   content: () ->\r
173     Pettanr.to_s(@page)\r
174   \r
175 class Locmare.ListGroupModule.LibModule.PagerModule.NextPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
176   \r
177   content: () ->\r
178     '>'\r
179   \r
180 class Locmare.ListGroupModule.LibModule.PagerModule.LastPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
181   \r
182   content: () ->\r
183     '>>'\r
184   \r
185 class Locmare.ListGroupModule.LibModule.PagerModule.More extends Backbone.View\r
186   tagName: 'div'\r
187   className: 'pagination'\r
188   \r
189   initialize: (options) ->\r
190     @params = options.params\r
191     \r
192     @controller = Manifest.manifest().controllers[@params['controller']]\r
193     @action = @controller.actions[@params['action']]\r
194     @action = @action.original if @action.original\r
195   \r
196   render: () ->\r
197     this.$el.html('')\r
198     linked_caption = new Tag.A({\r
199       attr: {href: '/' + @url()}, \r
200       content: 'More...'\r
201     })\r
202     @listenTo(linked_caption, 'click', @click)\r
203     this.$el.html(linked_caption.render().el)\r
204     this\r
205   \r
206   url: () ->\r
207     @action.url @params\r
208   \r
209   click: () ->\r
210     @trigger('http_get', @url())\r
211   \r