OSDN Git Service

c2d093ed05c381653edf68b3e27be6431a42cd75
[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     }\r
8     c = pagers[page_status.type]\r
9     return null if not page_status.total_page\r
10     new c({page_status: page_status, params: params})\r
11   \r
12 class Locmare.ListGroupModule.LibModule.PagerModule\r
13 class Locmare.ListGroupModule.LibModule.PagerModule.Default extends Backbone.View\r
14   tagName: 'ul'\r
15   className: 'pagination'\r
16   \r
17   initialize: (options) ->\r
18     @page_status = options.page_status\r
19     @params = options.params\r
20     @total = @page_status.total\r
21     \r
22     @window_size = 3\r
23     @controller = Manifest.manifest().controllers[@params['controller']]\r
24     @action = @controller.actions[@params['action']]\r
25     @action = @action.original if @action.original\r
26     \r
27     @current_page = @page_status.page\r
28     @per_page = @page_status.limit\r
29     @total_page = @page_status.total_page\r
30   \r
31   render: () ->\r
32     this.$el.html('')\r
33     if @hasPreviousPage()\r
34       this.$el.append(\r
35         (new Locmare.ListGroupModule.LibModule.PagerModule.FirstPage({\r
36           parent: this, page: 1, class_name: 'first'\r
37         })).render().el\r
38       )\r
39     if @hasPreviousPage()\r
40       this.$el.append(\r
41         (new Locmare.ListGroupModule.LibModule.PagerModule.PrevPage({\r
42           parent: this, page: @current_page - 1, class_name: 'prev'\r
43         })).render().el\r
44       )\r
45     if @hasPreviousPageGap()\r
46       this.$el.append(\r
47         (new Locmare.ListGroupModule.LibModule.PagerModule.PageGap()).render().el\r
48       )\r
49     _this = this\r
50     _.each @range(), (page) ->\r
51       _this.$el.append(\r
52         (new Locmare.ListGroupModule.LibModule.PagerModule.Page({\r
53           parent: _this, page: page, class_name: 'page'\r
54         })).render().el\r
55       )\r
56     if @hasNextPageGap()\r
57       this.$el.append(\r
58         (new Locmare.ListGroupModule.LibModule.PagerModule.PageGap()).render().el\r
59       )\r
60     if @hasNextPage()\r
61       this.$el.append(\r
62         (new Locmare.ListGroupModule.LibModule.PagerModule.NextPage({\r
63           parent: this, page: @current_page + 1, class_name: 'next'\r
64         })).render().el\r
65       )\r
66     if @hasNextPage()\r
67       this.$el.append(\r
68         (new Locmare.ListGroupModule.LibModule.PagerModule.LastPage({\r
69           parent: this, page: @total_page, class_name: 'last'\r
70         })).render().el\r
71       )\r
72     rb = new Tag.RowBreak()\r
73     this.$el.append(rb.render().el)\r
74     this\r
75   \r
76   range: () ->\r
77     f = if @hasPreviousPageGap()\r
78       @current_page - @window_size\r
79     else\r
80       1\r
81     t = if @hasNextPageGap()\r
82       @current_page + @window_size\r
83     else\r
84       @total_page\r
85     _.range(f, t)\r
86   \r
87   hasPreviousPage: () ->\r
88     @current_page > 1\r
89   \r
90   hasNextPage: () ->\r
91     @current_page < @total_page\r
92   \r
93   hasPreviousPageGap: () ->\r
94     @current_page > @window_size + 1\r
95   \r
96   hasNextPageGap: () ->\r
97     @total_page - @current_page > @window_size\r
98   \r
99   url: (page) ->\r
100     params = {}\r
101     _.each @params, (v, k) ->  # deep copy\r
102       params[k] = v\r
103     params['page'] = page\r
104     params['page_size'] = @per_page\r
105     @action.url params\r
106   \r
107 class Locmare.ListGroupModule.LibModule.PagerModule.Part extends Backbone.View\r
108   tagName: 'li'\r
109   \r
110   initialize: (options) ->\r
111     @parent = options.parent\r
112     @page = options.page\r
113     @el.className = options.class_name\r
114   \r
115   render: () ->\r
116     url = @parent.url(@page)\r
117     if @page == @parent.current_page\r
118       this.$el.html(@content())\r
119     else\r
120       linked_caption = new Tag.A({\r
121         attr: {href: '/' + url}, \r
122         handler_name: url,\r
123         content: @content()\r
124       })\r
125       this.$el.html(linked_caption.render().el)\r
126     this\r
127   \r
128   content: () ->\r
129     ''\r
130   \r
131 class Locmare.ListGroupModule.LibModule.PagerModule.FirstPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
132   \r
133   content: () ->\r
134     '<<'\r
135   \r
136 class Locmare.ListGroupModule.LibModule.PagerModule.PrevPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
137   \r
138   content: () ->\r
139     '<'\r
140   \r
141 class Locmare.ListGroupModule.LibModule.PagerModule.PageGap extends Backbone.View\r
142   tagName: 'li'\r
143   className: 'page-gap'\r
144   \r
145   render: () ->\r
146     this.$el.html('...')\r
147     this\r
148   \r
149 class Locmare.ListGroupModule.LibModule.PagerModule.Page extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
150   \r
151   content: () ->\r
152     Pettanr.to_s(@page)\r
153   \r
154 class Locmare.ListGroupModule.LibModule.PagerModule.NextPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
155   \r
156   content: () ->\r
157     '>'\r
158   \r
159 class Locmare.ListGroupModule.LibModule.PagerModule.LastPage extends Locmare.ListGroupModule.LibModule.PagerModule.Part\r
160   \r
161   content: () ->\r
162     '>>'\r
163   \r