View Javadoc
1   /*
2    * Copyright (c) 2011-2024 PrimeFaces Extensions
3    *
4    *  Permission is hereby granted, free of charge, to any person obtaining a copy
5    *  of this software and associated documentation files (the "Software"), to deal
6    *  in the Software without restriction, including without limitation the rights
7    *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    *  copies of the Software, and to permit persons to whom the Software is
9    *  furnished to do so, subject to the following conditions:
10   *
11   *  The above copyright notice and this permission notice shall be included in
12   *  all copies or substantial portions of the Software.
13   *
14   *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20   *  THE SOFTWARE.
21   */
22  package org.primefaces.extensions.component.orgchart;
23  
24  import java.util.Arrays;
25  import java.util.Collection;
26  import java.util.Collections;
27  import java.util.Map;
28  
29  import javax.faces.application.ResourceDependency;
30  import javax.faces.component.UIData;
31  import javax.faces.component.behavior.ClientBehaviorHolder;
32  import javax.faces.context.FacesContext;
33  import javax.faces.event.AjaxBehaviorEvent;
34  import javax.faces.event.FacesEvent;
35  
36  import org.primefaces.component.api.Widget;
37  import org.primefaces.extensions.event.OrgChartClickEvent;
38  import org.primefaces.extensions.event.OrgChartDropEvent;
39  import org.primefaces.util.Constants;
40  
41  /**
42   * <code>orgchart</code> component.
43   *
44   * @author @jxmai / last modified by Melloware
45   * @version $Revision$
46   * @since 6.3
47   */
48  @ResourceDependency(library = "primefaces", name = "jquery/jquery.js")
49  @ResourceDependency(library = "primefaces", name = "jquery/jquery-plugins.js")
50  @ResourceDependency(library = "primefaces", name = "core.js")
51  @ResourceDependency(library = "primefaces-extensions", name = "primefaces-extensions.js")
52  @ResourceDependency(library = "primefaces-extensions", name = "orgchart/orgchart.js")
53  @ResourceDependency(library = "primefaces-extensions", name = "orgchart/orgchart.css")
54  public class OrgChart extends UIData implements Widget, ClientBehaviorHolder {
55  
56      public static final String STYLE_CLASS = "ui-orgchart ";
57  
58      public static final String COMPONENT_TYPE = "org.primefaces.extensions.component.OrgChart";
59      public static final String COMPONENT_FAMILY = "org.primefaces.extensions.component";
60      private static final String DEFAULT_RENDERER = "org.primefaces.extensions.component.orgchart.OrgChartRenderer";
61  
62      private static final Collection<String> EVENT_NAMES = Collections
63                  .unmodifiableCollection(Arrays.asList(OrgChartClickEvent.NAME, OrgChartDropEvent.NAME));
64  
65      @SuppressWarnings("java:S115")
66      protected enum PropertyKeys {
67          nodeId, //
68          widgetVar, //
69          nodeContent, //
70          direction, //
71          pan, //
72          toggleSiblingsResp, //
73          depth, //
74          exportButton, //
75          exportFilename, //
76          exportFileextension, //
77          parentNodeSymbol, //
78          draggable, //
79          chartClass, //
80          zoom, //
81          zoominLimit, //
82          zoomoutLimit, //
83          verticalDepth, //
84          nodeTitle, //
85          style, //
86          styleClass, //
87          extender
88      }
89  
90      public OrgChart() {
91          setRendererType(DEFAULT_RENDERER);
92      }
93  
94      @Override
95      public String getFamily() {
96          return COMPONENT_FAMILY;
97      }
98  
99      @Override
100     public Collection<String> getEventNames() {
101         return EVENT_NAMES;
102     }
103 
104     @Override
105     public String getDefaultEventName() {
106         return OrgChartClickEvent.NAME;
107     }
108 
109     @Override
110     public void processDecodes(final FacesContext fc) {
111         if (isSelfRequest(fc)) {
112             decode(fc);
113         }
114         else {
115             super.processDecodes(fc);
116         }
117     }
118 
119     @Override
120     public void queueEvent(final FacesEvent event) {
121         final FacesContext fc = FacesContext.getCurrentInstance();
122 
123         if (isSelfRequest(fc) && event instanceof AjaxBehaviorEvent) {
124             final Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
125             final String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM);
126             final AjaxBehaviorEvent behaviorEvent = (AjaxBehaviorEvent) event;
127             final String clientId = getClientId(fc);
128 
129             if (OrgChartClickEvent.NAME.equals(eventName)) {
130 
131                 final String id = params.get(clientId + "_nodeId");
132 
133                 final String hierarchyStr = params.get(clientId + "_hierarchy");
134 
135                 final OrgChartClickEvent orgChartClickEvent = new OrgChartClickEvent(this,
136                             behaviorEvent.getBehavior(), id, hierarchyStr);
137                 orgChartClickEvent.setPhaseId(event.getPhaseId());
138                 super.queueEvent(orgChartClickEvent);
139             }
140             else if (OrgChartDropEvent.NAME.equals(eventName)) {
141                 final String hierarchyStr = params.get(clientId + "_hierarchy");
142 
143                 final String draggedNodeId = params.get(clientId + "_draggedNodeId");
144 
145                 final String droppedZoneId = params.get(clientId + "_droppedZoneId");
146 
147                 final OrgChartDropEvent orgChartDropEvent = new OrgChartDropEvent(this,
148                             behaviorEvent.getBehavior(), hierarchyStr, draggedNodeId, droppedZoneId);
149                 orgChartDropEvent.setPhaseId(event.getPhaseId());
150                 super.queueEvent(orgChartDropEvent);
151             }
152         }
153     }
154 
155     private boolean isSelfRequest(final FacesContext context) {
156         return getClientId(context)
157                     .equals(context.getExternalContext().getRequestParameterMap().get(
158                                 Constants.RequestParams.PARTIAL_SOURCE_PARAM));
159     }
160 
161     public String getNodeId() {
162         return (String) getStateHelper().eval(PropertyKeys.nodeId, "id");
163     }
164 
165     public void setNodeId(final String nodeId) {
166         getStateHelper().put(PropertyKeys.nodeId, nodeId);
167     }
168 
169     public String getWidgetVar() {
170         return (String) getStateHelper().eval(PropertyKeys.widgetVar, null);
171     }
172 
173     public void setWidgetVar(final String widgetVar) {
174         getStateHelper().put(PropertyKeys.widgetVar, widgetVar);
175     }
176 
177     public String getNodeContent() {
178         return (String) getStateHelper().eval(PropertyKeys.nodeContent, "title");
179     }
180 
181     public void setNodeContent(final String nodeContent) {
182         getStateHelper().put(PropertyKeys.nodeContent, nodeContent);
183     }
184 
185     public String getDirection() {
186         return (String) getStateHelper().eval(PropertyKeys.direction, "t2b");
187     }
188 
189     public void setDirection(final String direction) {
190         getStateHelper().put(PropertyKeys.direction, direction);
191     }
192 
193     public Boolean getPan() {
194         return (Boolean) getStateHelper().eval(PropertyKeys.pan, false);
195     }
196 
197     public void setPan(final Boolean pan) {
198         getStateHelper().put(PropertyKeys.pan, pan);
199     }
200 
201     public Boolean getToggleSiblingsResp() {
202         return (Boolean) getStateHelper().eval(PropertyKeys.toggleSiblingsResp, false);
203     }
204 
205     public void setToggleSiblingsResp(final Boolean toggleSiblingsResp) {
206         getStateHelper().put(PropertyKeys.toggleSiblingsResp, toggleSiblingsResp);
207     }
208 
209     public Integer getDepth() {
210         return (Integer) getStateHelper().eval(PropertyKeys.depth, 999);
211     }
212 
213     public void setDepth(final Integer depth) {
214         getStateHelper().put(PropertyKeys.depth, depth);
215     }
216 
217     public Boolean getExportButton() {
218         return (Boolean) getStateHelper().eval(PropertyKeys.exportButton, false);
219     }
220 
221     public void setExportButton(final Boolean exportButton) {
222         getStateHelper().put(PropertyKeys.exportButton, exportButton);
223     }
224 
225     public String getExportFilename() {
226         return (String) getStateHelper().eval(PropertyKeys.exportFilename, "OrgChart");
227     }
228 
229     public void setExportFilename(final String exportFilename) {
230         getStateHelper().put(PropertyKeys.exportFilename, exportFilename);
231     }
232 
233     public String getExportFileextension() {
234         return (String) getStateHelper().eval(PropertyKeys.exportFileextension, "png");
235     }
236 
237     public void setExportFileextension(final String exportFileextension) {
238         getStateHelper().put(PropertyKeys.exportFileextension, exportFileextension);
239     }
240 
241     public String getParentNodeSymbol() {
242         return (String) getStateHelper().eval(PropertyKeys.parentNodeSymbol, "fa-users");
243     }
244 
245     public void setParentNodeSymbol(final String parentNodeSymbol) {
246         getStateHelper().put(PropertyKeys.parentNodeSymbol, parentNodeSymbol);
247     }
248 
249     public Boolean getDraggable() {
250         return (Boolean) getStateHelper().eval(PropertyKeys.draggable, false);
251     }
252 
253     public void setDraggable(final Boolean draggable) {
254         getStateHelper().put(PropertyKeys.draggable, draggable);
255     }
256 
257     public String getChartClass() {
258         return (String) getStateHelper().eval(PropertyKeys.chartClass, "");
259     }
260 
261     public void setChartClass(final String chartClass) {
262         getStateHelper().put(PropertyKeys.chartClass, chartClass);
263     }
264 
265     public Boolean getZoom() {
266         return (Boolean) getStateHelper().eval(PropertyKeys.zoom, false);
267     }
268 
269     public void setZoom(final Boolean zoom) {
270         getStateHelper().put(PropertyKeys.zoom, zoom);
271     }
272 
273     public Number getZoominLimit() {
274         return (Number) getStateHelper().eval(PropertyKeys.zoominLimit, 7);
275     }
276 
277     public void setZoominLimit(final Number zoominLimit) {
278         getStateHelper().put(PropertyKeys.zoominLimit, zoominLimit);
279     }
280 
281     public Number getZoomoutLimit() {
282         return (Number) getStateHelper().eval(PropertyKeys.zoomoutLimit, 0.5);
283     }
284 
285     public void setZoomoutLimit(final Number zoomoutLimit) {
286         getStateHelper().put(PropertyKeys.zoomoutLimit, zoomoutLimit);
287     }
288 
289     public Integer getVerticalDepth() {
290         return (Integer) getStateHelper().eval(PropertyKeys.verticalDepth, null);
291     }
292 
293     public void setVerticalDepth(final Integer verticalDepth) {
294         getStateHelper().put(PropertyKeys.verticalDepth, verticalDepth);
295     }
296 
297     public String getNodeTitle() {
298         return (String) getStateHelper().eval(PropertyKeys.nodeTitle, "name");
299     }
300 
301     public void setNodeTitle(final String nodeTitle) {
302         getStateHelper().put(PropertyKeys.nodeTitle, nodeTitle);
303     }
304 
305     public String getStyle() {
306         return (String) getStateHelper().eval(PropertyKeys.style, null);
307     }
308 
309     public void setStyle(final String style) {
310         getStateHelper().put(PropertyKeys.style, style);
311     }
312 
313     public String getStyleClass() {
314         return (String) getStateHelper().eval(PropertyKeys.styleClass, null);
315     }
316 
317     public void setStyleClass(final String styleClass) {
318         getStateHelper().put(PropertyKeys.styleClass, styleClass);
319     }
320 
321     public String getExtender() {
322         return (String) getStateHelper().eval(PropertyKeys.extender, null);
323     }
324 
325     public void setExtender(final String extender) {
326         getStateHelper().put(PropertyKeys.extender, extender);
327     }
328 
329 }