1 package org.kuali.student.common.ui.client.configurable.mvc;
2
3 import org.kuali.student.common.ui.client.application.Application;
4 import org.kuali.student.common.ui.client.configurable.mvc.sections.Section;
5 import org.kuali.student.common.ui.client.widgets.field.layout.element.MessageKeyInfo;
6 import org.kuali.student.core.assembly.data.Metadata;
7 import org.kuali.student.core.assembly.data.ModelDefinition;
8 import org.kuali.student.core.assembly.data.QueryPath;
9
10 import com.google.gwt.user.client.ui.Widget;
11
12 /**
13 * A configurer defines the configuration of screens in KS, in particular this is where you add views,
14 * sections, and fields to a LayoutController preferably passed in in an configurer's implementation.
15 * This abstract class contains helper methods to do this.
16 *
17 * @author Kuali Student Team
18 *
19 */
20 public abstract class Configurer {
21 protected ModelDefinition modelDefinition;
22 protected String type = "";
23 protected String state = "";
24 protected String groupName = "";
25 // public abstract void configure(ConfigurableLayout layout);
26 /**
27 * Sets the modelDefinition which is the metadata backing the fields to be configured,
28 * this needs to be set before adding any fields in the configurer
29 * @param modelDefinition
30 */
31 public void setModelDefinition(ModelDefinition modelDefinition){
32 this.modelDefinition = modelDefinition;
33 }
34
35 public ModelDefinition getModelDefinition() {
36 return modelDefinition;
37 }
38
39 /**
40 * Generates a message info to be used in your field descriptor to get the label for the field.
41 * Used by the field descriptor with the application context to determine the label to show based on
42 * the labelKey
43 * @param labelKey key of the message - must match a message in your messages (stored in the db)
44 * @return
45 */
46 protected MessageKeyInfo generateMessageInfo(String labelKey) {
47 return new MessageKeyInfo(groupName, type, state, labelKey);
48 }
49
50 /**
51 * Gets the string corresponding to the label key passed in from the application messages
52 * @param labelKey
53 * @return
54 */
55 protected String getLabel(String labelKey) {
56 return Application.getApplicationContext().getUILabel(groupName, type, state, labelKey);
57 }
58
59 /**
60 * Gets a section title which is an h1 element using the label key passed to retrieve the corresponding
61 * message
62 * @param labelKey
63 * @return
64 */
65 protected SectionTitle getH1Title(String labelKey) {
66 return SectionTitle.generateH1Title(getLabel(labelKey));
67 }
68
69 /**
70 * Gets a section title which is an h1 element using the label key passed to retrieve the corresponding
71 * message
72 * @param labelKey
73 * @return
74 */
75 protected SectionTitle getH2Title(String labelKey) {
76 return SectionTitle.generateH2Title(getLabel(labelKey));
77 }
78
79 /**
80 * Gets a section title which is an h1 element using the label key passed to retrieve the corresponding
81 * message
82 * @param labelKey
83 * @return
84 */
85 protected SectionTitle getH3Title(String labelKey) {
86 return SectionTitle.generateH3Title(getLabel(labelKey));
87 }
88
89 /**
90 * Gets a section title which is an h1 element using the label key passed to retrieve the corresponding
91 * message
92 * @param labelKey
93 * @return
94 */
95 protected SectionTitle getH4Title(String labelKey) {
96 return SectionTitle.generateH4Title(getLabel(labelKey));
97 }
98
99 /**
100 * Gets a section title which is an h1 element using the label key passed to retrieve the corresponding
101 * message
102 * @param labelKey
103 * @return
104 */
105 protected SectionTitle getH5Title(String labelKey) {
106 return SectionTitle.generateH5Title(getLabel(labelKey));
107 }
108
109 /**
110 * Adds a field with the field key specified to the passed in section.
111 * Returns the generated FieldDescriptor. The field will have no label in this case.
112 * The widget will be auto generated in field descriptor based on the field's metadata in the
113 * model definition defined in this configurer - using the default widget factory. The fieldKey passed
114 * in MUST match a logical path in the metadata (ex. proposal/proposalTitle, etc.)
115 *
116 * Note: It also is acceptable to not use this helper method and add the FieldDescriptor directly
117 * to the section
118 *
119 * @param section
120 * @param fieldKey
121 * @return
122 */
123 public FieldDescriptor addField(Section section, String fieldKey) {
124 return addField(section, fieldKey, null, null, null);
125 }
126
127 /**
128 * Adds a field with the field key specified to the passed in section.
129 * Returns the generated FieldDescriptor. Uses the message key provided to generate the field label.
130 * The widget will be auto generated in field descriptor based on the field's metadata in the
131 * model definition defined in this configurer - using the default widget factory. The fieldKey passed
132 * in MUST match a logical path in the metadata (ex. proposal/proposalTitle, etc.)
133 *
134 * Note: It also is acceptable to not use this helper method and add the FieldDescriptor directly
135 * to the section
136 *
137 * @param section
138 * @param fieldKey
139 * @param messageKey
140 * @return
141 */
142 public FieldDescriptor addField(Section section, String fieldKey, MessageKeyInfo messageKey) {
143 return addField(section, fieldKey, messageKey, null, null);
144 }
145
146 /**
147 * Adds a field with the field key specified to the passed in section.
148 * Returns the generated FieldDescriptor. Uses the message key provided to generate the field label.
149 * The widget is not autogenerated based on the metadata in the defined model definition, but instead
150 * the passed in widget is used. The widget must be a type that is compatible with the default bindings
151 * (such as being a widget which implements HasText or HasValue), unless a custom binding is set on the
152 * returned FieldDescriptor from this method manually.
153 *
154 * Note: It also is acceptable to not use this helper method and add the FieldDescriptor directly
155 * to the section
156 *
157 * @param section
158 * @param fieldKey
159 * @param messageKey
160 * @param widget
161 * @return
162 */
163 public FieldDescriptor addField(Section section, String fieldKey, MessageKeyInfo messageKey, Widget widget) {
164 return addField(section, fieldKey, messageKey, widget, null);
165 }
166
167 /**
168 * Adds a field with the field key specified to the passed in section.
169 * Returns the generated FieldDescriptor. Uses the message key provided to generate the field label.
170 * The widget will be auto generated in field descriptor based on the field's metadata in the
171 * model definition defined in this configurer - using the default widget factory. The fieldKey passed
172 * in MUST match a logical path in the metadata (ex. proposal/proposalTitle, etc.). The parentPath
173 * will be concatenated onto the front of the fieldKey.
174 *
175 * Note: It also is acceptable to not use this helper method and add the FieldDescriptor directly
176 * to the section
177 *
178 * @param section
179 * @param fieldKey
180 * @param messageKey
181 * @param parentPath
182 * @return
183 */
184 public FieldDescriptor addField(Section section, String fieldKey, MessageKeyInfo messageKey, String parentPath) {
185 return addField(section, fieldKey, messageKey, null, parentPath);
186 }
187
188 /**
189 * Adds a field with the field key specified to the passed in section.
190 * Returns the generated FieldDescriptor. Uses the message key provided to generate the field label.
191 * The widget is not autogenerated based on the metadata in the defined model definition, but instead
192 * the passed in widget is used. The widget must be a type that is compatible with the default bindings
193 * (such as being a widget which implements HasText or HasValue), unless a custom binding is set on the
194 * returned FieldDescriptor from this method manually. The parentPath
195 * will be concatenated onto the front of the fieldKey.
196 *
197 * Note: It also is acceptable to not use this helper method and add the FieldDescriptor directly
198 * to the section
199 *
200 * @param section
201 * @param fieldKey
202 * @param messageKey
203 * @param widget
204 * @param parentPath
205 * @return
206 */
207 public FieldDescriptor addField(Section section, String fieldKey, MessageKeyInfo messageKey, Widget widget, String parentPath) {
208 QueryPath path = QueryPath.concat(parentPath, fieldKey);
209 Metadata meta = modelDefinition.getMetadata(path);
210
211 FieldDescriptor fd = new FieldDescriptor(path.toString(), messageKey, meta);
212 if (widget != null) {
213 fd.setFieldWidget(widget);
214 }
215 section.addField(fd);
216 return fd;
217 }
218
219 /**
220 * Read only variant of the corresponding addField method. This method will generate the read only version
221 * of the widget from the metadata found in the model definition that matches the fieldKey.
222 *
223 * @param section
224 * @param fieldKey
225 * @return
226 */
227 public FieldDescriptor addReadOnlyField(Section section, String fieldKey) {
228 return addReadOnlyField(section, fieldKey, null, null, null);
229 }
230
231 /**
232 * Read only variant of the corresponding addField method. This method will generate the read only version
233 * of the widget from the metadata found in the model definition that matches the fieldKey.
234 *
235 * @param section
236 * @param fieldKey
237 * @param messageKey
238 * @return
239 */
240 public FieldDescriptor addReadOnlyField(Section section, String fieldKey, MessageKeyInfo messageKey) {
241 return addReadOnlyField(section, fieldKey, messageKey, null, null);
242 }
243
244 /**
245 * Read only variant of the corresponding addField method. Uses widget passed in.
246 *
247 * @param section
248 * @param fieldKey
249 * @param messageKey
250 * @param widget
251 * @return
252 */
253 public FieldDescriptor addReadOnlyField(Section section, String fieldKey, MessageKeyInfo messageKey, Widget widget) {
254 return addReadOnlyField(section, fieldKey, messageKey, widget, null);
255 }
256
257 /**
258 * Read only variant of the corresponding addField method. This method will generate the read only version
259 * of the widget from the metadata found in the model definition that matches the fieldKey.
260 *
261 * @param section
262 * @param fieldKey
263 * @param messageKey
264 * @param parentPath
265 * @return
266 */
267 public FieldDescriptor addReadOnlyField(Section section, String fieldKey, MessageKeyInfo messageKey, String parentPath) {
268 return addReadOnlyField(section, fieldKey, messageKey, null, parentPath);
269 }
270
271 /**
272 * Read only variant of the corresponding addField method. Uses widget passed in.
273 *
274 * @param section
275 * @param fieldKey
276 * @param messageKey
277 * @param widget
278 * @param parentPath
279 * @return
280 */
281 public FieldDescriptor addReadOnlyField(Section section, String fieldKey, MessageKeyInfo messageKey, Widget widget, String parentPath) {
282 QueryPath path = QueryPath.concat(parentPath, fieldKey);
283 Metadata meta = modelDefinition.getMetadata(path);
284
285 FieldDescriptor fd = new FieldDescriptorReadOnly(path.toString(), messageKey, meta);
286 if (widget != null) {
287 fd.setFieldWidget(widget);
288 }
289 section.addField(fd);
290 return fd;
291 }
292 }