1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.client.console.wicket.markup.html.form;
20
21 import java.util.Iterator;
22 import java.util.List;
23 import org.apache.syncope.client.ui.commons.Constants;
24 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
25 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAutoCompleteBehavior;
26 import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
27 import org.apache.wicket.ajax.AjaxRequestTarget;
28 import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteBehavior;
29 import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings;
30 import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
31 import org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer;
32 import org.apache.wicket.model.IModel;
33 import org.apache.wicket.model.ResourceModel;
34 import org.apache.wicket.validation.IValidator;
35
36 public class AjaxSearchFieldPanel extends FieldPanel<String> implements Cloneable {
37
38 private static final long serialVersionUID = 6890905510177974519L;
39
40 private List<String> choices = List.of();
41
42 private final IAutoCompleteRenderer<String> renderer;
43
44 private final AutoCompleteSettings settings;
45
46 public AjaxSearchFieldPanel(final String id, final String name, final IModel<String> model) {
47 this(id, name, model, null, null);
48 }
49
50 public AjaxSearchFieldPanel(
51 final String id, final String name,
52 final IModel<String> model,
53 final AutoCompleteSettings settings) {
54 this(id, name, model, null, settings);
55 }
56
57 public AjaxSearchFieldPanel(
58 final String id, final String name,
59 final IModel<String> model,
60 final IAutoCompleteRenderer<String> renderer,
61 final AutoCompleteSettings settings) {
62 super(id, name, model);
63
64 this.settings = settings;
65 this.renderer = renderer;
66
67 field = new AutoCompleteTextField<>("textField", model, settings) {
68
69 private static final long serialVersionUID = -6648767303091874219L;
70
71 @Override
72 protected Iterator<String> getChoices(final String input) {
73 return AjaxSearchFieldPanel.this.getChoices(input);
74 }
75
76 @Override
77 protected AutoCompleteBehavior<String> newAutoCompleteBehavior(
78 final IAutoCompleteRenderer<String> renderer, final AutoCompleteSettings settings) {
79
80 return new IndicatorAutoCompleteBehavior<>(
81 AjaxSearchFieldPanel.this.renderer != null ? AjaxSearchFieldPanel.this.renderer : renderer,
82 AjaxSearchFieldPanel.this.settings != null ? AjaxSearchFieldPanel.this.settings : settings) {
83
84 private static final long serialVersionUID = 1070808433195962931L;
85
86 @Override
87 protected Iterator<String> getChoices(final String input) {
88 return AjaxSearchFieldPanel.this.getChoices(input);
89 }
90 };
91 }
92 };
93 add(field.setLabel(new ResourceModel(name, name)).setOutputMarkupId(true));
94
95 if (!isReadOnly()) {
96 field.add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
97
98 private static final long serialVersionUID = -6139318907146065915L;
99
100 @Override
101 protected void onUpdate(final AjaxRequestTarget target) {
102 AjaxSearchFieldPanel.this.onUpdateBehavior();
103 }
104 });
105 }
106 }
107
108 @Override
109 public FieldPanel<String> setRequired(final boolean required) {
110 return super.setRequired(required);
111 }
112
113 public List<String> getChoices() {
114 return choices;
115 }
116
117 public void addValidator(final IValidator<String> validator) {
118 this.field.add(validator);
119 }
120
121 public void onUpdateBehavior() {
122 }
123
124 protected Iterator<String> getChoices(final String input) {
125 return choices.iterator();
126 }
127
128 @Override
129 public FieldPanel<String> clone() {
130 final AjaxSearchFieldPanel panel = (AjaxSearchFieldPanel) super.clone();
131 return panel;
132 }
133 }