1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.krad.uif.field;
17
18 import org.apache.commons.lang.StringUtils;
19 import org.kuali.rice.core.api.uif.DataType;
20 import org.kuali.rice.core.api.util.ConcreteKeyValue;
21 import org.kuali.rice.core.api.util.KeyValue;
22 import org.kuali.rice.core.api.util.type.TypeUtils;
23 import org.kuali.rice.krad.datadictionary.AttributeDefinition;
24 import org.kuali.rice.krad.datadictionary.validation.capability.CaseConstrainable;
25 import org.kuali.rice.krad.datadictionary.validation.capability.Formatable;
26 import org.kuali.rice.krad.datadictionary.validation.capability.HierarchicallyConstrainable;
27 import org.kuali.rice.krad.datadictionary.validation.capability.LengthConstrainable;
28 import org.kuali.rice.krad.datadictionary.validation.capability.MustOccurConstrainable;
29 import org.kuali.rice.krad.datadictionary.validation.capability.PrerequisiteConstrainable;
30 import org.kuali.rice.krad.datadictionary.validation.capability.RangeConstrainable;
31 import org.kuali.rice.krad.datadictionary.validation.capability.SimpleConstrainable;
32 import org.kuali.rice.krad.datadictionary.validation.capability.ValidCharactersConstrainable;
33 import org.kuali.rice.krad.datadictionary.validation.constraint.CaseConstraint;
34 import org.kuali.rice.krad.datadictionary.validation.constraint.MustOccurConstraint;
35 import org.kuali.rice.krad.datadictionary.validation.constraint.PrerequisiteConstraint;
36 import org.kuali.rice.krad.datadictionary.validation.constraint.SimpleConstraint;
37 import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint;
38 import org.kuali.rice.krad.keyvalues.KeyValuesFinder;
39 import org.kuali.rice.krad.uif.UifConstants;
40 import org.kuali.rice.krad.uif.control.TextControl;
41 import org.kuali.rice.krad.uif.control.UifKeyValuesFinder;
42 import org.kuali.rice.krad.uif.view.FormView;
43 import org.kuali.rice.krad.uif.view.View;
44 import org.kuali.rice.krad.uif.control.Control;
45 import org.kuali.rice.krad.uif.control.MultiValueControlBase;
46 import org.kuali.rice.krad.uif.component.Component;
47 import org.kuali.rice.krad.uif.util.ClientValidationUtils;
48 import org.kuali.rice.krad.uif.util.ComponentUtils;
49 import org.kuali.rice.krad.uif.util.ObjectPropertyUtils;
50 import org.kuali.rice.krad.uif.view.ViewModel;
51 import org.kuali.rice.krad.uif.widget.DirectInquiry;
52 import org.kuali.rice.krad.uif.widget.QuickFinder;
53 import org.kuali.rice.krad.uif.widget.Suggest;
54 import org.kuali.rice.krad.util.ObjectUtils;
55
56 import java.util.ArrayList;
57 import java.util.List;
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 public class InputField extends DataField implements SimpleConstrainable, CaseConstrainable, PrerequisiteConstrainable,
79 MustOccurConstrainable, LengthConstrainable, RangeConstrainable, ValidCharactersConstrainable {
80 private static final long serialVersionUID = -3703656713706343840L;
81
82
83 private String customValidatorClass;
84 private ValidCharactersConstraint validCharactersConstraint;
85 private CaseConstraint caseConstraint;
86 private List<PrerequisiteConstraint> dependencyConstraints;
87 private List<MustOccurConstraint> mustOccurConstraints;
88 private SimpleConstraint simpleConstraint;
89 private DataType dataType;
90
91
92 private Control control;
93 private KeyValuesFinder optionsFinder;
94 private boolean performUppercase;
95
96 private ErrorsField errorsField;
97
98
99 private String constraintText;
100 private String instructionalText;
101
102 private MessageField instructionalMessageField;
103 private MessageField constraintMessageField;
104
105 private AttributeQuery fieldAttributeQuery;
106
107
108 private QuickFinder fieldLookup;
109 private DirectInquiry fieldDirectInquiry;
110 private Suggest fieldSuggest;
111
112 public InputField() {
113 super();
114
115 simpleConstraint = new SimpleConstraint();
116 }
117
118
119
120
121
122
123
124
125
126
127
128
129
130 @Override
131 public void performFinalize(View view, Object model, Component parent) {
132 super.performFinalize(view, model, parent);
133
134 setupIds();
135
136
137 List<KeyValue> fieldOptions = new ArrayList<KeyValue>();
138
139
140 if ((control != null) && control instanceof MultiValueControlBase) {
141 MultiValueControlBase multiValueControl = (MultiValueControlBase) control;
142 if ((multiValueControl.getOptions() != null) && !multiValueControl.getOptions().isEmpty()) {
143 fieldOptions = multiValueControl.getOptions();
144 }
145 }
146
147
148 if (fieldOptions.isEmpty() && (optionsFinder != null)) {
149 if (optionsFinder instanceof UifKeyValuesFinder) {
150 fieldOptions = ((UifKeyValuesFinder) optionsFinder).getKeyValues((ViewModel) model);
151
152
153 if (((UifKeyValuesFinder) optionsFinder).isAddBlankOption()) {
154 fieldOptions.add(0, new ConcreteKeyValue("", ""));
155 }
156 } else {
157 fieldOptions = optionsFinder.getKeyValues();
158 }
159
160 if ((control != null) && control instanceof MultiValueControlBase) {
161 ((MultiValueControlBase) control).setOptions(fieldOptions);
162 }
163 }
164
165
166 if (isReadOnly()
167 && !fieldOptions.isEmpty()
168 && StringUtils.isBlank(getAlternateDisplayValue())
169 && StringUtils.isBlank(getAdditionalDisplayValue())
170 && StringUtils.isBlank(getAlternateDisplayPropertyName())
171 && StringUtils.isBlank(getAdditionalDisplayPropertyName())) {
172
173 Object fieldValue = ObjectPropertyUtils.getPropertyValue(model, getBindingInfo().getBindingPath());
174
175
176 if ((fieldValue != null) && (TypeUtils.isSimpleType(fieldValue.getClass()))) {
177 for (KeyValue keyValue : fieldOptions) {
178 if (StringUtils.equals((String) fieldValue, keyValue.getKey())) {
179 setAlternateDisplayValue(keyValue.getValue());
180 break;
181 }
182 }
183 }
184 }
185
186
187 if (isReadOnly() || getControl() == null) {
188 return;
189 }
190
191
192 if (StringUtils.isNotBlank(instructionalText)) {
193 instructionalMessageField.setMessageText(instructionalText);
194 }
195
196
197 if (StringUtils.isNotBlank(constraintText)) {
198 constraintMessageField.setMessageText(constraintText);
199 }
200
201
202 adjustPrerequisiteConstraintBinding(dependencyConstraints);
203
204
205 adjustMustOccurConstraintBinding(mustOccurConstraints);
206
207
208 if (caseConstraint != null) {
209 String propertyName = getBindingInfo().getPropertyAdjustedBindingPath(caseConstraint.getPropertyName());
210 caseConstraint.setPropertyName(propertyName);
211 }
212
213 setupFieldQuery();
214
215 ClientValidationUtils.processAndApplyConstraints(this, view);
216 }
217
218
219
220
221
222
223 protected void adjustMustOccurConstraintBinding(List<MustOccurConstraint> mustOccurConstraints) {
224 if (mustOccurConstraints != null) {
225 for (MustOccurConstraint mustOccurConstraint : mustOccurConstraints) {
226 adjustPrerequisiteConstraintBinding(mustOccurConstraint.getPrerequisiteConstraints());
227 adjustMustOccurConstraintBinding(mustOccurConstraint.getMustOccurConstraints());
228 }
229 }
230 }
231
232
233
234
235
236 protected void adjustPrerequisiteConstraintBinding(List<PrerequisiteConstraint> prerequisiteConstraints) {
237 if (prerequisiteConstraints != null) {
238 for (PrerequisiteConstraint prerequisiteConstraint : prerequisiteConstraints) {
239 String propertyName = getBindingInfo().getPropertyAdjustedBindingPath(
240 prerequisiteConstraint.getPropertyName());
241 prerequisiteConstraint.setPropertyName(propertyName);
242 }
243 }
244 }
245
246
247
248
249
250
251 protected void setupFieldQuery() {
252 if (getFieldAttributeQuery() != null) {
253
254 getFieldAttributeQuery().updateQueryFieldMapping(getBindingInfo());
255 getFieldAttributeQuery().updateReturnFieldMapping(getBindingInfo());
256 getFieldAttributeQuery().updateQueryMethodArgumentFieldList(getBindingInfo());
257
258
259 String script = "executeFieldQuery('" + getControl().getId() + "',";
260 script += "'" + getId() + "'," + getFieldAttributeQuery().getQueryFieldMappingJsString() + ",";
261 script += getFieldAttributeQuery().getQueryMethodArgumentFieldsJsString() + ",";
262 script += getFieldAttributeQuery().getReturnFieldMappingJsString() + ");";
263
264 if (StringUtils.isNotBlank(getControl().getOnBlurScript())) {
265 script = getControl().getOnBlurScript() + script;
266 }
267 getControl().setOnBlurScript(script);
268 }
269 }
270
271
272
273
274
275
276 protected void setupIds() {
277
278 if (getControl() != null) {
279 getControl().setId(getId());
280 }
281
282 setNestedComponentIdAndSuffix(getErrorsField(), UifConstants.IdSuffixes.ERRORS);
283 setNestedComponentIdAndSuffix(getLabelField(), UifConstants.IdSuffixes.LABEL);
284 setNestedComponentIdAndSuffix(getInstructionalMessageField(), UifConstants.IdSuffixes.INSTRUCTIONAL);
285 setNestedComponentIdAndSuffix(getConstraintMessageField(), UifConstants.IdSuffixes.CONSTRAINT);
286 setNestedComponentIdAndSuffix(getFieldLookup(), UifConstants.IdSuffixes.QUICK_FINDER);
287 setNestedComponentIdAndSuffix(getFieldDirectInquiry(), UifConstants.IdSuffixes.DIRECT_INQUIRY);
288 setNestedComponentIdAndSuffix(getFieldSuggest(), UifConstants.IdSuffixes.SUGGEST);
289
290 setId(getId() + UifConstants.IdSuffixes.ATTRIBUTE);
291 }
292
293
294
295
296
297
298
299 private void setNestedComponentIdAndSuffix(Component component, String suffix) {
300 if (component != null) {
301 String fieldId = getId();
302 fieldId += suffix;
303
304 component.setId(fieldId);
305 }
306 }
307
308
309
310
311
312
313
314
315
316
317
318
319 public void copyFromAttributeDefinition(View view, AttributeDefinition attributeDefinition) {
320 super.copyFromAttributeDefinition(view, attributeDefinition);
321
322
323 if (getMaxLength() == null) {
324 setMaxLength(attributeDefinition.getMaxLength());
325 }
326
327
328 if (getMinLength() == null) {
329 setMinLength(attributeDefinition.getMinLength());
330 }
331
332
333 if (getValidCharactersConstraint() == null) {
334 setValidCharactersConstraint(attributeDefinition.getValidCharactersConstraint());
335 }
336
337 if (getCaseConstraint() == null) {
338 setCaseConstraint(attributeDefinition.getCaseConstraint());
339 }
340
341 if (getDependencyConstraints() == null) {
342 setDependencyConstraints(attributeDefinition.getPrerequisiteConstraints());
343 }
344
345 if (getMustOccurConstraints() == null) {
346 setMustOccurConstraints(attributeDefinition.getMustOccurConstraints());
347 }
348
349
350 if (getRequired() == null) {
351 setRequired(attributeDefinition.isRequired());
352
353
354 if (getRequired() == null) {
355 setRequired(false);
356 }
357 }
358
359 if (this.dataType == null) {
360 setDataType(attributeDefinition.getDataType());
361
362 if(this.dataType == null && control instanceof TextControl && ((TextControl) control).getDatePicker() != null) {
363 setDataType(DataType.DATE);
364 }
365 }
366
367
368 if ((getControl() == null) && (attributeDefinition.getControlField() != null)) {
369 Control control = attributeDefinition.getControlField();
370 view.assignComponentIds(control);
371
372 setControl(ComponentUtils.copy(control));
373 }
374
375
376 if (StringUtils.isEmpty(getConstraintText())) {
377 setConstraintText(attributeDefinition.getConstraintText());
378 getConstraintMessageField().setMessageText(attributeDefinition.getConstraintText());
379 }
380
381
382 if (getOptionsFinder() == null) {
383 setOptionsFinder(attributeDefinition.getOptionsFinder());
384 }
385 }
386
387
388
389
390 @Override
391 public List<Component> getComponentsForLifecycle() {
392 List<Component> components = super.getComponentsForLifecycle();
393
394 components.add(control);
395 components.add(errorsField);
396 components.add(fieldLookup);
397 components.add(fieldDirectInquiry);
398 components.add(fieldSuggest);
399
400 return components;
401 }
402
403
404
405
406 @Override
407 public boolean isInputAllowed() {
408 return true;
409 }
410
411
412
413
414
415
416
417
418
419
420
421
422
423 public Control getControl() {
424 return this.control;
425 }
426
427
428
429
430
431
432 public void setControl(Control control) {
433 this.control = control;
434 }
435
436
437
438
439
440
441
442
443 public ErrorsField getErrorsField() {
444 return this.errorsField;
445 }
446
447
448
449
450
451
452 public void setErrorsField(ErrorsField errorsField) {
453 this.errorsField = errorsField;
454 }
455
456
457
458
459
460
461
462
463
464 public KeyValuesFinder getOptionsFinder() {
465 return this.optionsFinder;
466 }
467
468
469
470
471
472
473 public void setOptionsFinder(KeyValuesFinder optionsFinder) {
474 this.optionsFinder = optionsFinder;
475 }
476
477
478
479
480
481
482
483 public void setOptionsFinderClass(Class<? extends KeyValuesFinder> optionsFinderClass) {
484 this.optionsFinder = ObjectUtils.newInstance(optionsFinderClass);
485 }
486
487
488
489
490 @Override
491 public boolean getSupportsOnLoad() {
492 return true;
493 }
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509 public QuickFinder getFieldLookup() {
510 return this.fieldLookup;
511 }
512
513
514
515
516
517
518 public void setFieldLookup(QuickFinder fieldLookup) {
519 this.fieldLookup = fieldLookup;
520 }
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537 public Suggest getFieldSuggest() {
538 return fieldSuggest;
539 }
540
541
542
543
544
545
546 public void setFieldSuggest(Suggest fieldSuggest) {
547 this.fieldSuggest = fieldSuggest;
548 }
549
550
551
552
553
554
555
556
557
558
559
560 public String getInstructionalText() {
561 return this.instructionalText;
562 }
563
564
565
566
567
568
569 public void setInstructionalText(String instructionalText) {
570 this.instructionalText = instructionalText;
571 }
572
573
574
575
576
577
578
579
580
581
582
583 public MessageField getInstructionalMessageField() {
584 return this.instructionalMessageField;
585 }
586
587
588
589
590
591
592
593
594
595
596
597 public void setInstructionalMessageField(MessageField instructionalMessageField) {
598 this.instructionalMessageField = instructionalMessageField;
599 }
600
601
602
603
604
605
606
607
608
609
610
611
612 public String getConstraintText() {
613 return this.constraintText;
614 }
615
616
617
618
619
620
621 public void setConstraintText(String constraintText) {
622 this.constraintText = constraintText;
623 }
624
625
626
627
628
629
630
631
632
633
634
635 public MessageField getConstraintMessageField() {
636 return this.constraintMessageField;
637 }
638
639
640
641
642
643
644
645
646
647
648
649 public void setConstraintMessageField(MessageField constraintMessageField) {
650 this.constraintMessageField = constraintMessageField;
651 }
652
653
654
655
656
657
658 public ValidCharactersConstraint getValidCharactersConstraint() {
659 return this.validCharactersConstraint;
660 }
661
662
663
664
665
666
667 public void setValidCharactersConstraint(ValidCharactersConstraint validCharactersConstraint) {
668 this.validCharactersConstraint = validCharactersConstraint;
669 }
670
671
672
673
674
675
676 public CaseConstraint getCaseConstraint() {
677 return this.caseConstraint;
678 }
679
680
681
682
683
684
685 public void setCaseConstraint(CaseConstraint caseConstraint) {
686 this.caseConstraint = caseConstraint;
687 }
688
689
690
691
692
693
694 public List<PrerequisiteConstraint> getDependencyConstraints() {
695 return this.dependencyConstraints;
696 }
697
698
699
700
701
702
703 public void setDependencyConstraints(List<PrerequisiteConstraint> dependencyConstraints) {
704 this.dependencyConstraints = dependencyConstraints;
705 }
706
707
708
709
710
711
712 public List<MustOccurConstraint> getMustOccurConstraints() {
713 return this.mustOccurConstraints;
714 }
715
716
717
718
719
720
721 public void setMustOccurConstraints(List<MustOccurConstraint> mustOccurConstraints) {
722 this.mustOccurConstraints = mustOccurConstraints;
723 }
724
725
726
727
728
729
730
731
732
733
734
735 public SimpleConstraint getSimpleConstraint() {
736 return this.simpleConstraint;
737 }
738
739
740
741
742
743
744
745
746
747
748
749
750 public void setSimpleConstraint(SimpleConstraint simpleConstraint) {
751 this.simpleConstraint = simpleConstraint;
752 }
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767 public Integer getMaxLength() {
768 return simpleConstraint.getMaxLength();
769 }
770
771
772
773
774
775
776 public void setMaxLength(Integer maxLength) {
777 simpleConstraint.setMaxLength(maxLength);
778 }
779
780
781
782
783
784
785
786
787
788
789
790
791
792 public Integer getMinLength() {
793 return simpleConstraint.getMinLength();
794 }
795
796
797
798
799
800
801 public void setMinLength(Integer minLength) {
802 simpleConstraint.setMinLength(minLength);
803 }
804
805
806
807
808 @Override
809 public Boolean getRequired() {
810 return this.simpleConstraint.getRequired();
811 }
812
813
814
815
816 @Override
817 public void setRequired(Boolean required) {
818 this.simpleConstraint.setRequired(required);
819 }
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835 public String getExclusiveMin() {
836 return simpleConstraint.getExclusiveMin();
837 }
838
839
840
841
842
843
844 public void setExclusiveMin(String exclusiveMin) {
845 simpleConstraint.setExclusiveMin(exclusiveMin);
846 }
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862 public String getInclusiveMax() {
863 return simpleConstraint.getInclusiveMax();
864 }
865
866
867
868
869
870
871 public void setInclusiveMax(String inclusiveMax) {
872 simpleConstraint.setInclusiveMax(inclusiveMax);
873 }
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889 public DirectInquiry getFieldDirectInquiry() {
890 return fieldDirectInquiry;
891 }
892
893
894
895
896
897
898 public void setFieldDirectInquiry(DirectInquiry fieldDirectInquiry) {
899 this.fieldDirectInquiry = fieldDirectInquiry;
900 }
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916 public AttributeQuery getFieldAttributeQuery() {
917 return fieldAttributeQuery;
918 }
919
920
921
922
923
924
925 public void setFieldAttributeQuery(AttributeQuery fieldAttributeQuery) {
926 this.fieldAttributeQuery = fieldAttributeQuery;
927 }
928
929
930
931
932
933
934
935
936
937
938
939 public boolean isPerformUppercase() {
940 return performUppercase;
941 }
942
943
944
945
946
947
948 public void setPerformUppercase(boolean performUppercase) {
949 this.performUppercase = performUppercase;
950 }
951
952
953
954
955
956
957 @Override
958 public String getName() {
959 return this.getBindingInfo().getBindingPath();
960 }
961
962 public List<PrerequisiteConstraint> getPrerequisiteConstraints() {
963 return dependencyConstraints;
964 }
965
966
967
968
969
970
971 public void setDataType(DataType dataType) {
972 this.simpleConstraint.setDataType(dataType);
973 }
974
975 public void setDataType(String dataType) {
976 this.simpleConstraint.setDataType(DataType.valueOf(dataType));
977 }
978
979
980
981
982
983
984
985 public DataType getDataType() {
986 return this.simpleConstraint.getDataType();
987 }
988 }