OSDN Git Service

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