-
Notifications
You must be signed in to change notification settings - Fork 71
Expand file tree
/
Copy pathPageScroll.java
More file actions
154 lines (125 loc) · 4.69 KB
/
PageScroll.java
File metadata and controls
154 lines (125 loc) · 4.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package org.got5.tapestry5.jquery.components;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.apache.tapestry5.BindingConstants;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.ClientElement;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.EventContext;
import org.apache.tapestry5.annotations.AfterRender;
import org.apache.tapestry5.annotations.BeginRender;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.Events;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.OnEvent;
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.RequestParameter;
import org.apache.tapestry5.corelib.components.Loop;
import org.apache.tapestry5.internal.services.ArrayEventContext;
import org.apache.tapestry5.internal.util.CaptureResultCallback;
import org.apache.tapestry5.ioc.services.TypeCoercer;
import org.apache.tapestry5.json.JSONObject;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.got5.tapestry5.jquery.JQueryEventConstants;
/**
* Infinite page scroll component based on
* <a href='http://contextllc.com/tools/jQuery-infinite-scroll-live-scroll'>
* jQuery onScrollBeyond()
* </a>
* @tapestrydoc
*/
@Events(JQueryEventConstants.NEXT_PAGE)
@Import(stylesheet = "${jquery.assets.root}/vendor/components/pagescroll/PageScroll.css")
public class PageScroll implements ClientElement {
/* Embedded loop component */
@Component(publishParameters = "encoder, formState, element, index, empty")
private Loop<?> loop;
/**
* Used to store the current object being rendered(for the current row).
* It can be used in the body to know what should be rendered.
*/
@Parameter
@Property
private Object row;
/**
* The id used to generate a page-unique client-side identifier for the component.
* If a component renders multiple times, a suffix will be appended to the to id
* to ensure uniqueness. The unique id value may be accessed via the clientId property.
*/
@Parameter(value = "prop:componentResources.id",
defaultPrefix = BindingConstants.LITERAL)
private String clientId;
/**
* Current page number
*/
@Parameter(required = true)
private int pageNumber;
/**
* Zone to be updated each time page is scrolled.
*/
@Parameter(required = true, allowNull = false, defaultPrefix = BindingConstants.LITERAL)
private String zone;
/**
* Scroller to use
*/
@Parameter(required = true, allowNull = false, defaultPrefix = BindingConstants.LITERAL)
private String scroller;
/**
* Any additional parameter options to be specified. See
* <a href='http://contextllc.com/tools/jQuery-infinite-scroll-live-scroll'>here</a>
* for more details.
*/
@Parameter
private JSONObject params;
/**
* Context to be passed on page scroll.
*/
@Parameter(value = "literal:[]")
private Object[] context;
private String assignedClientId;
@Inject
private JavaScriptSupport javaScriptSupport;
@Inject
private ComponentResources resources;
@Inject
private Block nextPageBlock;
@Inject
private TypeCoercer typeCoercer;
private EventContext eventContext;
@BeginRender
void initialize() {
assignedClientId = javaScriptSupport.allocateClientId(clientId);
eventContext = new ArrayEventContext(typeCoercer, context);
}
@AfterRender
void addJavaScript() {
JSONObject specs = new JSONObject()
.put("scroller", scroller)
.put("scrollURI", getScrollURI())
.put("zoneId", zone)
.put("firstPageNumber", pageNumber)
.put("params", params);
javaScriptSupport.require("tjq/PageScroll").with(specs);
}
@OnEvent("scroll")
Object scroll(EventContext context, @RequestParameter("pageNumber") int index) {
this.pageNumber = index;
this.eventContext = context;
return nextPageBlock;
}
public List<?> getNextPage() {
CaptureResultCallback<List<Object>> resultCallback = new CaptureResultCallback<List<Object>>();
resources.triggerContextEvent(JQueryEventConstants.NEXT_PAGE, eventContext, resultCallback);
List<?> result = resultCallback.getResult();
result = (result == null ? new ArrayList<Object>() : result);
return result;
}
public String getClientId() {
return assignedClientId;
}
public String getScrollURI() {
return resources.createEventLink("scroll", context).toAbsoluteURI();
}
}